PIPS
plint.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include "boolean.h"
#include "arithmetique.h"
#include "vecteur.h"
#include "contrainte.h"
#include "sc.h"
#include "sommet.h"
#include "ray_dte.h"
#include "polyedre.h"
#include "matrix.h"
#include "plint.h"
+ Include dependency graph for plint.c:

Go to the source code of this file.

Macros

#define MALLOC(s, t, f)   malloc(s)
 package plint More...
 

Functions

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, Pbase *b): Algorithme des congruences decroissantes (Michel Minoux - Programmation mathematique - theorie et algorithmes- tome 2. More...
 
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, Pbase * b): Cas de degenerescence au cours de l'algorithme des congruences decroissantes More...
 
Psysteme plint (Psysteme first_sys, Psommet fonct, Psolution *sol_fin)
 Psysteme plint(Psysteme first_sys, Psommet fonct, Psolution *sol_fin): resolution d'un systeme lineaire en nombres entiers positifs par l'algorithme general des congruences decroissantes (c.f. More...
 

Macro Definition Documentation

◆ MALLOC

#define MALLOC (   s,
  t,
  f 
)    malloc(s)

package plint

pour recuperer les declarations des fonctions de conversion de sc en liste de sommets et reciproquement, bien que ca casse le DAG des types de donnees

Definition at line 52 of file plint.c.

Function Documentation

◆ plint()

Psysteme plint ( Psysteme  first_sys,
Psommet  fonct,
Psolution sol_fin 
)

Psysteme plint(Psysteme first_sys, Psommet fonct, Psolution *sol_fin): resolution d'un systeme lineaire en nombres entiers positifs par l'algorithme general des congruences decroissantes (c.f.

Programmation Mathematique - tome 2. M.MINOUX (83))

resultat retourne par la fonction :

Psysteme : systeme lineaire donnant la solution de base du systeme ,si celui ci est realisable. Dans ce cas, son cout optimal vaut la valeur (avec le signe - ) de la constante de la fonction economique et la solution de base est exprimee sous la forme d'une Psolution.

NULL : si le systeme initial n'est pas realisable.

Les parametres de la fonction :

Psysteme first_syst : systeme lineaire initial Psommet fonct : fonction economique du programme lineaire

ajout des variables d'ecart

Definition at line 430 of file plint.c.

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 }
char * noms_var(entity e)
comp_expr_to_pnome.c
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
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
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 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
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
int printf()
Psysteme sc_normalize(Psysteme ps)
Psysteme sc_normalize(Psysteme ps): normalisation d'un systeme d'equation et d'inequations lineaires ...
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
Pcontrainte inegalites
Definition: sc-local.h:71
Pcontrainte egalites
Definition: sc-local.h:70
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
Pvecteur vecteur
Definition: sommet-local.h:66
Value denominateur
Definition: sommet-local.h:67
#define TCST
VARIABLE REPRESENTANT LE TERME CONSTANT.
#define BASE_NULLE
MACROS SUR LES BASES.
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
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

References Ssysteme::base, base_dup(), BASE_NULLE, Ssolution::denominateur, typ_som::denominateur, Ssysteme::dimension, eq_in_ineq(), noms_var(), plint_pas(), primal_pivot(), printf(), sc_dup(), sc_normalize(), sc_rm(), sol_finale(), sommets_rm(), Ssolution::succ, syst_smith(), TCST, Ssolution::val, Ssolution::var, var_ecart_sup(), vect_coeff(), vect_rm(), and typ_som::vecteur.

Referenced by find_eg(), and sys_int_fais().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ plint_degen()

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, Pbase * b): Cas de degenerescence au cours de l'algorithme des congruences decroissantes

resultat retourne par la fonction :

Le systeme initial est modifie. S'il est vide, c'est que le systeme est non faisable. Sinon on ajoute une contrainte supplementaire permettant la non degenerescence du programme lineaire.

Les parametres de la fonction :

Psommet sys : systeme lineaire Psommet fonct : fonction economique du programme lineaire Pvecteur lvbase: liste des variables de base du systeme int nb_som : nombre de contraintes du systeme int nbvars : nombre de variables du systeme Pbase b : liste des variables du systeme

construction de la liste des variables hors base de cout non nul

construction d'une nouvelle fonction economique pour le systeme dont on a elimine les variables h.base de cout non nul

recherche d'une solution entiere pour ce nouveau systeme

le systeme n'admet aucune solution entiere

ajout inegalite permettant la non-degenerescence du programme lineaire

on recherche la variable pivot et on effectue le pivot

Definition at line 288 of file plint.c.

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 }
#define VALUE_ZERO
#define VALUE_MONE
#define VALUE_ONE
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
#define MALLOC(s, t, f)
package plint
Definition: plint.c:52
void pivoter(Psommet sys, Psommet ligne, Variable var, Psommet fonct)
Definition: plpivoter.c:131
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
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
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
Variable var
Definition: vecteur-local.h:90
struct Svecteur * succ
Definition: vecteur-local.h:92
struct typ_som * succ
Definition: sommet-local.h:68
int * eq_sat
Definition: sommet-local.h:65
#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
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
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_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
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

References typ_som::denominateur, typ_som::eq_sat, lvbase_add(), lvbase_ote_no_ligne(), MALLOC, oter_lvbase(), pivoter(), plint_pas(), printf(), SOMMET, sommet_add(), sommets_dupc(), sommets_rm(), typ_som::succ, Svecteur::succ, TCST, VALUE_MONE, VALUE_ONE, VALUE_ZERO, Svecteur::var, var_ecart_sup(), var_pivotd(), vect_add_elem(), vect_chg_coeff(), vect_dup(), vect_new(), vect_rm(), typ_som::vecteur, VECTEUR_NUL, VECTEUR_NUL_P, and vecteur_var.

Referenced by plint_pas().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ plint_pas()

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, Pbase *b): Algorithme des congruences decroissantes (Michel Minoux - Programmation mathematique - theorie et algorithmes- tome 2.

Dunod. p22. )

resultat retourne par la fonction :

Psommet : systeme lineaire modifie

Les parametres de la fonction :

Psommet sys1 : systeme lineaire Psommet fonct : fonction economique du programme lineaire Pvecteur lvbase: liste des variables de base du systeme int nb_som : nombre de contraintes du systeme int nbvars : nombre de variables du systeme Pbase *b : liste des variables du systeme

test de degenerescence

recherche d'une variable de base non entiere, puis ajout d'une coupe de Gomory

il n'y a plus de variable non entiere

on effectue un pas de l'algorithme dual du simplexe

ajout des variables d'ecart

la solution est entiere mais pas positive

on a une solution positive

cas de degenerescence

on a une sol. entiere et positive a la fin de

l'execution de l'algorithme dual du simplexe

on a une solution entiere et positive a la fin

de l'execution de l'algorithme primal du simplexe

Definition at line 73 of file plint.c.

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 }
#define value_uminus(val)
unary operators on values
#define VALUE_TO_DOUBLE(val)
#define value_zero_p(val)
int Value
#define value_div(v1, v2)
#define false
Definition: newgen_types.h:80
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
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
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
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
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

References const_negative(), cout_nul(), typ_som::denominateur, dual_pivot_pas(), false, gomory_eq(), gomory_trait_eq(), ligne_pivot(), noms_var(), plint_degen(), primal_pivot(), printf(), sc_fprint(), sol_entiere(), sol_positive(), sommet_add(), sommets_rm(), TCST, value_div, VALUE_TO_DOUBLE, value_uminus, VALUE_ZERO, value_zero_p, var_ecart_sup(), vect_coeff(), and typ_som::vecteur.

Referenced by plint(), and plint_degen().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: