PIPS
pldual.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 pldual.c:

Go to the source code of this file.

Macros

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

Functions

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'algorithme dual du simplexe. More...
 
Variable var_pivotd (Psommet eq, Psommet fonct)
 int var_pivotd(Psommet eq, Psommet fonct): recherche de la nouvelle variable pivot entrant dans la base au cours de l'execution de l'algorithme dual du simplexe More...
 
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, Pbase * b): execution d'un pas de l'algorithme dual du simplexe i.e. More...
 
bool dual_pivot (Psysteme sys, Psysteme *syst_result, Psommet *fonct, int *nb_som, Pvecteur *lvbase)
 bool dual_pivot(Psysteme sys, Psysteme * syst_result, Psommet * fonct, int * nb_som, Pvecteur * lvbase): Algorithme dual du simplexe (c.f. More...
 
Psysteme dual (Psysteme sys, Psommet fonct)
 Psysteme dual(Psysteme ps, Psommet fonct): Algorithme dual du simplexe avec initialisation des parametres. More...
 
Psysteme dual_positive (Psysteme sys, Psommet fonct)
 

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 pldual.c.

Function Documentation

◆ dual()

Psysteme dual ( Psysteme  sys,
Psommet  fonct 
)

Psysteme dual(Psysteme ps, Psommet fonct): Algorithme dual du simplexe avec initialisation des parametres.

resultat retourne par la fonction :

Psysteme : systeme final dont on peut deduire la valeur des differentes variables du systeme.

NULL : si le systeme initial est non faisable.

Les parametres de la fonction :

! Psysteme sys : systeme lineaire ! Psommet fonct : fonction economique du programme lineaire

Definition at line 351 of file pldual.c.

354 {
355 
356  Psysteme syst_result = NULL;
357  Pvecteur lvbase = NULL;
358  int nb_som = 0;
359 
360  dual_pivot(sys,&syst_result,&fonct,&nb_som,&lvbase);
361  vect_rm(lvbase);
362  return(syst_result);
363 }
bool dual_pivot(Psysteme sys, Psysteme *syst_result, Psommet *fonct, int *nb_som, Pvecteur *lvbase)
bool dual_pivot(Psysteme sys, Psysteme * syst_result, Psommet * fonct, int * nb_som,...
Definition: pldual.c:297
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78

References dual_pivot(), and vect_rm().

Referenced by chernikova().

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

◆ dual_pivot()

bool dual_pivot ( Psysteme  sys,
Psysteme syst_result,
Psommet fonct,
int nb_som,
Pvecteur lvbase 
)

bool dual_pivot(Psysteme sys, Psysteme * syst_result, Psommet * fonct, int * nb_som, Pvecteur * lvbase): Algorithme dual du simplexe (c.f.

Programmation mathematique - tome 1 . M.MINOUX (83) )

resultat retourne par la fonction :

bool : == true si le systeme a une solution == false sinon

Le parametre SYST_RESULT est le systeme final (dont on peut deduire la valeur des differentes variables du systeme) . S'il est vide, c'est que le systeme initial est non faisable.

Les parametres de la fonction :

! Psysteme sys : systeme lineaire Psysteme syst_result: systeme lineaire resultant de l'execution ! Psommet fonct : fonction economique du programme lineaire ! Pvecteur lvbase : liste des variables de base du systeme ! int nb_som : nombre de contraintes du systeme

Definition at line 297 of file pldual.c.

303 {
304  Psommet som = (Psommet) NULL;
305  int nbvars = 0;
306  Pbase b = BASE_NULLE;
307 #ifdef TRACE
308  printf(" ** algorithme dual du simplexe \n");
309 #endif
310  if (sys != (Psysteme) NULL) {
311  nbvars = sys->dimension;
312  b = base_dup(sys->base);
313  som = sys_som_conv(sys,nb_som);
314 
315  som = eq_in_ineq(&som,nb_som,lvbase);
316  som = var_ecart_sup(som,*nb_som,lvbase,&nbvars,&b);
317 
318  while( (som != (Psommet) NULL) &&
319  (dual_pivot_pas(&som,lvbase,*nb_som,*fonct,&(sys->dimension),
320  &(sys->base)) == true) );
321 
322  *syst_result = som_sys_conv(som);
323  if (*syst_result) {
324  (*syst_result)->dimension = sys->dimension;
325  (*syst_result)->base = base_dup(sys->base);
326  }
327  }
328  if(som == (Psommet) NULL);
329  else sommets_rm(som);
330 
331  return((boolean) (som != (Psommet) NULL));
332 }
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 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
int printf()
struct typ_som * Psommet
structure de donnees Sommet
void sommets_rm(Psommet)
void sommets_rm(Psommet ps): liberation de l'espace memoire alloue a une liste de sommets
Definition: sommets.c:83
Pbase base
Definition: sc-local.h:75
int dimension
Definition: sc-local.h:74
structure de donnees Sommet
Definition: sommet-local.h:64
#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

References base_dup(), BASE_NULLE, dual_pivot_pas(), eq_in_ineq(), printf(), sommets_rm(), and var_ecart_sup().

Referenced by dual(), and dual_positive().

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

◆ dual_pivot_pas()

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, Pbase * b): execution d'un pas de l'algorithme dual du simplexe i.e.

  • ajout des variables d'ecart
  • recherche d'un pivot
  • on effectue le pivot

    resultat retourne par la fonction :

    bool : == false si l'on n'a pas pu effectuer un pas de l'algorithme dual == true si l'on a pu effectuer un pas de l'algorithme

    le systeme est modifie. Si le systeme retourne est NULL, c'est que le systeme est non borne.

    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

recherche de la ligne pivot

recherche de la variable pivot

operation PIVOT

Definition at line 213 of file pldual.c.

220 {
221 
222  Psommet ligne_entrant =NULL;
223  Psommet *ps=NULL;
224  int no_som = 0;
225  bool result = true;
226 
227 #ifdef TRACE
228  printf(" *** alg. dual - un pas de l'algorithme \n");
229 #endif
230  ps = sys;
231 
232  *ps = var_ecart_sup(*ps,nb_som,lvbase,nbvars,b);
233 
234  /* recherche de la ligne pivot */
235  ligne_entrant = ligne_pivot(*ps,nb_som,&no_som);
236  if ((ligne_entrant != NULL))
237  {
238  Variable var_entrant = NULL;
239  /* recherche de la variable pivot */
240  var_entrant = var_pivotd(ligne_entrant,fonct);
241 
242  if (VARIABLE_DEFINED_P(var_entrant))
243  {
244  /* operation PIVOT */
245  pivoter(*ps,ligne_entrant,var_entrant,fonct);
246  lvbase_ote_no_ligne(no_som,lvbase);
247  lvbase_add(var_entrant,no_som,lvbase);
248  }
249  else {
250  if (VARIABLE_UNDEFINED_P(var_entrant))
251  {
252  sommets_rm(*sys);
253  *sys = NULL;
254  result = false;
255 #ifdef TRACE
256  printf (" --- alg. dual - le probleme n'est pas borne \n");
257 #endif
258  }
259  }
260  }
261  else
262  {
263  result = false;
264 #ifdef TRACE
265  printf (" --- alg. dual - plus de ligne pivot possible \n");
266 #endif
267  }
268 
269  return (result);
270 
271 }
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
void pivoter(Psommet sys, Psommet ligne, Variable var, Psommet fonct)
Definition: plpivoter.c:131
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
#define VARIABLE_DEFINED_P(v)
Definition: vecteur-local.h:66
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 VARIABLE_UNDEFINED_P(v)
Definition: vecteur-local.h:65

References ligne_pivot(), lvbase_add(), lvbase_ote_no_ligne(), pivoter(), printf(), sommets_rm(), var_ecart_sup(), var_pivotd(), VARIABLE_DEFINED_P, and VARIABLE_UNDEFINED_P.

Referenced by dual_pivot(), plint_pas(), and plreal().

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

◆ dual_positive()

Psysteme dual_positive ( Psysteme  sys,
Psommet  fonct 
)
Parameters
fonctPsommet ???

Definition at line 365 of file pldual.c.

368 {
369 
370  Psysteme syst_result = NULL;
371  Pvecteur lvbase = NULL;
372  int nb_som = 0;
373 
374  dual_pivot(sys,&syst_result,&fonct,&nb_som,&lvbase);
375  if (!sol_positive(sys,lvbase,nb_som)) {
376  sc_rm(syst_result);
377  syst_result=NULL;}
378 
379  vect_rm(lvbase);
380  return(syst_result);
381 }
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
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

References dual_pivot(), sc_rm(), sol_positive(), and vect_rm().

+ Here is the call graph for this function:

◆ ligne_pivot()

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'algorithme dual du simplexe.

resultat retourne par la fonction : Psommet : prochaine contrainte "pivot"

Les parametres de la fonction :

Psommet sys : systeme lineaire int nb_som : nombre de contraintes du systeme int no_som : place de la contrainte dans le systeme (no de la ligne)

initialisation du minimum

Definition at line 66 of file pldual.c.

70 {
71  Psommet som1,som2;
72  Psommet lpivot= NULL;
73  double min;
74  double coeff;
75  int nb_som1 = nb_som;
76  Value den;
77  double dden;
78 
79 #ifdef TRACE
80  printf(" **** alg. dual - recherche de la ligne pivot \n");
81 #endif
82 
83 
84  if (sys) den = sys->denominateur;
85  /* initialisation du minimum */
86 
87  for (som2 = sys;som2 != NULL
88  && value_posz_p(vect_coeff(TCST,som2->vecteur)) ;
89  som2 = som2->succ,nb_som1 --);
90  den = som2->denominateur;
91  dden = VALUE_TO_DOUBLE(den);
92 
93  min = -VALUE_TO_DOUBLE(vect_coeff(TCST,som2->vecteur))/dden;
94  lpivot = som2;
95  *no_som = nb_som1;
96  nb_som1 --;
97  for (som1 = som2->succ;som1 != NULL;som1 = som1->succ)
98  {
99  den = som1->denominateur;
100  if ((coeff = -VALUE_TO_DOUBLE(vect_coeff(TCST,som1->vecteur))/dden) < 0
101  && coeff < min)
102  {
103  min = coeff;
104  lpivot = som1;
105  *no_som = nb_som1;
106 
107  } nb_som1--;
108  }
109  return(lpivot);
110 }
#define VALUE_TO_DOUBLE(val)
int Value
#define value_posz_p(val)
#define min(a, b)
struct typ_som * succ
Definition: sommet-local.h:68
Pvecteur vecteur
Definition: sommet-local.h:66
Value denominateur
Definition: sommet-local.h:67
#define TCST
VARIABLE REPRESENTANT LE TERME CONSTANT.
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 typ_som::denominateur, min, printf(), typ_som::succ, TCST, value_posz_p, VALUE_TO_DOUBLE, vect_coeff(), and typ_som::vecteur.

Referenced by dual_pivot_pas(), and plint_pas().

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

◆ var_pivotd()

Variable var_pivotd ( Psommet  eq,
Psommet  fonct 
)

int var_pivotd(Psommet eq, Psommet fonct): recherche de la nouvelle variable pivot entrant dans la base au cours de l'execution de l'algorithme dual du simplexe

resultat retourne par la fonction : int : variable "pivot" entrant dans la base

Les parametres de la fonction :

Psommet eq : contrainte du systeme Psommet fonct : fonction economique du programme lineaire

initialisation du minimum

pv = vect_tri(eq->vecteur, is_inferior_variable);

Definition at line 125 of file pldual.c.

127 {
128  Pvecteur pv= VECTEUR_NUL;
129  double min=0, min2;
130  Variable no_lpivot = NULL;
131  Value cf2 = VALUE_ZERO;
132  bool trouve = false;
133 
134 #ifdef TRACE
135  printf(" **** alg. dual - recherche de la variable pivot \n");
136 #endif
137 
138  if (eq && fonct)
139  {
140  /* initialisation du minimum */
141  Value cst = vect_coeff(TCST,eq->vecteur);
142  Pvecteur pv3;
143  vect_chg_coeff(&(eq->vecteur),TCST,0);
145  /* pv = vect_tri(eq->vecteur, is_inferior_variable); */
146  for(pv3 =pv; pv3->succ!=NULL;pv3=pv3->succ);
147  pv3->succ = vect_new(TCST,cst);
148 
149  for (; pv!= NULL && !trouve; pv = pv->succ) {
150  if ((var_of(pv) != NULL) && (value_neg_p(val_of(pv))) &&
151  (value_posz_p(cf2 = vect_coeff(var_of(pv),fonct->vecteur))))
152  {
153  double d1,d2 = 0;
154  d1 = VALUE_TO_DOUBLE(pv->val) *
156  d2 = VALUE_TO_DOUBLE(cf2) *
157  VALUE_TO_DOUBLE(eq->denominateur) ;
158  min = - d2/d1;
159  trouve = true;
160  no_lpivot = var_of(pv);
161  }
162  }
163  if (pv != VECTEUR_NUL) {
164  for (; pv!= NULL && trouve ;pv= pv->succ) {
165  if ((var_of(pv) != NULL) && value_neg_p(val_of(pv)) &&
166  value_posz_p(cf2 = vect_coeff(var_of(pv),fonct->vecteur)))
167  {
168  double d1,d2 = 0;
169  d1 = VALUE_TO_DOUBLE(cf2) *
170  VALUE_TO_DOUBLE(eq->denominateur);
171  d2 = VALUE_TO_DOUBLE(pv->val) *
173  min2 = -d1/d2;
174  if (min2 < min) {
175  min = min2;
176  no_lpivot = var_of(pv);
177  }
178  }
179  }
180  }
181  }
182  vect_rm(pv);
183 
184  return (no_lpivot);
185 }
#define VALUE_ZERO
#define value_neg_p(val)
Pcontrainte eq
element du vecteur colonne du systeme donne par l'analyse
Definition: sc_gram.c:108
Pvecteur vecteur
Value val
Definition: vecteur-local.h:91
struct Svecteur * succ
Definition: vecteur-local.h:92
#define val_of(varval)
#define VECTEUR_NUL
DEFINITION DU VECTEUR NUL.
#define var_of(varval)
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
int vect_compare(Pvecteur *pv1, Pvecteur *pv2)
for qsort, returns:
Definition: unaires.c:352
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

References eq, min, printf(), Svecteur::succ, TCST, Svecteur::val, val_of, value_neg_p, value_posz_p, VALUE_TO_DOUBLE, VALUE_ZERO, var_of, vect_chg_coeff(), vect_coeff(), vect_compare(), vect_new(), vect_rm(), vect_sort(), Scontrainte::vecteur, and VECTEUR_NUL.

Referenced by dual_pivot_pas(), and plint_degen().

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