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

Go to the source code of this file.

Macros

#define MALLOC(s, t, f)   malloc(s)
 package pour la structure de donnees sommet (sommet d'un systeme generateur) More...
 
#define FREE(s, t, f)   free(s)
 

Functions

Psommet sommet_new ()
 Creation d'un sommet
More...
 
Psommet sommet_make (Value d, Pvecteur v)
 Psommet sommet_make(int d, Pvecteur v): allocation et initialisation d'un sommet de denominateur d et de vecteur v; le vecteur v est utilise directement; ca peut introduire du sharing;. More...
 
Psommet sommet_dup (Psommet s_in)
 Psommet sommet_dup(Psommet s_in): allocation et copie de la valeur d'un sommet. More...
 
void sommet_rm (Psommet s)
 void sommet_rm(Psommet s): desallocation complete d'une structure sommet More...
 
void dbg_sommet_rm (Psommet s, char *f)
 
void sommet_fprint (FILE *f, Psommet s, char *(*nom_var)(Variable))
 void sommet_fprint(FILE * f, Psommet s, char * (*nom_var)()): impression d'un sommet More...
 
void sommet_fprint_as_dense (FILE *f, Psommet s, Pbase b)
 void sommet_fprint_as_dense(FILE * f, Psommet s): impression d'un sommet More...
 
void sommet_dump (Psommet s)
 void sommet_dump(Psommet s): impression d'un sommet sur stderr avec variable_debug_name() More...
 
void fprint_lsom (FILE *f, Psommet ls, char *(*nom_var)(Variable))
 void fprint_lsom(FILE * f, Psommet s, char * (*nom_var)()): impression d'une liste de sommets More...
 
void fprint_lsom_as_dense (FILE *f, Psommet ls, Pbase b)
 void fprint_lsom_as_dense(FILE * f, Psommet s): impression d'une liste de sommets More...
 
void sommet_normalize (Psommet ns)
 void sommet_normalize(Psommet ns): normalisation des coordonnees d'un sommet par le pgcd des coordonnees et du denominateur More...
 
bool som_in_liste (Psommet s, Psommet listes)
 bool som_in_liste(Psommet s, Psommet l): test de l'appartenance du sommet s a la liste de sommets l More...
 
bool sommet_egal (Psommet s1, Psommet s2)
 bool sommet_egal(Psommet s1, Psommet s2): test de l'egalite de representation de deux sommets More...
 
bool egaliste_s (Psommet l1, Psommet *ad_l2)
 bool egaliste_s(Psommet l1, Psommet * ad_l2): test d'egalite de listes de sommets More...
 
void sommet_add (Psommet *ps, Psommet som, int *nb_som)
 void sommet_add(Psommet *ps, Psommet som, int *nb_soms): Ajout d'un sommet a une liste de sommets Le sommet est ajoute a la fin de la liste. More...
 

Macro Definition Documentation

◆ FREE

#define FREE (   s,
  t,
  f 
)    free(s)

Definition at line 46 of file sommet.c.

◆ MALLOC

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

package pour la structure de donnees sommet (sommet d'un systeme generateur)

Francois Irigoin, Mai 1989

Definition at line 45 of file sommet.c.

Function Documentation

◆ dbg_sommet_rm()

void dbg_sommet_rm ( Psommet  s,
char *  f 
)

Definition at line 117 of file sommet.c.

120 {
121  (void) fprintf(stderr,"destruction de sommet dans %s : ",f);
123  dbg_vect_rm(s->vecteur,f);
124  FREE((char *)s,SOMMET,f);
125 }
char *(* variable_debug_name)(Variable)
Debug support: pointer to the function used by debug print outs.
Definition: variable.c:114
int f(int off1, int off2, int n, float r[n], float a[n], float b[n])
Definition: offsets.c:15
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
#define SOMMET
package sommet: structure de donnees representant les sommets d'un systeme generateur; elle contient:
Definition: sommet-local.h:48
void sommet_fprint(FILE *f, Psommet s, char *(*nom_var)(Variable))
void sommet_fprint(FILE * f, Psommet s, char * (*nom_var)()): impression d'un sommet
Definition: sommet.c:130
#define FREE(s, t, f)
Definition: sommet.c:46
Pvecteur vecteur
Definition: sommet-local.h:66
void dbg_vect_rm(Pvecteur v, char __attribute__((unused)) *f)
void dbg_vect_rm(Pvecteur v, char * f): desallocation d'un vecteur avec marquage de la fonction provo...
Definition: alloc.c:139

References dbg_vect_rm(), f(), fprintf(), FREE, SOMMET, sommet_fprint(), and variable_debug_name.

+ Here is the call graph for this function:

◆ egaliste_s()

bool egaliste_s ( Psommet  l1,
Psommet ad_l2 
)

bool egaliste_s(Psommet l1, Psommet * ad_l2): test d'egalite de listes de sommets

 nous proposons un test direct au lieu d'un test en deux etapes 
 d'inclusion dans les deux sens; ceci justifie le second parametre
 qui est l'adresse du pointeur de liste (Malik Imadache)

elements pour lesquels il reste a trouver un "jumeau" dans l1

adresse a laquelle il faudra raccrocher les elements de l2 successivement testes

on a trouve un element (eq21) de eq2 egal a l'element courant de l1; on remet donc eq21 dans l2, en distingant 2 cas suivant qu'il est en tete de eq2 ou pas

eq23 est le predecesseur de eq21 dans eq2 il faut le conserver pour enlever eq21 de eq2

eq21 est different de l'element de l1 qui est teste; il faut voir le reste de la liste eq2

on a trouve un element de l1 qui n'a pas de "jumeau" dans l2 => reformer l2 et sortir

tous les elements de l1 ont un jumeau (=> l1 est inclus dans l2) si tous les elements de l2 sont jumeaux (inclusion inverse) => egalite

dans le cas inverse reformer l2 et sortir

Parameters
l11
ad_l2d_l2

Definition at line 258 of file sommet.c.

260 {
261  int egalite;
262  Psommet eq1,eq2,eq21,eq23,*ad_aux;
263 
264  if (l1==(*ad_l2)) return(true);
265 
266  /* elements pour lesquels il reste a trouver un "jumeau" dans l1 */
267  eq2 = *ad_l2;
268  /* adresse a laquelle il faudra raccrocher les elements de l2
269  successivement testes */
270  ad_aux = ad_l2;
271 
272  (*ad_l2) = NULL;
273 
274  for(eq1=l1;eq1!=NULL;eq1=eq1->succ) {
275  egalite = 0;
276  for(eq21=eq2,eq23=eq2;eq21!=NULL;) {
277  if (sommet_egal(eq21,eq1)) {
278  /* on a trouve un element (eq21) de eq2 egal a
279  l'element courant de l1; on remet donc
280  eq21 dans l2, en distingant 2
281  cas suivant qu'il est en tete de
282  eq2 ou pas
283  */
284  /* eq23 est le predecesseur de eq21 dans eq2
285  il faut le conserver pour enlever eq21
286  de eq2
287  */
288  if (eq21==eq2) {
289  eq2=eq2->succ;
290  eq21->succ = NULL;
291  (*ad_aux) = eq21;
292  ad_aux = &(eq21->succ);
293  eq21 = eq23 = eq2;
294  }
295  else {
296  eq23->succ = eq21->succ;
297  eq21->succ = NULL;
298  (*ad_aux) = eq21;
299  ad_aux = &(eq21->succ);
300  eq21 = eq23->succ;
301  }
302  egalite = 1;
303  break;
304  }
305  else {
306  /* eq21 est different de l'element de l1
307  qui est teste; il faut voir le reste de
308  la liste eq2
309  */
310  eq23 = eq21;
311  eq21 = eq21->succ;
312  }
313  }
314  if (egalite == 0) {
315  /* on a trouve un element de l1 qui n'a pas
316  de "jumeau" dans l2 => reformer l2 et sortir
317  */
318  (* ad_aux) = eq2;
319  return(false);
320  }
321  else egalite = 0;
322  }
323  if (eq2==NULL)
324  /* tous les elements de l1 ont un jumeau
325  (=> l1 est inclus dans l2)
326  si tous les elements de l2 sont jumeaux
327  (inclusion inverse) => egalite
328  */
329  return(true);
330  else
331  /* dans le cas inverse reformer l2 et sortir */
332  (*ad_aux) = eq2;
333  return(false);
334 }
bool sommet_egal(Psommet s1, Psommet s2)
bool sommet_egal(Psommet s1, Psommet s2): test de l'egalite de representation de deux sommets
Definition: sommet.c:242
structure de donnees Sommet
Definition: sommet-local.h:64
struct typ_som * succ
Definition: sommet-local.h:68

References sommet_egal(), and typ_som::succ.

Referenced by egal_soms().

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

◆ fprint_lsom()

void fprint_lsom ( FILE *  f,
Psommet  ls,
char * (*)(Variable nom_var 
)

void fprint_lsom(FILE * f, Psommet s, char * (*nom_var)()): impression d'une liste de sommets

Definition at line 177 of file sommet.c.

181 {
182  Psommet e;
183  for (e = ls; e != NULL; e = e->succ) {
184  sommet_fprint(f, e, nom_var);
185  }
186 }
char * nom_var[100]
Definition: sc_read.c:89

References f(), nom_var, sommet_fprint(), and typ_som::succ.

Referenced by sg_fprint().

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

◆ fprint_lsom_as_dense()

void fprint_lsom_as_dense ( FILE *  f,
Psommet  ls,
Pbase  b 
)

void fprint_lsom_as_dense(FILE * f, Psommet s): impression d'une liste de sommets

Parameters
lss

Definition at line 191 of file sommet.c.

195 {
196  Psommet e;
197  for (e = ls; e != NULL; e = e->succ) {
198  sommet_fprint_as_dense(f, e, b);
199  }
200 }
void sommet_fprint_as_dense(FILE *f, Psommet s, Pbase b)
void sommet_fprint_as_dense(FILE * f, Psommet s): impression d'un sommet
Definition: sommet.c:152

References f(), sommet_fprint_as_dense(), and typ_som::succ.

Referenced by prettyprint_dependence_graph(), prettyprint_dot_dependence_graph(), and sg_fprint_as_dense().

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

◆ som_in_liste()

bool som_in_liste ( Psommet  s,
Psommet  listes 
)

bool som_in_liste(Psommet s, Psommet l): test de l'appartenance du sommet s a la liste de sommets l

Les coordonnees du sommet s et des sommets de la liste l sont supposees normalisees (fractions reduites)

Parameters
listesistes

Definition at line 222 of file sommet.c.

225 {
226  Psommet s1;
227 
228  for (s1=listes;s1!=NULL;s1=s1->succ) {
229  if ((s1->denominateur)==(s->denominateur)) {
230  if (vect_equal((s1->vecteur),(s->vecteur))) return(true);
231  }
232  }
233  return(false);
234 }
bool vect_equal(Pvecteur v1, Pvecteur v2)
bool vect_equal(Pvecteur v1, Pvecteur v2): test a egalite de deux vecteurs
Definition: reductions.c:278
s1
Definition: set.c:247
Value denominateur
Definition: sommet-local.h:67

References typ_som::denominateur, s1, vect_equal(), and typ_som::vecteur.

+ Here is the call graph for this function:

◆ sommet_add()

void sommet_add ( Psommet ps,
Psommet  som,
int nb_som 
)

void sommet_add(Psommet *ps, Psommet som, int *nb_soms): Ajout d'un sommet a une liste de sommets Le sommet est ajoute a la fin de la liste.

Parameters
pss
somom
nb_somb_som

Definition at line 342 of file sommet.c.

345 {
346 
347  if (som != NULL)
348  {
349  Psommet pred,ps1;
350 
351  pred = *ps;
352  for (ps1 = pred; ps1 != NULL; pred = ps1, ps1 = ps1->succ);
353  pred->succ = som;
354  som->succ = NULL;
355  *nb_som = (*nb_som) +1;
356  }
357 }

References typ_som::succ.

Referenced by eq_in_ineq(), plint_degen(), and plint_pas().

+ Here is the caller graph for this function:

◆ sommet_dump()

void sommet_dump ( Psommet  s)

void sommet_dump(Psommet s): impression d'un sommet sur stderr avec variable_debug_name()

Definition at line 168 of file sommet.c.

170 {
172 }

References sommet_fprint(), and variable_debug_name.

+ Here is the call graph for this function:

◆ sommet_dup()

Psommet sommet_dup ( Psommet  s_in)

Psommet sommet_dup(Psommet s_in): allocation et copie de la valeur d'un sommet.

Parameters
s_in_in

Definition at line 82 of file sommet.c.

84 {
85  Psommet s_out;
86 
87  s_out = (Psommet) MALLOC(sizeof(Ssommet), SOMMET, "sommet_dup");
88 
89  if(s_in->eq_sat!=NULL) {
90  (void) fprintf(stderr,
91  "sommet_dup: warning eq_sat is not duplicated\n");
92  }
93 
94  if(s_in->denominateur==0) {
95  (void) fprintf(stderr,"sommet_dup: denominateur nul\n");
96  abort();
97  }
98 
99  s_out = (Psommet) MALLOC(sizeof(Ssommet),SOMMET,"sommet_dup");
100  s_out->succ = NULL;
101  s_out->eq_sat = NULL;
102  s_out->vecteur = vect_dup(s_in->vecteur);
103  s_out->denominateur = s_in->denominateur;
104 
105  return s_out;
106 }
#define abort()
Definition: misc-local.h:53
struct typ_som * Psommet
structure de donnees Sommet
#define MALLOC(s, t, f)
package pour la structure de donnees sommet (sommet d'un systeme generateur)
Definition: sommet.c:45
int * eq_sat
Definition: sommet-local.h:65
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

References abort, typ_som::denominateur, typ_som::eq_sat, fprintf(), MALLOC, SOMMET, typ_som::succ, vect_dup(), and typ_som::vecteur.

Referenced by sg_dup(), sg_union(), sommets_dup(), and sommets_dupc().

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

◆ sommet_egal()

bool sommet_egal ( Psommet  s1,
Psommet  s2 
)

bool sommet_egal(Psommet s1, Psommet s2): test de l'egalite de representation de deux sommets

Il faut en normaliser les coordonnees d'abord si on veut une egalite de valeur

Parameters
s11
s22

Definition at line 242 of file sommet.c.

244 {
246  return(false);
247  else
248  return(vect_equal(s1->vecteur,s2->vecteur));
249 }
#define sommet_denominateur(s)
macros d'acces
Definition: sommet-local.h:87

References s1, sommet_denominateur, and vect_equal().

Referenced by egaliste_s().

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

◆ sommet_fprint()

void sommet_fprint ( FILE *  f,
Psommet  s,
char * (*)(Variable nom_var 
)

void sommet_fprint(FILE * f, Psommet s, char * (*nom_var)()): impression d'un sommet

malgre le clash de type, je kludge...

ray_dte_fprint(f, s, nom_var);

Definition at line 130 of file sommet.c.

134 {
135  if(value_notone_p(s->denominateur)) {
136  (void) fprintf(f,"denominator = ");
138  (void) fprintf(f, "\t");
139  }
140  if (s->vecteur)
142  else
143  fprintf(f, "0\n");
144 
145  /* malgre le clash de type, je kludge... */
146  /* ray_dte_fprint(f, s, nom_var);*/
147 }
#define value_notone_p(val)
void fprint_Value(FILE *, Value)
Definition: io.c:42
void vect_fprint(FILE *f, Pvecteur v, get_variable_name_t variable_name)
void vect_fprint(FILE * f, Pvecteur v, char * (*variable_name)()): impression d'un vecteur creux v su...
Definition: io.c:124

References typ_som::denominateur, f(), fprint_Value(), fprintf(), nom_var, value_notone_p, vect_fprint(), and typ_som::vecteur.

Referenced by dbg_sommet_rm(), fprint_lsom(), and sommet_dump().

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

◆ sommet_fprint_as_dense()

void sommet_fprint_as_dense ( FILE *  f,
Psommet  s,
Pbase  b 
)

void sommet_fprint_as_dense(FILE * f, Psommet s): impression d'un sommet

Definition at line 152 of file sommet.c.

156 {
157  if(value_notone_p(s->denominateur)) {
158  (void) fprintf(f,"denominator = ");
160  (void) fprintf(f, "\t");
161  }
163 }
void vect_fprint_as_dense(FILE *f, Pvecteur v, Pbase b)
void vect_fprint_as_dense(FILE * f, Pvecteur v, Pbase b):
Definition: io.c:159

References typ_som::denominateur, f(), fprint_Value(), fprintf(), value_notone_p, vect_fprint_as_dense(), and typ_som::vecteur.

Referenced by fprint_lsom_as_dense().

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

◆ sommet_make()

Psommet sommet_make ( Value  d,
Pvecteur  v 
)

Psommet sommet_make(int d, Pvecteur v): allocation et initialisation d'un sommet de denominateur d et de vecteur v; le vecteur v est utilise directement; ca peut introduire du sharing;.

Definition at line 67 of file sommet.c.

70 {
71  Psommet s;
72 
73  s = sommet_new();
74  s->denominateur = d;
75  s->vecteur = v;
76  return (s);
77 }
Psommet sommet_new()
Creation d'un sommet
Definition: sommet.c:51

References typ_som::denominateur, sommet_new(), and typ_som::vecteur.

Referenced by mk_rn(), and sg_of_rays().

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

◆ sommet_new()

Psommet sommet_new ( void  )

Creation d'un sommet

SOMMET.

Definition at line 51 of file sommet.c.

52 {
53  Psommet s;
54 
55  s = (Psommet) MALLOC(sizeof(Ssommet), SOMMET, "sommet_dup");
56  s->denominateur =0;
57  s->vecteur = NULL;
58  s->eq_sat =NULL;
59  s->succ = NULL;
60  return (s);
61 }

References typ_som::denominateur, typ_som::eq_sat, MALLOC, SOMMET, typ_som::succ, and typ_som::vecteur.

Referenced by fonct_init(), fonct_max(), fonct_max_all(), fonct_max_d(), fonct_min(), fonct_min_all(), fonct_min_d(), fonct_read(), and sommet_make().

+ Here is the caller graph for this function:

◆ sommet_normalize()

void sommet_normalize ( Psommet  ns)

void sommet_normalize(Psommet ns): normalisation des coordonnees d'un sommet par le pgcd des coordonnees et du denominateur

Parameters
nss

Definition at line 205 of file sommet.c.

207 {
208  Value div = vect_pgcd_all(ns->vecteur);
209 
210  assert(value_pos_p(div));
211  div = pgcd(div, ns->denominateur);
212  value_division(ns->denominateur,div);
213  (void) vect_div(ns->vecteur, div);
214 }
#define value_pos_p(val)
#define pgcd(a, b)
Pour la recherche de performance, selection d'une implementation particuliere des fonctions.
int Value
#define value_division(ref, 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 assert(ex)
Definition: newgen_assert.h:41
Pvecteur vect_div(Pvecteur v, Value x)
Pvecteur vect_div(Pvecteur v, Value x): division du vecteur v par le scalaire x, si x est different d...
Definition: scalaires.c:52

References assert, pgcd, value_division, value_pos_p, vect_div(), and vect_pgcd_all().

Referenced by sommets_normalize().

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

◆ sommet_rm()

void sommet_rm ( Psommet  s)

void sommet_rm(Psommet s): desallocation complete d'une structure sommet

Definition at line 110 of file sommet.c.

112 {
113  vect_rm(s->vecteur);
114  FREE((char *)s,SOMMET,"sommet_rm");
115 }
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78

References FREE, SOMMET, and vect_rm().

+ Here is the call graph for this function: