PIPS
sc_read.c
Go to the documentation of this file.
1 /*
2 
3  $Id: sc_read.c 1669 2019-06-26 17:24:57Z 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  /* ensemble des fonctions utilisees dans le programme 'sc_gram.y'
26  * permettant de construire la structure de donnees 'Psysteme '
27  * a partir de la grammaire definie dans 'sc_gram.y'
28  *
29  * Ces fonction ne sont utilisables que dans ce contexte particulier
30  * car elles utilisent des variables globales
31  *
32  * * init_globals(): initialisation des variables globales
33  *
34  * * new_ident (ps,s) : - introduction de la nouvelle variable s
35  * dans la base
36  *
37  * * rec_ident (ps,s) : - recherche du rang de la variable s
38  * dans la base
39  *
40  * * creer_eg (p) : - ajout d'une egalite, dont les couples
41  * (variable,coefficient) sont pointes
42  * par p
43  *
44  * * creer_ineg (p): - ajout d'une inegalite, dont les couples
45  * (variable,coefficient) sont pointes
46  * par p
47  *
48  * Corinne Ancourt
49  *
50  * Modifications:
51  * - introduction de la notion de base (FI, 3/1/90)
52  */
53 
54 #ifdef HAVE_CONFIG_H
55  #include "config.h"
56 #endif
57 
58 #include <stdio.h>
59 #include <string.h>
60 #include <stdlib.h>
61 
62 #include "linear_assert.h"
63 #include "arithmetique.h"
64 #include "boolean.h"
65 #include "vecteur.h"
66 #include "contrainte.h"
67 #include "sc.h"
68 
69  /* Variables globales malencontreusement utilisees pour rendre les modules
70  * non reutilisables
71  *
72  * Introduites pour utilisation avec le module YACC gram.y
73  */
74 
75  /* pointeur sur la derniere egalite */
77 
78  /* pointeur sur la derniere inegalite */
80 
81  /* pointeur sur le predecesseur du couple courant */
83 
85 
86  /* pointeur sur le couple courant */
88 
89 char *nom_var[100];
90 
91 ␌
92  /* quelques constantes symboliques */
93 
94 #define OPINF 1
95 #define OPINFEGAL 2
96 #define OPEGAL 3
97 #define OPSUPEGAL 4
98 #define OPSUP 5
99 #define CHAINE 0
100 
101 /* void init_globals: initialisation des variables globales */
103 {
104  p_eg_fin = NULL;
105  p_ineg_fin = NULL;
106  p_pred = NULL;
107  cp = NULL;
108 }
109 
110 /* void new_ident(Psysteme ps, char s[]): fonction introduisant un nouvel
111  * identificateur dans la liste des variables du systeme en cours
112  * de lecture
113  *
114  * Modification:
115  * - utilisation des bases (FI, 13/12/89)
116  * - symbols handled in sc_lex.l (FC, 02/05/2000)
117  */
119 {
120  Pbase b = ps->base;
121 
122  if (!base_contains_variable_p(b, s)) {
123  ps->base = vect_add_variable(b, s);
124  ps->dimension ++;
125  }
126 }
127 
128 /* int rec_ident(Psysteme ps, char * s): cette fonction recherche
129  * dans la liste des variables du systeme la variable de nom s
130  *
131  * Modifications:
132  * - utilisation des bases (FI, 13/12/89)
133  * - parcours direct de la base avec strcmp pour eviter des problemes
134  * avec variable_equal() (FI, 3/1/90)
135  */
137 {
138  Variable v;
139 
140  v = base_find_variable(ps->base, s);
141 
142  if(VARIABLE_UNDEFINED_P(v)) {
143  (void) fprintf(stderr,
144  "Variable %s not declared. Add it to the VAR list!\n",
146  exit(1);
147  }
148 
149  return v;
150 }
151 
152 ␌
153 /* void creer_eg(Psysteme ps,Pcontrainte peq): ajout de la contrainte (egalite)
154  * peq au systeme ps.
155  *
156  * Inutilisable car elle utilise la variable globale p_eg_fin pour faire
157  * des chainages rapides en FIN de liste
158  */
159 void creer_eg(ps,peq)
160 Psysteme ps;
161 Pcontrainte peq;
162 {
163  ps->nb_eq++;
164 
165  if (ps->egalites != NULL) {
166  p_eg_fin->succ = peq;
167  p_eg_fin = peq;
168  }
169  else {
170  ps->egalites = peq;
171  p_eg_fin = peq;
172  }
173 }
174 
175 /* void creer_ineg(Psysteme ps, Pcontrainte peq, int sens): ajout
176  * d'une nouvelle inegalite peq dans la liste des inegalites du
177  * systeme ps
178  *
179  * Si sens vaut -1, l'inegalite est multipliee par -1; ceci est utilise
180  * pour convertir une inegalite de type >= en <=
181  *
182  * Inutilisable hors contexte car la variable globale p_ineg_fin est
183  * utilisee pour effectuer rapidement des chainages en FIN de liste
184  */
185 void creer_ineg(ps,peq,sens)
186 Psysteme ps;
187 Pcontrainte peq;
188 int sens;
189 {
190  ps->nb_ineq +=1;
191 
192  /* multiplication par "-1" des coefficients de chaque variable
193  si l'inegalite est "superieure" */
194  if (sens == -1)
195  vect_chg_sgn(peq->vecteur);
196 
197  if (ps->inegalites != NULL) {
198  p_ineg_fin->succ = peq;
199  p_ineg_fin = peq;
200  }
201  else {
202  ps->inegalites = peq;
203  p_ineg_fin = peq;
204  }
205 }
206 
207 /* Psysteme sc_reversal(Psysteme sc) */
209 Psysteme sc;
210 {
211 
212  if(!(SC_EMPTY_P(sc) || sc_empty_p(sc) || sc_rn_p(sc))) {
214 
215  for(c = sc_egalites(sc); !CONTRAINTE_UNDEFINED_P(c); c = c->succ) {
216  c = contrainte_reversal(c);
217  }
218  for(c = sc_inegalites(sc); !CONTRAINTE_UNDEFINED_P(c); c = c->succ) {
219  c = contrainte_reversal(c);
220  }
221  }
222 
223  return sc;
224 }
225 
226 /* Pcontrainte contrainte_reversal(Pcontrainte c) */
228 Pcontrainte c;
229 {
231  Pvecteur rv = VECTEUR_NUL;
232 
233  rv = (Pvecteur) vect_reversal((Pbase) v);
234  contrainte_vecteur(c) = rv;
235  vect_rm(v);
236 
237  return c;
238 }
Variable base_find_variable(Pbase b, Variable v)
Variable base_find_variable(Pbase b, Variable v): returns variable v if variable v is one of b's elem...
Definition: base.c:155
bool base_contains_variable_p(Pbase b, Variable v)
bool base_contains_variable_p(Pbase b, Variable v): returns true if variable v is one of b's elements...
Definition: base.c:136
Pbase vect_add_variable(Pbase b, Variable v)
package vecteur - routines sur les bases
Definition: base.c:61
#define CONTRAINTE_UNDEFINED_P(c)
#define contrainte_vecteur(c)
passage au champ vecteur d'une contrainte "a la Newgen"
#define CONTRAINTE_UNDEFINED
char * variable_default_name(Variable v)
char * variable_default_name(Variable v): returns the name of variable v
Definition: variable.c:81
#define exit(code)
Definition: misc-local.h:54
Pvecteur vect_reversal(Pvecteur vect_in)
Pvecteur vect_reversal(Pvecteur vect_in); produces the reversal vector of the vect_in.
Definition: private.c:237
bool sc_rn_p(Psysteme sc)
bool sc_rn_p(Psysteme sc): check if the set associated to sc is the whole space, rn
Definition: sc_alloc.c:369
bool sc_empty_p(Psysteme sc)
bool sc_empty_p(Psysteme sc): check if the set associated to sc is the constant sc_empty or not.
Definition: sc_alloc.c:350
int sens
facteur multiplicatif suivant qu'on analyse un terme
Definition: sc_gram.c:100
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
Pcontrainte p_eg_fin
ensemble des fonctions utilisees dans le programme 'sc_gram.y' permettant de construire la structure ...
Definition: sc_read.c:76
Pvecteur p_pred
pointeur sur le predecesseur du couple courant
Definition: sc_read.c:82
char * nom_var[100]
Definition: sc_read.c:89
Psysteme sc_reversal(Psysteme sc)
Psysteme sc_reversal(Psysteme sc)
Definition: sc_read.c:208
void new_ident(Psysteme ps, Variable s)
void new_ident(Psysteme ps, char s[]): fonction introduisant un nouvel identificateur dans la liste d...
Definition: sc_read.c:118
void init_globals()
void init_globals: initialisation des variables globales
Definition: sc_read.c:102
Variable rec_ident(Psysteme ps, Variable s)
int rec_ident(Psysteme ps, char * s): cette fonction recherche dans la liste des variables du systeme...
Definition: sc_read.c:136
Pcontrainte contrainte_reversal(Pcontrainte c)
Pcontrainte contrainte_reversal(Pcontrainte c)
Definition: sc_read.c:227
Pvecteur cp
pointeur sur le couple courant
Definition: sc_read.c:87
Pcontrainte p_ineg_fin
pointeur sur la derniere inegalite
Definition: sc_read.c:79
Pvecteur p_membre_courant
Definition: sc_read.c:84
void creer_eg(Psysteme ps, Pcontrainte peq)
void creer_eg(Psysteme ps,Pcontrainte peq): ajout de la contrainte (egalite) peq au systeme ps.
Definition: sc_read.c:159
void creer_ineg(Psysteme ps, Pcontrainte peq, int sens)
void creer_ineg(Psysteme ps, Pcontrainte peq, int sens): ajout d'une nouvelle inegalite peq dans la l...
Definition: sc_read.c:185
void vect_chg_sgn(Pvecteur v)
void vect_chg_sgn(Pvecteur v): multiplie v par -1
Definition: scalaires.c:151
Pvecteur vecteur
struct Scontrainte * succ
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
#define VECTEUR_NUL
DEFINITION DU VECTEUR NUL.
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
#define VARIABLE_UNDEFINED_P(v)
Definition: vecteur-local.h:65
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78