PIPS
ps_max_to_min.c
Go to the documentation of this file.
1 /*
2 
3  $Id: ps_max_to_min.c 23065 2016-03-02 09:05:50Z coelho $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of PIPS.
8 
9  PIPS is free software: you can redistribute it and/or modify it
10  under the terms of the GNU General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  PIPS 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 General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with PIPS. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 #ifdef HAVE_CONFIG_H
25  #include "pips_config.h"
26 #endif
27 /* Name : ps_max_to_min.c
28  * Package : pip
29  * Author : F. Dumontet
30  * Date : july 93
31  * Historic :
32  * Documents:
33  *
34  * Comments :
35  */
36 
37 #include <stdlib.h>
38 #include <stdio.h>
39 #include <stdlib.h>
40 #include <setjmp.h>
41 #include <string.h>
42 #include <errno.h>
43 
44 #include "genC.h"
45 
46 /* C3 includes */
47 #include "boolean.h"
48 #include "arithmetique.h"
49 #include "vecteur.h"
50 #include "contrainte.h"
51 #include "ray_dte.h"
52 #include "sommet.h"
53 #include "sg.h"
54 #include "sc.h"
55 #include "polyedre.h"
56 #include "matrix.h"
57 
58 #include "misc.h"
59 #include "text.h"
60 #include "text-util.h"
61 #include "ri.h"
62 #include "ri-util.h"
63 #include "graph.h"
64 #include "dg.h"
65 #include "paf_ri.h"
66 #include "paf-util.h"
67 #include "pip.h"
68 
69 
70 
71 #define VARSUPP "Variable_pour_max_en_min_q"
72 
73 
74 /*----------------------------------------------------------------------------*/
75 /* */
76 /* Name : add_coeff_vect */
77 /* */
78 /* Parameters: p_vect: le vecteur a sommer. */
79 /* p_base: la base associee au vecteur. */
80 /* nb_var: le nombre de variables dans la base. */
81 /* */
82 /* Result: un nombre sous la forme d'une value. */
83 /* */
84 /* Aims: sommer des coefficients des nb_var premieres variables du vecteur */
85 /* p_vect. */
86 /* */
87 /* Author: F Dumontet */
88 /* */
89 /* Date of last change: */
90 /* */
91 /*----------------------------------------------------------------------------*/
92 
93 Value
94 add_coeff_vect (p_vect,p_base,nb_var)
95 
96 
97  Pvecteur p_vect;
98  Pbase p_base;
99  int nb_var;
100 
101 {
102 
103  Pvecteur p_vect_baux = (Pvecteur) p_base;
104  Value aux = VALUE_ZERO;
105  int aux1;
106 
107  for(aux1=0 ;((aux1 < nb_var) && (p_vect != NULL));\
108  p_vect_baux = p_vect_baux->succ )
109  {
110 
111  if (p_vect->var != NULL)
112  if (p_vect_baux->var == p_vect->var)
113  {
114  value_addto(aux,p_vect->val);
115  p_vect = p_vect->succ;
116  }
117  aux1++;
118  }
119  return aux;
120 }
121 
122 /*----------------------------------------------------------------------------*/
123 /* BIDOUILLE */
124 /* Name: */
125 /* */
126 /* Parameters: name: nom local attribue a l'"entite" cree. */
127 /* module_name: TOP_LEVEL_MODULE ???? */
128 /* */
129 /* Side effect: */
130 /* */
131 /* Result: */
132 /* */
133 /* Aims: */
134 /* */
135 /* Author: F Dumontet. */
136 /* */
137 /* Date of last change: */
138 /* */
139 /*----------------------------------------------------------------------------*/
140 /******************************************************************************/
141 entity
143 char *name;
144 char *module_name;
145 {
146  string full_name;
147  entity e ;
148  basic b ;
149 
150  debug(8,"make_scalar_integer_entity", "begin name=%s, module_name=%s\n",
151  name, module_name);
152 
153  full_name = strdup(concatenate(module_name, MODULE_SEP_STRING, name, (char *) NULL));
154 
156 
157  if(e == entity_undefined) {
162 
163  b = make_basic(is_basic_int, 4);
164 
166  }
167 
168 
169  return (e);
170 }
171 
172 /******************************************************************************/
173 /*----------------------------------------------------------------------------*/
174 /* */
175 /* Name: add_fin_mat */
176 /* */
177 /* Parameters: p_cont: pointeur sur la premiere contrainte de la liste */
178 /* d'egalites ou d'inegalites. */
179 /* p_base: base du Psysteme. */
180 /* nb_var: le nombre de variables dans la base. */
181 /* */
182 /* Result: */
183 /* */
184 /* Aims: ajouter A.1 dans la colonne correspondant au nouveau parametre var_q.*/
185 /* */
186 /* Author: F Dumontet */
187 /* */
188 /* Date of last change: */
189 /* */
190 /*----------------------------------------------------------------------------*/
191 
192 void
193 add_fin_mat(p_cont , p_base , nb_var, var_q)
194 
195  Pcontrainte p_cont;
196  Pbase p_base;
197  int nb_var;
198  Variable var_q;
199 
200 {
201 
202  Pvecteur p_vect_aux;
203  Pvecteur v2;
204 
205  for( ; p_cont != NULL;p_cont = p_cont->succ)
206  {
207 
208 
209 
210  for(p_vect_aux=p_cont->vecteur; p_vect_aux->succ != NULL;\
211  p_vect_aux = p_vect_aux->succ)
212  {}
213 /* Old version of FD
214  vect_add_elem(&p_vect_aux->succ, var_q,\
215  add_coeff_vect(p_cont->vecteur,\
216  p_base,nb_var));
217 */
218  v2 = (Pvecteur) malloc(sizeof(Svecteur));
219  vect_add_elem(&v2, var_q,\
220  add_coeff_vect(p_cont->vecteur,\
221  p_base,nb_var));
222  p_vect_aux->succ = v2;
223  }
224 }
225 
226 /*----------------------------------------------------------------------------*/
227 /* */
228 /* Name: opp_var_in_mat. */
229 /* */
230 /* Parameters: p_cont: pointeur sur la premiere contrainte de la liste */
231 /* d'egalites ou d'inegalites. */
232 /* p_base: base du Psysteme. */
233 /* nb_var: le nombre de variables dans la base. */
234 /* */
235 /* Result: */
236 /* */
237 /* Aims: transformer les coefficients des vecteurs qui portent sur des */
238 /* en leur oppose. */
239 /* */
240 /* Author: F Dumontet. */
241 /* */
242 /* Date of last change: */
243 /* */
244 /*----------------------------------------------------------------------------*/
245 
246 void
247 opp_var_in_mat (p_cont , p_base , nb_var)
248 
249  Pcontrainte p_cont;
250  Pbase p_base;
251  int nb_var;
252 
253 {
254 
255  Pvecteur p_vect_aux; /* vecteur d'une contrainte. */
256  Pvecteur p_vect_baux; /* vecteur d'une base. */
257  int aux1; /* compteur de variables deja */
258  /* traitee. */
259 
260 
261  for( ; p_cont != NULL; p_cont = p_cont->succ)
262  {
263  p_vect_baux = p_base;
264  p_vect_aux = p_cont->vecteur;
265  /* on traite les nb_var 1eres variables de la base */
266  for(aux1 = 0 ; ((p_vect_aux != NULL) && (aux1<nb_var));\
267  p_vect_baux = p_vect_baux->succ)
268  {
269  if ((p_vect_baux->var != NULL) &&\
270  (p_vect_aux->var !=NULL))
271  {
272  if (p_vect_baux->var == p_vect_aux->var)
273  {
274  value_oppose(p_vect_aux->val);
275  p_vect_aux = p_vect_aux->succ;
276  }
277 
278  }
279  if (p_vect_baux->var != NULL)
280  aux1++;
281  }
282  }
283 }
284 /*----------------------------------------------------------------------------*/
285 /* */
286 /* Name: converti_psysmin_psysmax */
287 /* */
288 /* Parameters: p_systmin: le Psysteme (ordonne) a transformer. */
289 /* nb_var: le nombre de variables dans le Psysteme (ce sont les */
290 /* premieres de la base). */
291 /* */
292 /* Result: Psysteme ordonne. */
293 /* */
294 /* Aims: convertir un probleme de maximum en son dual de minimum, le probleme */
295 /* et le resultat sont sous formes de Psystemes. */
296 /* */
297 /* Author: F Dumontet. */
298 /* */
299 /* Date of last change: */
300 /* */
301 /*----------------------------------------------------------------------------*/
302 
303 Psysteme
304 converti_psysmin_psysmax (p_systmin, nb_var)
305 Psysteme p_systmin;
306 int nb_var;
307 {
308  Psysteme p_syst; /* le Psysteme produi */
309  Psysteme p_syst1; /* permet la double copie sinon rien */
310  Pcontrainte p_cont_aux, pc;
311  Pvecteur p_vect_aux, p_vect_baux, p_base;
312  int aux1;
315 
316  /* double dup pour obtenir une copie qui respecte l'odre des variables
317  * sc_dup rend une image inversee */
318  p_syst1=sc_dup(p_systmin);
319  p_syst = sc_dup(p_syst1);
320 
321  /* ajout d'une variable dans la base essayer de trouver une fonction
322  * C3 */
323  p_syst->dimension++;
324 
325  for(p_vect_aux=(Pvecteur) p_syst->base; p_vect_aux->succ != NULL;
326  p_vect_aux = p_vect_aux->succ) {}
327  vect_add_elem(&p_vect_aux->succ, var_q, (Value) 1);
328 
329  /* ajout de A.1 en fin de matrice , le parametre var_q puis -A */
330 
331  /* These four function calls are replaced by the following loops */
332  /*
333  add_fin_mat((Pcontrainte) p_syst->egalites, p_syst->base, nb_var, var_q);
334 
335  opp_var_in_mat((Pcontrainte) p_syst->egalites,
336  p_syst->base , nb_var);
337  add_fin_mat((Pcontrainte) p_syst->inegalites,
338  p_syst->base, nb_var, var_q);
339 
340  opp_var_in_mat((Pcontrainte) p_syst->inegalites,
341  p_syst->base , nb_var);
342  */
343 
344  for(aux1=0, p_base = p_syst->base ;((aux1 < nb_var) && (p_base != NULL));
345  p_base = p_base->succ, aux1++) {
346  for(pc = p_syst->egalites; pc != NULL; pc = pc->succ) {
347  pc->vecteur = vect_var_subst(pc->vecteur, p_base->var,
349  (vect_new(var_q, VALUE_ONE),
350  VALUE_MONE,
351  vect_new(p_base->var, VALUE_ONE),
352  NO_OFL_CTRL));
353  }
354  for(pc = p_syst->inegalites; pc != NULL; pc = pc->succ) {
355  pc->vecteur = vect_var_subst(pc->vecteur, p_base->var,
357  (vect_new(var_q, VALUE_ONE), VALUE_MONE,
358  vect_new(p_base->var, VALUE_ONE),
359  NO_OFL_CTRL));
360  }
361  }
362 
363  /* ajout de -I , 1 en bas de la matrice */
364  p_vect_baux = (Pvecteur) p_syst->base;
365  for(aux1 = 0; aux1 < nb_var ; aux1++) {
366  p_vect_aux = vect_new(p_vect_baux->var, VALUE_ONE);
367  vect_add_elem(&p_vect_aux, var_q, (Value) VALUE_MONE);
368  p_cont_aux = contrainte_make(p_vect_aux);
369  insert_ineq_end_sc(p_syst,p_cont_aux);
370  p_vect_baux = p_vect_baux->succ;
371  }
372 
373  return p_syst;
374 }
basic make_basic(enum basic_utype tag, void *val)
Definition: ri.c:155
#define VALUE_ZERO
#define value_oppose(ref)
#define VALUE_MONE
int Value
#define value_addto(ref, val)
#define VALUE_ONE
struct _newgen_struct_type_ * type
Pcontrainte contrainte_make(Pvecteur pv)
Pcontrainte contrainte_make(Pvecteur pv): allocation et initialisation d'une contrainte avec un vecte...
Definition: alloc.c:73
const char * module_name(const char *s)
Return the module part of an entity name.
Definition: entity_names.c:296
void * malloc(YYSIZE_T)
#define NIL
The empty list (nil in Lisp)
Definition: newgen_list.h:47
#define full_name(dir, name)
Definition: compile.c:414
void debug(const int the_expected_debug_level, const char *calling_function_name, const char *a_message_format,...)
ARARGS0.
Definition: debug.c:189
#define TOP_LEVEL_MODULE_NAME
Module containing the global variables in Fortran and C.
Definition: naming-local.h:101
#define MODULE_SEP_STRING
Definition: naming-local.h:30
string concatenate(const char *,...)
Return the concatenation of the given strings.
Definition: string.c:183
void * gen_find_tabulated(const char *, int)
Definition: tabulated.c:218
Pvecteur vect_var_subst(Pvecteur, Variable, Pvecteur)
=================================================================
Definition: utils.c:1948
Value add_coeff_vect(Pvecteur p_vect, Pbase p_base, int nb_var)
Name : add_coeff_vect
Definition: ps_max_to_min.c:94
Psysteme converti_psysmin_psysmax(Psysteme p_systmin, int nb_var)
Name: converti_psysmin_psysmax
void add_fin_mat(Pcontrainte p_cont, Pbase p_base, int nb_var, Variable var_q)
Name: add_fin_mat
void opp_var_in_mat(Pcontrainte p_cont, Pbase p_base, int nb_var)
Name: opp_var_in_mat.
entity creer_nom_var(char *name, char *module_name)
BIDOUILLE
#define VARSUPP
Name : ps_max_to_min.c Package : pip Author : F.
Definition: ps_max_to_min.c:71
#define make_entity(n, t, s, i)
type MakeTypeVariable(basic, cons *)
BEGIN_EOLE.
Definition: type.c:116
#define value_undefined
Definition: ri.h:3016
@ is_basic_int
Definition: ri.h:571
#define entity_undefined
Definition: ri.h:2761
#define type_undefined
Definition: ri.h:2883
#define entity_type(x)
Definition: ri.h:2792
#define entity_domain
newgen_syntax_domain_defined
Definition: ri.h:410
#define storage_undefined
Definition: ri.h:2476
Psysteme sc_dup(Psysteme ps)
Psysteme sc_dup(Psysteme ps): should becomes a link.
Definition: sc_alloc.c:176
void insert_ineq_end_sc(Psysteme sc, Pcontrainte ineq)
This function inserts one constraint ineq at the end of the system of inequalities of sc.
Definition: sc_insert_eq.c:81
char * strdup()
int aux
Definition: solpip.c:104
Pvecteur vecteur
struct Scontrainte * succ
Pcontrainte inegalites
Definition: sc-local.h:71
Pcontrainte egalites
Definition: sc-local.h:70
Pbase base
Definition: sc-local.h:75
int dimension
Definition: sc-local.h:74
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
Value val
Definition: vecteur-local.h:91
Variable var
Definition: vecteur-local.h:90
struct Svecteur * succ
Definition: vecteur-local.h:92
#define NO_OFL_CTRL
struct Svecteur * Pvecteur
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_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
Pvecteur vect_cl_ofl_ctrl(Pvecteur v, Value lambda, Pvecteur u, int ofl_ctrl)
Pvecteur vect_cl_ofl_ctrl(Pvecteur v, Value lambda, Pvecteur u, int ofl_ctrl): etape d'acculumulation...
Definition: binaires.c:128
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