PIPS
plsolution.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 "matrix.h"
#include "plint.h"
+ Include dependency graph for plsolution.c:

Go to the source code of this file.

Macros

#define MALLOC(s, t, f)   malloc((unsigned)(s))
 package plint More...
 
#define FREE(s, t, f)   free((char *)(s))
 

Functions

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 entiere More...
 
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 positive More...
 
bool sol_positive_simpl (Psommet sys, Pvecteur lvbase, Pvecteur lvsup, int nb_som)
 
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 programme lineaire a partir du systeme final et de la liste des variables de base. More...
 

Macro Definition Documentation

◆ FREE

#define FREE (   s,
  t,
  f 
)    free((char *)(s))

Definition at line 46 of file plsolution.c.

◆ MALLOC

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

package plint

Definition at line 45 of file plsolution.c.

Function Documentation

◆ sol_entiere()

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 entiere

resultat retourne par la fonction :

boolean : true si la solution est entiere false sinon

Les parametres de la fonction :

Psommet sys : systeme lineaire Pvecteur lvbase: liste des variables de base du systeme int nb_som : nombre de contraintes du systeme

Definition at line 62 of file plsolution.c.

66 {
67  Psommet ps1=NULL;
68  Variable var =NULL;
69  bool result = true;
70  Value cv;
71 #ifdef TRACE
72  printf(" ** la solution est elle entiere ? \n");
73 #endif
74 
75  for (ps1 = sys; ps1!= NULL && result;ps1 = ps1->succ) {
76  var = coeff_no_ligne(lvbase,nb_som);
77  if (var != NULL
78  && value_notzero_p(cv = vect_coeff(var,ps1->vecteur))
80  result = false;
81  nb_som --;
82  }
83  if (sys == NULL)
84  result = false;
85  return (result);
86 }
#define value_notzero_p(val)
int Value
#define value_mod(v1, v2)
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
int printf()
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
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 coeff_no_ligne(), printf(), typ_som::succ, TCST, value_mod, value_notzero_p, vect_coeff(), and typ_som::vecteur.

Referenced by plint_pas().

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

◆ sol_finale()

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 programme lineaire a partir du systeme final et de la liste des variables de base.

resultat retourne par la fonction :

Psolution : solution finale NULL : si le systeme est infaisable

Les parametres de la fonction :

Psommet sys : systeme lineaire Pvecteur lvbase: liste des variables de base du systeme int nb_som : nombre de contraintes du systeme

Definition at line 194 of file plsolution.c.

198 {
199  Psommet ps1=NULL;
200  Psolution sol = NULL;
201  Psolution sol1 = NULL;
202  Variable var =NULL;
203 
204 #ifdef TRACE
205  printf(" ** la solution finale est: \n");
206 
207 #endif
208 
209  for (ps1 = sys; ps1!= NULL;ps1 = ps1->succ) {
210  var = coeff_no_ligne(lvbase,nb_som);
211 
212  if (var != TCST) {
213  sol1 = (Psolution)MALLOC(sizeof(Ssolution),
214  SOLUTION,"sol_finale");
215  sol1->var = var;
216  sol1->val = value_uminus(vect_coeff(TCST,ps1->vecteur));
217  sol1->denominateur = vect_coeff(var,ps1->vecteur);
218  sol1->succ = sol;
219  sol = sol1;
220 #ifdef TRACE
221  (void) printf (" %s == %f; ",
222  noms_var(sol1->var),
223  (double)(sol1->val / sol1->denominateur));
224 #endif
225  }
226  nb_som --;
227  }
228 #ifdef TRACE
229 
230  printf ("\n");
231 #endif
232  return (sol);
233 }
#define value_uminus(val)
unary operators on values
char * noms_var(entity e)
comp_expr_to_pnome.c
struct Ssolution * Psolution
#define SOLUTION
package plint: programmation lineaire en nombres entiers
Definition: plint-local.h:49
#define MALLOC(s, t, f)
package plint
Definition: plsolution.c:45
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

References coeff_no_ligne(), Ssolution::denominateur, MALLOC, noms_var(), printf(), SOLUTION, Ssolution::succ, typ_som::succ, TCST, Ssolution::val, value_uminus, Ssolution::var, vect_coeff(), and typ_som::vecteur.

Referenced by plint().

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

◆ sol_positive()

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 positive

On deduit la solution du systeme lineaire a l'aide de la liste des variables de base du systeme. Chaque variable de base n'apparait que dans une des contraintes du systeme. La valeur d'une variable de base dans le systeme est egale a la constante de la contrainte divisee par le coefficient de la variable dans cette contrainte.

resultat retourne par la fonction :

boolean : true si la solution est positive false sinon

Les parametres de la fonction :

Psommet sys : systeme lineaire Pvecteur lvbase: liste des variables de base du systeme int nb_som : nombre de contraintes du systeme

Definition at line 107 of file plsolution.c.

111 {
112  Psommet ps1=NULL;
113  Value in1 = VALUE_ZERO;
114  Variable var = NULL;
115  Value b;
116  bool result = true;
117 
118 #ifdef TRACE
119  printf(" ** la solution est elle positive ? \n");
120 #endif
121 
122  for (ps1 = sys; ps1!= NULL && result;ps1 = ps1->succ) {
123  var = coeff_no_ligne(lvbase,nb_som);
124  if (var != NULL) {
125  Value v1 = 0;
126  b = value_uminus(vect_coeff(TCST,ps1->vecteur));
127  if ( value_notzero_p(v1 = vect_coeff(var,ps1->vecteur)))
128  in1 = value_div(b,v1);
129  if (value_neg_p(in1)) {
130  result = false;
131  printf ("sol. negative \n");
132  }
133  }
134  nb_som --;
135  }
136  if (sys == NULL)
137  result = false;
138  return (result);
139 }
#define VALUE_ZERO
#define value_neg_p(val)
#define value_div(v1, v2)

References coeff_no_ligne(), printf(), typ_som::succ, TCST, value_div, value_neg_p, value_notzero_p, value_uminus, VALUE_ZERO, vect_coeff(), and typ_som::vecteur.

Referenced by dual_positive(), and plint_pas().

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

◆ sol_positive_simpl()

bool sol_positive_simpl ( Psommet  sys,
Pvecteur  lvbase,
Pvecteur  lvsup,
int  nb_som 
)

Definition at line 142 of file plsolution.c.

147 {
148  Psommet ps1=NULL;
149  Value in1 = VALUE_ZERO;
150  Variable var = NULL;
151  Value b;
152  bool result = true;
153 
154 #ifdef TRACE
155  printf(" ** la solution est elle positive ? \n");
156 #endif
157 
158  for (ps1 = sys; ps1!= NULL && result;ps1 = ps1->succ) {
159  var = coeff_no_ligne(lvbase,nb_som);
160  if (var != NULL) {
161  Value v1 = 0,tmp;
162  b = value_uminus(vect_coeff(TCST,ps1->vecteur));
163  if ( value_notzero_p(v1 = vect_coeff(var,ps1->vecteur)))
164  in1 = value_div(b,v1);
165  tmp = vect_coeff(var,lvsup);
166  if ((value_neg_p(in1) && value_zero_p(tmp))
167  || (value_pos_p(in1) && value_notzero_p(tmp)))
168  {
169  result = false;
170  printf ("sol. negative \n");
171  }
172  }
173  nb_som --;
174  }
175  if (sys == NULL)
176  result = false;
177  return (result);
178 }
#define value_pos_p(val)
#define value_zero_p(val)

References coeff_no_ligne(), printf(), typ_som::succ, TCST, value_div, value_neg_p, value_notzero_p, value_pos_p, value_uminus, VALUE_ZERO, value_zero_p, vect_coeff(), and typ_som::vecteur.

Referenced by primal_positive().

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