PIPS
sc_to_matrice.c
Go to the documentation of this file.
1 /*
2 
3  $Id: sc_to_matrice.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 sur les polyedres
26  *
27  * Francois Irigoin
28  */
29 
30 #ifdef HAVE_CONFIG_H
31  #include "config.h"
32 #endif
33 
34 #include <stdio.h>
35 #include "linear_assert.h"
36 #include "arithmetique.h"
37 #include "boolean.h"
38 #include "vecteur.h"
39 #include "contrainte.h"
40 #include "sc.h"
41 
42 #include "sommet.h"
43 
44 #include "matrix.h"
45 
46 #include "plint.h"
47 
48 /* void sys_mat_conv(Psysteme ps, matrice A, matrice B, int n, int m):
49  * calcul de la matrice A correspondant a la partie lineaire des
50  * egalites (ou des inegalites?) du systeme lineaire ps et de la matrice B
51  * correspondant aux termes constants de ps
52  *
53  * Les parametres de la fonction :
54  *
55  * Psysteme ps : systeme lineaire
56  *!int A[] : matrice
57  *!int B[] : matrice
58  * int n : nombre de lignes de la matrice
59  * int m : nombre de colonnes de la matrice
60  *
61  *
62  * Modifications:
63  * - prise en compte du changement de signe du terme constant (FI, 19/12/89)
64  */
65 void sys_mat_conv(ps,A,B,n,m)
66 Psysteme ps;
67 Pmatrix A;
68 Pmatrix B;
69 int n,m;
70 {
71  int i,j;
73  Pbase b;
74 
75  matrix_nulle(B);
76  matrix_nulle(A);
77  for(eq = ps->egalites,i=1; eq != NULL; eq=eq->succ,i++) {
78  for (j=1, b=ps->base; j<= m && !VECTEUR_NUL_P(b); j++, b = b->succ)
81  }
82 }
83 
84 /* void mat_sys_conv(Psysteme ps, matrice B, int n, int m, int nbl)
85  * remplissage du champ des egalites ps->egalites en fonction de la matrice B
86  * qui contient les coefficients et les termes constant
87  *
88  * La matrice B passee en parametres est celle calculee a l'aide
89  * de la fonction "matrice_smith"
90  *
91  * Les parametres de la fonction :
92  *
93  *!Psysteme ps : systeme lineaire avec un champ base initialise
94  * int B[] : matrice de dimension (m,m+1) correspondant a la matrice
95  * solution du systeme d'egalites du systeme lineaire
96  * int n : nombre de lignes de la matrice (FI laquelle?)
97  * int m : nombre de colonnes de la matrice
98  * int nbl : nombre de variables non contraintes ajoutees a la matrice
99  *
100  * Modifications:
101  * - prise en compte du changement de cote du terme constant (FI, 19/12/89)
102  */
103 void mat_sys_conv(ps,B,n,m,nbl)
104 Psysteme ps;
105 Pmatrix B;
106 int n,m;
107 int nbl;
108 {
109  Pvecteur pv=NULL;
110  Pcontrainte pc=NULL;
111  Pcontrainte cp = NULL;
112  Pbase b;
113  Pbase b1;
114  int i,j;
115  Value den;
116 
117  for(i = 1; i <= nbl; i++)
118  creat_new_var(ps);
119 
120  if(value_notzero_p(den = MATRIX_DENOMINATOR(B))) {
121  for (i=1, b = ps->base;i<=m && !VECTEUR_NUL_P(b); i++, b = b->succ) {
122  cp = contrainte_new();
123  pv = vect_new(vecteur_var(b),den);
124 
125  for (j=1, b1 = b; j<=nbl && !VECTEUR_NUL_P(b1); j++, b1=b1->succ)
127  value_uminus(MATRIX_ELEM(B,i,j+1)));
128 
129  vect_chg_coeff(&pv,TCST,MATRIX_ELEM(B,i,1));
130  cp->vecteur = pv;
131  cp->succ = pc;
132  pc = cp;
133  }
134  }
135  ps->egalites = pc;
136  ps->nb_eq = n+nbl;
137 }
138 
139 extern char *variable_name(Variable v);
140 
141 /* void egalites_to_matrice(matrice a, int n, int m, Pcontrainte leg, Pbase b):
142  * conversion d'une liste d'egalites leg representees par des vecteurs creux
143  * en une matrice pleine a de n lignes representant les egalites et de
144  * m colonnes representant les variables.
145  *
146  * Les lignes sont assignees suivant l'ordre dans lequel les egalites
147  * apparaissent dans la liste leg. Les colonnes sont assignees suivant
148  * les rang des variables dans la base b.
149  *
150  * Les termes constants sont pris en compte et stockes (arbitrairement)
151  * dans la colonne 0.
152  *
153  * La matrice a est supposees avoir ete allouees en memoire avec des dimensions
154  * suffisantes. Elle est initialisee a 0. Ni la liste d'egalites leg, ni
155  * la base b ne sont modifiees.
156  *
157  * Les nombres effectifs d'egalites et de variables ne sont pas retournes.
158  *
159  * L'implementation n'est pas propre, meme je ne vois pas ce qu'on peut
160  * faire de mieux sans un iterateurs sur les coefficients non nuls d'un
161  * vecteur. De plus, cette conversion de format est typiquement implementation
162  * dependante. L'implementation faite par Corinne pour syst_mat_conv()
163  * est cependante correcte. En plus, je parcours plein de fois la base...
164  * I'm lost!
165  *
166  * Francois Irigoin, 17 avril 1990
167  */
168 void egalites_to_matrice(a, n, m, leg, b)
169 Pmatrix a;
170 int n;
171 int m;
172 Pcontrainte leg;
173 Pbase b;
174 {
175  Pvecteur v;
176  int ligne;
177 
178  matrix_nulle(a);
179 
180  for(ligne=0;!CONTRAINTE_NULLE_P(leg); leg=leg->succ, ligne++) {
181  assert(ligne<n);
182  for(v = contrainte_vecteur(leg); !VECTEUR_UNDEFINED_P(v);
183  v = v->succ)
184  {
185  int rank = vecteur_var(v) == TCST? 0 :
187  vecteur_var(v),
188  variable_name);
189  assert(rank < m);
190  MATRIX_ELEM(a, ligne, rank) = vecteur_val(v);
191  }
192  }
193 }
194 
195 /* Pcontrainte matrice_to_contraintes(matrice a, int n, int m, Pbase b):
196  * fonction inverse de la precedente; les termes constants sont pris
197  * en colonne 0; les contraintes, egalites ou inegalites, sont allouees
198  * en fonction des besoins.`
199  *
200  * Comme on ne sait pas representer des contraintes rationnelles avec
201  * le type de donnees "contrainte", le denominateur de la matrice doit
202  * valoir 1.
203  */
205 Pmatrix a;
206 int n;
207 int m;
208 Pbase b;
209 {
211  return leg;
212 }
#define value_notzero_p(val)
#define value_uminus(val)
unary operators on values
int Value
int base_find_variable_rank(Pbase b, Variable v, char *(*variable_name)(Variable))
int base_find_variable_rank(Pbase b, Variable v, char * (*variable_name)()): returns variable v's ran...
Definition: base.c:194
#define A(i, j)
comp_matrice.c
Definition: comp_matrice.c:63
#define CONTRAINTE_NULLE_P(c)
contrainte nulle (non contrainte 0 == 0 ou 0 <= 0)
#define contrainte_vecteur(c)
passage au champ vecteur d'une contrainte "a la Newgen"
#define CONTRAINTE_UNDEFINED
Pcontrainte contrainte_new(void)
package contrainte - allocations et desallocations
Definition: alloc.c:47
#define B(A)
Definition: iabrev.h:61
#define MATRIX_DENOMINATOR(matrix)
int MATRIX_DENONIMATOR(matrix): acces au denominateur global d'une matrice matrix
Definition: matrix-local.h:86
#define MATRIX_ELEM(matrix, i, j)
Macros d'acces aux elements d'une matrice.
Definition: matrix-local.h:80
void matrix_nulle(Pmatrix Z)
void matrix_nulle(Pmatrix Z): Initialisation de la matrice Z a la valeur matrice nulle
Definition: matrix.c:293
static entity rank
#define assert(ex)
Definition: newgen_assert.h:41
Value b1
booleen indiquant quel membre est en cours d'analyse
Definition: sc_gram.c:105
Pcontrainte eq
element du vecteur colonne du systeme donne par l'analyse
Definition: sc_gram.c:108
Pvecteur cp
pointeur sur l'egalite ou l'inegalite courante
Definition: sc_read.c:87
void mat_sys_conv(Psysteme ps, Pmatrix B, int n, int m, int nbl)
void mat_sys_conv(Psysteme ps, matrice B, int n, int m, int nbl) remplissage du champ des egalites ps...
char * variable_name(Variable v)
polynome_ri.c
Definition: polynome_ri.c:73
void egalites_to_matrice(Pmatrix a, int n, int m, Pcontrainte leg, Pbase b)
void egalites_to_matrice(matrice a, int n, int m, Pcontrainte leg, Pbase b): conversion d'une liste d...
void sys_mat_conv(Psysteme ps, Pmatrix A, Pmatrix B, int n, int m)
package sur les polyedres
Definition: sc_to_matrice.c:65
Pcontrainte matrice_to_contraintes(Pmatrix a, int n, int m, Pbase b)
Pcontrainte matrice_to_contraintes(matrice a, int n, int m, Pbase b): fonction inverse de la preceden...
Variable creat_new_var(Psysteme ps)
char * noms_var(int i): cette fonction convertit un numero de variable en chaine de caracteres
Definition: sc_var.c:102
Definition: pip__tab.h:25
package matrice
Definition: matrix-local.h:63
Pvecteur vecteur
struct Scontrainte * succ
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 TCST
VARIABLE REPRESENTANT LE TERME CONSTANT.
#define vecteur_val(v)
#define vecteur_var(v)
#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 VECTEUR_UNDEFINED_P(v)
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
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
void vect_chg_coeff(Pvecteur *ppv, Variable var, Value val)
void vect_chg_coeff(Pvecteur *ppv, Variable var, Value val): mise de la coordonnee var du vecteur *pp...
Definition: unaires.c:143