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

Go to the source code of this file.

Macros

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

Functions

Psysteme find_eg (Psysteme sys)
 Psysteme find_eg(Psysteme sys): Recherche des egalites du systeme en nombres entiers sys parmi ses inegalites. 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 find-eg.c.

Function Documentation

◆ find_eg()

Psysteme find_eg ( Psysteme  sys)

Psysteme find_eg(Psysteme sys): Recherche des egalites du systeme en nombres entiers sys parmi ses inegalites.

Le systeme initial est modifie.

Les parametres de la fonction :

!Psysteme ps : systeme lineaire

Definition at line 64 of file find-eg.c.

66 {
67  Psysteme sys2=NULL;
68  Psysteme sys3=NULL;
69  Psommet som=NULL;
70  Psommet ps = NULL ;
71  Psommet fonct = fonct_init();
72  Psolution sol1 = NULL;
73  Pvecteur pv;
74  int nbvars;
75  int exnbv;
76  int nbsom;
77  /*
78  * respectivement la valeur de la constante de l'equation
79  * et la valeur de la constante de la fonction economique
80  */
81  Value b0,f0;
82 
83  sys = sc_elim_redond(sys);
84  if (sys != (Psysteme) NULL) {
85  nbvars = sys->dimension;
86  ps = sys_som_conv(sys,&nbsom);
87  exnbv = nbvars;
88  for (som = ps;((nbsom != 0) && (som!= NULL));som=som->succ)
89 
90  {
91  if (*(som->eq_sat) == -1) {
92  /*
93  * on choisit une inequation A.x = b0
94  */
95 
96  nbvars = exnbv;
97  /*
98  *on cree une fonction economique identique au
99  * membre gauche de l'inequation
100  * fonct->vecteur = A.x
101  */
102  fonct->denominateur = VALUE_ONE;
103  fonct->vecteur = vect_dup(som->vecteur);
105  b0 = value_uminus(vect_coeff(TCST,som->vecteur));
106  pv = vect_dup(som->vecteur);
107 
108  /*
109  * on enleve l'inegalite choisie du systeme
110  */
111  vect_rm(som->vecteur);
112  som->vecteur = VECTEUR_NUL;
113 
114  if ((sys2 = som_sys_conv(ps)) != (Psysteme) NULL) {
115  sys2->dimension = sys->dimension;
116  sys2->base = vect_dup(sys->base);
117  }
118 
119  /*
120  * on calcule le nouveau programme linaire
121  * ainsi forme
122  */
123  sys3 = plint(sys2,fonct,&sol1);
124  /*
125  * si la solution entiere trouvee donne pour
126  * minimum a la fonction economique la valeur
127  * de la constante b0 ==> cette inegalite peut
128  * etre transformee en egalite
129  */
130  if (sys3 != NULL && fonct != NULL) {
131  Value x = fonct->denominateur;
132  f0 = vect_coeff(TCST,fonct->vecteur);
133  value_division(f0,x);
134  if (value_eq(b0,f0))
135  *(som->eq_sat) = 1;
136  }
137 
138  som->vecteur = pv;
139  if (fonct!= NULL) {
140  vect_rm(fonct->vecteur);
141  fonct->vecteur = NULL;
142  }
143  sc_rm(sys2);
144  sc_rm (sys3);
145  sys2 = NULL;
146  sys3 = NULL;
147  }
148  }
149 
150  if ((sys2 = som_sys_conv(ps)) != (Psysteme) NULL) {
151  sys2->dimension = sys->dimension;
152  sys2->base = vect_dup(sys->base);
153  }
154  sommets_rm(ps);
155  }
156  return(sys2);
157 }
#define VALUE_ZERO
#define value_uminus(val)
unary operators on values
int Value
#define value_eq(v1, v2)
bool operators on values
#define value_division(ref, val)
#define VALUE_ONE
Psommet fonct_init()
Definition: plfonct-eco.c:53
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 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
void sommets_rm(Psommet)
void sommets_rm(Psommet ps): liberation de l'espace memoire alloue a une liste de sommets
Definition: sommets.c:83
static char * x
Definition: split_file.c:159
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
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_NUL
DEFINITION DU VECTEUR NUL.
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
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
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 Ssysteme::base, typ_som::denominateur, Ssysteme::dimension, typ_som::eq_sat, fonct_init(), plint(), sc_rm(), sommets_rm(), typ_som::succ, TCST, value_division, value_eq, VALUE_ONE, value_uminus, VALUE_ZERO, vect_chg_coeff(), vect_coeff(), vect_dup(), vect_rm(), typ_som::vecteur, VECTEUR_NUL, and x.

+ Here is the call graph for this function: