PIPS
sc_elim_eq.c
Go to the documentation of this file.
1 /*
2 
3  $Id: sc_elim_eq.c 1641 2016-03-02 08:20:19Z coelho $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of Linear/C3 Library.
8 
9  Linear/C3 Library is free software: you can redistribute it and/or modify it
10  under the terms of the GNU Lesser General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  Linear/C3 Library is distributed in the hope that it will be useful, but WITHOUT ANY
15  WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  FITNESS FOR A PARTICULAR PURPOSE.
17 
18  See the GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with Linear/C3 Library. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 
25 /* package sc: elimination de redondance simple */
26 
27 #ifdef HAVE_CONFIG_H
28  #include "config.h"
29 #endif
30 
31 #include <string.h>
32 #include <stdio.h>
33 #include "arithmetique.h"
34 #include "boolean.h"
35 #include "vecteur.h"
36 #include "contrainte.h"
37 #include "sc.h"
38 
39 /* void sc_rm_empty_constraints(Psysteme ps, bool process_equalities):
40  * elimination des "fausses" contraintes du systeme ps, i.e. les contraintes ne
41  * comportant plus de couple (variable,valeur), i.e. les contraintes qui
42  * ont ete eliminees par la fonction 'eq_set_vect_nul', i.e. 0 = 0 ou
43  * 0 <= 0
44  *
45  * resultat retourne par la fonction: le systeme initial ps est modifie.
46  *
47  * parametres de la fonction:
48  * !Psysteme ps: systeme lineaire
49  * bool egalite: true s'il faut traiter la liste des egalites
50  * false s'il faut traiter la liste des inegalites
51  *
52  * Modifications:
53  * - the number of equalities was always decremented, regardless
54  * of the process_equalities parameter; Francois Irigoin, 30 October 1991
55  */
56 void sc_rm_empty_constraints(ps, process_equalities)
57 Psysteme ps;
58 bool process_equalities;
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 }
92 
93 /* Psysteme sc_kill_db_eg(Psysteme ps):
94  * elimination des egalites et des inegalites identiques ou inutiles dans
95  * le systeme; plus precisemment:
96  *
97  * Pour les egalites, on elimine une equation si on a un systeme d'egalites
98  * de la forme :
99  *
100  * a1/ Ax - b == 0, ou b1/ Ax - b == 0,
101  * Ax - b == 0, b - Ax == 0,
102  *
103  * ou c1/ 0 == 0
104  *
105  * Pour les inegalites, on elimine une inequation si on a un systeme
106  * d'inegalites de la forme :
107  *
108  * a2/ Ax - b <= c, ou b2/ 0 <= const (avec const >=0)
109  * Ax - b <= c
110  *
111  * resultat retourne par la fonction :
112  *
113  * Psysteme : Le systeme initial est modifie (si necessaire) et renvoye
114  * Si le systeme est non faisable (0 <= const <0 ou
115  * 0 = b), il est desalloue et NULL est
116  * renvoye.
117  *
118  * Attention, on ne teste pas les proportionalites: 2*i=2 est different
119  * de i = 1. Il faut reduire le systeme par gcd avant d'appeler cette
120  * fonction sc_kill_db_eg()
121  *
122  * Notes:
123  * - le temps d'execution doit pouvoir etre divise par deux en prenant en
124  * compte la symetrie des comparaisons et en modifiant l'initialisation
125  * des boucles internes pour les "triangulariser superieurement".
126  * - la representation interne des vecteurs est utilisee pour les tests;
127  * il faudrait tester la colinearite au vecteur de base representatif du
128  * terme constant
129  *
130  * - so called triangular version, FC 28/09/94
131  */
132 
134 Psysteme ps;
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 }
189 
190 /* same as above, but returns an empty system if the system is not feasible*/
192 Psysteme ps;
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 }
253 
254 
255 
256 /* That is all
257  */
#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
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
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
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
Psysteme sc_kill_db_eg(Psysteme ps)
Psysteme sc_kill_db_eg(Psysteme ps): elimination des egalites et des inegalites identiques ou inutile...
Definition: sc_elim_eq.c:133
Psysteme sc_safe_kill_db_eg(Psysteme ps)
same as above, but returns an empty system if the system is not feasible
Definition: sc_elim_eq.c:191
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
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
Value val
Definition: vecteur-local.h:91
Variable var
Definition: vecteur-local.h:90
#define BASE_UNDEFINED
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78