PIPS
sommet.c
Go to the documentation of this file.
1 /*
2 
3  $Id: sommet.c 1669 2019-06-26 17:24:57Z coelho $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of Linear/C3 Library.
8 
9  Linear/C3 Library is free software: you can redistribute it and/or modify it
10  under the terms of the GNU Lesser General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  Linear/C3 Library is distributed in the hope that it will be useful, but WITHOUT ANY
15  WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  FITNESS FOR A PARTICULAR PURPOSE.
17 
18  See the GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with Linear/C3 Library. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 
25 /* package pour la structure de donnees sommet (sommet d'un systeme generateur)
26  *
27  * Francois Irigoin, Mai 1989
28  */
29 
30 #ifdef HAVE_CONFIG_H
31  #include "config.h"
32 #endif
33 
34 #include <stdlib.h>
35 #include <stdio.h>
36 
37 #include "boolean.h"
38 #include "linear_assert.h"
39 #include "arithmetique.h"
40 #include "vecteur.h"
41 
42 #include "ray_dte.h"
43 #include "sommet.h"
44 
45 #define MALLOC(s,t,f) malloc(s)
46 #define FREE(s,t,f) free(s)
47 
48 /*
49  * Creation d'un sommet
50  */
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 }
62 
63 /* Psommet sommet_make(int d, Pvecteur v): allocation et initialisation
64  * d'un sommet de denominateur d et de vecteur v; le vecteur v est
65  * utilise directement; ca peut introduire du sharing;
66  */
68 Value d;
69 Pvecteur v;
70 {
71  Psommet s;
72 
73  s = sommet_new();
74  s->denominateur = d;
75  s->vecteur = v;
76  return (s);
77 }
78 
79 /* Psommet sommet_dup(Psommet s_in): allocation et copie de la valeur
80  * d'un sommet
81  */
83 Psommet s_in;
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 }
107 
108 /* void sommet_rm(Psommet s): desallocation complete d'une structure sommet
109  */
110 void sommet_rm(s)
111 Psommet s;
112 {
113  vect_rm(s->vecteur);
114  FREE((char *)s,SOMMET,"sommet_rm");
115 }
116 
118 Psommet s;
119 char *f;
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 }
126 
127 /* void sommet_fprint(FILE * f, Psommet s, char * (*nom_var)()):
128  * impression d'un sommet
129  */
131 FILE * f;
132 Psommet s;
133 char * (*nom_var)(Variable);
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 }
148 
149 /* void sommet_fprint_as_dense(FILE * f, Psommet s):
150  * impression d'un sommet
151  */
153 FILE * f;
154 Psommet s;
155 Pbase b;
156 {
157  if(value_notone_p(s->denominateur)) {
158  (void) fprintf(f,"denominator = ");
160  (void) fprintf(f, "\t");
161  }
163 }
164 
165 /* void sommet_dump(Psommet s): impression d'un sommet sur stderr avec
166  * variable_debug_name()
167  */
168 void sommet_dump(s)
169 Psommet s;
170 {
172 }
173 
174 /* void fprint_lsom(FILE * f, Psommet s, char * (*nom_var)()):
175  * impression d'une liste de sommets
176  */
178 FILE * f;
179 Psommet ls;
180 char * (*nom_var)(Variable);
181 {
182  Psommet e;
183  for (e = ls; e != NULL; e = e->succ) {
184  sommet_fprint(f, e, nom_var);
185  }
186 }
187 
188 /* void fprint_lsom_as_dense(FILE * f, Psommet s):
189  * impression d'une liste de sommets
190  */
192 FILE * f;
193 Psommet ls;
194 Pbase b;
195 {
196  Psommet e;
197  for (e = ls; e != NULL; e = e->succ) {
198  sommet_fprint_as_dense(f, e, b);
199  }
200 }
201 
202 /* void sommet_normalize(Psommet ns): normalisation des coordonnees d'un sommet
203  * par le pgcd des coordonnees et du denominateur
204  */
206 Psommet ns;
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 }
215 
216 /* bool som_in_liste(Psommet s, Psommet l): test de l'appartenance
217  * du sommet s a la liste de sommets l
218  *
219  * Les coordonnees du sommet s et des sommets de la liste l sont
220  * supposees normalisees (fractions reduites)
221  */
222 bool som_in_liste(s,listes)
223 Psommet s;
224 Psommet listes;
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 }
235 
236 /* bool sommet_egal(Psommet s1, Psommet s2): test de l'egalite
237  * de representation de deux sommets
238  *
239  * Il faut en normaliser les coordonnees d'abord si on veut une egalite
240  * de valeur
241  */
242 bool sommet_egal(s1,s2)
243 Psommet s1,s2;
244 {
246  return(false);
247  else
248  return(vect_equal(s1->vecteur,s2->vecteur));
249 }
250 
251 /* bool egaliste_s(Psommet l1, Psommet * ad_l2): test d'egalite
252  * de listes de sommets
253  *
254  * nous proposons un test direct au lieu d'un test en deux etapes
255  * d'inclusion dans les deux sens; ceci justifie le second parametre
256  * qui est l'adresse du pointeur de liste (Malik Imadache)
257  */
258 bool egaliste_s(l1,ad_l2)
259 Psommet l1,*ad_l2;
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 }
335 
336 
337 /* void sommet_add(Psommet *ps, Psommet som, int *nb_soms):
338  * Ajout d'un sommet a une liste de sommets
339  * Le sommet est ajoute a la fin de la liste.
340  *
341  */
342 void sommet_add(ps,som,nb_som)
343 Psommet *ps,som;
344 int *nb_som;
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 }
358 
359 
#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)
int Value
#define value_division(ref, val)
void fprint_Value(FILE *, Value)
Definition: io.c:42
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
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
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
bool vect_equal(Pvecteur v1, Pvecteur v2)
bool vect_equal(Pvecteur v1, Pvecteur v2): test a egalite de deux vecteurs
Definition: reductions.c:278
char *(* variable_debug_name)(Variable)
Debug support: pointer to the function used by debug print outs.
Definition: variable.c:114
#define abort()
Definition: misc-local.h:53
#define assert(ex)
Definition: newgen_assert.h:41
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 ...
char * nom_var[100]
Definition: sc_read.c:89
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
s1
Definition: set.c:247
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
#define sommet_denominateur(s)
macros d'acces
Definition: sommet-local.h:87
void sommet_rm(Psommet s)
void sommet_rm(Psommet s): desallocation complete d'une structure sommet
Definition: sommet.c:110
#define MALLOC(s, t, f)
package pour la structure de donnees sommet (sommet d'un systeme generateur)
Definition: sommet.c:45
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
Definition: sommet.c:191
Psommet sommet_new()
Creation d'un sommet
Definition: sommet.c:51
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 ...
Definition: sommet.c:342
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
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
Definition: sommet.c:177
Psommet sommet_make(Value d, Pvecteur v)
Psommet sommet_make(int d, Pvecteur v): allocation et initialisation d'un sommet de denominateur d et...
Definition: sommet.c:67
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
void dbg_sommet_rm(Psommet s, char *f)
Definition: sommet.c:117
void sommet_dump(Psommet s)
void sommet_dump(Psommet s): impression d'un sommet sur stderr avec variable_debug_name()
Definition: sommet.c:168
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
void sommet_normalize(Psommet ns)
void sommet_normalize(Psommet ns): normalisation des coordonnees d'un sommet par le pgcd des coordonn...
Definition: sommet.c:205
bool egaliste_s(Psommet l1, Psommet *ad_l2)
bool egaliste_s(Psommet l1, Psommet * ad_l2): test d'egalite de listes de sommets
Definition: sommet.c:258
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
Definition: sommet.c:222
#define FREE(s, t, f)
Definition: sommet.c:46
Psommet sommet_dup(Psommet s_in)
Psommet sommet_dup(Psommet s_in): allocation et copie de la valeur d'un sommet.
Definition: sommet.c:82
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
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
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 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
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78