PIPS
sc_elim_eq.c File Reference
#include <string.h>
#include <stdio.h>
#include "arithmetique.h"
#include "boolean.h"
#include "vecteur.h"
#include "contrainte.h"
#include "sc.h"
+ Include dependency graph for sc_elim_eq.c:

Go to the source code of this file.

Functions

void sc_rm_empty_constraints (Psysteme ps, bool process_equalities)
 package sc: elimination de redondance simple More...
 
Psysteme sc_kill_db_eg (Psysteme ps)
 Psysteme sc_kill_db_eg(Psysteme ps): elimination des egalites et des inegalites identiques ou inutiles dans le systeme; plus precisemment: More...
 
Psysteme sc_safe_kill_db_eg (Psysteme ps)
 same as above, but returns an empty system if the system is not feasible More...
 

Function Documentation

◆ sc_kill_db_eg()

Psysteme sc_kill_db_eg ( Psysteme  ps)

Psysteme sc_kill_db_eg(Psysteme ps): elimination des egalites et des inegalites identiques ou inutiles dans le systeme; plus precisemment:

Pour les egalites, on elimine une equation si on a un systeme d'egalites de la forme :

a1/ Ax - b == 0, ou b1/ Ax - b == 0,
Ax - b == 0, b - Ax == 0,

ou c1/ 0 == 0

Pour les inegalites, on elimine une inequation si on a un systeme d'inegalites de la forme :

a2/ Ax - b <= c, ou b2/ 0 <= const (avec const >=0) Ax - b <= c

resultat retourne par la fonction :

Psysteme : Le systeme initial est modifie (si necessaire) et renvoye Si le systeme est non faisable (0 <= const <0 ou 0 = b), il est desalloue et NULL est renvoye.

Attention, on ne teste pas les proportionalites: 2*i=2 est different de i = 1. Il faut reduire le systeme par gcd avant d'appeler cette fonction sc_kill_db_eg()

Notes:

  • le temps d'execution doit pouvoir etre divise par deux en prenant en compte la symetrie des comparaisons et en modifiant l'initialisation des boucles internes pour les "triangulariser superieurement".
  • la representation interne des vecteurs est utilisee pour les tests; il faudrait tester la colinearite au vecteur de base representatif du terme constant

so called triangular version, FC 28/09/94

b = 0

0 <= b < 0

Definition at line 133 of file sc_elim_eq.c.

135 {
137  eq1 = NULL,
138  eq2 = NULL;
139 
140  if (ps == NULL)
141  return(NULL);
142 
143  for (eq1 = ps->egalites;
144  eq1 != NULL;
145  eq1 = eq1->succ)
146  {
147  if ((vect_size(eq1->vecteur) == 1) &&
148  (eq1->vecteur->var == 0) && (eq1->vecteur->val != 0))
149  {
150  /* b = 0 */
151  sc_rm(ps);
152  return(NULL);
153  }
154 
155  for (eq2 = eq1->succ;
156  eq2 != NULL;
157  eq2 = eq2->succ)
158  if (egalite_equal(eq1, eq2))
159  eq_set_vect_nul(eq2);
160  }
161 
162  for (eq1 = ps->inegalites;
163  eq1 != NULL;
164  eq1 = eq1->succ)
165  {
166  if ((vect_size(eq1->vecteur) == 1) && (eq1->vecteur->var == 0))
167  if (eq1->vecteur->val <= 0)
168  vect_rm(eq1->vecteur),
169  eq1->vecteur = NULL;
170  else
171  {
172  /* 0 <= b < 0 */
173  sc_rm(ps);
174  return(NULL);
175  }
176 
177  for (eq2 = eq1->succ;
178  eq2 != NULL;
179  eq2 = eq2->succ)
180  if (contrainte_equal(eq1,eq2))
181  eq_set_vect_nul(eq2);
182  }
183 
184  sc_rm_empty_constraints(ps, true);
185  sc_rm_empty_constraints(ps, false);
186 
187  return (ps);
188 }
void eq_set_vect_nul(Pcontrainte)
void_eq_set_vect_nul(Pcontrainte c): transformation d'une contrainte en une contrainte triviale 0 == ...
Definition: unaires.c:84
bool contrainte_equal(Pcontrainte, Pcontrainte)
bool contrainte_equal(Pcontrainte c1, Pcontrainte c2): test d'egalite des contraintes c1 et c2; elles...
Definition: predicats.c:128
bool egalite_equal(Pcontrainte, Pcontrainte)
bool egalite_equal(Pcontrainte eg1, Pcontrainte eg2): teste l'equivalence de deux egalites; leurs coe...
Definition: predicats.c:98
int vect_size(Pvecteur v)
package vecteur - reductions
Definition: reductions.c:47
void sc_rm(Psysteme ps)
void sc_rm(Psysteme ps): liberation de l'espace memoire occupe par le systeme de contraintes ps;
Definition: sc_alloc.c:277
void sc_rm_empty_constraints(Psysteme ps, bool process_equalities)
package sc: elimination de redondance simple
Definition: sc_elim_eq.c:56
Pvecteur vecteur
struct Scontrainte * succ
Pcontrainte inegalites
Definition: sc-local.h:71
Pcontrainte egalites
Definition: sc-local.h:70
Value val
Definition: vecteur-local.h:91
Variable var
Definition: vecteur-local.h:90
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78

References contrainte_equal(), egalite_equal(), eq_set_vect_nul(), sc_rm(), sc_rm_empty_constraints(), Scontrainte::succ, Svecteur::val, Svecteur::var, vect_rm(), vect_size(), and Scontrainte::vecteur.

Referenced by sc_build_triang_elim_redund(), sc_elim_redund(), and sc_triang_elim_redund().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sc_rm_empty_constraints()

void sc_rm_empty_constraints ( Psysteme  ps,
bool  process_equalities 
)

package sc: elimination de redondance simple

void sc_rm_empty_constraints(Psysteme ps, bool process_equalities): elimination des "fausses" contraintes du systeme ps, i.e. les contraintes ne comportant plus de couple (variable,valeur), i.e. les contraintes qui ont ete eliminees par la fonction 'eq_set_vect_nul', i.e. 0 = 0 ou 0 <= 0

resultat retourne par la fonction: le systeme initial ps est modifie.

parametres de la fonction: !Psysteme ps: systeme lineaire bool egalite: true s'il faut traiter la liste des egalites false s'il faut traiter la liste des inegalites

Modifications:

  • the number of equalities was always decremented, regardless of the process_equalities parameter; Francois Irigoin, 30 October 1991

Definition at line 56 of file sc_elim_eq.c.

59 {
60  Pcontrainte pc, ppc;
61 
62  if (ps != SC_EMPTY)
63  pc = (process_equalities) ? ps->egalites : ps->inegalites;
64  else pc = NULL;
65  ppc = NULL;
66 
67  while (pc != NULL) {
68  if (contrainte_vecteur(pc) == NULL) {
69  Pcontrainte p = pc;
70 
71  if (ppc == NULL) {
72  if (process_equalities)
73  ps->egalites = pc = pc->succ;
74  else
75  ps->inegalites = pc = pc->succ;
76  }
77  else {
78  ppc->succ = pc = pc->succ;
79  }
80  contrainte_free(p);
81  if (process_equalities)
82  ps->nb_eq--;
83  else
84  ps->nb_ineq--;
85  }
86  else {
87  ppc = pc;
88  pc = pc->succ;
89  }
90  }
91 }
#define contrainte_vecteur(c)
passage au champ vecteur d'une contrainte "a la Newgen"
Pcontrainte contrainte_free(Pcontrainte c)
Pcontrainte contrainte_free(Pcontrainte c): liberation de l'espace memoire alloue a la contrainte c a...
Definition: alloc.c:184
int nb_ineq
Definition: sc-local.h:73
int nb_eq
Definition: sc-local.h:72

References contrainte_free(), contrainte_vecteur, and Scontrainte::succ.

Referenced by elim_redund_sc_with_sc(), sc_add_normalize_eq(), sc_add_normalize_ineq(), sc_inequations_elim_redund(), sc_kill_db_eg(), sc_safe_kill_db_eg(), simplify_big_coeff(), and sys_int_redond().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sc_safe_kill_db_eg()

Psysteme sc_safe_kill_db_eg ( Psysteme  ps)

same as above, but returns an empty system if the system is not feasible

b = 0

0 <= b < 0

Definition at line 191 of file sc_elim_eq.c.

193 {
195  eq1 = NULL,
196  eq2 = NULL;
197 
198  if (ps == NULL)
199  return(NULL);
200 
201  for (eq1 = ps->egalites;
202  eq1 != NULL;
203  eq1 = eq1->succ)
204  {
205  if ((vect_size(eq1->vecteur) == 1) &&
206  (eq1->vecteur->var == 0) && (eq1->vecteur->val != 0))
207  {
208  /* b = 0 */
209  Pbase base_tmp = ps->base;
210  ps->base = BASE_UNDEFINED;
211  sc_rm(ps);
212  ps =sc_empty(ps->base);
213  return(ps);
214  }
215 
216  for (eq2 = eq1->succ;
217  eq2 != NULL;
218  eq2 = eq2->succ)
219  if (egalite_equal(eq1, eq2))
220  eq_set_vect_nul(eq2);
221  }
222 
223  for (eq1 = ps->inegalites;
224  eq1 != NULL;
225  eq1 = eq1->succ)
226  {
227  if ((vect_size(eq1->vecteur) == 1) && (eq1->vecteur->var == 0))
228  if (eq1->vecteur->val <= 0)
229  vect_rm(eq1->vecteur),
230  eq1->vecteur = NULL;
231  else
232  {
233  /* 0 <= b < 0 */
234  Pbase base_tmp = ps->base;
235  ps->base = BASE_UNDEFINED;
236  sc_rm(ps);
237  ps =sc_empty(ps->base);
238  return(ps);
239  }
240 
241  for (eq2 = eq1->succ;
242  eq2 != NULL;
243  eq2 = eq2->succ)
244  if (contrainte_equal(eq1,eq2))
245  eq_set_vect_nul(eq2);
246  }
247 
248  sc_rm_empty_constraints(ps, true);
249  sc_rm_empty_constraints(ps, false);
250 
251  return (ps);
252 }
Psysteme sc_empty(Pbase b)
Psysteme sc_empty(Pbase b): build a Psysteme with one unfeasible constraint to define the empty subsp...
Definition: sc_alloc.c:319
Pbase base
Definition: sc-local.h:75
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
#define BASE_UNDEFINED

References BASE_UNDEFINED, contrainte_equal(), egalite_equal(), eq_set_vect_nul(), sc_empty(), sc_rm(), sc_rm_empty_constraints(), Scontrainte::succ, Svecteur::val, Svecteur::var, vect_rm(), vect_size(), and Scontrainte::vecteur.

Referenced by sc_normalize().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: