PIPS
binaires.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include "linear_assert.h"
#include "boolean.h"
#include "arithmetique.h"
#include "vecteur.h"
#include "contrainte.h"
+ Include dependency graph for binaires.c:

Go to the source code of this file.

Functions

int contrainte_subst_ofl (Variable v, Pcontrainte def, Pcontrainte c, bool eq_p)
 package contrainte - operations binaires More...
 
int contrainte_subst (Variable v, Pcontrainte def, Pcontrainte c, bool eq_p)
 
Pcontrainte contrainte_substitute_dimension (Pcontrainte e, Variable i, Pvecteur v)
 
Pcontrainte inegalite_comb (Pcontrainte posit, Pcontrainte negat, Variable v)
 
Pcontrainte inegalite_comb_ofl (Pcontrainte posit, Pcontrainte negat, Variable v)
 
int contrainte_subst_ofl_ctrl (Variable v, Pcontrainte def, Pcontrainte c, bool eq_p, int ofl_ctrl)
 int contrainte_subst_ofl_ctrl(Variable v, Pcontrainte def, Pcontrainte c
Boolean eq_p, int ofl_ctrl): elimination d'une variable v entre une equation def et une contrainte, egalite ou inegalite, c. More...
 
Pcontrainte inegalite_comb_ofl_ctrl (Pcontrainte posit, Pcontrainte negat, Variable v, int ofl_ctrl)
 Pcontrainte inegalite_comb_ofl_ctrl(Pcontrainte posit, Pcontrainte negat, Variable v, int ofl_ctrl): combinaison lineaire positive des deux inegalites posit et negat eliminant la variable v. More...
 
Value eq_diff_const (Pcontrainte c1, Pcontrainte c2)
 Value eq_diff_const(Pcontrainte c1, Pcontrainte c2): calcul de la difference des deux termes constants des deux equations c1 et c2. More...
 
Value eq_sum_const (Pcontrainte c1, Pcontrainte c2)
 Value eq_sum_const(Pcontrainte c1, Pcontrainte c2): calcul de la somme des deux termes constants des deux contraintes c1 et c2. More...
 
Pcontrainte contrainte_append (Pcontrainte c1, Pcontrainte c2)
 Pcontrainte contrainte_append(c1, c2) Pcontrainte c1, c2;. More...
 
Pcontrainte extract_common_constraints (Pcontrainte *pc1, Pcontrainte *pc2, bool eq)
 common (simply equal) contraints are extracted, whether equalities or inequalities. More...
 

Function Documentation

◆ contrainte_append()

Pcontrainte contrainte_append ( Pcontrainte  c1,
Pcontrainte  c2 
)

Pcontrainte contrainte_append(c1, c2) Pcontrainte c1, c2;.

append directly c2 to c1. Neither c1 nor c2 are relevant when the result is returned.

Parameters
c11
c22

Definition at line 267 of file binaires.c.

269 {
270  Pcontrainte c;
271 
272  if (c1==NULL) return(c2);
273  if (c2==NULL) return(c1);
274  for (c=c1; c->succ!=NULL; c=c->succ);
275  c->succ=c2;
276  return(c1);
277 }
struct Scontrainte * succ

References Scontrainte::succ.

Referenced by algorithm_row_echelon_generic(), and sc_bounded_normalization().

+ Here is the caller graph for this function:

◆ contrainte_subst()

int contrainte_subst ( Variable  v,
Pcontrainte  def,
Pcontrainte  c,
bool  eq_p 
)
Parameters
defef
eq_pq_p

Definition at line 48 of file binaires.c.

52 {
53  return( contrainte_subst_ofl_ctrl(v,def,c,eq_p, NO_OFL_CTRL));
54 
55 }
int contrainte_subst_ofl_ctrl(Variable v, Pcontrainte def, Pcontrainte c, bool eq_p, int ofl_ctrl)
int contrainte_subst_ofl_ctrl(Variable v, Pcontrainte def, Pcontrainte c Boolean eq_p,...
Definition: binaires.c:107
#define NO_OFL_CTRL

References contrainte_subst_ofl_ctrl(), and NO_OFL_CTRL.

+ Here is the call graph for this function:

◆ contrainte_subst_ofl()

int contrainte_subst_ofl ( Variable  v,
Pcontrainte  def,
Pcontrainte  c,
bool  eq_p 
)

package contrainte - operations binaires

binaires.c

Parameters
defef
eq_pq_p

Definition at line 40 of file binaires.c.

44 {
45  return( contrainte_subst_ofl_ctrl(v,def,c,eq_p, FWD_OFL_CTRL));
46 }
#define FWD_OFL_CTRL

References contrainte_subst_ofl_ctrl(), and FWD_OFL_CTRL.

+ Here is the call graph for this function:

◆ contrainte_subst_ofl_ctrl()

int contrainte_subst_ofl_ctrl ( Variable  v,
Pcontrainte  def,
Pcontrainte  c,
bool  eq_p,
int  ofl_ctrl 
)

int contrainte_subst_ofl_ctrl(Variable v, Pcontrainte def, Pcontrainte c
Boolean eq_p, int ofl_ctrl): elimination d'une variable v entre une equation def et une contrainte, egalite ou inegalite, c.

La contrainte c est modifiee en substituant v par sa valeur impliquee par def.

La contrainte c est interpretee comme une inegalite et la valeur retournee vaut: -1 si la contrainte c est trivialement verifiee et peut etre eliminee 0 si la contrainte c est trivialement impossible 1 sinon (tout va bien) Si la contrainte c passee en argument etait trivialement impossible ou trivialement verifiee, aucune subsitution n'a lieu et la valeur 1 est retournee.

La substitution d'une variable dans une inegalite peut aussi introduire une non-faisabilite testable par calcul de PGCD, mais cela n'est pas fait puisqu'on ne sait pas si c est une egalite ou une inegalite. Le traitement du terme constant n'est pas decidable.

Note: il faudrait separer le probleme de la combinaison lineaire a coefficients positifs de celui de la faisabilite et de la trivialite

Le controle de l'overflow est effectue et traite par le retour du contexte correspondant au dernier CATCH(overflow_error) effectue.

cv_def = coeff de v dans def

cv_c = coeff de v dans c

il faut que cv_def soit non nul pour que la variable v puisse etre eliminee

il n'y a rien a faire si la variable v n'apparait pas dans la contrainte c

substitution inutile: variable v absente

on garde trace de la valeur de c avant substitution pour pouvoir la desallouer apres le calcul de la nouvelle

on ne fait pas de distinction entre egalites et inegalites, mais on prend soin de toujours multiplier la contrainte, inegalite potentielle, par un coefficient positif

reste malikien: cette partie ne peut pas etre faite sans savoir si on est en train de traiter une egalite ou une inegalite

=> eliminer cette c inutile

=> systeme non faisable

Parameters
defef
eq_pq_p
ofl_ctrlfl_ctrl

Definition at line 107 of file binaires.c.

112 {
113  Pvecteur save_c;
114 
115  /* cv_def = coeff de v dans def */
116  Value cv_def = vect_coeff(v,def->vecteur);
117  /* cv_c = coeff de v dans c */
118  Value cv_c = vect_coeff(v,c->vecteur);
119 
120  /* il faut que cv_def soit non nul pour que la variable v puisse etre
121  eliminee */
122  assert(value_notzero_p(cv_def));
123 
124  /* il n'y a rien a faire si la variable v n'apparait pas dans la
125  contrainte c */
126  /* substitution inutile: variable v absente */
127  if (value_zero_p(cv_c)) return 1;
128 
129  /* on garde trace de la valeur de c avant substitution pour pouvoir
130  la desallouer apres le calcul de la nouvelle */
131  save_c = c->vecteur;
132  /* on ne fait pas de distinction entre egalites et inegalites, mais
133  on prend soin de toujours multiplier la contrainte, inegalite
134  potentielle, par un coefficient positif */
135  if (value_neg_p(cv_def)) {
137  c->vecteur,cv_c,
138  def->vecteur,
139  ofl_ctrl);
140  }
141  else {
142  c->vecteur = vect_cl2_ofl_ctrl(cv_def,c->vecteur,
143  value_uminus(cv_c),
144  def->vecteur, ofl_ctrl);
145  }
146  vect_rm(save_c);
147 
148  /* reste malikien: cette partie ne peut pas etre faite sans savoir
149  si on est en train de traiter une egalite ou une inegalite */
150  if(contrainte_constante_p(c)) {
151  if(contrainte_verifiee(c,eq_p))
152  /* => eliminer cette c inutile */
153  return(-1);
154  else
155  /* => systeme non faisable */
156  return(false);
157  }
158  return(true);
159 }
#define value_notzero_p(val)
#define value_uminus(val)
unary operators on values
#define value_zero_p(val)
int Value
#define value_neg_p(val)
bool contrainte_constante_p(Pcontrainte)
bool contrainte_constante_p(Pcontrainte c): test de contrainte triviale sans variables (ie du type 0<...
Definition: predicats.c:192
bool contrainte_verifiee(Pcontrainte, bool)
bool contrainte_verifiee(Pcontrainte ineg, bool eq_p): test de faisabilite d'inegalite (eq_p == false...
Definition: predicats.c:234
#define assert(ex)
Definition: newgen_assert.h:41
Pvecteur vecteur
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
Pvecteur vect_cl2_ofl_ctrl(Value x1, Pvecteur v1, Value x2, Pvecteur v2, int ofl_ctrl)
Pvecteur vect_cl2_ofl(Value x1, Pvecteur v1, Value x2, Pvecteur v2): allocation d'un vecteur v dont l...
Definition: binaires.c:204
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 assert, contrainte_constante_p(), contrainte_verifiee(), value_neg_p, value_notzero_p, value_uminus, value_zero_p, vect_cl2_ofl_ctrl(), vect_coeff(), vect_rm(), and Scontrainte::vecteur.

Referenced by better_elim_var_with_eg(), contrainte_subst(), contrainte_subst_ofl(), and new_elim_var_with_eg().

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

◆ contrainte_substitute_dimension()

Pcontrainte contrainte_substitute_dimension ( Pcontrainte  e,
Variable  i,
Pvecteur  v 
)

Definition at line 57 of file binaires.c.

58 {
61  return e;
62 }
#define contrainte_vecteur(c)
passage au champ vecteur d'une contrainte "a la Newgen"
Pvecteur vect_substitute_dimension(Pvecteur v, Variable i, Pvecteur s)
Pvecteur vect_substitute_dimension(Pvecteur v, Variable i, Pvecteur s)
Definition: binaires.c:99

References contrainte_vecteur, and vect_substitute_dimension().

Referenced by sc_substitute_dimension().

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

◆ eq_diff_const()

Value eq_diff_const ( Pcontrainte  c1,
Pcontrainte  c2 
)

Value eq_diff_const(Pcontrainte c1, Pcontrainte c2): calcul de la difference des deux termes constants des deux equations c1 et c2.

Notes:

  • cette routine fait l'hypothese que CONTRAINTE_UNDEFINED=>CONTRAINTE_NULLE

Modifications:

  • renvoie d'une valeur non nulle meme si une des contraintes est nulles
Parameters
c11
c22

Definition at line 218 of file binaires.c.

220 {
221  if(c1!=NULL)
222  if(c2!=NULL) {
223  Value b1 = vect_coeff(TCST,c1->vecteur),
224  b2 = vect_coeff(TCST,c2->vecteur);
225  return value_minus(b1,b2);
226  }
227  else
228  return vect_coeff(TCST,c1->vecteur);
229  else
230  if(c2!=NULL)
231  return value_uminus(vect_coeff(TCST,c2->vecteur));
232  else
233  return VALUE_ZERO;
234 }
#define VALUE_ZERO
#define value_minus(v1, v2)
Value b2
Definition: sc_gram.c:105
Value b1
booleen indiquant quel membre est en cours d'analyse
Definition: sc_gram.c:105
#define TCST
VARIABLE REPRESENTANT LE TERME CONSTANT.

References b1, b2, TCST, value_minus, value_uminus, VALUE_ZERO, and vect_coeff().

Referenced by sc_check_inequality_redundancy(), sc_elim_simple_redund_with_eq(), and sc_elim_simple_redund_with_ineq().

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

◆ eq_sum_const()

Value eq_sum_const ( Pcontrainte  c1,
Pcontrainte  c2 
)

Value eq_sum_const(Pcontrainte c1, Pcontrainte c2): calcul de la somme des deux termes constants des deux contraintes c1 et c2.

Notes:

  • cette routine fait l'hypothese que CONTRAINTE_UNDEFINED=>CONTRAINTE_NULLE
Parameters
c11
c22

Definition at line 243 of file binaires.c.

245 {
246  if(c1!=NULL)
247  if(c2!=NULL) {
248  Value b1 = vect_coeff(TCST,c1->vecteur),
249  b2 = vect_coeff(TCST,c2->vecteur);
250  return value_plus(b1, b2);
251  }
252  else
253  return vect_coeff(TCST,c1->vecteur);
254  else
255  if(c2!=NULL)
256  return vect_coeff(TCST,c2->vecteur);
257  else
258  return VALUE_ZERO;
259 }
#define value_plus(v1, v2)
binary operators on values

References b1, b2, TCST, value_plus, VALUE_ZERO, and vect_coeff().

Referenced by sc_check_inequality_redundancy().

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

◆ extract_common_constraints()

Pcontrainte extract_common_constraints ( Pcontrainte pc1,
Pcontrainte pc2,
bool  eq 
)

common (simply equal) contraints are extracted, whether equalities or inequalities.

returns the common extracted constaints. WARNING: *pc1 and *pc2 are modified.

common!

link to result.

clean

get to next.

Parameters
pc1c1
pc2c2
eqq

Definition at line 285 of file binaires.c.

286 {
287  Pcontrainte c = CONTRAINTE_UNDEFINED, c1, c2, c1p, c2p, nc1, nc2;
288 
289  for (c1 = *pc1,
290  c1p = CONTRAINTE_UNDEFINED,
291  nc1 = c1? c1->succ: CONTRAINTE_UNDEFINED;
292  c1;
293  c1p = (c1==nc1)? c1p: c1,
294  c1 = nc1,
295  nc1 = c1? c1->succ: CONTRAINTE_UNDEFINED)
296  {
297  for (c2 = *pc2,
298  c2p = CONTRAINTE_UNDEFINED,
299  nc2 = c2? c2->succ: CONTRAINTE_UNDEFINED;
300  c2;
301  c2p = (c2==nc2)? c2p: c2,
302  c2 = nc2,
303  nc2 = c2? c2->succ: CONTRAINTE_UNDEFINED)
304  {
305  if ((eq && egalite_equal(c1, c2)) || (!eq && contrainte_equal(c1, c2)))
306  {
307  /* common! */
308  Pcontrainte sc1 = c1->succ, sc2 = c2->succ;
309 
310  c1->succ = c, c = c1; /* link to result. */
311  c2->succ = NULL, contrainte_free(c2); /* clean */
312 
313  if (c1p) c1p->succ = sc1; else *pc1 = sc1;
314  if (c2p) c2p->succ = sc2; else *pc2 = sc2;
315 
316  /* get to next. */
317  c1 = nc1;
318  c2 = nc2 = CONTRAINTE_UNDEFINED;
319  }
320  }
321  }
322 
323  return c;
324 }
#define CONTRAINTE_UNDEFINED
Pcontrainte contrainte_free(Pcontrainte c)
Pcontrainte contrainte_free(Pcontrainte c): liberation de l'espace memoire alloue a la contrainte c a...
Definition: alloc.c:184
bool contrainte_equal(Pcontrainte, Pcontrainte)
bool contrainte_equal(Pcontrainte c1, Pcontrainte c2): test d'egalite des contraintes c1 et c2; elles...
Definition: predicats.c:128
bool egalite_equal(Pcontrainte, Pcontrainte)
bool egalite_equal(Pcontrainte eg1, Pcontrainte eg2): teste l'equivalence de deux egalites; leurs coe...
Definition: predicats.c:98
Pcontrainte eq
element du vecteur colonne du systeme donne par l'analyse
Definition: sc_gram.c:108

References contrainte_equal(), contrainte_free(), CONTRAINTE_UNDEFINED, egalite_equal(), eq, and Scontrainte::succ.

Referenced by extract_common_syst().

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

◆ inegalite_comb()

Pcontrainte inegalite_comb ( Pcontrainte  posit,
Pcontrainte  negat,
Variable  v 
)
Parameters
positosit
negategat

Definition at line 65 of file binaires.c.

68 {
69  return( inegalite_comb_ofl_ctrl(posit,negat,v, NO_OFL_CTRL));
70 }
Pcontrainte inegalite_comb_ofl_ctrl(Pcontrainte posit, Pcontrainte negat, Variable v, int ofl_ctrl)
Pcontrainte inegalite_comb_ofl_ctrl(Pcontrainte posit, Pcontrainte negat, Variable v,...
Definition: binaires.c:179

References inegalite_comb_ofl_ctrl(), and NO_OFL_CTRL.

+ Here is the call graph for this function:

◆ inegalite_comb_ofl()

Pcontrainte inegalite_comb_ofl ( Pcontrainte  posit,
Pcontrainte  negat,
Variable  v 
)
Parameters
positosit
negategat

Definition at line 72 of file binaires.c.

75 {
76  return( inegalite_comb_ofl_ctrl(posit,negat,v, FWD_OFL_CTRL));
77 
78 }

References FWD_OFL_CTRL, and inegalite_comb_ofl_ctrl().

+ Here is the call graph for this function:

◆ inegalite_comb_ofl_ctrl()

Pcontrainte inegalite_comb_ofl_ctrl ( Pcontrainte  posit,
Pcontrainte  negat,
Variable  v,
int  ofl_ctrl 
)

Pcontrainte inegalite_comb_ofl_ctrl(Pcontrainte posit, Pcontrainte negat, Variable v, int ofl_ctrl): combinaison lineaire positive des deux inegalites posit et negat eliminant la variable v.

Une nouvelle contrainte est allouee et renvoyee.

Si le coefficient de v dans negat egale -1 ou si le coefficient de v dans posit egale 1, la nouvelle contrainte est equivalente en nombres entiers avec posit et negat.

Modifications:

  • use gcd to reduce the combination coefficients in hope to reduce integer overflow risk (Francois Irigoin, 17 December 1991)

Le controle de l'overflow est effectue et traite par le retour du contexte correspondant au dernier CATCH(overflow_error) effectue.

pdiv ???

Parameters
positosit
negategat
ofl_ctrlfl_ctrl

Definition at line 179 of file binaires.c.

183 {
184  Value cv_p, cv_n, d;
185  Pcontrainte ineg;
186 
187  cv_p = vect_coeff(v,posit->vecteur);
188  cv_n = vect_coeff(v,negat->vecteur);
189 
190  assert(value_pos_p(cv_p) && value_neg_p(cv_n));
191 
192  d = pgcd(cv_p, value_uminus(cv_n));
193  if(value_notone_p(d)) {
194  cv_p = value_div(cv_p,d); /* pdiv ??? */
195  cv_n = value_div(cv_n,d);
196  }
197 
198  ineg = contrainte_new();
199 
200  ineg->vecteur = vect_cl2_ofl_ctrl(cv_p,negat->vecteur,
201  value_uminus(cv_n),
202  posit->vecteur, ofl_ctrl);
203  return(ineg);
204 }
#define value_pos_p(val)
#define pgcd(a, b)
Pour la recherche de performance, selection d'une implementation particuliere des fonctions.
#define value_notone_p(val)
#define value_div(v1, v2)
Pcontrainte contrainte_new(void)
package contrainte - allocations et desallocations
Definition: alloc.c:47

References assert, contrainte_new(), pgcd, value_div, value_neg_p, value_notone_p, value_pos_p, value_uminus, vect_cl2_ofl_ctrl(), vect_coeff(), and Scontrainte::vecteur.

Referenced by inegalite_comb(), and inegalite_comb_ofl().

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