PIPS
sg.c
Go to the documentation of this file.
1 /*
2 
3  $Id: sg.c 1641 2016-03-02 08:20:19Z 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 tsg (systeme generateur) et pour les
26  * deux structures de donnees inclues tsg_vects et tsg_soms qui representent
27  * les listes de rayons, de droites et de sommets d'un systeme generateur
28  *
29  * Francois Irigoin
30  */
31 
32 #ifdef HAVE_CONFIG_H
33  #include "config.h"
34 #endif
35 
36 #include <stdlib.h>
37 #include <stdio.h>
38 
39 #include "boolean.h"
40 #include "arithmetique.h"
41 #include "vecteur.h"
42 #include "ray_dte.h"
43 #include "sommet.h"
44 #include "sg.h"
45 
46 static int sg_debug_level = 0;
47 #define ifdebug(n) if((n)<sg_debug_level)
48 
49 #define MALLOC(s,t,f) malloc(s)
50 #define FREE(p,t,f) free(p)
51 
52 /* Ptsg sg_new(): allocation d'un systeme generateur et initialisation a la
53  * valeur ensemble vide
54  */
56 {
57  Ptsg sg;
58 
59  sg = (Ptsg) MALLOC(sizeof(Stsg),TSG,"sg_new");
60  sg->soms_sg.nb_s = 0;
61  sg->soms_sg.ssg = NULL;
62  sg->rays_sg.nb_v = 0;
63  sg->rays_sg.vsg = NULL;
64  sg->dtes_sg.nb_v = 0;
65  sg->dtes_sg.vsg = NULL;
66  sg->base = NULL;
67  return sg;
68 }
69 ␌
70 /* Ptsg sg_dup(Ptsg sg_in): allocation d'un systeme generateur sg_out
71  * et copie sans sharing des ensembles de rayons, de droites et de
72  * sommets de l'argument sg_in
73  *
74  * sg_in n'est pas modifie
75  *
76  * Autre nom (obsolete): cp_sg()
77  *
78  * Extension: duplicate undefined generating systems (FI, 22 May 2009)
79  *
80  * sc_dup() has been replaced by sc_copy() which maintains the order
81  * in the data structure lists. Maybe we need the same change for
82  * generating systems.
83  */
85 {
86  Ptsg sg_out = SG_UNDEFINED;
87 
88  if(!SG_UNDEFINED_P(sg_in)) {
89  Pray_dte rd;
90  Pray_dte rd_new;
91  Psommet s;
92  Psommet s_new;
93 
94  sg_out = sg_new();
95 
96  /* duplication de la liste des sommets */
97  sg_out->soms_sg.nb_s = sg_in->soms_sg.nb_s;
98  for(s = sg_in->soms_sg.ssg; s != NULL; s = s->succ) {
99  s_new = sommet_dup(s);
100  s_new->succ = sg_out->soms_sg.ssg;
101  sg_out->soms_sg.ssg = s_new;
102  }
103 
104  /* duplication de la liste des rayons */
105  sg_out->rays_sg.nb_v = sg_in->rays_sg.nb_v;
106  for(rd = sg_in->rays_sg.vsg; rd != NULL; rd = rd->succ) {
107  rd_new = ray_dte_dup(rd);
108  rd_new->succ = sg_out->rays_sg.vsg;
109  sg_out->rays_sg.vsg = rd_new;
110  }
111 
112  /* duplication de la liste des droites */
113  sg_out->dtes_sg.nb_v = sg_in->dtes_sg.nb_v;
114  for(rd = sg_in->dtes_sg.vsg; rd != NULL; rd = rd->succ) {
115  rd_new = ray_dte_dup(rd);
116  rd_new->succ = sg_out->dtes_sg.vsg;
117  sg_out->dtes_sg.vsg = rd_new;
118  }
119 
120  sg_out->base = base_dup(sg_in->base);
121  }
122  return sg_out;
123 }
124 ␌
125 /* Ptsg sg_without_line(Ptsg sg_in): allocation d'un systeme generateur
126  * et copie d'un systeme generateur dont on transforme les lignes en rayons
127  *
128  * Aucune elimination de redondance pour le moment. On peut en envisager trois
129  * niveaux: egalite entre rayons, proportionalite entre rayons et
130  * combinaison lineaire positive de rayons.
131  */
133 Ptsg sg_in;
134 {
135  Ptsg sg_out;
136  Pray_dte rd;
137  Pray_dte rd_new;
138  Pray_dte rd_prec;
139 
140  ifdebug(8) {
141  (void) fprintf(stderr,"sg_without_line: begin\n");
142  (void) fprintf(stderr,"sg_without_line: sg_in\n");
143  sg_fprint(stderr, sg_in, variable_dump_name);
144  }
145 
146  sg_out = sg_dup(sg_in);
147 
148  /* ajout des l'oppose des vecteurs directeur des droites a la liste
149  des rayons */
150  for(rd_prec=rd=sg_out->dtes_sg.vsg; rd!=NULL; rd_prec=rd, rd=rd->succ) {
151  /* allocation et calcul du vecteur opppose */
152  rd_new = ray_oppose(rd);
153  /* chainage en tete de la liste des rayons */
154  rd_new = sg_out->rays_sg.vsg;
155  sg_out->rays_sg.vsg = rd_new;
156  }
157 
158  /* ajout (sans duplication en memoire) de la liste des vecteurs directeurs
159  des droites a la liste des rayons, si l'ensemble des droites n'est
160  pas vide */
161  if(rd_prec!=NULL) {
162  /* ajout de l'ensemble des rayons a l'ensemble des droites */
163  rd_prec->succ = sg_out->rays_sg.vsg;
164  /* transfert de la liste des droites a la liste des rayons */
165  sg_out->rays_sg.vsg = sg_out->dtes_sg.vsg;
166  sg_out->dtes_sg.vsg = NULL;
167  /* mise a jour des nombres de droites et de vecteurs */
168  sg_out->rays_sg.nb_v += 2*(sg_out->dtes_sg.nb_v);
169  sg_out->dtes_sg.nb_v = 0;
170  }
171 
172  ifdebug(8) {
173  (void) fprintf(stderr,"sg_without_line: sg_out\n");
174  sg_fprint(stderr, sg_out, variable_dump_name);
175  (void) fprintf(stderr,"sg_without_line: end\n");
176  }
177 
178  return sg_out;
179 }
180 ␌
181 /* Ptsg sg_add_ray(Ptsg sg, Pray_dte ray): ajout d'un rayon a un syteme
182  * generateur; aucune allocation n'est affectuee; il y a donc risque
183  * de sharing pour le rayon ray; l'argument sg est modifie
184  *
185  * Aucune elimination de redondance pour le moment. On peut en envisager trois
186  * niveaux: egalite entre rayons, proportionalite entre rayons et
187  * combinaison lineaire positive de rayons.
188  */
190 Ptsg sg;
191 Pray_dte ray;
192 {
193  /* chainage en tete de la liste des rayons */
194  ray = sg->rays_sg.vsg;
195  sg->rays_sg.vsg = ray;
196 
197  return sg;
198 }
199 ␌
200 /* void sg_rm_sommets(Ptsg sg): desallocation d'une liste de sommets
201  * d'un systeme generateur
202  *
203  * Ex-fonction elim_tt_som() qui prenait en argument une liste de sommets
204  */
206 Ptsg sg;
207 {
208  Psommet s,s1;
209 
210  for (s=sg->soms_sg.ssg; s!=NULL;) {
211  s1 = s->succ;
212  SOMMET_RM(s,"sg_rm_sommets");
213  s = s1;
214  }
215  sg->soms_sg.ssg = NULL;
216  sg->soms_sg.nb_s = 0;
217 }
218 
219 /* void sg_rm_rayons(Ptsg sg): desallocation d'une liste de rayons d'un systeme
220  * generateur
221  */
223 Ptsg sg;
224 {
226  sg->rays_sg.vsg = NULL;
227  sg->rays_sg.nb_v = 0;
228 }
229 
230 /* void sg_rm_droites(Ptsg sg): desallocation d'une liste de droites
231  * d'un systeme generateur
232  */
234 Ptsg sg;
235 {
237  sg->rays_sg.vsg = NULL;
238  sg->rays_sg.nb_v = 0;
239 }
240 
241 /* void sg_rm(Ptsg sg): liberation de l'espace memoire occupe par
242  * un systeme generateur
243  *
244  * Ne pas oublier de remettre le pointeur correspondant a NULL dans le
245  * programme appelant
246  *
247  * Ancien nom: elim_sg()
248  */
249 void sg_rm(sg)
250 Ptsg sg;
251 {
252  sg_rm_sommets(sg);
253  sg_rm_rayons(sg);
254  sg_rm_droites(sg);
255  base_rm(sg->base);
256  FREE((char *)sg,TSG,"sg_rm");
257 }
258 ␌
259 /* void sg_fprint(FILE * f, Ptsg sg, char * (*nom_var)()):
260  * impression d'un systeme generateur
261  */
262 void sg_fprint(FILE * f, Ptsg sg, char * (*nom_var)(Variable))
263 {
264  (void) fprintf(f,"Generating system:\n");
265  (void) fprintf(f,"%d Vert%s \n",sg_nbre_sommets(sg),
266  sg_nbre_sommets(sg)==1? "ex" : "ices");
268  if(sg_nbre_rayons(sg)>0) {
269  (void) fprintf(f,"\n%d Ray%s \n",sg_nbre_rayons(sg),
270  sg_nbre_rayons(sg)==1? "" : "s");
272  }
273  if(sg_nbre_droites(sg)>0) {
274  (void) fprintf(f,"\n%d Line%s \n",sg_nbre_droites(sg),
275  sg_nbre_rayons(sg)==1? "" : "s");
277  }
278  (void) fprintf(f,"\nEnd of generating system ****\n");
279 }
280 
281 /* For debugging */
282 void sg_print(Ptsg sg, char * (*nom_var)(Variable))
283 {
284  sg_fprint(stderr, sg, nom_var);
285 }
286 
287 /* For debugging */
289 {
291 }
292 
293 /* void sg_fprint_as_dense(FILE * f, Ptsg sg):
294  * impression d'un systeme generateur
295  *
296  * Note: b could/should be sg->base
297  */
299 FILE * f;
300 Ptsg sg;
301 Pbase b;
302 {
303  (void) fprintf(f,"Generating system:\n");
304 
305  (void) fprintf(f,"%d Vert%s \n",sg_nbre_sommets(sg),
306  sg_nbre_sommets(sg)==1? "ex" : "ices");
308 
309  if(sg_nbre_rayons(sg)>0) {
310  (void) fprintf(f,"\n%d Ray%s \n",sg_nbre_rayons(sg),
311  sg_nbre_rayons(sg)==1? "" : "s");
313  }
314 
315  if(sg_nbre_droites(sg)>0) {
316  (void) fprintf(f,"\n%d Line%s \n",sg_nbre_droites(sg),
317  sg_nbre_rayons(sg)==1? "" : "s");
319  }
320 
321  (void) fprintf(f,"\nEnd of generating system ****\n");
322 }
323 ␌
324 /* Print a generating system as a dependence direction vector */
325 
326 #define LESSER_DIRECTION 4
327 #define GREATER_DIRECTION 1
328 #define ZERO_DIRECTION 2
329 #define ANY_DIRECTION 7
330 #define NO_DIRECTION 0
331 
333 
335 
337 
338 static char * direction_to_representation[8] = {"?", "<", "=", "<=", ">", "*", ">=", "*"};
339 
340 void
342  FILE * fd,
343  Ptsg sg)
344 {
345  Pbase c = BASE_NULLE;
346  int ddv = 0;
347 
348  fprintf(fd, "ddv(");
349 
350  /* For each coordinate */
351  for(c=sg->base; !BASE_NULLE_P(c); c = c->succ) {
352  Psommet v;
353  Pray_dte r;
354  Pray_dte l;
355 
356  /* For all vertices */
357  for(v=sg_sommets(sg); v!= NULL; v = v->succ) {
359  }
360 
361  /* For all rays */
362  for(r=sg_rayons(sg); r!= NULL; r = r->succ) {
364  }
365 
366  /* For all lines */
367  for(l=sg_droites(sg); l!= NULL; l = l->succ) {
369  }
370 
371  fprintf(fd, c==sg->base? "%s" : ",%s", direction_to_representation[ddv]);
372  }
373 
374  fprintf(fd, ")");
375 }
376 
377 //void sg_dump(sg)
378 //Ptsg sg;
379 //{
380 // /* char * (*variable_dump_name)(); */
381 //
382 // sg_fprint(stderr, sg, variable_dump_name);
383 //}
384 
385 ␌
386 /* bool egal_soms(Ptsg_soms sgs1, Ptsg_soms sgs2): test de l'egalite
387  * de deux listes de sommets associees a un systeme generateur
388  *
389  * Malik: on notera que deux polyedres non faisables (nb sommets = 0)
390  * seront identiques quelque soit la representation du SC
391  *
392  * Francois: comme la structure de donnees tsg_soms n'existe jamais "libre"
393  * mais n'est toujours qu'une partie de la structure tsg, je ne pense pas
394  * qu'il soit necessaire de rendre cette routine visible de l'exterieur
395  */
396 static bool egal_soms(sgs1,sgs2)
397 Ptsg_soms sgs1,sgs2;
398 {
399  if (sgs1->nb_s != sgs2->nb_s) return(false);
400  if (sgs1->nb_s == 0) return(true);
401  return(egaliste_s(sgs1->ssg,&(sgs2->ssg)));
402 }
403 
404 /* bool egal_rd(Ptsg_vects rdgs1, Ptsg_vects rdgs2):
405  * test de de l'egalite des deux objets representes par des structures
406  * tsg_vects
407  *
408  * Ne doit servir que dans sg_egal()
409  */
410 static bool egal_rd(rdgs1,rdgs2)
411 Ptsg_vects rdgs1,rdgs2;
412 {
413  int result;
414  if (rdgs1->nb_v != rdgs2->nb_v) return(0);
415  result = egaliste_rd(rdgs1->vsg,&(rdgs2->vsg));
416  return(result);
417 }
418 
419 /* bool sg_egal(Ptsg sg1, Ptsg sg2): test de l'egalite de deux systemes
420  * generateur sg1 et sg2
421  *
422  * Ce test suppose que les deux systemes ont ete prealablement normalises:
423  * - reduction des coordonnees des sommets, des rayons et des droites
424  * par leur PGCD
425  * - suppression des doublons dans les listes
426  * - suppression des rayons qui sont des droites
427  * - representation unique des vecteurs directeurs des droites
428  * (vecteur lexicopositif par exemple)
429  * - suppression des vecteurs nuls comme rayon ou droite
430  * - absence d'elements redondants dans les systemes generateurs
431  *
432  * Ancien nom: sg_egal()
433  */
434 bool sg_egal(sg1,sg2)
435 Ptsg sg1,sg2;
436 {
437  if (! egal_soms(&(sg1->soms_sg) ,&(sg2->soms_sg) ) ) return(false);
438  if (sg_nbre_sommets(sg1) == 0) return(true);
439  if (! egal_rd(&(sg1->rays_sg),&(sg2->rays_sg))) return(false);
440  if (! egal_rd(&(sg1->dtes_sg),&(sg2->dtes_sg))) return(false);
441  return(true);
442 }
443 
444 /* Ptsg mk_rn(Pbase b): construction du systeme generateur du polyedre
445  * qui represente l'espace entier; le systeme de contraintes correspondant
446  * est vide: il ne contient ni egalite ni inegalite non triviale;
447  *
448  * Modifications:
449  * - remplacement du parametre entier dim par une base (FI, 18/12/89)
450  */
452 Pbase b;
453 {
454  Ptsg sg;
455  Pray_dte d;
456 
457  ifdebug(8) (void) fprintf(stderr,"mk_rn: begin\n");
458 
459  sg = sg_new();
460 
461  /* un sommet a l'origine */
462  (sg->soms_sg).nb_s = 1;
464 
465  /* il n'y a aucun rayon */
466  (sg->rays_sg).nb_v = 0;
467  (sg->rays_sg).vsg = NULL;
468 
469  /* enfin, une droite par dimension */
470  (sg->dtes_sg).nb_v = base_dimension(b);
471  (sg->dtes_sg).vsg = NULL;
472  for (;!VECTEUR_NUL_P(b); b = b->succ) {
474  d->succ = (sg->dtes_sg).vsg;
475  (sg->dtes_sg).vsg = d;
476  }
477  ifdebug(8) {
478  sg_fprint(stderr, sg, variable_dump_name);
479  (void) fprintf(stderr,"mk_rn: end\n");
480  }
481  return(sg);
482 }
483 
484 /* Ptsg ajout_dte(Ptsg sg, Variable v): ajoute une droite dans la direction
485  * correspondant a la variable v
486  */
488 Ptsg sg;
489 Variable v;
490 {
491  Pray_dte dte;
492 
493  /* creation */
494 
495  dte = (Pray_dte ) MALLOC(sizeof(Sray_dte),RAY_DTE,"ajout_dte");
496  dte->vecteur = vect_new(v, VALUE_ONE);
497 
498  /* ajout */
499 
500  dte->succ = sg_droites(sg);
501  sg_droites(sg) = dte;
502  sg_nbre_droites(sg)++;
503  return(sg);
504 }
505 
506 
508 Psommet som;
509 Ptsg sg;
510 {
511  Psommet ps;
512  bool trouve = false;
513 
514  if (!SG_UNDEFINED_P(sg)) {
515  for (ps = sg->soms_sg.ssg; ps != NULL && !trouve ; ps=ps->succ) {
516  trouve = trouve || vect_equal(som->vecteur,ps->vecteur);
517  }
518  }
519  return (trouve);
520 }
521 
522 bool ray_in_sg_p(ray,sg)
523 Pray_dte ray;
524 Ptsg sg;
525 {
526  Pray_dte pr;
527  bool trouve = false;
528 
529  if (!SG_UNDEFINED_P(sg)) {
530  for (pr = sg->rays_sg.vsg; pr != NULL; pr=pr->succ) {
531  trouve = trouve || vect_equal(ray->vecteur,pr->vecteur);
532  }
533  }
534  return (trouve);
535 }
536 
537 bool dte_in_sg_p(dte,sg)
538 Pray_dte dte;
539 Ptsg sg;
540 {
541  Pray_dte pr;
542  bool trouve = false;
543 
544  if (!SG_UNDEFINED_P(sg)) {
545  for (pr = sg->dtes_sg.vsg; pr != NULL; pr=pr->succ) {
546  trouve = trouve || vect_equal(dte->vecteur,pr->vecteur);
547  }
548  }
549  return (trouve);
550 }
551 
552 Ptsg sg_union(sg1,sg2)
553 Ptsg sg1,sg2;
554 {
555  Ptsg sg;
556  bool newsommet = (sg_nbre_sommets(sg1)== 0) ? true : false;
557  bool newray = (sg_nbre_rayons(sg1)== 0) ? true : false;
558  bool newdte = (sg_nbre_droites(sg1)== 0) ? true : false;
559  Psommet ps, ps_tmp;
560  Pray_dte pr,pr_tmp;
561 
562  if (sg1 == NULL)
563  return (sg_dup(sg2));
564  if (sg2 == NULL)
565  return (sg_dup(sg1));
566 
567  sg = sg_dup(sg1);
568  sg->soms_sg.nb_s = sg_nbre_sommets(sg1);
569  sg->rays_sg.nb_v =sg_nbre_rayons(sg1) ;
570  sg->dtes_sg.nb_v = sg_nbre_droites(sg1);
571  /* union des sommets */
572 
573  for (ps = sg->soms_sg.ssg, ps_tmp = ps; ps != NULL ; ps_tmp = ps, ps=ps->succ)
574  ;
575  for (ps = sg2->soms_sg.ssg; ps != NULL; ps=ps->succ) {
576  if (newsommet) {
577  sg->soms_sg.ssg = ps_tmp=sommet_dup(ps);
578  newsommet = false;
579  sg->soms_sg.nb_s++;
580  } else {
581  if (!sommet_in_sg_p(ps,sg)) {
582  ps_tmp->succ=sommet_dup(ps);
583  ps_tmp = ps_tmp->succ; sg->soms_sg.nb_s++;
584  }
585  }
586  }
587 
588  /* union des rayons */
589  for (pr = sg->rays_sg.vsg, pr_tmp=pr; pr!= NULL; pr_tmp = pr, pr = pr->succ)
590  ;
591  for (pr = sg2->rays_sg.vsg; pr != NULL; pr=pr->succ) {
592  if (newray) {
593  sg->rays_sg.vsg = pr_tmp=ray_dte_dup(pr);
594  newray = false;
595  sg->rays_sg.nb_v++;
596  } else {
597  if (!ray_in_sg_p(pr,sg)) {
598  pr_tmp->succ=ray_dte_dup(pr);
599  pr_tmp = pr_tmp->succ;
600  sg->rays_sg.nb_v++;
601  }
602  }
603  }
604 
605  /*union des droites */
606  for (pr = sg->dtes_sg.vsg, pr_tmp=pr; pr!= NULL; pr_tmp = pr,pr=pr->succ)
607  ;
608  for (pr = sg2->dtes_sg.vsg; pr != NULL; pr=pr->succ) {
609  if (newdte) {
610  sg->dtes_sg.vsg = pr_tmp=ray_dte_dup(pr);
611  newdte = false;
612  sg->dtes_sg.nb_v++;
613  } else {
614  if (!dte_in_sg_p(pr,sg)) {
615  pr_tmp->succ=ray_dte_dup(pr);
616  pr_tmp = pr_tmp->succ;
617  sg->dtes_sg.nb_v++;
618  }
619  }
620  }
621  base_rm(sg->base);
622  sg->base = base_union(sg1->base,sg2->base);
623  return (sg);
624 }
#define value_sign(v)
trian operators on values
#define VALUE_ONE
Pbase base_union(Pbase b1, Pbase b2)
Pbase base_union(Pbase b1, Pbase b2): compute a new basis containing all elements of b1 and all eleme...
Definition: base.c:428
Ptsg sg
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_dump_name(Variable v)
variable_dump_name() returns an unambiguous name for variable v, based on the pointer used to really ...
Definition: variable.c:96
int f(int off1, int off2, int n, float r[n], float a[n], float b[n])
Definition: offsets.c:15
struct rdte * Pray_dte
#define RAY_DTE
package ray_dte: structure de donnees representant les rayons et les droites d'un systeme generateur;...
Definition: ray_dte-local.h:41
void fprint_lray_dte_as_dense(FILE *f, Pray_dte listrd, Pbase b)
void fprint_lray_dte_as_dense(FILE * f, Pray_dte listrd): impression d'une liste de rayons ou de droi...
Definition: ray_dte.c:210
Pray_dte ray_dte_make(Pvecteur v)
Pray_dte ray_dte_make(Pvecteur v): allocation et initialisation d'une structure ray_dte;.
Definition: ray_dte.c:108
void fprint_lray_dte(FILE *f, Pray_dte listrd, char *(*nom_var)(Variable))
void fprint_lray_dte(FILE * f, Pray_dte listrd, char * (*nom_var)()): impression d'une liste de rayon...
Definition: ray_dte.c:196
bool egaliste_rd(Pray_dte l1, Pray_dte *ad_l2)
bool egaliste_rd(Pray_dte l1, Pray_dte * l2): egalite de deux listes de rayons ou de droites
Definition: ray_dte.c:260
Pray_dte ray_dte_dup(Pray_dte rd_in)
Pray_dte ray_dte_dup(Pray_dte rd_in): duplication (allocation et copie) d'une structure ray_dte;.
Definition: ray_dte.c:66
Pray_dte ray_oppose(Pray_dte r)
Pray_dte ray_oppose(Pray_dte r): transformation d'un rayon en son oppose (effet de bord)
Definition: ray_dte.c:125
void elim_tt_rd(Pray_dte listrd)
void elim_tt_rd(Pray_dte listrd): suppression d'une liste de rayons ou d'une liste de droites
Definition: ray_dte.c:349
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
char * nom_var[100]
Definition: sc_read.c:89
s1
Definition: set.c:247
#define sg_sommets(sg)
vieilles definitions des fonctions d'impression void sg_fprint(); #define print_sg(sg) sg_fprint(stdo...
Definition: sg-local.h:85
#define sg_rayons(sg)
acces au premier rayon de la liste des rayons d'un systeme generateur defini par un pointeur: sg_rayo...
Definition: sg-local.h:89
struct type_sg * Ptsg
Representation d'un systeme generateur par trois ensembles de sommets de rayons et de droites.
#define sg_nbre_sommets(sg)
nombre de sommets: int sg_nbre_sommets(Ptsg)
Definition: sg-local.h:96
#define TSG
package sur les systemes generateur sg
Definition: sg-local.h:36
#define SG_UNDEFINED
Definition: sg-local.h:73
#define SG_UNDEFINED_P(sg)
Definition: sg-local.h:74
#define sg_nbre_droites(sg)
nombre de droites: int sg_nbre_droites(Ptsg)
Definition: sg-local.h:102
#define sg_nbre_rayons(sg)
nombre de rayons: int sg_nbre_rayons(Ptsg)
Definition: sg-local.h:99
#define sg_droites(sg)
acces a la premiere droite de la liste des droites d'un systeme generateur defini par un pointeur: sg...
Definition: sg-local.h:93
#define MALLOC(s, t, f)
Definition: sg.c:49
void sg_print(Ptsg sg, char *(*nom_var)(Variable))
For debugging.
Definition: sg.c:282
Ptsg ajout_dte(Ptsg sg, Variable v)
Ptsg ajout_dte(Ptsg sg, Variable v): ajoute une droite dans la direction correspondant a la variable ...
Definition: sg.c:487
Ptsg sg_dup(Ptsg sg_in)
Ptsg sg_dup(Ptsg sg_in): allocation d'un systeme generateur sg_out et copie sans sharing des ensemble...
Definition: sg.c:84
Ptsg sg_new()
Ptsg sg_new(): allocation d'un systeme generateur et initialisation a la valeur ensemble vide.
Definition: sg.c:55
static int ray_to_direction[3]
Definition: sg.c:334
#define ifdebug(n)
Definition: sg.c:47
void sg_fprint(FILE *f, Ptsg sg, char *(*nom_var)(Variable))
void sg_fprint(FILE * f, Ptsg sg, char * (*nom_var)()): impression d'un systeme generateur
Definition: sg.c:262
static char * direction_to_representation[8]
Definition: sg.c:338
static int vertex_to_direction[3]
Definition: sg.c:332
static bool egal_soms(Ptsg_soms sgs1, Ptsg_soms sgs2)
bool egal_soms(Ptsg_soms sgs1, Ptsg_soms sgs2): test de l'egalite de deux listes de sommets associees...
Definition: sg.c:396
#define ZERO_DIRECTION
Definition: sg.c:328
#define FREE(p, t, f)
Definition: sg.c:50
static int line_to_direction[3]
Definition: sg.c:336
bool sg_egal(Ptsg sg1, Ptsg sg2)
bool sg_egal(Ptsg sg1, Ptsg sg2): test de l'egalite de deux systemes generateur sg1 et sg2
Definition: sg.c:434
Ptsg mk_rn(Pbase b)
Ptsg mk_rn(Pbase b): construction du systeme generateur du polyedre qui represente l'espace entier; l...
Definition: sg.c:451
Ptsg sg_add_ray(Ptsg sg, Pray_dte ray)
Ptsg sg_add_ray(Ptsg sg, Pray_dte ray): ajout d'un rayon a un syteme generateur; aucune allocation n'...
Definition: sg.c:189
static int sg_debug_level
package pour la structure de donnees tsg (systeme generateur) et pour les deux structures de donnees ...
Definition: sg.c:46
void sg_rm(Ptsg sg)
void sg_rm(Ptsg sg): liberation de l'espace memoire occupe par un systeme generateur
Definition: sg.c:249
#define LESSER_DIRECTION
Print a generating system as a dependence direction vector.
Definition: sg.c:326
void sg_fprint_as_dense(FILE *f, Ptsg sg, Pbase b)
void sg_fprint_as_dense(FILE * f, Ptsg sg): impression d'un systeme generateur
Definition: sg.c:298
void sg_fprint_as_ddv(FILE *fd, Ptsg sg)
Definition: sg.c:341
void sg_rm_droites(Ptsg sg)
void sg_rm_droites(Ptsg sg): desallocation d'une liste de droites d'un systeme generateur
Definition: sg.c:233
bool sommet_in_sg_p(Psommet som, Ptsg sg)
Definition: sg.c:507
static bool egal_rd(Ptsg_vects rdgs1, Ptsg_vects rdgs2)
bool egal_rd(Ptsg_vects rdgs1, Ptsg_vects rdgs2): test de de l'egalite des deux objets representes pa...
Definition: sg.c:410
#define GREATER_DIRECTION
Definition: sg.c:327
void sg_dump(Ptsg sg)
For debugging.
Definition: sg.c:288
bool dte_in_sg_p(Pray_dte dte, Ptsg sg)
Definition: sg.c:537
bool ray_in_sg_p(Pray_dte ray, Ptsg sg)
Definition: sg.c:522
void sg_rm_sommets(Ptsg sg)
void sg_rm_sommets(Ptsg sg): desallocation d'une liste de sommets d'un systeme generateur
Definition: sg.c:205
Ptsg sg_without_line(Ptsg sg_in)
Ptsg sg_without_line(Ptsg sg_in): allocation d'un systeme generateur et copie d'un systeme generateur...
Definition: sg.c:132
Ptsg sg_union(Ptsg sg1, Ptsg sg2)
Definition: sg.c:552
#define ANY_DIRECTION
Definition: sg.c:329
void sg_rm_rayons(Ptsg sg)
void sg_rm_rayons(Ptsg sg): desallocation d'une liste de rayons d'un systeme generateur
Definition: sg.c:222
#define NO_DIRECTION
Definition: sg.c:330
#define SOMMET_RM(s, function_name)
Definition: sommet-local.h:77
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
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 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
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
struct Svecteur * succ
Definition: vecteur-local.h:92
struct rdte * succ
Definition: ray_dte-local.h:46
struct Svecteur * vecteur
Definition: ray_dte-local.h:45
Representation d'un ensemble de sommets.
Definition: sg-local.h:41
struct typ_som * ssg
Definition: sg-local.h:43
int nb_s
Definition: sg-local.h:42
Representation d'un ensemble de droites.
Definition: sg-local.h:47
Pray_dte vsg
Definition: sg-local.h:49
int nb_v
Definition: sg-local.h:48
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
Representation d'un systeme generateur par trois ensembles de sommets de rayons et de droites.
Definition: sg-local.h:66
Stsg_vects rays_sg
Definition: sg-local.h:68
Stsg_soms soms_sg
Definition: sg-local.h:67
Pbase base
Definition: sg-local.h:70
Stsg_vects dtes_sg
Definition: sg-local.h:69
#define vecteur_var(v)
#define VECTEUR_NUL
DEFINITION DU VECTEUR NUL.
#define VECTEUR_NUL_P(v)
#define base_rm(b)
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
#define base_dimension(b)
#define BASE_NULLE
MACROS SUR LES BASES.
#define BASE_NULLE_P(b)
Pbase base_dup(Pbase b)
Pbase base_dup(Pbase b) Note: this function changes the value of the pointer.
Definition: alloc.c:268
Pvecteur vect_new(Variable var, Value coeff)
Pvecteur vect_new(Variable var,Value coeff): allocation d'un vecteur colineaire au vecteur de base va...
Definition: alloc.c:110
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