PIPS
private.c
Go to the documentation of this file.
1 /*
2 
3  $Id: private.c 1671 2019-06-26 19:14:11Z 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 vecteur
26  * routines internes au package
27  */
28 
29 /*LINTLIBRARY*/
30 #ifdef HAVE_CONFIG_H
31  #include "config.h"
32 #endif
33 
34 #include <stdio.h>
35 #include "linear_assert.h"
36 
37 #include "boolean.h"
38 #include "arithmetique.h"
39 #include "vecteur.h"
40 
41 /* PRIVATE: introduit du sharing, ne garantit pas l'unicite de chaque
42  * composante
43  *
44  * Pvecteur vect_chain(Pvecteur v_in, Variable var, Value coeff):
45  * ajout d'un vecteur colineaire au vecteur de base var et de coefficient
46  * coeff au vecteur v_in; si la composante var de v_in etait nulle:
47  *
48  * si <v_in . evar> == 0 alors
49  * ---->
50  * allocate v_out;
51  * ----> ---> -->
52  * v_out = v_in + coeff var;
53  * --->
54  * destroy v_in;
55  * sinon
56  * chaos!
57  *
58  * v_in ne doit plus etre utilise ulterieurement; l'utilisation
59  * standard est donc:
60  * v = vect_chain(v,var,coeff);
61  *
62  * Pour preserver la coherence des vecteurs, l'utilisateur doit
63  * appeler vect_add_elem(v,var,coeff) qui teste l'existence d'un coefficient
64  * var nul dans v avant de creer un nouveau couple (var,coeff)
65  *
66  * On pourrait preferer le passage d'un Pvecteur * comme premier argument
67  * et un return void.
68  */
69 Pvecteur vect_chain(v_in,var,coeff)
70 Pvecteur v_in;
71 Variable var;
72 Value coeff;
73 {
74  Pvecteur v_out;
75 
76  /* very expensive for EDF... FC/CA 06/07/2000. useless? */
77  /* assert(vect_coeff(var, v_in)==0); */
78 
79  v_out = vect_new(var, coeff);
80  v_out->succ = v_in;
81 
82  return (v_out);
83 }
84 
85 /* PRIVATE: introduit du sharing; never used...
86  *
87  * Pvecteur vect_elem(Pvecteur vect, Variable var): retourne la valeur
88  * du pointeur vers le couple correspondant a la variable var dans le
89  * vecteur vect, s'il existe ou NULL sinon.
90  */
92 Pvecteur vect;
93 Variable var;
94 {
95  for( ;vect!=NULL;vect=vect->succ) {
96  if (var_of(vect)==var) {
97  return(vect);
98  }
99  }
100  return (NULL);
101 }
102 
103 /* UNUSED - NOT TESTED
104  *
105  * Pvecteur vect_extract(Pvecteur pvec, Variable var):
106  * fonction qui extrait le couple (variable,coefficient) du vecteur et renvoie
107  * l'adresse d'un nouveau vecteur vers ce couple. On a donc un effet de
108  * bord sur pvec (qui est impossible a assurer dans tous les cas) et un
109  * retour de valeur
110  *
111  * ---> ---> ---> --> -->
112  * pvec := pvec - <pvec . var> var;
113  * ---->
114  * allocate pvec1;
115  * ----> ---> --> -->
116  * return(pvec1 := <pvec . var> var);
117  *
118  * Notes:
119  * - ca ne peut pas marcher si var apparait dans le premier couple du vecteur
120  * car on n'a pas moyen de changer pvec, vu la passage par valeur; il
121  * faudrait donc soit changer le type de la procedure et passer un
122  * Pvecteur *, soit autoriser les couples de valeur 0;
123  * - cette fonction n'est utile que si elle diminue le nombre d'allocations;
124  * elle commence malencontreusement par un vect_dup inconditionnel.
125  */
127 Pvecteur pvec;
128 Variable var;
129 {
130  Pvecteur pvec1 = vect_dup(pvec);
131  Pvecteur var_val = pvec1;
132  Pvecteur var_pred = pvec1;
133 
134  if (var_val != NULL) {
135  if ( var_of(var_pred)== var) {
136  /* le couple interessant se trouve en tete */
137  pvec1 = var_pred->succ;
138  var_pred->succ = NULL;
139  return (var_pred);
140  }
141  else {
142  for(var_val=(var_val->succ);var_val!=NULL;var_pred = var_val,
143  var_val=var_val->succ) {
144  if (var_of(var_val)==var) {
145  var_pred->succ = var_val->succ;
146  var_val->succ = NULL;
147  return(var_val);
148  }
149  }
150 
151  }
152  }
153 
154  /* Sinon, c'est le vecteur 0 */
155  return (NULL);
156 }
157 
158 /* PRIVATE: marquage du couple var_val comme visite par remplacement de
159  * var par -var dans le couple (OBSOLETE)
160  *
161  * Value vect_coeff_m(Variable var, Pvecteur vect)
162  *
163  * static Value vect_coeff_m(var,vect)
164  * Variable var;
165  * Pvecteur vect;
166  * {
167  * for (; vect != NULL ; vect = vect->succ)
168  * if (var_of(vect) == var) {
169  * marquer(vect);
170  * return(val_of(vect));
171  * }
172  * return(0);
173  * }
174  */
175 
176 
177 /* PRIVATE
178  * Pvecteur vect_tri_old(Pvecteur pvec): allocation d'un vecteur
179  * prenant une valeur egale a celle de pvec mais dont les couples
180  * (variable,valeur) sont tries dans "l'ordre croissant" des vecteurs de base
181  * (i.e. des variables)
182  */
183 /*
184 static Pvecteur vect_tri_old(pvec)
185 Pvecteur pvec;
186 {
187  Pvecteur pv1,pv2,pv3;
188 
189  Pvecteur debut = NULL;
190  Pvecteur pred;
191 
192  if (pvec)
193  {
194  debut = vect_new(pvec->var,pvec->val);
195  for (pv1 = pvec->succ;pv1!= NULL;pv1 = pv1->succ)
196  {
197 
198  pred = debut;
199  for (pv2 = debut;((pv2 != NULL) && (pv2->var < pv1->var));
200  pred = pv2,pv2=pv2->succ);
201 
202  if ( pv2 == pred)
203  {
204  pv3 = vect_new(pv1->var,pv1->val);
205  pv3->succ = debut;
206  debut = pv3;
207  }
208  else
209  {
210  pv3 = vect_new(pv1->var,pv1->val);
211  pred->succ = pv3;
212  pv3->succ = pv2;
213  }
214  }
215  }
216  return (debut);
217 }
218 */
219 
220 
221 /* Variable vect_first_var(Pvecteur pvec)
222  * retourne la premiere variable (au sens CAR) du vecteur pvec
223  * routine sale mais qui permet d'iterer sur les variables
224  * formant un vecteur ou une base.
225  * 20/06/90 PB
226  */
228 Pvecteur pvec;
229 {
230  return(pvec->var);
231 }
232 
233 /* Pvecteur vect_reversal(Pvecteur vect_in); produces the reversal vector of
234  * the vect_in. vect_in is not killed.
235  * 12/09/91, YY
236  */
238 Pvecteur vect_in;
239 {
240  Pvecteur pv;
241  Pvecteur vect_out = VECTEUR_NUL;
242 
243  for(pv=vect_in; !VECTEUR_NUL_P(pv); pv=pv->succ)
244  vect_add_elem(&vect_out, vecteur_var(pv), vecteur_val(pv));
245  return (vect_out);
246 }
247 
int Value
Variable vect_first_var(Pvecteur pvec)
PRIVATE: marquage du couple var_val comme visite par remplacement de var par -var dans le couple (OBS...
Definition: private.c:227
Pvecteur vect_chain(Pvecteur v_in, Variable var, Value coeff)
package vecteur routines internes au package
Definition: private.c:69
Pvecteur vect_extract(Pvecteur pvec, Variable var)
UNUSED - NOT TESTED.
Definition: private.c:126
Pvecteur vect_elem(Pvecteur vect, Variable var)
PRIVATE: introduit du sharing; never used...
Definition: private.c:91
Pvecteur vect_reversal(Pvecteur vect_in)
Pvecteur vect_reversal(Pvecteur vect_in); produces the reversal vector of the vect_in.
Definition: private.c:237
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
#define vecteur_val(v)
#define vecteur_var(v)
#define VECTEUR_NUL
DEFINITION DU VECTEUR NUL.
#define VECTEUR_NUL_P(v)
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 var_of(varval)
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
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
void vect_add_elem(Pvecteur *pvect, Variable var, Value val)
void vect_add_elem(Pvecteur * pvect, Variable var, Value val): addition d'un vecteur colineaire au ve...
Definition: unaires.c:72