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

Go to the source code of this file.

Macros

#define ifdebug(n)   if((n)<sg_debug_level)
 
#define MALLOC(s, t, f)   malloc(s)
 
#define FREE(p, t, f)   free(p)
 
#define LESSER_DIRECTION   4
 Print a generating system as a dependence direction vector. More...
 
#define GREATER_DIRECTION   1
 
#define ZERO_DIRECTION   2
 
#define ANY_DIRECTION   7
 
#define NO_DIRECTION   0
 

Functions

Ptsg sg_new ()
 Ptsg sg_new(): allocation d'un systeme generateur et initialisation a la valeur ensemble vide. More...
 
Ptsg sg_dup (Ptsg sg_in)
 Ptsg sg_dup(Ptsg sg_in): allocation d'un systeme generateur sg_out et copie sans sharing des ensembles de rayons, de droites et de sommets de l'argument sg_in. More...
 
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 dont on transforme les lignes en rayons. More...
 
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'est affectuee; il y a donc risque de sharing pour le rayon ray; l'argument sg est modifie. More...
 
void sg_rm_sommets (Ptsg sg)
 void sg_rm_sommets(Ptsg sg): desallocation d'une liste de sommets d'un systeme generateur More...
 
void sg_rm_rayons (Ptsg sg)
 void sg_rm_rayons(Ptsg sg): desallocation d'une liste de rayons d'un systeme generateur More...
 
void sg_rm_droites (Ptsg sg)
 void sg_rm_droites(Ptsg sg): desallocation d'une liste de droites d'un systeme generateur More...
 
void sg_rm (Ptsg sg)
 void sg_rm(Ptsg sg): liberation de l'espace memoire occupe par un systeme generateur More...
 
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 More...
 
void sg_print (Ptsg sg, char *(*nom_var)(Variable))
 For debugging. More...
 
void sg_dump (Ptsg sg)
 For debugging. More...
 
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 More...
 
void sg_fprint_as_ddv (FILE *fd, Ptsg sg)
 
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 a un systeme generateur More...
 
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 par des structures tsg_vects More...
 
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 More...
 
Ptsg mk_rn (Pbase b)
 Ptsg mk_rn(Pbase b): construction du systeme generateur du polyedre qui represente l'espace entier; le systeme de contraintes correspondant est vide: il ne contient ni egalite ni inegalite non triviale;. More...
 
Ptsg ajout_dte (Ptsg sg, Variable v)
 Ptsg ajout_dte(Ptsg sg, Variable v): ajoute une droite dans la direction correspondant a la variable v. More...
 
bool sommet_in_sg_p (Psommet som, Ptsg sg)
 
bool ray_in_sg_p (Pray_dte ray, Ptsg sg)
 
bool dte_in_sg_p (Pray_dte dte, Ptsg sg)
 
Ptsg sg_union (Ptsg sg1, Ptsg sg2)
 

Variables

static int sg_debug_level = 0
 package pour la structure de donnees tsg (systeme generateur) et pour les deux structures de donnees inclues tsg_vects et tsg_soms qui representent les listes de rayons, de droites et de sommets d'un systeme generateur More...
 
static int vertex_to_direction [3] = {LESSER_DIRECTION, ZERO_DIRECTION, GREATER_DIRECTION}
 
static int ray_to_direction [3] = {LESSER_DIRECTION, NO_DIRECTION, GREATER_DIRECTION}
 
static int line_to_direction [3] = {ANY_DIRECTION, NO_DIRECTION, ANY_DIRECTION}
 
static char * direction_to_representation [8] = {"?", "<", "=", "<=", ">", "*", ">=", "*"}
 

Macro Definition Documentation

◆ ANY_DIRECTION

#define ANY_DIRECTION   7

Definition at line 329 of file sg.c.

◆ FREE

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

Definition at line 50 of file sg.c.

◆ GREATER_DIRECTION

#define GREATER_DIRECTION   1

Definition at line 327 of file sg.c.

◆ ifdebug

#define ifdebug (   n)    if((n)<sg_debug_level)

Definition at line 47 of file sg.c.

◆ LESSER_DIRECTION

#define LESSER_DIRECTION   4

Print a generating system as a dependence direction vector.

Definition at line 326 of file sg.c.

◆ MALLOC

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

Definition at line 49 of file sg.c.

◆ NO_DIRECTION

#define NO_DIRECTION   0

Definition at line 330 of file sg.c.

◆ ZERO_DIRECTION

#define ZERO_DIRECTION   2

Definition at line 328 of file sg.c.

Function Documentation

◆ ajout_dte()

Ptsg ajout_dte ( Ptsg  sg,
Variable  v 
)

Ptsg ajout_dte(Ptsg sg, Variable v): ajoute une droite dans la direction correspondant a la variable v.

creation

ajout

Parameters
sgg

Definition at line 487 of file sg.c.

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 }
#define VALUE_ONE
Ptsg sg
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
#define sg_nbre_droites(sg)
nombre de droites: int sg_nbre_droites(Ptsg)
Definition: sg-local.h:102
#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
struct rdte * succ
Definition: ray_dte-local.h:46
struct Svecteur * vecteur
Definition: ray_dte-local.h:45
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

References MALLOC, RAY_DTE, sg, sg_droites, sg_nbre_droites, rdte::succ, VALUE_ONE, vect_new(), and rdte::vecteur.

+ Here is the call graph for this function:

◆ dte_in_sg_p()

bool dte_in_sg_p ( Pray_dte  dte,
Ptsg  sg 
)
Parameters
dtete
sgg

Definition at line 537 of file sg.c.

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 }
bool vect_equal(Pvecteur v1, Pvecteur v2)
bool vect_equal(Pvecteur v1, Pvecteur v2): test a egalite de deux vecteurs
Definition: reductions.c:278
#define SG_UNDEFINED_P(sg)
Definition: sg-local.h:74
Pray_dte vsg
Definition: sg-local.h:49
Stsg_vects dtes_sg
Definition: sg-local.h:69

References type_sg::dtes_sg, sg, SG_UNDEFINED_P, rdte::succ, vect_equal(), rdte::vecteur, and ttsg_vects::vsg.

Referenced by sg_union().

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

◆ egal_rd()

static bool egal_rd ( Ptsg_vects  rdgs1,
Ptsg_vects  rdgs2 
)
static

bool egal_rd(Ptsg_vects rdgs1, Ptsg_vects rdgs2): test de de l'egalite des deux objets representes par des structures tsg_vects

Ne doit servir que dans sg_egal()

Definition at line 410 of file sg.c.

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 }
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
int nb_v
Definition: sg-local.h:48

References egaliste_rd().

Referenced by sg_egal().

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

◆ egal_soms()

static bool egal_soms ( Ptsg_soms  sgs1,
Ptsg_soms  sgs2 
)
static

bool egal_soms(Ptsg_soms sgs1, Ptsg_soms sgs2): test de l'egalite de deux listes de sommets associees a un systeme generateur

Malik: on notera que deux polyedres non faisables (nb sommets = 0) seront identiques quelque soit la representation du SC

Francois: comme la structure de donnees tsg_soms n'existe jamais "libre" mais n'est toujours qu'une partie de la structure tsg, je ne pense pas qu'il soit necessaire de rendre cette routine visible de l'exterieur

Definition at line 396 of file sg.c.

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 }
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
struct typ_som * ssg
Definition: sg-local.h:43
int nb_s
Definition: sg-local.h:42

References egaliste_s().

Referenced by sg_egal().

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

◆ mk_rn()

Ptsg mk_rn ( Pbase  b)

Ptsg mk_rn(Pbase b): construction du systeme generateur du polyedre qui represente l'espace entier; le systeme de contraintes correspondant est vide: il ne contient ni egalite ni inegalite non triviale;.

Modifications:

  • remplacement du parametre entier dim par une base (FI, 18/12/89)

un sommet a l'origine

il n'y a aucun rayon

enfin, une droite par dimension

Definition at line 451 of file sg.c.

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 }
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
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
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
Ptsg sg_new()
Ptsg sg_new(): allocation d'un systeme generateur et initialisation a la valeur ensemble vide.
Definition: sg.c:55
#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
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
struct Svecteur * succ
Definition: vecteur-local.h:92
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
#define vecteur_var(v)
#define VECTEUR_NUL
DEFINITION DU VECTEUR NUL.
#define VECTEUR_NUL_P(v)
#define base_dimension(b)

References base_dimension, type_sg::dtes_sg, fprintf(), ifdebug, ray_dte_make(), type_sg::rays_sg, sg, sg_fprint(), sg_new(), sommet_make(), type_sg::soms_sg, rdte::succ, Svecteur::succ, VALUE_ONE, variable_dump_name(), vect_new(), VECTEUR_NUL, VECTEUR_NUL_P, and vecteur_var.

+ Here is the call graph for this function:

◆ ray_in_sg_p()

bool ray_in_sg_p ( Pray_dte  ray,
Ptsg  sg 
)
Parameters
rayay
sgg

Definition at line 522 of file sg.c.

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 }

References type_sg::rays_sg, sg, SG_UNDEFINED_P, rdte::succ, vect_equal(), rdte::vecteur, and ttsg_vects::vsg.

Referenced by sg_union().

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

◆ sg_add_ray()

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'est affectuee; il y a donc risque de sharing pour le rayon ray; l'argument sg est modifie.

Aucune elimination de redondance pour le moment. On peut en envisager trois niveaux: egalite entre rayons, proportionalite entre rayons et combinaison lineaire positive de rayons.

chainage en tete de la liste des rayons

Parameters
sgg
rayay

Definition at line 189 of file sg.c.

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 }

References type_sg::rays_sg, sg, and ttsg_vects::vsg.

◆ sg_dump()

void sg_dump ( Ptsg  sg)

For debugging.

Parameters
sgg

Definition at line 288 of file sg.c.

289 {
291 }
void sg_print(Ptsg sg, char *(*nom_var)(Variable))
For debugging.
Definition: sg.c:282

References sg, sg_print(), and variable_dump_name().

+ Here is the call graph for this function:

◆ sg_dup()

Ptsg sg_dup ( Ptsg  sg_in)

Ptsg sg_dup(Ptsg sg_in): allocation d'un systeme generateur sg_out et copie sans sharing des ensembles de rayons, de droites et de sommets de l'argument sg_in.

sg_in n'est pas modifie

Autre nom (obsolete): cp_sg()

Extension: duplicate undefined generating systems (FI, 22 May 2009)

sc_dup() has been replaced by sc_copy() which maintains the order in the data structure lists. Maybe we need the same change for generating systems.

duplication de la liste des sommets

duplication de la liste des rayons

duplication de la liste des droites

Parameters
sg_ing_in

Definition at line 84 of file sg.c.

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 }
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
#define SG_UNDEFINED
Definition: sg-local.h:73
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
structure de donnees Sommet
Definition: sommet-local.h:64
struct typ_som * succ
Definition: sommet-local.h:68
Pbase base
Definition: sg-local.h:70
Pbase base_dup(Pbase b)
Pbase base_dup(Pbase b) Note: this function changes the value of the pointer.
Definition: alloc.c:268

References type_sg::base, base_dup(), type_sg::dtes_sg, ttsg_soms::nb_s, ttsg_vects::nb_v, ray_dte_dup(), type_sg::rays_sg, sg_new(), SG_UNDEFINED, SG_UNDEFINED_P, sommet_dup(), type_sg::soms_sg, ttsg_soms::ssg, rdte::succ, typ_som::succ, and ttsg_vects::vsg.

Referenced by conflict_dup(), initialize_newgen(), sg_union(), and sg_without_line().

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

◆ sg_egal()

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

Ce test suppose que les deux systemes ont ete prealablement normalises:

  • reduction des coordonnees des sommets, des rayons et des droites par leur PGCD
  • suppression des doublons dans les listes
  • suppression des rayons qui sont des droites
  • representation unique des vecteurs directeurs des droites (vecteur lexicopositif par exemple)
  • suppression des vecteurs nuls comme rayon ou droite
  • absence d'elements redondants dans les systemes generateurs

Ancien nom: sg_egal()

Parameters
sg1g1
sg2g2

Definition at line 434 of file sg.c.

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 }
#define sg_nbre_sommets(sg)
nombre de sommets: int sg_nbre_sommets(Ptsg)
Definition: sg-local.h:96
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
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

References egal_rd(), egal_soms(), and sg_nbre_sommets.

+ Here is the call graph for this function:

◆ sg_fprint()

void sg_fprint ( FILE *  f,
Ptsg  sg,
char *(*)(Variable nom_var 
)

void sg_fprint(FILE * f, Ptsg sg, char * (*nom_var)()): impression d'un systeme generateur

Definition at line 262 of file sg.c.

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 }
int f(int off1, int off2, int n, float r[n], float a[n], float b[n])
Definition: offsets.c:15
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
char * nom_var[100]
Definition: sc_read.c:89
#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
#define sg_nbre_rayons(sg)
nombre de rayons: int sg_nbre_rayons(Ptsg)
Definition: sg-local.h:99
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

References f(), fprint_lray_dte(), fprint_lsom(), fprintf(), nom_var, sg, sg_droites, sg_nbre_droites, sg_nbre_rayons, sg_nbre_sommets, sg_rayons, and sg_sommets.

Referenced by adg_print_graph(), main(), mk_rn(), sg_print(), and sg_without_line().

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

◆ sg_fprint_as_ddv()

void sg_fprint_as_ddv ( FILE *  fd,
Ptsg  sg 
)

For each coordinate

For all vertices

For all rays

For all lines

Parameters
fdd
sgg

Definition at line 341 of file sg.c.

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 }
#define value_sign(v)
trian operators on values
static int ray_to_direction[3]
Definition: sg.c:334
static char * direction_to_representation[8]
Definition: sg.c:338
static int vertex_to_direction[3]
Definition: sg.c:332
static int line_to_direction[3]
Definition: sg.c:336
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
Pvecteur vecteur
Definition: sommet-local.h:66
#define BASE_NULLE
MACROS SUR LES BASES.
#define BASE_NULLE_P(b)
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 type_sg::base, BASE_NULLE, BASE_NULLE_P, direction_to_representation, fprintf(), line_to_direction, ray_to_direction, sg, sg_droites, sg_rayons, sg_sommets, rdte::succ, typ_som::succ, Svecteur::succ, value_sign, vect_coeff(), rdte::vecteur, typ_som::vecteur, vecteur_var, and vertex_to_direction.

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

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

◆ sg_fprint_as_dense()

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

Note: b could/should be sg->base

Parameters
sgg

Definition at line 298 of file sg.c.

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 }
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
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

References f(), fprint_lray_dte_as_dense(), fprint_lsom_as_dense(), fprintf(), sg, sg_droites, sg_nbre_droites, sg_nbre_rayons, sg_nbre_sommets, sg_rayons, and sg_sommets.

Referenced by legal_point_p(), prettyprint_dependence_graph(), and prettyprint_dependence_graph_view().

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

◆ sg_new()

Ptsg sg_new ( void  )

Ptsg sg_new(): allocation d'un systeme generateur et initialisation a la valeur ensemble vide.

Obsolete macros of Malik Imadache #define soms_of_sg(sg) (((sg).soms_sg).ssg) #define rays_of_sg(sg) (((sg).rays_sg).vsg) #define dtes_of_sg(sg) (((sg).dtes_sg).vsg)

Definition at line 55 of file sg.c.

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 }
struct type_sg * Ptsg
Representation d'un systeme generateur par trois ensembles de sommets de rayons et de droites.
#define TSG
package sur les systemes generateur sg
Definition: sg-local.h:36

References type_sg::base, type_sg::dtes_sg, MALLOC, ttsg_soms::nb_s, ttsg_vects::nb_v, type_sg::rays_sg, sg, type_sg::soms_sg, ttsg_soms::ssg, TSG, and ttsg_vects::vsg.

Referenced by dependence_cone_positive(), main(), mk_rn(), sg_dup(), and sg_of_rays().

+ Here is the caller graph for this function:

◆ sg_print()

void sg_print ( Ptsg  sg,
char *(*)(Variable nom_var 
)

For debugging.

Definition at line 282 of file sg.c.

283 {
284  sg_fprint(stderr, sg, nom_var);
285 }

References nom_var, sg, and sg_fprint().

Referenced by sg_dump().

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

◆ sg_rm()

void sg_rm ( Ptsg  sg)

void sg_rm(Ptsg sg): liberation de l'espace memoire occupe par un systeme generateur

Ne pas oublier de remettre le pointeur correspondant a NULL dans le programme appelant

Ancien nom: elim_sg()

Parameters
sgg

Definition at line 249 of file sg.c.

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 }
#define FREE(p, t, f)
Definition: sg.c:50
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
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
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 base_rm(b)

References type_sg::base, base_rm, FREE, sg, sg_rm_droites(), sg_rm_rayons(), sg_rm_sommets(), and TSG.

Referenced by dependence_cone_positive(), initialize_newgen(), sg_of_sc(), and TestDependence().

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

◆ sg_rm_droites()

void sg_rm_droites ( Ptsg  sg)

void sg_rm_droites(Ptsg sg): desallocation d'une liste de droites d'un systeme generateur

Parameters
sgg

Definition at line 233 of file sg.c.

235 {
237  sg->rays_sg.vsg = NULL;
238  sg->rays_sg.nb_v = 0;
239 }
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

References elim_tt_rd(), ttsg_vects::nb_v, type_sg::rays_sg, sg, and ttsg_vects::vsg.

Referenced by sg_rm().

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

◆ sg_rm_rayons()

void sg_rm_rayons ( Ptsg  sg)

void sg_rm_rayons(Ptsg sg): desallocation d'une liste de rayons d'un systeme generateur

Parameters
sgg

Definition at line 222 of file sg.c.

224 {
226  sg->rays_sg.vsg = NULL;
227  sg->rays_sg.nb_v = 0;
228 }

References elim_tt_rd(), ttsg_vects::nb_v, type_sg::rays_sg, sg, and ttsg_vects::vsg.

Referenced by sg_rm().

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

◆ sg_rm_sommets()

void sg_rm_sommets ( Ptsg  sg)

void sg_rm_sommets(Ptsg sg): desallocation d'une liste de sommets d'un systeme generateur

Ex-fonction elim_tt_som() qui prenait en argument une liste de sommets

Parameters
sgg

Definition at line 205 of file sg.c.

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 }
s1
Definition: set.c:247
#define SOMMET_RM(s, function_name)
Definition: sommet-local.h:77

References ttsg_soms::nb_s, s1, sg, SOMMET_RM, type_sg::soms_sg, ttsg_soms::ssg, and typ_som::succ.

Referenced by sg_rm().

+ Here is the caller graph for this function:

◆ sg_union()

Ptsg sg_union ( Ptsg  sg1,
Ptsg  sg2 
)

union des sommets

union des rayons

nion des droites

Parameters
sg1g1
sg2g2

Definition at line 552 of file sg.c.

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 }
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_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
bool sommet_in_sg_p(Psommet som, Ptsg sg)
Definition: sg.c:507
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

References type_sg::base, base_rm, base_union(), dte_in_sg_p(), type_sg::dtes_sg, ttsg_soms::nb_s, ttsg_vects::nb_v, ray_dte_dup(), ray_in_sg_p(), type_sg::rays_sg, sg, sg_dup(), sg_nbre_droites, sg_nbre_rayons, sg_nbre_sommets, sommet_dup(), sommet_in_sg_p(), type_sg::soms_sg, ttsg_soms::ssg, rdte::succ, typ_som::succ, and ttsg_vects::vsg.

Referenced by main().

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

◆ sg_without_line()

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 dont on transforme les lignes en rayons.

Aucune elimination de redondance pour le moment. On peut en envisager trois niveaux: egalite entre rayons, proportionalite entre rayons et combinaison lineaire positive de rayons.

ajout des l'oppose des vecteurs directeur des droites a la liste des rayons

allocation et calcul du vecteur opppose

chainage en tete de la liste des rayons

ajout (sans duplication en memoire) de la liste des vecteurs directeurs des droites a la liste des rayons, si l'ensemble des droites n'est pas vide

ajout de l'ensemble des rayons a l'ensemble des droites

transfert de la liste des droites a la liste des rayons

mise a jour des nombres de droites et de vecteurs

Parameters
sg_ing_in

Definition at line 132 of file sg.c.

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 }
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

References type_sg::dtes_sg, fprintf(), ifdebug, ttsg_vects::nb_v, ray_oppose(), type_sg::rays_sg, sg_dup(), sg_fprint(), rdte::succ, variable_dump_name(), and ttsg_vects::vsg.

+ Here is the call graph for this function:

◆ sommet_in_sg_p()

bool sommet_in_sg_p ( Psommet  som,
Ptsg  sg 
)
Parameters
somom
sgg

Definition at line 507 of file sg.c.

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 }

References sg, SG_UNDEFINED_P, type_sg::soms_sg, ttsg_soms::ssg, typ_som::succ, vect_equal(), and typ_som::vecteur.

Referenced by sg_union().

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

Variable Documentation

◆ direction_to_representation

char* direction_to_representation[8] = {"?", "<", "=", "<=", ">", "*", ">=", "*"}
static

Definition at line 338 of file sg.c.

Referenced by sg_fprint_as_ddv().

◆ line_to_direction

int line_to_direction[3] = {ANY_DIRECTION, NO_DIRECTION, ANY_DIRECTION}
static

Definition at line 336 of file sg.c.

Referenced by sg_fprint_as_ddv().

◆ ray_to_direction

int ray_to_direction[3] = {LESSER_DIRECTION, NO_DIRECTION, GREATER_DIRECTION}
static

Definition at line 334 of file sg.c.

Referenced by sg_fprint_as_ddv().

◆ sg_debug_level

int sg_debug_level = 0
static

package pour la structure de donnees tsg (systeme generateur) et pour les deux structures de donnees inclues tsg_vects et tsg_soms qui representent les listes de rayons, de droites et de sommets d'un systeme generateur

Francois Irigoin

Definition at line 46 of file sg.c.

◆ vertex_to_direction

int vertex_to_direction[3] = {LESSER_DIRECTION, ZERO_DIRECTION, GREATER_DIRECTION}
static

Definition at line 332 of file sg.c.

Referenced by sg_fprint_as_ddv().