PIPS
plvar-ecart.c
Go to the documentation of this file.
1 /*
2 
3  $Id: plvar-ecart.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 #define TRACE
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 /* Psommet eq_in_ineq(Psommet * sys, int * nb_som, Pvecteur * lvbase):
55  * Transformation des egalites du systeme en inegalites.
56  * N egalites du systeme seront transformees en N+1 inegalites.
57  *
58  * resultat retourne par la fonction :
59  *
60  * Psommet : systeme lineaire initial modifie.
61  *
62  * Les parametres de la fonction :
63  *
64  * Psommet sys : systeme lineaire
65  * Pvecteur lvbase: liste des variables de base du systeme
66  * int nb_som : nombre de contraintes du systeme
67  */
68 Psommet eq_in_ineq(sys,nb_som,lvbase)
69 Psommet *sys;
70 int *nb_som;
71 Pvecteur *lvbase;
72 {
73  Psommet eq=NULL;
74  Psommet sys2;
75  Psommet som2;
76  Pvecteur pv3=NULL;
77  Pvecteur pvsom=NULL;
78  Pvecteur pvsom2 = NULL;
79  bool egalite = false;
80  Value den = VALUE_ONE;
81 
82 #ifdef TRACE
83 
84  Psysteme ps1=NULL;
85  Pvecteur pvec;
86 
87  printf(" ** transformation des equations en inequations \n");
88 #endif
89 
90 
91  sys2 = *sys;
92 
93  for (eq = sys2;eq!= NULL;eq=eq->succ) {
94  if (*(eq->eq_sat) == 1) {
95  egalite = true;
96  *(eq->eq_sat) = -1;
97  pv3 = vect_dup(eq->vecteur);
98  vect_chg_sgn(pv3);
99  (void) vect_multiply(pv3,den);
100  value_product(den,eq->denominateur);
101  (void) vect_multiply(pvsom,eq->denominateur);
102  pvsom2 = vect_add(pvsom,pv3);
103  vect_rm(pv3);
104  vect_rm(pvsom);
105  pvsom = pvsom2;
106  }
107  }
108  if (egalite) {
109  som2 = (Psommet)MALLOC(sizeof(Ssommet),SOMMET,"eq_in_ineq");
110  som2->eq_sat =(int *)MALLOC(sizeof(int),INTEGER,"eq_in_ineq");
111  *(som2->eq_sat) = -1;
112  som2->denominateur =den ;
113  som2->vecteur = pvsom;
114  som2->succ = NULL;
115  sommet_add(&sys2,som2,nb_som);
116  }
117 
118 #ifdef TRACE
119  ps1 = som_sys_conv(sys2);
120 
121  sc_fprint(stdout,ps1,*variable_default_name);
122  printf (" -- variables de base :");
123  for (pvec = *lvbase;pvec!= NULL;pvec=pvec->succ)
124  {
125  printf(" (0x%x,", (unsigned int) pvec->var);
126  print_Value(pvec->val);
127  printf("), ");
128  }
129  printf("\n");
130  sc_rm(ps1);
131 
132 #endif
133 
134  sommets_normalize(sys2);
135  return(sys2);
136 
137 }
138 
139 /* Psommet var_ecart_sup(Psommet sys, int nb_som, Pvecteur * lvbase,
140  * int * nbvars, Pbase *b):
141  * ajout des variables d'ecart necessaires a la transformation du systeme
142  * A . X <= B en A'. X' = B .
143  *
144  * resultat retourne par la fonction :
145  *
146  * Psommet : systeme lineaire initial modifie
147  *
148  * Les parametres de la fonction :
149  *
150  * Psommet sys : systeme lineaire
151  * Pvecteur lvbase: liste des variables de base du systeme
152  * int nb_som : nombre de contraintes du systeme
153  * int nbvars : nombre de variables du systeme
154  * Pbase b : liste des variables du systeme
155  */
156 Psommet var_ecart_sup(sys,nb_som,lvbase,nbvars,b)
157 Psommet sys;
158 int nb_som;
159 Pvecteur *lvbase;
160 int *nbvars;
161 Pbase *b;
162 {
163  Psysteme ps1=NULL;
164  Psommet ineg;
165  Psommet sys2 = sys;
166  Variable nv;
167 
168 #ifdef TRACE
169  Pvecteur pvec;
170 
171  printf(" ** ajout des variables d'ecart \n");
172 #endif
173  if (sys) {
174  ps1 = som_sys_conv(sys);
175  if (ps1 != NULL) {
176  ps1->dimension = *nbvars;
177  ps1->base = base_dup(*b);
178 
179  for (ineg = sys2;ineg!= NULL;ineg=ineg->succ) {
180  if (*(ineg->eq_sat) == -1) {
181  nv = creat_new_var(ps1);
182  vect_add_elem(&(ineg->vecteur),nv,VALUE_ONE);
183  lvbase_add(nv,nb_som,lvbase);
184  *(ineg->eq_sat) = 1;
185  *b = vect_add_variable(*b,nv);
186  (*nbvars)++;
187  }
188  nb_som --;
189  }
190 
191 #ifdef TRACE
192  printf (" -- variables de base :");
193  for (pvec = *lvbase;pvec!= NULL;pvec=pvec->succ)
194  {
195  printf(" (0x%x,",(unsigned int)pvec->var);
196  print_Value(pvec->val);
197  printf("), ");
198  }
199  printf("\n");
200  ps1 = som_sys_conv(sys2);
201  sc_fprint(stdout,ps1,*variable_default_name);
202 #endif
203  sc_rm(ps1);
204  }
205  }
206  return(sys2);
207 }
208 
209 
210 Psommet add_var_sup(sys,nb_som,lvbase,lvsup,nbvars,b,fonct)
211 Psommet sys;
212 int nb_som;
213 Pvecteur *lvbase;
214 Pvecteur *lvsup;
215 int *nbvars;
216 Pbase *b;
217 Psommet fonct;
218 {
219  Psysteme ps1=NULL;
220  Psommet ineg;
221  Psommet sys2 = sys;
222  Variable nv;
223 
224 #ifdef TRACE
225  Pvecteur pvec;
226 
227  printf(" ** ajout des variables suupplementaire \n");
228 #endif
229  if (sys) {
230  ps1 = som_sys_conv(sys);
231  if (ps1 != NULL) {
232  ps1->dimension = *nbvars;
233  ps1->base = base_dup(*b);
234 
235  for (ineg = sys2;ineg!= NULL;ineg=ineg->succ) {
236  if (*(ineg->eq_sat) == -1) {
237  nv = creat_new_var(ps1);
238  vect_add_elem(&(ineg->vecteur),nv,VALUE_ONE);
239  *b = vect_add_variable(*b,nv);
240  (*nbvars) ++;
241  if (value_pos_p(vect_coeff(TCST,ineg->vecteur))) {
242  nv = creat_new_var(ps1);
243  vect_add_elem(&(ineg->vecteur),nv,VALUE_MONE);
244  vect_add_elem(&(fonct->vecteur),nv,
245  int_to_value(999)); /* ??? 999 ??? */
246  lvbase_add(nv,nb_som,lvsup);
247  }
248  lvbase_add(nv,nb_som,lvbase);
249 
250  *(ineg->eq_sat) = 1;
251  *b = vect_add_variable(*b,nv);
252  (*nbvars) ++;
253  }
254  nb_som --;
255  }
256 
257 #ifdef TRACE
258  printf (" -- variables de base :");
259  for (pvec = *lvbase;pvec!= NULL;pvec=pvec->succ)
260  {
261  printf(" (0x%x,",(unsigned int)pvec->var);
262  print_Value(pvec->val);
263  printf("), ");
264  }
265  printf("\n");
266  ps1 = som_sys_conv(sys2);
267  sc_fprint(stdout,ps1,*variable_default_name);
268 #endif
269 
270  sc_rm(ps1);
271  }
272  }
273  return(sys2);
274 }
#define value_pos_p(val)
#define int_to_value(i)
end LINEAR_VALUE_IS_INT
#define VALUE_MONE
int Value
#define value_product(v, w)
#define VALUE_ONE
void print_Value(Value)
io.c
Definition: io.c:37
Pbase vect_add_variable(Pbase b, Variable v)
package vecteur - routines sur les bases
Definition: base.c:61
char * variable_default_name(Variable v)
char * variable_default_name(Variable v): returns the name of variable v
Definition: variable.c:81
#define MALLOC(s, t, f)
pour recuperer les declarations des fonctions de conversion de sc en liste de sommets et reciproqueme...
Definition: plvar-ecart.c:52
Psommet add_var_sup(Psommet sys, int nb_som, Pvecteur *lvbase, Pvecteur *lvsup, int *nbvars, Pbase *b, Psommet fonct)
Definition: plvar-ecart.c:210
Psommet eq_in_ineq(Psommet *sys, int *nb_som, Pvecteur *lvbase)
Psommet eq_in_ineq(Psommet * sys, int * nb_som, Pvecteur * lvbase): Transformation des egalites du sy...
Definition: plvar-ecart.c:68
Psommet var_ecart_sup(Psommet sys, int nb_som, Pvecteur *lvbase, int *nbvars, Pbase *b)
Psommet var_ecart_sup(Psommet sys, int nb_som, Pvecteur * lvbase, int * nbvars, Pbase *b): ajout des ...
Definition: plvar-ecart.c:156
void lvbase_add(Variable var, int no_ligne, Pvecteur *lvbase)
void lvbase_add(Variable var, int no_ligne, Pvecteur * lvbase): ajout d'un couple (variable de base,...
Definition: plvbase.c:116
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
Pcontrainte eq
element du vecteur colonne du systeme donne par l'analyse
Definition: sc_gram.c:108
void sc_fprint(FILE *fp, Psysteme ps, get_variable_name_t nom_var)
void sc_fprint(FILE * f, Psysteme ps, char * (*nom_var)()): cette fonction imprime dans le fichier po...
Definition: sc_io.c:220
int printf()
Variable creat_new_var(Psysteme ps)
char * noms_var(int i): cette fonction convertit un numero de variable en chaine de caracteres
Definition: sc_var.c:102
void vect_chg_sgn(Pvecteur v)
void vect_chg_sgn(Pvecteur v): multiplie v par -1
Definition: scalaires.c:151
Pvecteur vect_multiply(Pvecteur v, Value x)
Pvecteur vect_multiply(Pvecteur v, Value x): multiplication du vecteur v par le scalaire x,...
Definition: scalaires.c:123
struct typ_som * Psommet
structure de donnees Sommet
#define SOMMET
package sommet: structure de donnees representant les sommets d'un systeme generateur; elle contient:
Definition: sommet-local.h:48
void sommet_add(Psommet *ps, Psommet som, int *nb_som)
void sommet_add(Psommet *ps, Psommet som, int *nb_soms): Ajout d'un sommet a une liste de sommets Le ...
Definition: sommet.c:342
void sommets_normalize(Psommet)
void sommets_normalize(som) Normalisation des elements d'une liste de sommets i.e.
Definition: sommets.c:108
Pvecteur vecteur
struct Scontrainte * succ
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
Value val
Definition: vecteur-local.h:91
Variable var
Definition: vecteur-local.h:90
struct Svecteur * succ
Definition: vecteur-local.h:92
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.
void * Variable
arithmetique is a requirement for vecteur, but I do not want to inforce it in all pips files....
Definition: vecteur-local.h:60
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
Pbase base_dup(Pbase b)
Pbase base_dup(Pbase b) Note: this function changes the value of the pointer.
Definition: alloc.c:268
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78
Pvecteur vect_add(Pvecteur v1, Pvecteur v2)
package vecteur - operations binaires
Definition: binaires.c:53
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
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