PIPS
plint.c
Go to the documentation of this file.
1 /*
2 
3  $Id: plint.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 /* Psommet plint_pas(Psommet sys1, Psommet fonct, Pvecteur * lvbase,
55  * int * nb_som, int * nbvars, Pbase *b):
56  * Algorithme des congruences decroissantes
57  * (Michel Minoux - Programmation mathematique -
58  * theorie et algorithmes- tome 2. Dunod. p22. )
59  *
60  * resultat retourne par la fonction :
61  *
62  * Psommet : systeme lineaire modifie
63  *
64  * Les parametres de la fonction :
65  *
66  * Psommet sys1 : systeme lineaire
67  * Psommet fonct : fonction economique du programme lineaire
68  * Pvecteur lvbase: liste des variables de base du systeme
69  * int nb_som : nombre de contraintes du systeme
70  * int nbvars : nombre de variables du systeme
71  * Pbase *b : liste des variables du systeme
72  */
73 Psommet plint_pas(sys1,fonct,lvbase,nb_som,nbvars,b)
74 Psommet sys1;
75 Psommet fonct;
76 Pvecteur *lvbase;
77 int *nb_som;
78 int *nbvars;
79 Pbase *b;
80 {
81 
82  double d1;
83  int no_som =0;
84  Variable var2 = 0;
85  Value in1;
86  bool non_fin = true;
87  bool non_stop = true;
88  bool degenere = false;
89 
90 #ifdef TRACE
91 
92  Psysteme sys =NULL;
93  printf(" * algorithme de GOMORY \n");
94 #endif
95 
96  sys1 = primal_pivot(sys1,lvbase,*nb_som,fonct);
97 
98  if (sys1!=NULL && fonct != NULL)
99  {
100  if ((sol_entiere(sys1,*lvbase,*nb_som) == false) ||
101  (sol_positive(sys1,*lvbase,*nb_som) == false) || const_negative(sys1))
102  {
103 
104 
105  while ((sys1 != NULL) &&
106  (dual_pivot_pas(&sys1,lvbase,*nb_som,fonct,nbvars,b) == true));
107  if (sys1 != NULL && fonct != NULL)
108  {
109  if ((sol_entiere(sys1,*lvbase,*nb_som)==false))
110  {
111  Value f0 = VALUE_ZERO,fden;
112 
113  while (non_fin)
114  {
115  f0 = value_uminus(vect_coeff(TCST,fonct->vecteur));
116  fden = fonct->denominateur;
117  d1 = VALUE_TO_DOUBLE(f0) / VALUE_TO_DOUBLE(fden);
118  in1 = value_div(f0,fden);
119 
120  /* test de degenerescence */
121  if ((d1 != VALUE_TO_DOUBLE(in1)) ||
122  value_zero_p(in1) ||
123  (cout_nul(fonct,*lvbase,*nbvars,*b) ==
124  false) || degenere) {
125  degenere = false;
126 
127  while (non_stop)
128  {
129  Psommet eq_gom = NULL;
130  Psommet eq_coup = NULL;
131 
132  /* recherche d'une variable de base non entiere,
133  puis ajout d'une coupe de Gomory */
134 
135  if (((eq_gom = gomory_eq(&sys1,*lvbase,*nb_som,&no_som,&var2)) != NULL) && (sys1 !=NULL)) {
136  if ((eq_coup = gomory_trait_eq(eq_gom,var2)) != NULL)
137  sommet_add(&sys1,eq_coup,nb_som);
138  else {
139  sommets_rm(sys1);
140  sys1 = NULL;
141  non_fin = false;
142  non_stop = false;
143  }
144 #ifdef TRACE
145  sys = som_sys_conv(sys1);
146  sc_fprint(stdout,sys,noms_var);
147 #endif
148  }
149  else {
150  /* il n'y a plus de variable non entiere */
151  non_stop = false ;
152  non_fin = false;
153  }
154  if ((sys1 != NULL) && non_stop )
155  {
156  /* on effectue un pas de l'algorithme dual du simplexe */
157  /* ajout des variables d'ecart */
158  sys1 = var_ecart_sup (sys1,*nb_som,lvbase,nbvars,b);
159  if (dual_pivot_pas(&sys1,lvbase,*nb_som,fonct,nbvars,b) != false) {
160  if (sol_entiere(sys1,*lvbase,*nb_som) == true) {
161  /* la solution est entiere mais pas positive */
162  if (ligne_pivot(sys1,*nb_som,&no_som) != NULL) {
163  while ((sys1 != NULL)
164  && (dual_pivot_pas(&sys1,lvbase,*nb_som,fonct,nbvars,b) == true))
165  ;
166 
167  if ((sol_entiere(sys1,*lvbase,*nb_som) == true) && (sol_positive(sys1,*lvbase,*nb_som) == true))
168  {
169 #ifdef TRACE
170  printf(" - Gomory - on a une solution optimale \n");
171 #endif
172  non_fin = false;
173  non_stop = false;
174  }
175  else {
176  if (sys1 == NULL) {
177  non_fin = false;
178  non_stop = false;
179  }
180  }
181  }
182  else {
183 #ifdef TRACE
184  printf (" - Gomory - on a une solution optimale \n");
185 #endif
186  non_fin = false;
187  non_stop = false;
188  }
189  }
190  }
191  else {
192  /* on a une solution positive */
193  if (sys1 == NULL)
194  {
195  non_stop = false;
196  non_fin = false;
197  }
198  else {
199  if (sol_entiere(sys1,*lvbase,*nb_som) == true)
200  {
201 #ifdef TRACE
202  printf (" - Gomory - on a une solution entiere \n");
203 #endif
204  non_stop = false;
205  non_fin = false;
206  }
207  }
208  }
209  }
210 #ifdef TRACE
211  sys = som_sys_conv(sys1);
212  sc_fprint(stdout,sys,noms_var);
213 #endif
214  }
215  }
216  else
217  {
218  /* cas de degenerescence */
219  degenere = true;
220  if (plint_degen(&sys1,fonct,nb_som,lvbase,nbvars,b) == false)
221  {
222  if (sys1!= NULL)
223  {
224 #ifdef TRACE
225  printf (" - Gomory - on a une solution reelle \n");
226  sys = som_sys_conv(sys1);
227  sc_fprint(stdout,sys,noms_var);
228 #endif
229  }
230  non_fin = false;
231  }
232  }
233  }
234  }
235  else {
236  /* on a une sol. entiere et positive a la fin de */
237  /* l'execution de l'algorithme dual du simplexe */
238 
239 #ifdef TRACE
240  printf (" - Gomory - on a une solution \n");
241 #endif
242  }
243  }
244 #ifdef TRACE
245  else printf (" - Gomory - le systeme est non realisable - fin !!\n");
246 #endif
247  }
248  else {
249  /* on a une solution entiere et positive a la fin */
250  /* de l'execution de l'algorithme primal du simplexe */
251 #ifdef TRACE
252  printf (" - Gomory - on a une solution optimale \n");
253  sys = som_sys_conv(sys1);
254  sc_fprint(stdout,sys,noms_var);
255 #endif
256 
257  }
258  }
259  else {
260 #ifdef TRACE
261  printf (" - Gomory - pas de sol. reelle ==> pas de sol. entiere \n");
262 #endif
263  }
264  return (sys1);
265 }
266 
267 /* void plint_degen(Psommet *sys, Psommet fonct, int *nb_som,
268  * Pvecteur * lvbase, int nbvars, Pbase * b):
269  * Cas de degenerescence au cours de l'algorithme des
270  * congruences decroissantes
271  *
272  * resultat retourne par la fonction :
273  *
274  * Le systeme initial est modifie.
275  * S'il est vide, c'est que le systeme est non faisable.
276  * Sinon on ajoute une contrainte supplementaire permettant la
277  * non degenerescence du programme lineaire.
278  *
279  * Les parametres de la fonction :
280  *
281  * Psommet sys : systeme lineaire
282  * Psommet fonct : fonction economique du programme lineaire
283  * Pvecteur lvbase: liste des variables de base du systeme
284  * int nb_som : nombre de contraintes du systeme
285  * int nbvars : nombre de variables du systeme
286  * Pbase b : liste des variables du systeme
287  */
288 bool plint_degen(sys,fonct,nb_som,lvbase,nbvars,b)
289 Psommet *sys;
290 Psommet fonct;
291 int *nb_som;
292 Pvecteur *lvbase;
293 int *nbvars;
294 Pbase *b;
295 {
296  Psommet fonct2=NULL;
297  Psommet eq_coupe=NULL;
298  Psommet sys1 = sommets_dupc(*sys);
299  Pvecteur eq_for_ndegen=NULL;
300  Pvecteur lvhb_de_cnnul=NULL;
301  Pvecteur pv=NULL;
302  Pvecteur pv2=VECTEUR_NUL;
303  Pvecteur explv=NULL;
304  Variable var_entrant;
305  register int i;
306  int exnbv;
307  int exnbs = *nb_som;
308  bool result = true;
309 
310 #ifdef TRACE
311  printf(" ** Gomory - cas de degenerescence \n");
312 #endif
313 
314  /* construction de la liste des variables hors base de cout non nul*/
315  lvhb_de_cnnul = vect_dup(fonct->vecteur);
316 
317  for (pv= *lvbase;pv!=NULL;pv=pv->succ)
318  {
319  vect_chg_coeff(&lvhb_de_cnnul,pv->var,0);
320  }
321 
322  vect_chg_coeff(&lvhb_de_cnnul,TCST,0);
323  oter_lvbase(sys1,lvhb_de_cnnul);
324  exnbv = *nbvars;
325  explv = vect_dup(*lvbase);
326 
327  /* construction d'une nouvelle fonction economique pour le systeme
328  dont on a elimine les variables h.base de cout non nul */
329 
330  fonct2 = (Psommet)MALLOC(sizeof(Ssommet),SOMMET,"plint_degen");
331  fonct2->denominateur = VALUE_ONE;
332  fonct2->vecteur = vect_new(vecteur_var(*b),VALUE_ONE);
333  for (i =1,pv2 = (*b)->succ ; i< *nbvars && !VECTEUR_NUL_P(pv2);
334  i++, pv2=pv2->succ)
335  vect_add_elem(&(fonct2->vecteur),vecteur_var(pv2),VALUE_ONE);
336 
337  for (pv= lvhb_de_cnnul;pv!=NULL;pv=pv->succ)
338  vect_chg_coeff(&(fonct2->vecteur),pv->var,VALUE_ZERO);
339 
341 
342  fonct2->eq_sat = (int *)MALLOC(sizeof(int),INTEGER,"plint_degen");
343  *(fonct2->eq_sat) = 0;
344  fonct2->succ = NULL;
345 
346  /* recherche d'une solution entiere pour ce nouveau systeme */
347  if (sys1 != NULL)
348 sys1 = plint_pas(sys1,fonct2,lvbase,nb_som,nbvars,b);
349  if (sys1 != NULL)
350 
351  {
352 #ifdef TRACE
353  printf (" -- Gomory degen. - le pb. a une sol. optimale \n ");
354 #endif
355  result = false;
356  vect_rm(explv);
357  }
358  else {
359  /* le systeme n'admet aucune solution entiere */
360  *nbvars = exnbv;
361  *nb_som = exnbs;
362  vect_rm(*lvbase);
363  *lvbase = explv;
364  /* ajout inegalite permettant la non-degenerescence du
365  programme lineaire */
366 
367  eq_for_ndegen = vect_dup(lvhb_de_cnnul);
368  for (pv = eq_for_ndegen; pv!= NULL; pv = pv->succ)
369  vect_chg_coeff(&pv,pv->var,VALUE_MONE);
370  vect_chg_coeff(&eq_for_ndegen,TCST,VALUE_ONE);
371  eq_coupe = (Psommet) MALLOC(sizeof(Ssommet),SOMMET,"plint_degen");
372  eq_coupe->vecteur = eq_for_ndegen;
373  eq_coupe->eq_sat = (int *)MALLOC(sizeof(int),INTEGER,"plint_degen");
374  *(eq_coupe->eq_sat) = -1;
375  eq_coupe->denominateur = VALUE_ONE;
376  eq_coupe->succ=NULL;
377  sommet_add(sys,eq_coupe,nb_som);
378 
379  *sys = var_ecart_sup(*sys,*nb_som,lvbase,nbvars,b);
380 
381  /* on recherche la variable pivot et on effectue le pivot */
382  var_entrant = var_pivotd(eq_coupe,fonct);
383 
384  if (var_entrant != NULL)
385  {
386 
387  pivoter (*sys,eq_coupe,var_entrant,fonct);
388  lvbase_ote_no_ligne(1,lvbase);
389  lvbase_add(var_entrant,1,lvbase);
390  }
391  else
392  {
393 #ifdef TRACE
394  printf (" -- Gomory degen. - le pb. n'est pas borne \n");
395 #endif
396  result = false;
397  sommets_rm(*sys);
398  *sys = NULL;
399  }
400  }
401  vect_rm(lvhb_de_cnnul);
402  sommets_rm(sys1);
403  sommets_rm(fonct2);
404 
405  return(result);
406 }
407 
408 /* Psysteme plint(Psysteme first_sys, Psommet fonct, Psolution *sol_fin):
409  * resolution d'un systeme lineaire en nombres entiers positifs par
410  * l'algorithme general des congruences decroissantes
411  * (c.f. Programmation Mathematique - tome 2. M.MINOUX (83))
412  *
413  *
414  * resultat retourne par la fonction :
415  *
416  * Psysteme : systeme lineaire donnant la solution de base du
417  * systeme ,si celui ci est realisable.
418  * Dans ce cas, son cout optimal vaut
419  * la valeur (avec le signe - ) de la constante de la
420  * fonction economique et la solution de base est
421  * exprimee sous la forme d'une Psolution.
422  *
423  * NULL : si le systeme initial n'est pas realisable.
424  *
425  * Les parametres de la fonction :
426  *
427  * Psysteme first_syst : systeme lineaire initial
428  * Psommet fonct : fonction economique du programme lineaire
429  */
430 Psysteme plint(first_sys,fonct,sol_fin)
431 Psysteme first_sys;
432 Psommet fonct;
433 Psolution *sol_fin;
434 {
435  Psommet sys1 = NULL;
436  Psysteme sys2 = NULL;
437  Psysteme syst_res = NULL;
438  Pvecteur lvbase = NULL;
439  int nb_som = 0;
440  int nbvars;
441  Pbase b = BASE_NULLE;
442 
443 #ifdef TRACE
444  Psolution sol = NULL;
445 
446  printf(" * algorithme des congruences decroissantes global \n");
447  printf (" - GOMORY - le nb. de variables du systeme est %d \n",first_sys->dimension);
448 #endif
449  if (first_sys) {
450  nbvars = first_sys->dimension;
451  b = base_dup(first_sys->base);
452 
453 
454  if ((first_sys->egalites != NULL) || (first_sys->inegalites != NULL))
455  {
456 
457  sys2 =sc_normalize(sc_dup(first_sys));
458  if (sys2 != (Psysteme) NULL && syst_smith(sys2))
459  sys1 = sys_som_conv(sys2,&nb_som);
460 
461 #ifdef TRACE
462  printf (" - GOMORY - le nb. de contraintes est %d \n",nb_som);
463 #endif
464  /* ajout des variables d'ecart */
465  if ((sys1 = eq_in_ineq(&sys1,&nb_som,&lvbase)) != (Psommet) NULL) {
466  sys1 = var_ecart_sup(sys1,nb_som,&lvbase,&nbvars,&b);
467  sys1 = primal_pivot(sys1,&lvbase,nb_som,fonct);
468  }
469 
470  sys1 = plint_pas(sys1,fonct,&lvbase,&nb_som,&nbvars,&b);
471 
472  if (sys1 && fonct) {
473  *sol_fin = sol_finale(sys1,lvbase,nb_som);
474 
475 #ifdef TRACE
476  for (sol = *sol_fin; sol != NULL; sol = sol->succ)
477  printf (" %s == %f; ",noms_var(sol->var),(double)(sol->val / sol->denominateur));
478  printf (" \n ");
479  printf (" - GOMORY - la fonct. economique vaut %d\n ",vect_coeff(TCST,fonct->vecteur)/fonct->denominateur);
480 
481 #endif
482 
483  }
484  if (sys1 == NULL && fonct != NULL) fonct->vecteur = NULL;
485 
486  if ((syst_res = som_sys_conv(sys1)) != NULL) {
487  syst_res->base = b;
488  syst_res->dimension = nbvars;
489  }
490  }
491  sommets_rm(sys1);
492  vect_rm(lvbase);
493  sc_rm(sys2);
494  }
495  return(syst_res);
496 }
#define VALUE_ZERO
#define value_uminus(val)
unary operators on values
#define VALUE_MONE
#define VALUE_TO_DOUBLE(val)
#define value_zero_p(val)
int Value
#define VALUE_ONE
#define value_div(v1, v2)
char * noms_var(entity e)
comp_expr_to_pnome.c
#define false
Definition: newgen_types.h:80
Variable var_pivotd(Psommet eq, Psommet fonct)
int var_pivotd(Psommet eq, Psommet fonct): recherche de la nouvelle variable pivot entrant dans la ba...
Definition: pldual.c:125
Psommet ligne_pivot(Psommet sys, int nb_som, no_som)
Psommet ligne_pivot(Psommet sys, int nb_som, int * no_som): recherche de la ligne pivot dans l'algori...
Definition: pldual.c:66
bool dual_pivot_pas(Psommet *sys, Pvecteur *lvbase, int nb_som, Psommet fonct, int *nbvars, Pbase *b)
bool dual_pivot_pas(Psommet * sys, Pvecteur * lvbase, int nb_som, Psommet fonct, int * nbvars,...
Definition: pldual.c:213
Psommet gomory_trait_eq(Psommet eq, Variable var)
Psommet gomory_trait_eq(Psommet eq, Variable var): Cette fonction utilise une contrainte du systeme e...
Definition: plgomory.c:62
Psommet gomory_eq(Psommet *sys, Pvecteur lvbase, int nb_som, int *no_som, Variable *var)
Psommet gomory_eq(Psommet *sys, Pvecteur lvbase, int nb_som, int * no_som, Variable * var): Recherche...
Definition: plgomory.c:153
#define MALLOC(s, t, f)
package plint
Definition: plint.c:52
bool plint_degen(Psommet *sys, Psommet fonct, int *nb_som, Pvecteur *lvbase, int *nbvars, Pbase *b)
void plint_degen(Psommet *sys, Psommet fonct, int *nb_som, Pvecteur * lvbase, int nbvars,...
Definition: plint.c:288
Psommet plint_pas(Psommet sys1, Psommet fonct, Pvecteur *lvbase, int *nb_som, int *nbvars, Pbase *b)
Psommet plint_pas(Psommet sys1, Psommet fonct, Pvecteur * lvbase, int * nb_som, int * nbvars,...
Definition: plint.c:73
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 pivoter(Psommet sys, Psommet ligne, Variable var, Psommet fonct)
Definition: plpivoter.c:131
Psommet primal_pivot(Psommet sys, Pvecteur *lvbase, int nb_som, Psommet fonct)
Psommet primal_pivot(Psommet sys, Pvecteur * lvbase, int nb_som, Psommet fonct): algorithme primal du...
Definition: plsimplexe.c:209
bool sol_entiere(Psommet sys, Pvecteur lvbase, int nb_som)
bool sol_entiere(Psommet sys, Pvecteur lvbase, int nb_som): Cette fonction teste si la solution est e...
Definition: plsolution.c:62
bool sol_positive(Psommet sys, Pvecteur lvbase, int nb_som)
bool sol_positive(Psommet sys, Pvecteur lvbase, int nb_som): Cette fonction teste si la solution est ...
Definition: plsolution.c:107
Psolution sol_finale(Psommet sys, Pvecteur lvbase, int nb_som)
Psolution sol_finale(Psommet sys, Pvecteur lvbase, int nb_som): Calcul de la solution finale du progr...
Definition: plsolution.c:194
Psommet sommets_dupc(Psommet som)
Psommet sommets_dupc(Psommet som): copie d'une liste de sommets tout en respectant le meme ordre.
Definition: plsommet-op.c:48
bool cout_nul(Psommet fonct, Pvecteur lvbase, int nbvars, Pbase b)
Definition: plsomvb-test.c:127
bool const_negative(Psommet som)
Definition: plsomvb-test.c:57
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_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
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
bool syst_smith(Psysteme ps)
bool syst_smith(Psysteme ps): Test de faisabilite d'un systeme lineaire en nombres entiers positifs p...
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_dup(Psysteme ps)
Psysteme sc_dup(Psysteme ps): should becomes a link.
Definition: sc_alloc.c:176
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()
Psysteme sc_normalize(Psysteme ps)
Psysteme sc_normalize(Psysteme ps): normalisation d'un systeme d'equation et d'inequations lineaires ...
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_rm(Psommet)
void sommets_rm(Psommet ps): liberation de l'espace memoire alloue a une liste de sommets
Definition: sommets.c:83
Value val
valeur de la variable
Definition: plint-local.h:55
struct Ssolution * succ
pointeur vers la variable suivante
Definition: plint-local.h:59
Value denominateur
denominateur de la valeur de la variable
Definition: plint-local.h:57
Variable var
variable du systeme
Definition: plint-local.h:53
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
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.
#define vecteur_var(v)
#define VECTEUR_NUL
DEFINITION DU VECTEUR NUL.
#define VECTEUR_NUL_P(v)
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 BASE_NULLE
MACROS SUR LES BASES.
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
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
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
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