PIPS
ray_dte.c
Go to the documentation of this file.
1 /*
2 
3  $Id: ray_dte.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 ray_dte, qui represente un rayon ou
26  * une droite de systeme generateur
27  *
28  * Francois Irigoin
29  *
30  * D'autres procedures sur ray_dte doivent etre dispersees dans les fichiers
31  * de Malik
32  *
33  * Liste des procedures:
34  * - Pray_dte ray_dte_dup(Pray_dte): allocation d'une nouvelle structure
35  * et copie de l'ancienne, sauf pour le chainage
36  * - Pray_dte ray_oppose(Pray_dte): transforme un rayon en le rayon oppose
37  * (utilisation: remplacement d'une droite par deux rayons)
38  *
39  * Voir aussi ray_dte.h et poly.h
40  */
41 
42 #ifdef HAVE_CONFIG_H
43  #include "config.h"
44 #endif
45 
46 #include <stdlib.h>
47 #include <stdio.h>
48 
49 #include "boolean.h"
50 #include "arithmetique.h"
51 #include "vecteur.h"
52 #include "contrainte.h"
53 
54 #include "ray_dte.h"
55 
56 #define MALLOC(s,t,f) malloc(s)
57 #define FREE(s,t,f) free(s)
58 
59 /* Pray_dte ray_dte_dup(Pray_dte rd_in): duplication (allocation et copie)
60  * d'une structure ray_dte;
61  *
62  * Le chainage est mis a NULL; le tableau des saturations aussi car on
63  * ne peut pas connaitre sa taille; le vecteur est copie pour ne pas
64  * introduire de sharing
65  */
67 Pray_dte rd_in;
68 {
69  Pray_dte rd_out;
70 
71  if(rd_in->eq_sat!=NULL) {
72  (void) fprintf(stderr,
73  "ray_dte_dup: perte d'un tableau de saturation\n");
74  abort();
75  }
76 
77  rd_out = ray_dte_new();
78  rd_out->vecteur = vect_dup(rd_in->vecteur);
79 
80  return rd_out;
81 }
82 
83 /* Pray_dte ray_dte_new(): allocation d'une structure ray_dte;
84  *
85  * Le chainage est mis a NULL; le tableau des saturations aussi car on
86  * ne peut pas connaitre sa taille; le vecteur est initialise a
87  * VECTEUR_UNDEFINED
88  */
90 {
91  Pray_dte rd;
92 
93  rd = (Pray_dte) MALLOC(sizeof(Sray_dte),RAY_DTE,"ray_dte_new");
94  rd->succ = NULL;
95  rd->eq_sat = NULL;
97 
98  return rd;
99 }
100 
101 /* Pray_dte ray_dte_make(Pvecteur v): allocation et initialisation
102  * d'une structure ray_dte;
103  *
104  * Le chainage est mis a NULL; le tableau des saturations aussi car on
105  * ne peut pas connaitre sa taille; le vecteur n'est pas copie et
106  * du sharing est introduit
107  */
109 Pvecteur v;
110 {
111  Pray_dte rd;
112 
113  rd = ray_dte_new();
114  rd->vecteur = v;
115 
116  return rd;
117 }
118 
119 /* Pray_dte ray_oppose(Pray_dte r): transformation d'un rayon en son
120  * oppose (effet de bord)
121  *
122  * -> ->
123  * r = - r
124  */
126 Pray_dte r;
127 {
128  vect_chg_sgn(r->vecteur);
129  return r;
130 }
131 
132 /* void ray_dte_rm(Pray_dte rm): desallocation complete d'une structure ray_dte
133  */
134 void ray_dte_rm(rd)
135 Pray_dte rd;
136 {
137  vect_rm(rd->vecteur);
138  FREE((char *)rd,RAY_DTE,"ray_dte_rm");
139 }
140 
141 /* void dbg_ray_dte(Pray_dte rd, char * f): desallocation complete d'une
142  * structure ray_dte rd avec trace sur stderr; le nom de la fonction
143  * demandant la desallocation est passe comme deuxieme argument, f.
144  */
146 Pray_dte rd;
147 char *f;
148 {
149  (void) fprintf(stderr,"destruction de R/D dans %s\n",f);
151  dbg_vect_rm(rd->vecteur,f);
152  FREE((char *)rd,RAY_DTE,f);
153 }
154 
155 /* void ray_dte_fprint(File * f, Pray_dte rd, char * (*nom_var)()):
156  * impression d'un rayon ou d'une droite
157  *
158  * FI: tres maladroit; utilise la representation interne d'un vecteur
159  * directement
160  * Modification par YY (09/91)
161  */
163 FILE * f;
164 Pray_dte rd;
165 char * (*nom_var)(Variable);
166 {
167  if(rd->vecteur==NULL)
168  (void) fprintf(f,"( vecteur nul )\n");
169  else vect_fprint(f,rd->vecteur,nom_var);
170 
171 }
172 
173 /* void ray_dte_fprint_as_dense(File * f, Pray_dte rd, Pbase b)
174  * impression d'un rayon ou d'une droite
175  */
177 FILE * f;
178 Pray_dte rd;
179 Pbase b;
180 {
182 }
183 
184 /* void ray_dte_dump(Pray_dte rd): impression de debug de rd sur stderr,
185  * utilisant variable_debug_name()
186  */
187 void ray_dte_dump(rd)
188 Pray_dte rd;
189 {
190  ray_dte_fprint(stderr, rd, variable_debug_name);
191 }
192 
193 /* void fprint_lray_dte(FILE * f, Pray_dte listrd, char * (*nom_var)()):
194  * impression d'une liste de rayons ou de droites
195  */
196 void fprint_lray_dte(f,listrd, nom_var)
197 FILE * f;
198 Pray_dte listrd;
199 char * (*nom_var)(Variable);
200 {
201  Pray_dte e;
202  for (e = listrd; e != NULL; e = e->succ) {
203  ray_dte_fprint(f, e, nom_var);
204  }
205 }
206 
207 /* void fprint_lray_dte_as_dense(FILE * f, Pray_dte listrd):
208  * impression d'une liste de rayons ou de droites
209  */
210 void fprint_lray_dte_as_dense(f, listrd, b)
211 FILE * f;
212 Pray_dte listrd;
213 Pbase b;
214 {
215  Pray_dte e;
216  for (e = listrd; e != NULL; e = e->succ) {
217  ray_dte_fprint_as_dense(f, e, b);
218  }
219 }
220 
221 /* void ray_dte_normalize(Pray_dte rd): normalisation des coordonnees
222  * d'un rayon ou d'une droite rd (division par le pgcd leurs coefficients)
223  *
224  * Ancien nom: norm_rd()
225  */
227 Pray_dte rd;
228 {
229  vect_normalize(rd->vecteur);
230 }
231 
232 /* bool rd_in_liste(Pray-dte rd, Pray_dte lrd): test si rd appartient
233  * a la liste lrd
234  *
235  * Les coordonnees de rd et des elements de lrd sont supposees normalisees.
236  *
237  * Il faudrait distinguer le cas des droites qui peuvent avoir des vecteurs
238  * directeurs opposes et etre neanmoins egales; a moins que le normalisation
239  * soit effectuee de maniere a n'avoir qu'un vecteur directeur possible
240  * (le lexico-positif par exemple).
241  */
242 bool rd_in_liste(rd,lrd)
243 Pray_dte rd;
244 Pray_dte lrd;
245 {
246  Pray_dte rd1;
247 
248  if (rd->vecteur == NULL) return(1);
249  for (rd1=lrd;rd1!=NULL;rd1=rd1->succ) {
250  if (vect_equal((rd1->vecteur),(rd->vecteur))) {
251  return(true);
252  }
253  }
254  return(false);
255 }
256 
257 /* bool egaliste_rd(Pray_dte l1, Pray_dte * l2): egalite de deux listes
258  * de rayons ou de droites
259  */
260 bool egaliste_rd(l1,ad_l2)
261 Pray_dte l1,*ad_l2;
262 {
263  int egalite;
264  Pray_dte eq1,eq2,eq21,eq23,*ad_aux;
265 
266  if (l1==(*ad_l2)) return(true);
267  eq2 = *ad_l2;
268  ad_aux = ad_l2;
269  (*ad_l2) = NULL;
270  for(eq1=l1;eq1!=NULL;eq1=eq1->succ) {
271  egalite = 0;
272  for(eq21=eq2,eq23=eq2;eq21!=NULL;) {
273  if (vect_equal(eq21->vecteur,eq1->vecteur)) {
274  if (eq21==eq2) {
275  eq2=eq2->succ;
276  eq21->succ = NULL;
277  (*ad_aux) = eq21;
278  ad_aux = &(eq21->succ);
279  eq21 = eq23 = eq2;
280  }
281  else {
282  eq23->succ = eq21->succ;
283  eq21->succ = NULL;
284  (*ad_aux) = eq21;
285  ad_aux = &(eq21->succ);
286  eq21 = eq23->succ;
287  }
288  egalite = 1;
289  break;
290  }
291  else {
292  eq23 = eq21;
293  eq21 = eq21->succ;
294  }
295  }
296  if (egalite == 0) {
297  (* ad_aux) = eq2;
298  return(false);
299  }
300  else
301  egalite = 0;
302  }
303  if (eq2==NULL)
304  return(true);
305  else
306  (*ad_aux) = eq2;
307  return(false);
308 }
309 
310 /* Pray_dte elim_null_vect(Pray_dte l, int * n):
311  * elimine les vecteurs nuls d'une liste l de rayons ou
312  * de droites et renvoie un pointeur vers la nouvelle liste ainsi que le
313  * nouveau nombre d'elements de la liste *n
314  *
315  * la nouvelle liste contient les elements non-nuls en ordre inverse
316  */
318 Pray_dte l; /* liste initiale, passee par valeur */
319 int * n; /* nombre d'elements non-nuls dans l */
320 {
321  Pray_dte nl = (Pray_dte) NULL; /* nouvelle liste */
322  Pray_dte zero; /* rayon ou droite nul a desallouer */
323 
324  *n = 0;
325 
326  while(l!=NULL) {
327  if(l->vecteur==NULL) {
328  /* desallocation du rayon ou de la droite */
329  zero = l;
330  l = l->succ;
331  RAY_DTE_RM(zero,"elim_null_vect");
332  }
333  else {
334  Pray_dte ll;
335  (*n)++;
336  /* il faut le chainer a la nouvelle liste */
337  ll = l;
338  l = l->succ;
339  ll->succ = nl;
340  nl = ll;
341  }
342  }
343  return nl;
344 }
345 
346 /* void elim_tt_rd(Pray_dte listrd): suppression d'une liste de rayons
347  * ou d'une liste de droites
348  */
349 void elim_tt_rd(listrd)
350 Pray_dte listrd;
351 {
352  Pray_dte rd,rd1;
353 
354  for (rd=listrd; rd!=NULL;) {
355  rd1 = rd->succ;
356  RAY_DTE_RM(rd,"elim_tt_rd");
357  rd = rd1;
358  }
359 }
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
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
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_RM(rd, f)
Definition: ray_dte-local.h:54
#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 MALLOC(s, t, f)
package pour la structure de donnees ray_dte, qui represente un rayon ou une droite de systeme genera...
Definition: ray_dte.c:56
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 ray_dte_normalize(Pray_dte rd)
void ray_dte_normalize(Pray_dte rd): normalisation des coordonnees d'un rayon ou d'une droite rd (div...
Definition: ray_dte.c:226
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
void ray_dte_fprint_as_dense(FILE *f, Pray_dte rd, Pbase b)
void ray_dte_fprint_as_dense(File * f, Pray_dte rd, Pbase b) impression d'un rayon ou d'une droite
Definition: ray_dte.c:176
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
void ray_dte_fprint(FILE *f, Pray_dte rd, char *(*nom_var)(Variable))
void ray_dte_fprint(File * f, Pray_dte rd, char * (*nom_var)()): impression d'un rayon ou d'une droit...
Definition: ray_dte.c:162
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
Pray_dte ray_dte_new()
Pray_dte ray_dte_new(): allocation d'une structure ray_dte;.
Definition: ray_dte.c:89
void dbg_ray_dte_rm(Pray_dte rd, char *f)
void dbg_ray_dte(Pray_dte rd, char * f): desallocation complete d'une structure ray_dte rd avec trace...
Definition: ray_dte.c:145
Pray_dte elim_null_vect(Pray_dte l, int *n)
Pray_dte elim_null_vect(Pray_dte l, int * n): elimine les vecteurs nuls d'une liste l de rayons ou de...
Definition: ray_dte.c:317
#define FREE(s, t, f)
Definition: ray_dte.c:57
bool rd_in_liste(Pray_dte rd, Pray_dte lrd)
bool rd_in_liste(Pray-dte rd, Pray_dte lrd): test si rd appartient a la liste lrd
Definition: ray_dte.c:242
void ray_dte_dump(Pray_dte rd)
void ray_dte_dump(Pray_dte rd): impression de debug de rd sur stderr, utilisant variable_debug_name()
Definition: ray_dte.c:187
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
void ray_dte_rm(Pray_dte rd)
void ray_dte_rm(Pray_dte rm): desallocation complete d'une structure ray_dte
Definition: ray_dte.c:134
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
char * nom_var[100]
Definition: sc_read.c:89
void vect_chg_sgn(Pvecteur v)
void vect_chg_sgn(Pvecteur v): multiplie v par -1
Definition: scalaires.c:151
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
struct rdte * succ
Definition: ray_dte-local.h:46
struct Svecteur * vecteur
Definition: ray_dte-local.h:45
int * eq_sat
Definition: ray_dte-local.h:44
#define VECTEUR_UNDEFINED
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
void vect_normalize(Pvecteur v)
void vect_normalize(Pvecteur v): division de tous les coefficients de v par leur pgcd; "normalisation...
Definition: unaires.c:59