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

Go to the source code of this file.

Functions

bool contrainte_in_liste (Pcontrainte c, Pcontrainte lc)
 package contrainte - operations sur les listes de contraintes More...
 
int constraint_rank (Pcontrainte c, Pcontrainte lc)
 Return the rank of constraint c in constraint list lc. More...
 
bool egalite_in_liste (Pcontrainte v, Pcontrainte listev)
 bool egalite_in_liste(Pcontrainte eg, Pcontrainte leg): test si une egalite appartient a une liste d'egalites More...
 
int nb_elems_list (Pcontrainte list)
 int nb_elems_list(Pcontrainte list): nombre de contraintes se trouvant dans une liste de contraintes More...
 
bool cyclic_constraint_list_p (Pcontrainte l)
 Check if list l contains a cycle. More...
 
int safe_nb_elems_list (Pcontrainte list, int n)
 Compute the number of elements in the list if it is less than n. More...
 
Pcontrainte contrainte_remove_large_coef (Pcontrainte lc, Value val)
 

Function Documentation

◆ constraint_rank()

int constraint_rank ( Pcontrainte  c,
Pcontrainte  lc 
)

Return the rank of constraint c in constraint list lc.

1 for the first element, and so on, Fortran style. 0 when c is not in lc.

The comparisons are based on the pointers, not on the values of the constraints. It is mainly useful to detect cycles in constraint list.

Parameters
lcc

Definition at line 75 of file listes.c.

76 {
77  Pcontrainte cc;
78  int rank = 0;
79 
81 
82  if (CONTRAINTE_NULLE_P(c))
83  ;
84  else {
85  for (cc=lc; !CONTRAINTE_UNDEFINED_P(cc); cc=cc->succ) {
86  rank++;
87  // This would be useful to detect duplicate constraints
88  // if (vect_equal((c1->vecteur),(c->vecteur))) {
89 
90  // Physical check
91  if(cc==c)
92  break;
93  }
94  }
95 
96  return rank;
97 }
#define CONTRAINTE_UNDEFINED_P(c)
#define CONTRAINTE_NULLE_P(c)
contrainte nulle (non contrainte 0 == 0 ou 0 <= 0)
static entity rank
#define assert(ex)
Definition: newgen_assert.h:41
struct Scontrainte * succ

References assert, CONTRAINTE_NULLE_P, CONTRAINTE_UNDEFINED_P, rank, and Scontrainte::succ.

Referenced by cyclic_constraint_list_p().

+ Here is the caller graph for this function:

◆ contrainte_in_liste()

bool contrainte_in_liste ( Pcontrainte  c,
Pcontrainte  lc 
)

package contrainte - operations sur les listes de contraintes

listes.c

bool contrainte_in_liste(Pcontrainte c, Pcontrainte lc): test de l'appartenance d'une contrainte c a une liste de contrainte lc

Les contrainte sont supposees normalisees (coefficients reduits par leur PGCD, y compris les termes constants).

On considere que la contrainte nulle, qui ne represente aucune contrainte (elle est toujours verifiee) appartient a toutes les listes de contraintes.

Parameters
lcc

Definition at line 52 of file listes.c.

53 {
54  Pcontrainte c1;
55 
57 
58  if (CONTRAINTE_NULLE_P(c))
59  return true;
60 
61  for (c1=lc; !CONTRAINTE_UNDEFINED_P(c1); c1=c1->succ) {
62  if (vect_equal((c1->vecteur),(c->vecteur))) {
63  return true;
64  }
65  }
66  return false;
67 }
bool vect_equal(Pvecteur v1, Pvecteur v2)
bool vect_equal(Pvecteur v1, Pvecteur v2): test a egalite de deux vecteurs
Definition: reductions.c:278
Pvecteur vecteur

References assert, CONTRAINTE_NULLE_P, CONTRAINTE_UNDEFINED_P, Scontrainte::succ, vect_equal(), and Scontrainte::vecteur.

Referenced by dj_simple_inegs_to_eg(), pa_path_to_few_disjunct_ofl_ctrl(), and sc_supress_same_constraints().

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

◆ contrainte_remove_large_coef()

Pcontrainte contrainte_remove_large_coef ( Pcontrainte  lc,
Value  val 
)
Returns
a constraint list without constraint with large coeffs
Parameters
lclist of constraint, which is modified
valmaximum value allowed for coefficients
Parameters
lcc
valal

Definition at line 179 of file listes.c.

180 {
181  linear_assert("value must be positive", value_posz_p(val));
182 
183  Pcontrainte first = lc, previous = NULL;
184 
185  if (value_zero_p(val)) // nothing to do
186  return lc;
187 
188  while (lc!=NULL)
189  {
190  if (vect_larger_coef_p(lc->vecteur, val))
191  {
192  // unlink and free
193  Pcontrainte next = lc->succ;
194  lc->succ = NULL;
195  contrainte_free(lc);
196  if (lc==first) first = next;
197  if (previous) previous->succ = next;
198  // "previous" constraint itself is unchanged
199  lc = next;
200  }
201  else
202  {
203  previous = lc;
204  lc = lc->succ;
205  }
206  }
207  return first;
208 }
#define value_zero_p(val)
#define value_posz_p(val)
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 vect_larger_coef_p(Pvecteur v, Value val)
Definition: reductions.c:564
#define linear_assert(msg, ex)
Definition: linear_assert.h:51

References contrainte_free(), linear_assert, Scontrainte::succ, value_posz_p, value_zero_p, vect_larger_coef_p(), and Scontrainte::vecteur.

Referenced by sc_remove_large_coef().

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

◆ cyclic_constraint_list_p()

bool cyclic_constraint_list_p ( Pcontrainte  l)

Check if list l contains a cycle.

Definition at line 141 of file listes.c.

142 {
143  int i;
144  Pcontrainte c;
145  bool cyclic_p = false;
146 
147  for(i=0, c=l; c!=NULL; i++, c=c->succ) {
148  int r = constraint_rank(c, l);
149  if(r>0 && r<i) {
150  cyclic_p = true;
151  break;
152  }
153  }
154 
155  return cyclic_p;
156 }
int constraint_rank(Pcontrainte c, Pcontrainte lc)
Return the rank of constraint c in constraint list lc.
Definition: listes.c:75

References constraint_rank(), and Scontrainte::succ.

Referenced by sc_bounded_normalization().

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

◆ egalite_in_liste()

bool egalite_in_liste ( Pcontrainte  v,
Pcontrainte  listev 
)

bool egalite_in_liste(Pcontrainte eg, Pcontrainte leg): test si une egalite appartient a une liste d'egalites

Une egalite peut avoir ete multipliee par moins 1 mais ses coefficients, comme les coefficients des egalites de la liste, doivent avoir ete reduits par leur PGCD auparavant

Ancien nom: vect_in_liste1()

Parameters
listevistev

Definition at line 108 of file listes.c.

109 {
110  Pcontrainte v1;
111 
112  if (v->vecteur == NULL) return(true);
113  for (v1=listev;v1!=NULL;v1=v1->succ) {
114  if (vect_equal((v1->vecteur),(v->vecteur)) ||
115  vect_oppos((v1->vecteur),(v->vecteur))) {
116  return true;
117  }
118  }
119  return false;
120 }
bool vect_oppos(Pvecteur v1, Pvecteur v2)
bool vect_oppos(Pvecteur v1, Pvecteur v2): test de l'opposition de deux vecteurs
Definition: reductions.c:360

References Scontrainte::succ, vect_equal(), vect_oppos(), and Scontrainte::vecteur.

+ Here is the call graph for this function:

◆ nb_elems_list()

int nb_elems_list ( Pcontrainte  list)

int nb_elems_list(Pcontrainte list): nombre de contraintes se trouvant dans une liste de contraintes

Ancien nom: nb_elems_eq()

Cycles are not detected

Parameters
listist

Definition at line 129 of file listes.c.

130 {
131  int i;
132  Pcontrainte c;
133 
134  for(i=0, c=list;c!=NULL;i++,c=c->succ)
135  ;
136 
137  return i;
138 }
The structure used to build lists in NewGen.
Definition: newgen_list.h:41

References Scontrainte::succ.

Referenced by bounds_equal_p(), build_third_comb(), combiner_ofl_with_test(), constraints_lexicographic_sort_generic(), constraints_sort_info(), loop_iteration_domaine_to_sc(), prepare_reindexing(), region_sc_minimal(), sc_add_egalites(), sc_add_inegalites(), sc_elim_var(), sc_fix(), sc_make(), sc_projection_optim_along_vecteur_ofl(), sc_remove_large_coef(), and sc_weak_consistent_p().

+ Here is the caller graph for this function:

◆ safe_nb_elems_list()

int safe_nb_elems_list ( Pcontrainte  list,
int  n 
)

Compute the number of elements in the list if it is less than n.

n is assumed positive. A negative value is returned if the number of elements is strictly greater than n, for instance because the list is cyclic.

Parameters
listist

Definition at line 162 of file listes.c.

163 {
164  int i;
165  Pcontrainte c;
166 
167  assert(n>=0);
168 
169  for(i=0, c=list;c!=NULL && i<=n ;i++,c=c->succ)
170  ;
171 
172  return i<=n? i : -1;
173 }

References assert, and Scontrainte::succ.

Referenced by sc_consistent_p().

+ Here is the caller graph for this function: