PIPS
sommet.h File Reference

Go to the source code of this file.

Data Structures

struct  typ_som
 structure de donnees Sommet More...
 

Macros

#define SOMMET   1004
 Warning! Do not modify this file that is automatically generated! More...
 
#define print_som(s)   sommet_fprint(stdout,s)
 
#define print_lsom(ls)   fprint_lsom(stdout,ls)
 
#define VERSION_FINALE
 
#define SOMMET_RM(s, function_name)   sommet_rm(s)
 
#define sommet_denominateur(s)   ((s)->denominateur)
 macros d'acces More...
 

Typedefs

typedef struct typ_somPsommet
 structure de donnees Sommet More...
 
typedef struct typ_som Ssommet
 

Functions

Psommet sommet_new (void)
 SOMMET. More...
 
Psommet sommet_make (Value, Pvecteur)
 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)
 Psommet sommet_dup(Psommet s_in): allocation et copie de la valeur d'un sommet. More...
 
void sommet_rm (Psommet)
 void sommet_rm(Psommet s): desallocation complete d'une structure sommet More...
 
void dbg_sommet_rm (Psommet, char *)
 
void sommet_fprint (FILE *, Psommet, char *(*)(Variable))
 
void sommet_fprint_as_dense (FILE *, Psommet, Pbase)
 void sommet_fprint_as_dense(FILE * f, Psommet s): impression d'un sommet More...
 
void sommet_dump (Psommet)
 void sommet_dump(Psommet s): impression d'un sommet sur stderr avec variable_debug_name() More...
 
void fprint_lsom (FILE *, Psommet, char *(*)(Variable))
 
void fprint_lsom_as_dense (FILE *, Psommet, Pbase)
 void fprint_lsom_as_dense(FILE * f, Psommet s): impression d'une liste de sommets More...
 
void sommet_normalize (Psommet)
 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, Psommet)
 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, Psommet)
 bool sommet_egal(Psommet s1, Psommet s2): test de l'egalite de representation de deux sommets More...
 
bool egaliste_s (Psommet, Psommet *)
 bool egaliste_s(Psommet l1, Psommet * ad_l2): test d'egalite de listes de sommets More...
 
void sommet_add (Psommet *, Psommet, int *)
 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...
 
Psommet sommets_dup (Psommet)
 sommets.c More...
 
void sommets_rm (Psommet)
 void sommets_rm(Psommet ps): liberation de l'espace memoire alloue a une liste de sommets More...
 
void sommets_normalize (Psommet)
 void sommets_normalize(som) Normalisation des elements d'une liste de sommets i.e. More...
 

Macro Definition Documentation

◆ print_lsom

#define print_lsom (   ls)    fprint_lsom(stdout,ls)

Definition at line 81 of file sommet.h.

◆ print_som

#define print_som (   s)    sommet_fprint(stdout,s)

Definition at line 79 of file sommet.h.

◆ SOMMET

#define SOMMET   1004

Warning! Do not modify this file that is automatically generated!

Modify src/Libs/sommet/sommet-local.h instead, to add your own modifications. header file built by cproto sommet-local.h package sommet: structure de donnees representant les sommets d'un systeme generateur; elle contient:

  • le vecteur correspondant, a un coefficient multiplicatif pret qui le rend entier,
  • son denominateur,
  • un eventuel tableau de saturation (par rapport a une liste implicite de contraintes),
  • le chainage vers les autres rayons ou droites.

Francois Irigoin, Mai 1989

Cette structure de donnees est aussi utilisee dans plint.dir pour representer la fonction economique, les contraintes lineaires et les systemes de contraintes lineaires.

FI: commentaires a completer par Corinne, declaration d'un type synonyme pour eviter les conflits? valeur numerique utilise pour flagger les structures de donnees de type sommet

Definition at line 56 of file sommet.h.

◆ sommet_denominateur

#define sommet_denominateur (   s)    ((s)->denominateur)

macros d'acces

int sommet_denominateur(Psommet): denominateur des coordonnees d'un sommet; ex den_of()

Definition at line 95 of file sommet.h.

◆ SOMMET_RM

#define SOMMET_RM (   s,
  function_name 
)    sommet_rm(s)

Definition at line 85 of file sommet.h.

◆ VERSION_FINALE

#define VERSION_FINALE

Definition at line 83 of file sommet.h.

Typedef Documentation

◆ Psommet

typedef struct typ_som * Psommet

structure de donnees Sommet

  • eq_sat: eventuel tableau des saturations du sommets par rapport a un eventuel systeme de contraintes; inutilisable quand on ne connait pas le nombre de contraintes, egalites ou inegalites
  • vecteur: coordonnees entieres du sommet, a un coefficient multiplicatif pres; l'inverse de ce coefficient est donne par le champ suivant
  • denominateur: coefficient permettant de garder les coordonnees du sommet sous forme rationnelle; les numerateurs des coordonnees se trouvent dans "vecteur"; le denominateur est unique, pour le sommet, i.e. c'est le PGCD des coordonnees; le denominateur doit toujours etre strictement positif
  • succ: pointeur vers le sommet suivant; on s'interesse a l'ensemble des sommets du systeme generateur plutot qu'a un sommet particulier

◆ Ssommet

typedef struct typ_som Ssommet

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 *  ,
Psommet  ,
char *  *)(Variable 
)

◆ 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 *  ,
Psommet  ,
char *  *)(Variable 
)

◆ 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 }
#define value_notone_p(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

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  )

SOMMET.

cproto-generated files sommet.c

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:

◆ sommets_dup()

Psommet sommets_dup ( Psommet  som)

sommets.c

sommets.c

pointeur vers le dernier element de la liste

pointeur vers le premier element de la liste

Parameters
somom

Definition at line 49 of file sommets.c.

51 {
52 
53  Psommet som1,som2;
54  /* pointeur vers le dernier element de la liste*/
55  Psommet pred;
56  /* pointeur vers le premier element de la liste*/
57  Psommet debut = NULL;
58 
59 
60 #ifdef TRACE
61  printf(" ***** duplication du systeme \n");
62 #endif
63  if (som)
64  {
65  som2 = sommet_dup(som);
66  debut = som2;
67  pred = som2;
68  for (som1 = som->succ; som1 != NULL; som1 = som1->succ)
69  {
70 
71  som2 = sommet_dup(som1);
72  pred->succ = som2;
73  pred = som2;
74  };
75  };
76  return (debut);
77 }
int printf()
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

References printf(), sommet_dup(), and typ_som::succ.

+ Here is the call graph for this function:

◆ sommets_normalize()

void sommets_normalize ( Psommet  som)

void sommets_normalize(som) Normalisation des elements d'une liste de sommets i.e.

division par le pgcd de tous les elements.

Parameters
somom

Definition at line 108 of file sommets.c.

110 {
111  Psommet ps;
112  for (ps = som;ps!= NULL; ps= ps->succ)
113  sommet_normalize(ps);
114 }
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

References sommet_normalize(), and typ_som::succ.

Referenced by eq_in_ineq(), pivoter(), and primal_pivot().

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

◆ sommets_rm()

void sommets_rm ( Psommet  ps)

void sommets_rm(Psommet ps): liberation de l'espace memoire alloue a une liste de sommets

Parameters
pss

Definition at line 83 of file sommets.c.

85 {
86  Psommet p1,p2;
87 
88 #ifdef TRACE2
89  printf(" ***** erase systeme \n");
90 #endif
91 
92  for (p2 = ps;p2 != NULL;)
93  {
94  p1 = p2->succ;
95  FREE((int *)p2->eq_sat,INTEGER,"sommets_rm");
96  vect_rm(p2->vecteur);
97  FREE((Psommet)p2,SOMMET,"sommets_rm");
98  p2 = p1;
99  }
100 
101 }
#define FREE(s, t, f)
Definition: sommets.c:43

References typ_som::eq_sat, FREE, printf(), SOMMET, typ_som::succ, vect_rm(), and typ_som::vecteur.

Referenced by dual_pivot(), dual_pivot_pas(), find_eg(), gomory_eq(), plint(), plint_degen(), plint_pas(), plreal(), primal(), primal_pivot(), and primal_positive().

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