PIPS
sc-local.h
Go to the documentation of this file.
1 /*
2 
3  $Id: sc-local.h 1664 2017-02-03 09:58:23Z 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 sc sur les Systemes de Contraintes lineaires. Une contrainte
26  * peut etre une egalite lineaire ou une inegalite lineaire
27  *
28  * Malik Imadache, Corinne Ancourt, Neil Butler, Francois Irigoin,
29  * Remi Triolet
30  *
31  * Autres packages necessaires:
32  * - types.h
33  * - boolean.h
34  * - vecteur.h
35  * - contrainte.h
36  *
37  * Modifications:
38  * - redefinition de la structure "Ssysteme"; le champ "nbvars" est renomme
39  * "dimension"; il reste de type "int"; le champ "num_var" est remplace
40  * par un champ "base" de type "Pbase"; le champ "base" ne contient pas
41  * le terme constant; FI, 13/12/89;
42  */
43 
44 
45 #ifndef SYSTEME
46 /* constante definissant le type Systeme */
47 #define SYSTEME 1001
48 
49 #include "arithmetique.h"
50 
51 
52 /*
53  * Le champ dimension donne le nombre de variables utilisees dans
54  * les egalites et les inegalites, ou si l'on prefere, la dimension
55  * de l'espace dans lequel est defini le polyedre correspondant.
56  * Le terme constant ne fait pas partie de l'espace.
57  *
58  * La champ base contient tous les vecteurs de base, i.e. toutes les
59  * variables apparaissant dans les egalites et les inegalites.
60  * Le terme constant ne fait pas partie de la base. La taille de la
61  * base est donc egale a la dimension du systeme.
62  * Si certaines fonctions ajoutent temporairement le terme constant a la
63  * base, elles doivent l'oter apres traitement.
64  * Le champ base est utilise par des algorithmes comme celui du test
65  * de faisabilite mais il n'est pas entretenu automatiquement lors de
66  * l'ajout de nouvelles contraintes. Il faut penser aux mises a jour.
67  *
68  */
69 typedef struct Ssysteme {
72  int nb_eq;
73  int nb_ineq;
74  int dimension;
77 
78 /* - Traitement des overflows :
79  * ~~~~~~~~~~~~~~~~~~~~~~~~~~
80  * Pour ne pas dupliquer trop de fonctions pour le traitement des
81  * overflows, nous avons fait une seule fonction prenant en parametre ofl_ctrl.
82  *
83  * NO_OFL_CTRL : pas de traitement des overflows.
84  *
85  * FWD_OFL_CTRL : les overflows doivent e^tre re'cupe're's par les
86  * fonctions appelantes.
87  * OFL_CTRL : le setjmp est fait dans la fonction appele'e, et donc il est
88  * inutile de faire un setjmp dans la fonction appelante. Cette dernie`re
89  * option n'est pas disponible dans toutes les fonctions, car pour cela,
90  * il faut rajouter un parame`tre permettant de savoir quoi retourner en
91  * cas d'overflow, et ce n'e'tait pas toujours possible. Voir les
92  * commentaires au dessus des fonctions pour cela.
93  *
94  * Toutes les fonctions qui acceptent ces valeurs en (dernier) parame`tre
95  * ont leur nom qui finit par _ofl_ctrl.
96  *
97  * Ceci concerne quasiment toutes les fonctions de projection, les
98  * fonctions de test de faisabilite', la fonction du simplexe, les
99  * fonctions d'e'limination de redondances, la fonction de valeur absolue
100  * (abs_ofl_ctrl), les fonctions de combinaisons line'aires de vecteurs.
101  * Ceci n'est pas force'ment exhaustif...
102  *
103  *
104  * - SC_EMPTY, SC_RN, sc_empty, sc_rn
105  * ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
106  * Le systeme vide "sc_empty" est represente par l'egalite "0==-1".
107  * le systeme representant l'espace Rn "sc_rn" est un systeme
108  * ne contenant aucune contrainte.
109  * Avant ces deux systemes etaient representes par Le pointeur (Psysteme) NULL.
110  * Progressivement, les (Psysteme) NULL sont replaces par des appels aux
111  * fonctions sc_empty et sc_rn.
112  * SC_EMPTY et SC_RN representent des valeurs obsoletes qu'ils faudraient
113  * remplacer par les sc_empty et sc_rn.
114  *
115  * - entier ou rationnel ?
116  * ~~~~~~~~~~~~~~~~~~~~~
117  * Les tests de faisabilite' e'taient fait en entier. Les deux tests
118  * (entier et rationnel) sont maintenant disponibles (voir
119  * sc_feasibility.c, il y a des commentaires). Le test appele' par
120  * l'ancienne fonction sc_faisabilite est celui en rationnel.
121  *
122  * Les fonctions d'elimination des contraintes redondantes utilisent
123  * toujours la meme technique : inversion de la contrainte et ajout de
124  * la constante 1, avant de tester la faisabilite de cette contrainte inversee
125  * dans le contexte choisi. Ce contexte est soit le systeme entier pour
126  * "sc_elim_redund" ou le systeme non redondant prealablement construit
127  * pour les fonctions "build_sc_nredund..." et "sc_triang_elim_redund".
128  * Le test de faisabilite qui est applique est en rationnel pour les
129  * fonctions "build_sc_nredund..." et en entiers pour les
130  * "sc_triang_elim_redund". L'utilisation du test rationel permet de conserver
131  * des contraintes qui reduisent l'ensemble convexe des points entiers du
132  * polyedre. Ces contraintes peuvent etre redondantes en entiers, mais utiles
133  * si l'on veut tester l'exactitude de la projection. Ce type de contraintes
134  * est considere comme redondant par "sc_triang_elim_redund".
135  * "sc_triang_elim_redund" est principalement utilise
136  * pour parcourir les nids de boucles. En cas de projection non exacte,
137  * l'une des bornes inf. peut alors etre superieure a une borne sup.
138  * L'utilisation d'un test rationel pour "sc_triang_elim_redund" peut conduire
139  * a conserver des contraintes redondantes.
140  *
141  * Note: l'inversion entiere de contrainte peut conduire a une augmentation
142  * du polyedre correspondant au systeme traite. Le nombre de contraintes est
143  * minimise en entier mais le polyedre rationnel correspondant peut augmenter.
144  * Si une enveloppe convexe est calculee ulterieurement, le resultat peut donc
145  * etre degrade par une elimination de redondance anterieure.
146  *
147  */
148 
149 #define get_sc_debug_level() sc_debug_level
150 #define ifscdebug(l) if (get_sc_debug_level()>=l)
151 
152 /* MACROS */
153 
154 #define sc_nbre_egalites(psc) ((psc)->nb_eq)
155 #define sc_nbre_inegalites(psc) ((psc)->nb_ineq)
156 #define sc_egalites(psc) ((psc)->egalites)
157 #define sc_inegalites(psc) ((psc)->inegalites)
158 #define sc_base(psc) ((psc)->base)
159 #define sc_dimension(psc) ((psc)->dimension)
160 
163 
164 /* For the parsers: */
165 extern void sc_init_lex(void);
166 extern int syst_parse(void);
167 extern void syst_restart(FILE * input_file );
168 
169 
170 /* old compatible... */
171 #define sc_add_eg(p,c) sc_add_egalite(p, c)
172 #define sc_add_ineg(p,c) sc_add_inegalite(p, c)
173 
174 /* ex-definition d'un systeme de contraintes infaisable, representant un
175  * polyedre vide.
176  *
177  * Utiliser sc_empty() et sc_empty_p() plutot que ces macros obsoletes.
178  */
179 #define SC_EMPTY ((Psysteme) NULL)
180 #define SC_EMPTY_P(sc) ((sc)==SC_EMPTY)
181 
182 /* ex-definition d'un systeme de contraintes vide, representant tout l'espace,
183  * dont la base se trouve eventuellement dans "base" (quand ce champ est
184  * alloue); quand la base et la dimension ne sont pas definies, cela
185  * represente un espace de dimension quelconque.
186  *
187  * Utiliser sc_rn() et sc_rn_p() plutot que ces macros obsoletes.
188  */
189 #define SC_RN ((Psysteme) NULL)
190 #define SC_RN_P(sc) ((sc)==(Psysteme) NULL)
191 
192 /* definition du systeme de contraintes non initialise
193  */
194 #define SC_UNDEFINED ((Psysteme) NULL)
195 #define SC_UNDEFINED_P(sc) ((sc)==(Psysteme) NULL)
196 
197 /* nombre maximum d'inequations que doit comporter un systeme lineaire
198 pour que l'elimination des redondances en nombres REELS s'effectue en un
199 temps raisonnable */
200 #define NB_INEQ_MAX1 100
201 
202 /* nombre maximum d'inequations que doit comporter un systeme lineaire
203 pour que l'elimination des redondances en nombres ENTIERS s'effectue en
204 un temps raisonnable */
205 #define NB_INEQ_MAX2 50
206 
207 /* ensemble de macros permettant de compiler les programmes utilisant
208 les anciens noms des fonctions */
209 
210 #define sc_faisabilite(sc) sc_rational_feasibility_ofl_ctrl((sc), NO_OFL_CTRL,true)
211 #define sc_faisabilite_ofl(sc) \
212  sc_rational_feasibility_ofl_ctrl((sc), FWD_OFL_CTRL, true)
213 #define sc_feasible_ofl(sc, b) sc_rational_feasibility_ofl_ctrl((sc), OFL_CTRL, (b))
214 #define sc_elim_redond(ps) sc_elim_redund((ps))
215 #define sc_triang_elim_redond(x,y) sc_triang_elim_redund(x,y)
216 #define sc_rm_empty_constraints( ps,b) sc_elim_empty_constraints((ps),(b))
217 #define sc_kill_db_eg( ps) sc_elim_db_constraints((ps))
218 #define sc_safe_kill_db_eg( ps) sc_safe_elim_db_constraints((ps))
219 #define non_redundent_subsystem( s1, s2) extract_nredund_subsystem((s1), (s2))
220 #define sc_nredund_ofl( psc) build_sc_nredund_2pass_ofl_ctrl((psc),FWD_OFL_CTRL)
221 #define sc_nredund_optim( psc) build_sc_nredund_2pass((psc))
222 #define sc_nredund( psc) build_sc_nredund_2pass((psc))
223 #define sc_projection_on_list_of_variables(sc,ib,pv) \
224  sc_projection_on_variables((sc),(ib),(pv))
225 #define combiner(sc, v) \
226  sc_fourier_motzkin_variable_elimination_ofl_ctrl((sc),(v),false,false,NO_OFL_CTRL)
227 #define combiner_ofl(sc, v) \
228  sc_fourier_motzkin_variable_elimination_ofl_ctrl((sc),(v),false,false,FWD_OFL_CTRL)
229 #define exact_combiner_ofl(sc, v, b) \
230  sc_fourier_motzkin_variable_elimination_ofl_ctrl((sc),(v),true, (b), FWD_OFL_CTRL)
231 #define eq_v_min_coeff(c, v, cf) contrainte_var_min_coeff((c), (v), (cf), false)
232 #define sc_projection_ofl_with_eq(sc, eq, v) \
233  sc_variable_substitution_with_eq_ofl_ctrl((sc), (eq), (v), FWD_OFL_CTRL)
234 #define cond_suff_comb_integer(sc,pos,neg, v) \
235  cond_suff_comb_integer_ofl_ctrl((sc),(pos),(neg), (v), NO_OFL_CTRL)
236 #define cond_suff_comb_integer_ofl(sc,pos,neg, v) \
237  cond_suff_comb_integer_ofl_ctrl((sc),(pos),(neg), (v), FWD_OFL_CTRL)
238 #define sc_projection_int_along_vecteur(fsc,sc,ib,pv,ti,dim,n) \
239  sc_integer_projection_along_variables((fsc),(sc),(ib),(pv),(ti),(dim),(n))
240 #define integer_projection(sci,sc,v) \
241  sc_integer_projection_along_variable((sci),(sc),(v))
242 
243 typedef int two_int_info[2];
244 typedef two_int_info *two_int_infop;
245 
246 typedef int (* constraint_cmp_func_t)
247 (const Pcontrainte *, const Pcontrainte *, void *);
248 
249 #endif /* SYSTEME */
void const char const char const int
struct Ssysteme * Psysteme
struct Ssysteme Ssysteme
void sc_init_lex(void)
void sc_add_egalite(Psysteme p, Pcontrainte e)
void sc_add_egalite(Psysteme p, Pcontrainte e): macro ajoutant une egalite e a un systeme p; la base ...
Definition: sc_alloc.c:389
void sc_add_inegalite(Psysteme p, Pcontrainte i)
void sc_add_inegalite(Psysteme p, Pcontrainte i): macro ajoutant une inegalite i a un systeme p; la b...
Definition: sc_alloc.c:406
int syst_parse(void)
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