PIPS
ps_to_fic_pip.c
Go to the documentation of this file.
1 /*
2 
3  $Id: ps_to_fic_pip.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_to_fic_pip.c
28  * Package : pip
29  * Author : F. Dumontet
30  * Date : july 93
31  * Historic :
32  * - 18 oct 93. L'ordre dans le vecteur n'est plus important. AP
33  *
34  * Documents:
35  *
36  * Comments :
37  */
38 
39 #include <stdio.h>
40 #include <string.h>
41 #include <errno.h>
42 
43 #include "genC.h"
44 #include "misc.h"
45 #include "text.h"
46 #include "text-util.h"
47 #include "ri.h"
48 #include "ri-util.h"
49 #include "paf_ri.h"
50 #include "pip.h"
51 
52 #define PIP_IN_FILE "pip_in"
53 
54 #define OK 0
55 #define EGALITE 1
56 #define INEGALITE 2
57 #define ERREUR_TAILLE 3
58 
59 /*----------------------------------------------------------------------------*/
60 /* */
61 /* Name: ecrit_commentaire2 */
62 /* */
63 /* Parameters: commentaire: le texte du commentaire. */
64 /* p_sys_tab: le Psysteme traite. Contient le nom des variables */
65 /* et des parametres. */
66 /* nb_var: discrimine les variables des parametres */
67 /* */
68 /* Result: void */
69 /* */
70 /* Aims: ecrire le commentaire et le nom des variables et des parametres. */
71 /* */
72 /* Author: F Dumontet */
73 /* */
74 /* Date of last change: */
75 /* */
76 /*----------------------------------------------------------------------------*/
77 void
78 ecrit_commentaire2(commentaire, p_sys_tab, nb_var, nom_fichier)
79  char *commentaire;
80  Psysteme p_sys_tab;
81  int nb_var;
82  FILE *nom_fichier;
83 
84 
85 {
86  int aux;
87  Pvecteur p_vecteur_aux;
88 
89  fprintf(nom_fichier, "(%s (variables", commentaire);
90 
91  p_vecteur_aux = (Pvecteur) p_sys_tab->base;
92  for (aux = 1; aux <= nb_var; aux++) {
93  fprintf(nom_fichier, " %s",
94  (char *) entity_local_name(
95  (entity) p_vecteur_aux->var));
96  p_vecteur_aux = p_vecteur_aux->succ;
97  }
98 /*
99  for (aux = 1; aux <= nb_var; aux++) {
100  fprintf(nom_fichier, " %s", (char *) p_vecteur_aux->var);
101  p_vecteur_aux = p_vecteur_aux->succ;
102  }
103 */
104  fprintf(nom_fichier, ") (parametres");
105  while (p_vecteur_aux != NULL) {
106  fprintf(nom_fichier, " %s",
107  (char *) entity_local_name(
108  (entity) p_vecteur_aux->var));
109  p_vecteur_aux = p_vecteur_aux->succ;
110  }
111 /*
112  while (p_vecteur_aux != NULL) {
113  fprintf(nom_fichier, " %s", (char *) p_vecteur_aux->var);
114  p_vecteur_aux = p_vecteur_aux->succ;
115  }
116 */
117 
118  fprintf(nom_fichier, "))\n");
119  return;
120 }
121 
122 
123 /*----------------------------------------------------------------------------*/
124 /* */
125 /* Name: ecrit_ligne */
126 /* */
127 /* Parameters: p_vect: le vecteur a ecrire. Il doit PAS etre ordonne. */
128 /* p_sys_base: vecteur de base permet de connaitre l'ordre des */
129 /* variables et de rajouter des 0 pour celles qui ne */
130 /* sont pas dans la matrice creuse. */
131 /* nom_ficher: pointeur sur le fichier destination. */
132 /* nb_var: permet de differencier les "nbvar" variables des */
133 /* parametres dans la base. */
134 /* eg_ineg: permet de distinger le cas dans lequel le vecteur */
135 /* represente une egalite de celui ou il represente une */
136 /* une inegalite. */
137 /* */
138 /* Result: void */
139 /* */
140 /* Aims: ecrire un vecteur sur une ligne. Le vecteur doit etre ordonne */
141 /* */
142 /* Author: F Dumontet */
143 /* */
144 /* Date of last change: AP, 18 oct 93. L'ordre dans le vecteur n'est plus */
145 /* important. */
146 /* */
147 /*----------------------------------------------------------------------------*/
148 void ecrit_ligne(p_vect, p_sys_base, nom_fichier, nb_var, eg_ineg)
149 Pvecteur p_vect;
150 Pbase p_sys_base;
151 FILE *nom_fichier;
152 int nb_var,eg_ineg;
153 {
154  Pvecteur p_vect_aux = (Pvecteur) p_sys_base;
155  int aux = 0, /* Compteur de variables deja vues */
156  first = 1; /* Pas de blanc juste apres le #[ */
157 
158  fprintf(nom_fichier, "#[");
159 
160  for( ; (p_vect_aux != NULL) || (aux <= nb_var) ; aux++) {
161  int val;
162 
163  if(aux == nb_var)
164  val = (int) vect_coeff(TCST, p_vect);
165  else {
166  val = (int) vect_coeff(p_vect_aux->var, p_vect);
167  p_vect_aux = p_vect_aux->succ;
168  }
169 
170  if(first)
171  first = 0;
172  else
173  fprintf(nom_fichier, " ");
174 
175  if(eg_ineg == EGALITE)
176  fprintf(nom_fichier, "%i", val);
177  else
178  fprintf(nom_fichier, "%i", -val);
179  }
180  fprintf(nom_fichier, "]\n");
181 }
182 
183 /*----------------------------------------------------------------------------*/
184 /* */
185 /* Name: ecrit_tableau2. */
186 /* */
187 /* Parameters: p_syst_tab: le Psysteme qui va etre ecrit sur le fichier. Ce */
188 /* peut etre aussi bien un contexte q'un probleme. */
189 /* nb_var: le nombre de variables du Psysteme a differencier des */
190 /* parametres. */
191 /* nom_fichier: fichier de destination. */
192 /* */
193 /* Result: entier. */
194 /* */
195 /* Aims: ecrire a partir d'un Psysteme, un tableau avec une ligne par vecteur */
196 /* inegalite et deux pour un vecteur egalite ( opposes ) */
197 /* */
198 /* Author: F Dumontet */
199 /* */
200 /* Date of last change: */
201 /* */
202 /*----------------------------------------------------------------------------*/
203 int
204 ecrit_tableau2(p_syst_tab, nb_var, nom_fichier)
205  Psysteme p_syst_tab;
206  int nb_var;
207  FILE *nom_fichier;
208 
209 {
210  Pcontrainte p_contr_tab_aux;
211 
212  fprintf(nom_fichier, "(");
213 
214  if (p_syst_tab != NULL)
215  {
216  p_contr_tab_aux = p_syst_tab->egalites;
217 
218  while (p_contr_tab_aux != NULL) {
219  ecrit_ligne(p_contr_tab_aux->vecteur, p_syst_tab->base,\
220  nom_fichier, nb_var, INEGALITE);
221  ecrit_ligne(p_contr_tab_aux->vecteur, p_syst_tab->base,\
222  nom_fichier, nb_var, EGALITE);
223  p_contr_tab_aux = p_contr_tab_aux->succ;
224  }
225  p_contr_tab_aux = p_syst_tab->inegalites;
226 
227  while (p_contr_tab_aux != NULL) {
228  ecrit_ligne(p_contr_tab_aux->vecteur, p_syst_tab->base, \
229  nom_fichier, nb_var, INEGALITE);
230  p_contr_tab_aux = p_contr_tab_aux->succ;
231  }
232  }
233  fprintf(nom_fichier, ")\n");
234  return OK;
235 }
236 
237 
238 
239 /*----------------------------------------------------------------------------*/
240 /* */
241 /* Name: ecrit_probleme2. */
242 /* */
243 /* Parameters: commentaire: chaine de caracteres contenant le texte du */
244 /* commentaire. */
245 /* p_syst_tab: Psysteme devant etre resolu (il doit etre */
246 /* ordonne). */
247 /* p_syst_cont: Psysteme contenant le contexte. */
248 /* nb_var: le nombre de variables dans p_syst_tab. */
249 /* bg: numero d'ordre dans p_syst_tab du parametre devant etre */
250 /* considere comme infiniment grand; */
251 /* nb_var_cont: nbr de variables du contexte. */
252 /* */
253 /* Result: entier indiquant si l'ecriture s'est bien deroulee. */
254 /* */
255 /* Aims: ecrire dans un fichier, au format d'entree reconnu par pip un */
256 /* probleme de programmation lineaire en nombre entiers. Il nous faut */
257 /* deux Psystemes. Le premier contient les variables, les parametres et */
258 /* les constantes (dans l'ordre). Le second contient le contexte avec */
259 /* dans l'ordre ses variables et les constantes. L'odre est celui de la */
260 /* base de chaque Psysteme. La distinction entre variables et parametres*/
261 /* est effectuee au moyen de nb_var qui indique que les nb_var 1eres */
262 /* termes sont des variables. */
263 /* */
264 /* Author: F Dumontet */
265 /* */
266 /* Date of last change: */
267 /* */
268 /*----------------------------------------------------------------------------*/
269 int
270 ecrit_probleme2(commentaire, p_syst_tab, p_syst_cont, nb_var, bg , nb_var_cont)
271  char *commentaire;
272  Psysteme p_syst_tab, p_syst_cont;
273  int nb_var, bg , nb_var_cont;
274 
275 {
276  Pvecteur p_vecteur_aux;
277  FILE *nom_fichier;
278  int aux, aux1,nb_par;
279 
280  nom_fichier = fopen(PIP_IN_FILE, "w");
281  if (nom_fichier == NULL)
282  return errno;
283  fprintf(nom_fichier,"(");
284  ecrit_commentaire2(commentaire, p_syst_tab, nb_var, nom_fichier);
285  /* le nombre de variables */
286  fprintf(nom_fichier, "%1d", nb_var);
287  p_vecteur_aux = (Pvecteur) p_syst_tab->base;
288  aux = 0;
289  nb_par = p_syst_tab->dimension-nb_var;
290  /* le nombre de parametres */
291  fprintf(nom_fichier, " %1d", nb_par);
292  aux1 = (p_syst_tab->nb_eq * 2) + p_syst_tab->nb_ineq;
293  fprintf(nom_fichier, " %1d", aux1);
294  if (p_syst_cont != NULL)
295  aux1 = (p_syst_cont->nb_eq * 2) + p_syst_cont->nb_ineq;
296  else
297  aux1 = 0;
298  /* le nombre de contraintes du systeme*/
299  /* le numero de la variable consideree*/
300  /* comme infiniment grande pour le max*/
301  /* l'indicateur de solution entiere. */
302  fprintf(nom_fichier, " %1d %1d 1\n", aux1, bg);
303 
304  /* ecriture du systeme a resoudre */
305  ecrit_tableau2(p_syst_tab, nb_var, nom_fichier);
306 
307  /* ecriture du contexte */
308  ecrit_tableau2(p_syst_cont, nb_var_cont, nom_fichier);
309  fprintf(nom_fichier, ")\n");
310 
311  return fclose(nom_fichier);
312 }
313 
314 
void const char const char const int
void ecrit_commentaire2(char *commentaire, Psysteme p_sys_tab, int nb_var, FILE *nom_fichier)
Name: ecrit_commentaire2
Definition: ps_to_fic_pip.c:78
#define INEGALITE
Definition: ps_to_fic_pip.c:56
void ecrit_ligne(Pvecteur p_vect, Pbase p_sys_base, FILE *nom_fichier, int nb_var, int eg_ineg)
Name: ecrit_ligne
#define EGALITE
Definition: ps_to_fic_pip.c:55
int ecrit_probleme2(char *commentaire, Psysteme p_syst_tab, Psysteme p_syst_cont, int nb_var, int bg, int nb_var_cont)
Name: ecrit_probleme2.
#define OK
Definition: ps_to_fic_pip.c:54
#define PIP_IN_FILE
Name : ps_to_fic_pip.c Package : pip Author : F.
Definition: ps_to_fic_pip.c:52
int ecrit_tableau2(Psysteme p_syst_tab, int nb_var, FILE *nom_fichier)
Name: ecrit_tableau2.
const char * entity_local_name(entity e)
entity_local_name modified so that it does not core when used in vect_fprint, since someone thought t...
Definition: entity.c:453
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
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
int nb_ineq
Definition: sc-local.h:73
int nb_eq
Definition: sc-local.h:72
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
Variable var
Definition: vecteur-local.h:90
struct Svecteur * succ
Definition: vecteur-local.h:92
#define TCST
VARIABLE REPRESENTANT LE TERME CONSTANT.
struct Svecteur * Pvecteur
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