PIPS
find-eg.c
Go to the documentation of this file.
1 /*
2 
3  $Id: find-eg.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 
40 #include "sommet.h"
41 
42 /* pour recuperer les declarations des fonctions de conversion de
43  * sc en liste de sommets et reciproquement, bien que ca casse le
44  * DAG des types de donnees
45  */
46 #include "ray_dte.h"
47 #include "polyedre.h"
48 #include "matrix.h"
49 
50 #include "plint.h"
51 
52 #define MALLOC(s,t,f) malloc(s)
53 
54 /* Psysteme find_eg(Psysteme sys):
55  * Recherche des egalites du systeme en nombres entiers sys
56  * parmi ses inegalites
57  *
58  * Le systeme initial est modifie.
59  *
60  * Les parametres de la fonction :
61  *
62  * !Psysteme ps : systeme lineaire
63  */
65 Psysteme sys;
66 {
67  Psysteme sys2=NULL;
68  Psysteme sys3=NULL;
69  Psommet som=NULL;
70  Psommet ps = NULL ;
71  Psommet fonct = fonct_init();
72  Psolution sol1 = NULL;
73  Pvecteur pv;
74  int nbvars;
75  int exnbv;
76  int nbsom;
77  /*
78  * respectivement la valeur de la constante de l'equation
79  * et la valeur de la constante de la fonction economique
80  */
81  Value b0,f0;
82 
83  sys = sc_elim_redond(sys);
84  if (sys != (Psysteme) NULL) {
85  nbvars = sys->dimension;
86  ps = sys_som_conv(sys,&nbsom);
87  exnbv = nbvars;
88  for (som = ps;((nbsom != 0) && (som!= NULL));som=som->succ)
89 
90  {
91  if (*(som->eq_sat) == -1) {
92  /*
93  * on choisit une inequation A.x = b0
94  */
95 
96  nbvars = exnbv;
97  /*
98  *on cree une fonction economique identique au
99  * membre gauche de l'inequation
100  * fonct->vecteur = A.x
101  */
102  fonct->denominateur = VALUE_ONE;
103  fonct->vecteur = vect_dup(som->vecteur);
105  b0 = value_uminus(vect_coeff(TCST,som->vecteur));
106  pv = vect_dup(som->vecteur);
107 
108  /*
109  * on enleve l'inegalite choisie du systeme
110  */
111  vect_rm(som->vecteur);
112  som->vecteur = VECTEUR_NUL;
113 
114  if ((sys2 = som_sys_conv(ps)) != (Psysteme) NULL) {
115  sys2->dimension = sys->dimension;
116  sys2->base = vect_dup(sys->base);
117  }
118 
119  /*
120  * on calcule le nouveau programme linaire
121  * ainsi forme
122  */
123  sys3 = plint(sys2,fonct,&sol1);
124  /*
125  * si la solution entiere trouvee donne pour
126  * minimum a la fonction economique la valeur
127  * de la constante b0 ==> cette inegalite peut
128  * etre transformee en egalite
129  */
130  if (sys3 != NULL && fonct != NULL) {
131  Value x = fonct->denominateur;
132  f0 = vect_coeff(TCST,fonct->vecteur);
133  value_division(f0,x);
134  if (value_eq(b0,f0))
135  *(som->eq_sat) = 1;
136  }
137 
138  som->vecteur = pv;
139  if (fonct!= NULL) {
140  vect_rm(fonct->vecteur);
141  fonct->vecteur = NULL;
142  }
143  sc_rm(sys2);
144  sc_rm (sys3);
145  sys2 = NULL;
146  sys3 = NULL;
147  }
148  }
149 
150  if ((sys2 = som_sys_conv(ps)) != (Psysteme) NULL) {
151  sys2->dimension = sys->dimension;
152  sys2->base = vect_dup(sys->base);
153  }
154  sommets_rm(ps);
155  }
156  return(sys2);
157 }
158 
#define VALUE_ZERO
#define value_uminus(val)
unary operators on values
int Value
#define value_eq(v1, v2)
bool operators on values
#define value_division(ref, val)
#define VALUE_ONE
Psysteme find_eg(Psysteme sys)
Psysteme find_eg(Psysteme sys): Recherche des egalites du systeme en nombres entiers sys parmi ses in...
Definition: find-eg.c:64
Psommet fonct_init()
Definition: plfonct-eco.c:53
Psysteme plint(Psysteme first_sys, Psommet fonct, Psolution *sol_fin)
Psysteme plint(Psysteme first_sys, Psommet fonct, Psolution *sol_fin): resolution d'un systeme lineai...
Definition: plint.c:430
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 sommets_rm(Psommet)
void sommets_rm(Psommet ps): liberation de l'espace memoire alloue a une liste de sommets
Definition: sommets.c:83
static char * x
Definition: split_file.c:159
Pbase base
Definition: sc-local.h:75
int dimension
Definition: sc-local.h:74
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
structure de donnees Sommet
Definition: sommet-local.h:64
struct typ_som * succ
Definition: sommet-local.h:68
Pvecteur vecteur
Definition: sommet-local.h:66
int * eq_sat
Definition: sommet-local.h:65
Value denominateur
Definition: sommet-local.h:67
#define TCST
VARIABLE REPRESENTANT LE TERME CONSTANT.
#define VECTEUR_NUL
DEFINITION DU VECTEUR NUL.
Pvecteur vect_dup(Pvecteur v_in)
Pvecteur vect_dup(Pvecteur v_in): duplication du vecteur v_in; allocation de et copie dans v_out;.
Definition: alloc.c:51
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78
Value vect_coeff(Variable var, Pvecteur vect)
Variable vect_coeff(Variable var, Pvecteur vect): coefficient de coordonnee var du vecteur vect —> So...
Definition: unaires.c:228
void vect_chg_coeff(Pvecteur *ppv, Variable var, Value val)
void vect_chg_coeff(Pvecteur *ppv, Variable var, Value val): mise de la coordonnee var du vecteur *pp...
Definition: unaires.c:143