PIPS
plvbase.c
Go to the documentation of this file.
1 /*
2 
3  $Id: plvbase.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 #include "matrix.h"
42 
43 #include "plint.h"
44 
45 #define MALLOC(s,t,f) malloc((unsigned)(s))
46 #define FREE(s,t,f) free((char *)(s))
47 
48 /* void oter_lvbase(Psommet sys, Pvecteur lvbase):
49  * Elimination d'une liste de variables contenues dans un vecteur
50  * dans Gomory : elimination des variables de base du systeme
51  *
52  * resultat retourne par la fonction :
53  *
54  * Le systeme initial est modifie.
55  *
56  * Les parametres de la fonction :
57  *
58  * Psommet sys : systeme lineaire
59  * Pvecteur lvbase: liste des variables de base du systeme
60  */
61 void oter_lvbase(sys,lvbase)
62 Psommet sys;
63 Pvecteur lvbase;
64 {
65  Psommet ps1=NULL;
66  Pvecteur pv;
67 
68 #ifdef TRACE
69  printf (" **** elimination d'une liste de variables \n");
70 #endif
71 
72  for (pv = lvbase; pv!=NULL; pv = pv->succ)
73  for (ps1 = sys; ps1 != NULL; ps1 = ps1->succ)
74  vect_chg_coeff(&(ps1->vecteur),pv->var,0);
75 }
76 
77 /* bool is_var_in_lvbase(Variable var, Pvecteur lvbase):
78  * test de non appartenance d'une variable a un vecteur
79  *
80  * Ne pourais-tu pas obtenir le meme resultat avec un vect_coeff()?
81  *
82  * resultat retourne par la fonction :
83  *
84  * boolean : true si la variable n'appartient pas au vecteur
85  * false sinon
86  *
87  * Les parametres de la fonction :
88  *
89  * Pvecteur lvbase: liste des variables de base du systeme
90  * int var : variable du systeme
91  */
92 bool is_var_in_lvbase(var,lvbase)
93 Variable var;
94 Pvecteur lvbase;
95 {
96  Pvecteur pv;
97  for (pv = lvbase;
98  pv!= NULL && ((pv->var!=var) || (pv->val == 0));
99  pv = pv->succ) ;
100  if(pv == NULL)
101  return (true);
102  else
103  return (false);
104 }
105 
106 /* void lvbase_add(Variable var, int no_ligne, Pvecteur * lvbase):
107  * ajout d'un couple (variable de base, no ligne correspondante) dans la liste
108  * des variables de base du systeme
109  *
110  * Les parametres de la fonction :
111  *
112  * Pvecteur lvbase: liste des variables de base du systeme
113  * Variable var : variable du systeme
114  * int no_ligne: numero de la ligne
115  */
116 void lvbase_add(var,no_ligne,lvbase)
117 Variable var;
118 int no_ligne;
119 Pvecteur *lvbase;
120 {
121  Pvecteur pv = NULL;
122  Value vno_ligne = int_to_value(no_ligne);
123  Pvecteur pl = vect_new(var,vno_ligne);
124  bool trouve = false;
125 
126  for (pv = *lvbase; pv != NULL && (pv->val != vno_ligne);pv=pv->succ);
127  if (pv !=NULL) trouve = true;
128  for (pv = *lvbase;( pv != NULL) &&(trouve) ;pv=pv->succ) {
129  if (value_ge(pv->val,vno_ligne))
130  value_increment(pv->val);
131  }
132  pl->succ = *lvbase;
133  *lvbase = pl;
134 }
135 
136 /* void lvbase_ote_no_ligne(int no_ligne, Pvecteur * lvbase):
137  * Elimination de la variable de base correspondant au numero de ligne
138  * NO_LIGNE de la liste des variables de base du systeme.
139  *
140  * Les parametres de la fonction :
141  *
142  * Pvecteur lvbase: liste des variables de base du systeme
143  * int no_ligne: numero de la ligne
144  */
145 void lvbase_ote_no_ligne (no_ligne,lvbase)
146 int no_ligne;
147 Pvecteur *lvbase;
148 {
149  Pvecteur pv;
150  Pvecteur pred = *lvbase;
151  Value vno_ligne = int_to_value(no_ligne);
152 
153 #ifdef TRACE
154  printf(" **** oter la variable d'indice %d \n",no_ligne);
155 #endif
156  if (pred != NULL)
157  if (value_eq(pred->val,vno_ligne))
158  {
159  pv = (*lvbase)->succ;
160  (*lvbase)->succ = NULL;
161  vect_rm(*lvbase);
162  *lvbase = pv;
163  }
164  else {
165  for (pv = (*lvbase)->succ;
166  pv!= NULL && value_ne(pv->val,vno_ligne);
167  pv = pv->succ, pred = pred->succ);
168 
169  if (value_eq(pv->val,vno_ligne)) {
170  pred->succ = pv->succ;
171  FREE(pv,VECTEUR,"ote_var_Liste");
172  }
173  }
174 }
175 
176 /* Variable find_vbase(Psommet eq, Pvecteur lvbase):
177  * Recherche de la variable de base d'une contrainte
178  *
179  * resultat retourne par la fonction :
180  *
181  * int : no de la variable de base
182  *
183  * Les parametres de la fonction :
184  *
185  * Psommet eq : contrainte du systeme
186  * Pvecteur lvbase: liste des variables de base du systeme
187  */
189 Psommet eq;
190 Pvecteur lvbase;
191 {
192  Pvecteur pv=NULL;
193  Variable var = NULL;
194 #ifdef TRACE
195  printf(" *** recherche d'une variable de base \n");
196 #endif
197  if (eq != NULL) {
198  Value cst = vect_coeff(TCST,eq->vecteur);
199  Pvecteur pv3;
200  vect_chg_coeff(&(eq->vecteur),TCST,0);
202  for(pv3 =pv; pv3->succ!=NULL;pv3=pv3->succ);
203  pv3->succ = vect_new(TCST,cst);
204  for (;pv!= NULL
205  && ((pv->val ==0) || is_var_in_lvbase(pv->var,lvbase));
206  pv=pv->succ) ;
207 
208  if (pv != NULL)
209  var = pv->var;
210  vect_rm(pv);
211  }
212  return (var);
213 }
214 
215 /* Variable coeff_no_ligne(lvbase, int no_ligne):
216  * Recherche de la variable de base d'une contrainte.
217  * La contrainte est caracterisee par son numero de ligne
218  *
219  * resultat retourne par la fonction :
220  *
221  * Variable : numero de la variable
222  *
223  * Les parametres de la fonction :
224  *
225  * Pvecteur lvbase: liste des variables de base du systeme
226  * int no_ligne: numero de la ligne
227  */
228 Variable coeff_no_ligne(lvbase,no_ligne)
229 Pvecteur lvbase;
230 int no_ligne;
231 {
232  Pvecteur pv;
233  Value vno_ligne = int_to_value(no_ligne);
234 
235  for (pv = lvbase;
236  (pv!= NULL) && value_ne(pv->val,vno_ligne);
237  pv= pv->succ);
238  if (pv != NULL)
239  return (pv->var);
240  else
241  return((Variable) NULL);
242 }
243 
#define value_increment(ref)
#define int_to_value(i)
end LINEAR_VALUE_IS_INT
#define value_ne(v1, v2)
int Value
#define value_eq(v1, v2)
bool operators on values
#define value_ge(v1, v2)
void lvbase_ote_no_ligne(int no_ligne, Pvecteur *lvbase)
void lvbase_ote_no_ligne(int no_ligne, Pvecteur * lvbase): Elimination de la variable de base corresp...
Definition: plvbase.c:145
bool is_var_in_lvbase(Variable var, Pvecteur lvbase)
bool is_var_in_lvbase(Variable var, Pvecteur lvbase): test de non appartenance d'une variable a un ve...
Definition: plvbase.c:92
Variable find_vbase(Psommet eq, Pvecteur lvbase)
Variable find_vbase(Psommet eq, Pvecteur lvbase): Recherche de la variable de base d'une contrainte.
Definition: plvbase.c:188
Variable coeff_no_ligne(Pvecteur lvbase, int no_ligne)
Variable coeff_no_ligne(lvbase, int no_ligne): Recherche de la variable de base d'une contrainte.
Definition: plvbase.c:228
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 oter_lvbase(Psommet sys, Pvecteur lvbase)
void oter_lvbase(Psommet sys, Pvecteur lvbase): Elimination d'une liste de variables contenues dans u...
Definition: plvbase.c:61
#define FREE(s, t, f)
Definition: plvbase.c:46
static hash_table pl
properties are stored in this hash table (string -> property) for fast accesses.
Definition: properties.c:783
Pcontrainte eq
element du vecteur colonne du systeme donne par l'analyse
Definition: sc_gram.c:108
int printf()
Pvecteur vecteur
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
#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
#define VECTEUR
package sur les vecteurs creux et les bases
Definition: vecteur-local.h:51
Pvecteur vect_new(Variable var, Value coeff)
Pvecteur vect_new(Variable var,Value coeff): allocation d'un vecteur colineaire au vecteur de base va...
Definition: alloc.c:110
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78
int vect_compare(Pvecteur *pv1, Pvecteur *pv2)
for qsort, returns:
Definition: unaires.c:352
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
Pvecteur vect_sort(Pvecteur v, int *compare)
Pvecteur vect_sort(v, compare) Pvecteur v; int (*compare)();.
Definition: unaires.c:335