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

Go to the source code of this file.

Macros

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

Functions

Psommet gomory_trait_eq (Psommet eq, Variable var)
 Psommet gomory_trait_eq(Psommet eq, Variable var): Cette fonction utilise une contrainte du systeme en vue d'obtenir une coupe de Gomory servant a rendre entiere une des variables du systeme. More...
 
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 d'une contrainte dont la variable de base est non entiere. More...
 

Macro Definition Documentation

◆ MALLOC

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

package plint

Definition at line 45 of file plgomory.c.

Function Documentation

◆ gomory_eq()

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 d'une contrainte dont la variable de base est non entiere.

resultat retourne par la fonction :

Psommet : contrainte dont la variable de base est non entiere

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 int no_som : place de la contrainte dans le systeme (no de la ligne) Variable var: variable non entiere

on a trouve une variable de base non entiere

on choisit celle de plus grand denominateur

Definition at line 153 of file plgomory.c.

159 {
160  Psommet eq=NULL;
161  Psommet result= NULL;
162  int nb_som1 = nb_som;
163  Value a;
164  Value max = VALUE_ZERO;
165  Variable v1 = NULL;
166  bool borne = true;
167 
168 #ifdef TRACE
169  printf(" ** Gomory - recherche d'une variable non_entiere \n");
170 #endif
171  *var = NULL;
172 
173  for (eq = *sys ;eq != NULL && borne; eq=eq->succ) {
174  Value b0,den2;
175 
176  if ((borne = test_borne(eq))) {
177  if (((v1 = find_vbase(eq,lvbase))) != NULL) {
178  den2 = vect_coeff(v1,eq->vecteur);
180 
181  /* on a trouve une variable de base non entiere */
182  /* on choisit celle de plus grand denominateur */
183 
184  if (value_notzero_p(value_mod(b0,den2))) {
185  Value p1=eq->denominateur;
186  Value p2 = value_abs(b0);
187  Value p3 = pgcd(p2,p1);
188 
189  a = value_div(p1,p3);
190  value_absolute(a);
191  if (value_gt(a,max)) {
192  max = a;
193  *var = v1;
194  *no_som = nb_som1;
195  result = eq;
196  }
197  }
198  }
199  nb_som1 --;
200  }
201  else {
202 #ifdef TRACE
203  printf (" -- le systeme est non borne !!! \n ");
204 #endif
205  sommets_rm(*sys);
206  *sys = NULL;
207  }
208  }
209  if (value_notzero_p(max))
210  return (result);
211  else
212  return (NULL);
213 }
#define VALUE_ZERO
#define value_absolute(ref)
#define value_gt(v1, v2)
#define pgcd(a, b)
Pour la recherche de performance, selection d'une implementation particuliere des fonctions.
#define value_notzero_p(val)
#define value_uminus(val)
unary operators on values
int Value
#define value_abs(val)
#define value_mod(v1, v2)
#define value_div(v1, v2)
#define max(a, b)
bool test_borne(Psommet eq)
Definition: plsomvb-test.c:87
Variable find_vbase(Psommet eq, Pvecteur lvbase)
Variable find_vbase(Psommet eq, Pvecteur lvbase): Recherche de la variable de base d'une contrainte.
Definition: plvbase.c:188
Pcontrainte eq
element du vecteur colonne du systeme donne par l'analyse
Definition: sc_gram.c:108
int printf()
void sommets_rm(Psommet)
void sommets_rm(Psommet ps): liberation de l'espace memoire alloue a une liste de sommets
Definition: sommets.c:83
Pvecteur vecteur
struct Scontrainte * succ
structure de donnees Sommet
Definition: sommet-local.h:64
#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 eq, find_vbase(), max, pgcd, printf(), sommets_rm(), Scontrainte::succ, TCST, test_borne(), value_abs, value_absolute, value_div, value_gt, value_mod, value_notzero_p, value_uminus, VALUE_ZERO, vect_coeff(), and Scontrainte::vecteur.

Referenced by plint_pas().

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

◆ gomory_trait_eq()

Psommet gomory_trait_eq ( Psommet  eq,
Variable  var 
)

Psommet gomory_trait_eq(Psommet eq, Variable var): Cette fonction utilise une contrainte du systeme en vue d'obtenir une coupe de Gomory servant a rendre entiere une des variables du systeme.

resultat retourne par la fonction :

Psommet : inegalite correspondant a la coupe qu'il faut ajouter au systeme pour rendre la variable entiere

Les parametres de la fonction :

Psommet eq : contrainte du systeme dont la variable de base est non entiere Variable var : variable de base non entiere

calcul du determinant D

calcul de la coupe de Gomory

calcul de lambda = coefficient multiplicateur permettant d'obtenir la coupe optimale

optimisation de la coupe de Gomory

Definition at line 62 of file plgomory.c.

65 {
66  Psommet ps1 = NULL;
67  Pvecteur pv1,pv2;
68  Value in1;
69  Value b0;
70  Value lambda = VALUE_ONE;
71  int sgn_op= 1;
72  Value d = VALUE_ONE;
73 
74 #ifdef TRACE
75  printf(" ** Gomory - ajout d'une eq. verifiant les cond. de Gomory \n");
76 #endif
77 
78  if (eq != NULL && var != NULL)
79  {
80  /* calcul du determinant D */
81  Value p1, p2,tmp;
82  p1 = vect_coeff(var,eq->vecteur);
83  value_absolute(p1);
84  p2 =vect_pgcd_all(eq->vecteur);
85  value_absolute(p2);
86 
87  d = value_div(p1,p2);
88 
89  /* calcul de la coupe de Gomory */
90  ps1= (Psommet)MALLOC(sizeof(Ssommet),SOMMET,"gomory_trait_eq");
91  ps1->eq_sat = (int *)MALLOC(sizeof(int),INTEGER,"gomory_trait_eq");
92  pv1 = vect_dup(eq->vecteur);
93  ps1->denominateur = VALUE_ONE;
94  *(ps1->eq_sat) = -1;
95  ps1->succ = NULL;
96  vect_chg_coeff(&pv1,var,VALUE_ZERO);
97  ps1->vecteur = pv1;
98  tmp = vect_coeff(var,eq->vecteur);
99  sgn_op = -value_sign(tmp);
100  if (value_notzero_p(d)) {
101  for (pv2=pv1;pv2 != NULL; pv2= pv2->succ) {
102  if (sgn_op==-1)
103  value_oppose(pv2->val);
104  value_modulus(pv2->val,d);
105  if (value_neg_p(pv2->val))
106  value_addto(pv2->val,d);
107  }
108  }
109  b0 = vect_coeff(TCST,pv1);
110  value_absolute(b0);
111 
112  /* calcul de lambda = coefficient multiplicateur permettant
113  d'obtenir la coupe optimale */
114 
115  if (value_notzero_p(b0)) {
116  in1 = value_div(d,b0);
117  lambda = value_zero_p(value_mod(d,b0))? (in1-1) : in1;
118  if (value_zero_p(lambda))
119  lambda = VALUE_ONE;
120  }
121 
122  /* optimisation de la coupe de Gomory */
123  if (value_gt(lambda,VALUE_ONE))
124  for (pv2 = pv1;pv2!= NULL; pv2=pv2->succ)
125  {
126  value_product(pv2->val,lambda);
127  value_modulus(pv2->val,d);
128  }
129 
130  vect_chg_sgn(pv1);
131 
132  ps1->vecteur = vect_clean(ps1->vecteur);
133  }
134  return (ps1);
135 }
#define value_sign(v)
trian operators on values
#define value_oppose(ref)
#define value_modulus(ref, val)
#define value_zero_p(val)
#define value_addto(ref, val)
#define value_product(v, w)
#define VALUE_ONE
#define value_neg_p(val)
Value vect_pgcd_all(Pvecteur v)
Value vect_pgcd(Pvecteur v): calcul du pgcd de tous les coefficients non nul d'un vecteur v.
Definition: reductions.c:108
#define MALLOC(s, t, f)
package plint
Definition: plgomory.c:45
Pvecteur vect_clean(Pvecteur v)
Pvecteur vect_clean(Pvecteur v): elimination de tous les couples dont le coefficient vaut 0 dans le v...
Definition: scalaires.c:80
void vect_chg_sgn(Pvecteur v)
void vect_chg_sgn(Pvecteur v): multiplie v par -1
Definition: scalaires.c:151
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
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
Value val
Definition: vecteur-local.h:91
struct Svecteur * succ
Definition: vecteur-local.h:92
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
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_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, eq, typ_som::eq_sat, MALLOC, printf(), SOMMET, typ_som::succ, Svecteur::succ, TCST, Svecteur::val, value_absolute, value_addto, value_div, value_gt, value_mod, value_modulus, value_neg_p, value_notzero_p, VALUE_ONE, value_oppose, value_product, value_sign, VALUE_ZERO, value_zero_p, vect_chg_coeff(), vect_chg_sgn(), vect_clean(), vect_coeff(), vect_dup(), vect_pgcd_all(), Scontrainte::vecteur, and typ_som::vecteur.

Referenced by plint_pas().

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