PIPS
sc_elim_redund.c
Go to the documentation of this file.
1 /*
2 
3  $Id: sc_elim_redund.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 */
26 
27 #ifdef HAVE_CONFIG_H
28  #include "config.h"
29 #endif
30 
31 #include <stdio.h>
32 #include <string.h>
33 #include "arithmetique.h"
34 #include "boolean.h"
35 #include "vecteur.h"
36 #include "contrainte.h"
37 #include "sc.h"
38 
39 /* Psysteme sc_inequations_elim_redund(Psysteme ps):
40  *
41  * Elimination des contraintes lineaires redondantes dans le systeme par
42  * test de faisabilite. Le polyedre rationnel definit par ps peut etre
43  * augmente par cette procedure qui utilise contrainte_reverse() et un
44  * test de faisabilite: E(ps) peut etre strictement inclu dans E(ps'). Les
45  * sommets rationnels du systeme generateur de ps ne sont pas respectes.
46  *
47  * Remarque: il ne faut pas appliquer de normalisation du systeme apres
48  * inversion de la contrainte et avant le test de faisabilite en RATIONELS,
49  * car l'elimination des redondances n'est alors pas necessairement
50  * correcte en entiers.
51  *
52  * resultat retourne par la fonction :
53  *
54  * Psysteme : Le systeme initial est modifie. Il est egal a NULL si
55  * le systeme initial est non faisable.
56  *
57  * Les parametres de la fonction :
58  *
59  * Psysteme ps : systeme lineaire
60  *
61  */
62 
64 {
65  Pcontrainte eq, eq1;
66 
67  // hmmm... in order to prevent overflows and keep systems simple,
68  // there may be some strategy to try to remove bad constraints first?
69 
70  // hmmm... why choosing "eq" to scan inequalities?
71  for (eq = ps->inegalites;eq != NULL; eq = eq1) {
72  eq1 = eq->succ;
76  else {
79  }
80  }
81  return ps;
82 }
83 
84 /* Psysteme sc_elim_redund(Psysteme ps):
85  * elimination des contraintes lineaires redondantes dans le systeme par test
86  * de faisabilite. Les tests de faisabilite sont appliques sur tout le
87  * systeme. L'elimination des redondances est donc totale.
88  *
89  * resultat retourne par la fonction :
90  *
91  * Psysteme : Le systeme initial est modifie. Il est egal a NULL si
92  * le systeme initial est non faisable.
93  *
94  * Les parametres de la fonction :
95  *
96  * Psysteme ps : systeme lineaire
97  *
98  */
99 
101 {
102  Pcontrainte eq;
103 
104  for (eq = ps->egalites; eq != NULL; eq=eq->succ)
106 
107  ps = sc_kill_db_eg(ps);
108 
109  if (SC_UNDEFINED_P(ps))
110  return ps;
111 
113  {
114  sc_rm(ps);
115  return NULL;
116  }
117 
119  return ps;
120 }
121 
122 /* Same as above, but the basis is preserved and sc_empty is returned is
123  the system is not feasible. ps is assumed to be a consistent system of
124  constraints. */
126 {
127  Pbase b = base_copy(sc_base(ps));
128 
129  /* if (SC_UNDEFINED_P(ps)) return(ps); */
130 
131  ps = sc_elim_redund(ps);
132 
133  if(ps==NULL) {
134  ps = sc_empty(b);
135  }
136  else {
137  base_rm(b);
138  }
139 
140  return ps;
141 }
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
void contrainte_reverse(Pcontrainte)
void contrainte_reverse(Pcontrainte eq): changement de signe d'une contrainte, i.e.
Definition: unaires.c:67
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
void sc_rm_empty_constraints(Psysteme ps, bool process_equalities)
package sc: elimination de redondance simple
Definition: sc_elim_eq.c:56
Psysteme sc_inequations_elim_redund(Psysteme ps)
package sc
Psysteme sc_elim_redund(Psysteme ps)
Psysteme sc_elim_redund(Psysteme ps): elimination des contraintes lineaires redondantes dans le syste...
Psysteme sc_safe_elim_redund(Psysteme ps)
Same as above, but the basis is preserved and sc_empty is returned is the system is not feasible.
bool sc_rational_feasibility_ofl_ctrl(Psysteme sc, int ofl_ctrl, bool ofl_res)
Pcontrainte eq
element du vecteur colonne du systeme donne par l'analyse
Definition: sc_gram.c:108
Pvecteur vecteur
struct Scontrainte * succ
Pcontrainte inegalites
Definition: sc-local.h:71
Pcontrainte egalites
Definition: sc-local.h:70
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
#define base_rm(b)
#define OFL_CTRL
I do thing that overflows are managed in a very poor manner.
Pbase base_copy(Pbase b)
Direct duplication.
Definition: alloc.c:300
void vect_normalize(Pvecteur v)
void vect_normalize(Pvecteur v): division de tous les coefficients de v par leur pgcd; "normalisation...
Definition: unaires.c:59