PIPS
sc-red-int.c
Go to the documentation of this file.
1 /*
2 
3  $Id: sc-red-int.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 plint */
26 
27 #ifdef HAVE_CONFIG_H
28  #include "config.h"
29 #endif
30 
31 #include <stdio.h>
32 #include <stdlib.h>
33 
34 #include "boolean.h"
35 #include "arithmetique.h"
36 #include "vecteur.h"
37 #include "contrainte.h"
38 #include "sc.h"
39 #include "matrix.h"
40 
41 #include "sommet.h"
42 #include "plint.h"
43 
44 #define MALLOC(s,t,f) malloc(s)
45 
46 /* Psysteme sys_int_redond(Psysteme sys):
47  * elimination des contraintes lineaires redondantes d'un systeme lineaire
48  * en nombres entiers par tests de faisabilite exacts. Chaque inegalite est
49  * inversee tour a tour, et la faisabilite de chacun des systemes ainsi
50  * obtenus est teste par sys_int_fais(), l'algorithme des congruences
51  * decroissantes.
52  */
54 Psysteme sys;
55 {
56 
57  Pcontrainte eq,eq1;
58 
59  sys = sc_normalize(sc_dup(sys));
60  if (sys && (sys->nb_ineq <= NB_INEQ_MAX2) && sys_int_fais(sys) &&
61  sys != NULL) {
62  for (eq = sys->inegalites;
63  eq != NULL && sys->nb_ineq > 1;
64  eq = eq1)
65  {
66  eq1 = eq->succ;
67  /* inversion du sens de l'inegalite par multiplication */
68  /* par -1 du coefficient de chaque variable */
71  /* test de faisabilite avec la nouvelle inegalite */
72  if (sys_int_fais(sys) == false)
73  {
74  /* si le systeme est non faisable
75  ==> inegalite redondante
76  ==> elimination de cette inegalite */
79  }
80  else
81  {
84  }
85  }
86  }
87  return (sys);
88 }
#define VALUE_MONE
#define VALUE_ONE
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 sys_int_fais(Psysteme sys1)
bool sys_int_fais(Psysteme sys1): Test de faisabilite d'un systeme lineaire syst1 en nombres entiers ...
Definition: sc-fais-int.c:57
Psysteme sys_int_redond(Psysteme sys)
Psysteme sys_int_redond(Psysteme sys): elimination des contraintes lineaires redondantes d'un systeme...
Definition: sc-red-int.c:53
Psysteme sc_dup(Psysteme ps)
Psysteme sc_dup(Psysteme ps): should becomes a link.
Definition: sc_alloc.c:176
void sc_rm_empty_constraints(Psysteme ps, bool process_equalities)
package sc: elimination de redondance simple
Definition: sc_elim_eq.c:56
Pcontrainte eq
element du vecteur colonne du systeme donne par l'analyse
Definition: sc_gram.c:108
Psysteme sc_normalize(Psysteme ps)
Psysteme sc_normalize(Psysteme ps): normalisation d'un systeme d'equation et d'inequations lineaires ...
void vect_chg_sgn(Pvecteur v)
void vect_chg_sgn(Pvecteur v): multiplie v par -1
Definition: scalaires.c:151
Pvecteur vecteur
struct Scontrainte * succ
#define TCST
VARIABLE REPRESENTANT LE TERME CONSTANT.
void vect_add_elem(Pvecteur *pvect, Variable var, Value val)
void vect_add_elem(Pvecteur * pvect, Variable var, Value val): addition d'un vecteur colineaire au ve...
Definition: unaires.c:72