PIPS
plsolution.c
Go to the documentation of this file.
1 /*
2 
3  $Id: plsolution.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 /* bool sol_entiere(Psommet sys, Pvecteur lvbase, int nb_som):
49  * Cette fonction teste si la solution est entiere
50  *
51  * resultat retourne par la fonction :
52  *
53  * boolean : true si la solution est entiere
54  * false sinon
55  *
56  * Les parametres de la fonction :
57  *
58  * Psommet sys : systeme lineaire
59  * Pvecteur lvbase: liste des variables de base du systeme
60  * int nb_som : nombre de contraintes du systeme
61  */
62 bool sol_entiere(sys,lvbase,nb_som)
63 Psommet sys;
64 Pvecteur lvbase;
65 int nb_som;
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 }
87 
88 /* bool sol_positive(Psommet sys, Pvecteur lvbase, int nb_som):
89  * Cette fonction teste si la solution est positive
90  *
91  * On deduit la solution du systeme lineaire a l'aide de la liste des variables de base
92  * du systeme. Chaque variable de base n'apparait que dans une des contraintes du systeme.
93  * La valeur d'une variable de base dans le systeme est egale a la constante de la
94  * contrainte divisee par le coefficient de la variable dans cette contrainte.
95  *
96  * resultat retourne par la fonction :
97  *
98  * boolean : true si la solution est positive
99  * false sinon
100  *
101  * Les parametres de la fonction :
102  *
103  * Psommet sys : systeme lineaire
104  * Pvecteur lvbase: liste des variables de base du systeme
105  * int nb_som : nombre de contraintes du systeme
106  */
107 bool sol_positive(sys,lvbase,nb_som)
108 Psommet sys;
109 Pvecteur lvbase;
110 int nb_som;
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 }
140 
141 
142 bool sol_positive_simpl(sys,lvbase,lvsup,nb_som)
143 Psommet sys;
144 Pvecteur lvbase;
145 Pvecteur lvsup;
146 int nb_som;
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 }
179 /* Psolution sol_finale(Psommet sys, Pvecteur lvbase, int nb_som):
180  * Calcul de la solution finale du programme lineaire a partir du
181  * systeme final et de la liste des variables de base
182  *
183  * resultat retourne par la fonction :
184  *
185  * Psolution : solution finale
186  * NULL : si le systeme est infaisable
187  *
188  * Les parametres de la fonction :
189  *
190  * Psommet sys : systeme lineaire
191  * Pvecteur lvbase: liste des variables de base du systeme
192  * int nb_som : nombre de contraintes du systeme
193  */
194 Psolution sol_finale(sys,lvbase,nb_som)
195 Psommet sys;
196 Pvecteur lvbase;
197 int nb_som;
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_pos_p(val)
#define VALUE_ZERO
#define value_notzero_p(val)
#define value_uminus(val)
unary operators on values
#define value_zero_p(val)
int Value
#define value_mod(v1, v2)
#define value_neg_p(val)
#define value_div(v1, v2)
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
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
bool sol_positive_simpl(Psommet sys, Pvecteur lvbase, Pvecteur lvsup, int nb_som)
Definition: plsolution.c:142
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()
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
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
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