61 #define DEBUG(code) { }
64 #define DEBUG(code) { code }
68 #define DEBUG1(code) { }
71 #define DEBUG1(code) { code }
75 #define DEBUG2(code) { }
78 #define DEBUG2(code) { code }
82 #define DEBUG3(code) { }
85 #define DEBUG3(code) { code }
91 #define CONTROLING_TIMEOUT_SIMPLEX
94 control_catch_alarm_Simplex (
int sig)
110 #if defined(LINEAR_VALUE_IS_LONGLONG)
118 #define DIMENSION sc->dimension
119 #define NUMERO hashtable[h].numero
120 #define SOLUBLE(N) soluble=N;goto FINSIMPLEX ;
121 #define CREVARVISIBLE variables[compteur-3]=compteur-2;
122 #define CREVARCACHEE { variablescachees[nbvariables]=nbvariables + MAX_VAR ; \
123 if (nbvariables ++ >= MAX_VAR) abort(); }
139 if (value_gt(b,VALUE_ONE)) \
142 while(value_notzero_p(k=value_mod(i,j))) \
145 if (value_neg_p(j)) \
172 #define GCDZZN(j,a,b) \
175 i = (value_absolute(a)), k = (value_absolute(b)); \
176 while(value_notzero_p(j=value_mod(i,k))) \
181 #define GCD_ZERO_CTRL(j,a,b) \
182 {tag("GCD_ZERO_CTRL") \
183 if ((value_notzero_p(a)) && (value_notzero_p(b))) \
186 {fprintf(stderr,"********************************************************************Error : GCD of number zero !"); \
199 if (value_notone_p(b) && value_notone_p(a) && \
200 value_notmone_p(b) && value_notmone_p(a)) \
202 register Value i=a, j=b, k; \
203 while (value_notzero_p(k=value_mod(i,j))) \
205 value_division(a,j), value_division(b,j); \
207 if (value_neg_p(b)) \
208 value_oppose(a), value_oppose(b); \
213 #define SIMPLIFIE(f) \
215 if (value_zero_p(f.den)) \
218 if (value_zero_p(f.num)) \
221 SIMPL(f.num,f.den); } \
224 #define AFF(x,y) {x.num=y.num; x.den=y.den;}
225 #define AFF_PX(x,y) {x->num=y.num; x->den=y.den;}
226 #define INV(x,y) {x.num=y.den; x.den=y.num;}
232 #define INV_ZERO_CTRL(x,y) {if (value_zero_p(y.num)) {fprintf(stderr,"ERROR : inverse of fraction zero !"); x.num = VALUE_ZERO; x.den = VALUE_ONE;} else {INV(x,y)}}
235 #define METINFINI(f) {f.num=VALUE_MAX; f.den=VALUE_ONE;}
236 #define MET_ZERO(f) {f.num=VALUE_ZERO; f.den=VALUE_ONE;}
237 #define MET_UN(f) {f.num=VALUE_ONE; f.den=VALUE_ONE;}
239 #define EGAL1(x) (value_eq(x.num,x.den))
240 #define EGAL0(x) (value_zero_p(x.num))
241 #define NUL(x) (value_zero_p(x.num))
244 ((value_neg_p(x.num) && value_pos_p(x.den)) || \
245 (value_pos_p(x.num) && value_neg_p(x.den)))
248 ((value_pos_p(x.num) && value_pos_p(x.den)) || \
249 (value_neg_p(x.num) && value_neg_p(x.den)))
252 ((value_pos_p(x.num) && value_pos_p(x.den) && value_gt(x.num,x.den)) || \
253 (value_neg_p(x.num) && value_neg_p(x.den) && value_gt(x.den,x.num)))
255 #define EGAL_MACRO(x,y,mult) \
256 ((value_zero_p(x.num) && value_zero_p(y.num)) || \
257 (value_notzero_p(x.den) && value_notzero_p(y.den) && \
258 value_eq(mult(x.num,y.den),mult(x.den,y.num))))
266 #define INF_MACRO(x,y,mult) ((value_pos_p(mult(x.den,y.den)) && value_lt(mult(x.num,y.den),mult(x.den,y.num))) || (value_neg_p(mult(x.den,y.den)) && value_gt(mult(x.num,y.den),mult(x.den,y.num))))
292 #define DIV_MACRO(x,y,z,mult) \
294 if (value_zero_p(y.num)) \
300 if (value_zero_p(z.num)) \
302 fprintf(stderr,"ATTENTION : divided by zero number!"); \
307 x.num=mult(y.num,z.den); \
308 x.den=mult(y.den,z.num); \
317 #define MUL_MACRO(x,y,z,mult) \
319 if(value_zero_p(y.num) || value_zero_p(z.num)) \
323 x.num=mult(y.num,z.num); \
324 x.den=mult(y.den,z.den); \
331 #define SUB_MACRO(X,A,B,mult) \
333 if (value_zero_p(A.num)) \
334 X.num = value_uminus(B.num), \
336 else if (value_zero_p(B.num)) \
338 else if (value_eq(A.den,B.den)) \
340 X.num = value_minus(A.num,B.num); \
342 if (value_notone_p(A.den)) \
347 Value ad=A.den, bd=B.den, gd, v; \
348 GCD_ZERO_CTRL(gd,ad,bd); \
349 if (value_notone_p(gd)) value_division(ad,gd), value_division(bd,gd); \
350 X.num = mult(A.num,bd); \
351 v = mult(B.num,ad); \
352 value_substract(X.num,v); \
354 X.den = mult(v,gd); \
361 #define FULL_PIVOT_MACRO_SIOUX(X,A,B,C,D,mult) \
363 frac u,v,w; tag("FULL_PIVOT_SIOUX") \
364 AFF(u,B); AFF(v,C); INV_ZERO_CTRL(w,D);
\
365 SIMPL(u.num,v.den); SIMPL(u.num,w.den); \
366 SIMPL(v.num,u.den); SIMPL(v.num,w.den); \
367 SIMPL(w.num,u.den); SIMPL(w.num,v.den); \
368 u.num = mult(u.num,v.num); \
369 u.den = mult(u.den,v.den); \
370 u.num = mult(u.num,w.num); \
371 u.den = mult(u.den,w.den); \
372 SUB_MACRO(X,A,u,mult); \
377 #define FULL_PIVOT_MACRO_DIRECT(X,A,B,C,D,mult) \
379 Value v; tag("FULL_PIVOT_DIRECT") \
380 X.num = mult(A.num,B.den); \
381 X.num = mult(X.num,C.den); \
382 X.num = mult(X.num,D.num); \
383 v = mult(A.den,B.num); \
386 value_substract(X.num,v); \
387 X.den = mult(A.den,B.den); \
388 X.den = mult(X.den,C.den); \
389 X.den = mult(X.den,D.num); \
393 #define direct_p(v) (value_lt(v,MAXVAL))
398 #define FULL_PIVOT_MACRO(X,A,B,C,D,mult) \
399 { tag("FULL_PIVOT") \
400 if (direct_p(A.den) && direct_p(B.den) && \
401 direct_p(C.den) && direct_p(value_abs(D.num))) \
403 FULL_PIVOT_MACRO_DIRECT(X,A,B,C,D,mult); \
407 FULL_PIVOT_MACRO_SIOUX(X,A,B,C,D,mult); \
413 #define PARTIAL_PIVOT_MACRO_SIOUX(X,B,C,D,mult) \
414 { tag("PARTIAL_PIVOT_SIOUX") \
416 MUL_MACRO(u,B,C,mult);
\
417 DIV_MACRO(X,u,D,mult); \
418 value_oppose(X.num); \
421 #define PARTIAL_PIVOT_MACRO_DIRECT(X,B,C,D,mult) \
422 { tag("PARTIAL_PIVOT_DIRECT") \
423 X.num = mult(B.num,C.num); \
424 X.num = mult(X.num,D.den); \
425 value_oppose(X.num); \
426 X.den = mult(B.den,C.den); \
427 X.den = mult(X.den,D.num); \
431 #define PARTIAL_PIVOT_MACRO(X,B,C,D,mult) \
433 if (direct_p(B.den) && direct_p(C.den) && direct_p(D.num)) \
435 PARTIAL_PIVOT_MACRO_DIRECT(X,B,C,D,mult); \
439 PARTIAL_PIVOT_MACRO_SIOUX(X,B,C,D,mult); \
449 #define PIVOT_MACRO(X,A,B,C,D,mult) \
450 { if (value_zero_p(D.num)) fprintf(stderr,"division of zero!!!"); \
451 DEBUG3(fprintf(stdout, "pivot on: "); \
452 printfrac(A); printfrac(B); printfrac(C); printfrac(D)); \
453 if (value_zero_p(A.num))
\
455 if (value_zero_p(B.num) || value_zero_p(C.num) || value_zero_p(D.den)) \
458 { PARTIAL_PIVOT_MACRO(X,B,C,D,mult);} \
461 if (value_zero_p(B.num) || value_zero_p(C.num) || value_zero_p(D.den)) \
464 if (value_one_p(D.num) && value_one_p(A.den) && \
465 value_one_p(B.den) && value_one_p(C.den)) \
467 Value v = mult(B.num,C.num); \
469 X.num=value_minus(A.num,v); \
473 { FULL_PIVOT_MACRO(X,A,B,C,D,mult);} \
474 DEBUG3(fprintf(stdout, " = "); printfrac(X); fprintf(stdout, "\n")); \
482 #undef value_protected_mult
483 #define value_protected_mult(v,w) \
484 value_protected_multiply(v,w,THROW(simplex_arithmetic_error))
488 #define MULT(RES,A,B) RES=value_mult(A,B)
489 #define MULTOFL(RES,A,B) RES=value_protected_mult(A,B)
491 #define DIV(x,y,z) DIV_MACRO(x,y,z,value_mult)
492 #define DIVOFL(x,y,z) DIV_MACRO(x,y,z,value_protected_mult)
494 #define MUL(x,y,z) MUL_MACRO(x,y,z,value_mult)
495 #define MULOFL(x,y,z) MUL_MACRO(x,y,z,value_protected_mult)
497 #define SUB(X,A,B) SUB_MACRO(X,A,B,value_mult)
498 #define SUBOFL(X,A,B) SUB_MACRO(X,A,B,value_protected_mult)
500 #define PIVOT(X,A,B,C,D) PIVOT_MACRO(X,A,B,C,D,value_mult)
501 #define PIVOTOFL(X,A,B,C,D) PIVOT_MACRO(X,A,B,C,D,value_protected_mult)
503 #define EGAL(x,y) EGAL_MACRO(x,y,value_mult)
504 #define EGALOFL(x,y) EGAL_MACRO(x,y,value_protected_mult)
506 #define INF(x,y) INF_MACRO(x,y,value_mult)
507 #define INFOFL(x,y) INF_MACRO(x,y,value_protected_mult)
540 long long int tmp = lli;
543 while ((k=lli%llj) !=0)
555 tag(
"frac_simplifie")
577 fprintf(stderr,
"ATTENTION : divided by zero number!");
631 Value ad=
A.den, bd=
B.den, gd, v;
655 tag(
"FULL_PIVOT_SIOUX")
728 tag(
"PARTIAL_PIVOT_SIOUX")
737 {
tag(
"PARTIAL_PIVOT_DIRECT")
773 fprintf(stderr,
"division of zero!!!");
817 printf(
"%s %d ", (
char *) hashtable[i].nom, hashtable[i].numero),
839 dump_tableau(
char *msg,
tableau *t,
int colonnes) {
842 for(i=0;i<colonnes;i++)
843 if(t[i].colonne[t[i].taille-1].numero>
max)
845 printf(
"\nTableau (%s): %d colonnes %d lignes\n",msg,colonnes,
max) ;
846 printf(
"%d Variables visibles :",colonnes-2) ;
851 for(j=0;j<=
max;j++) {
853 for(i=0;i<colonnes;i++) {
855 for(k=0;k<t[i].
taille;k++)
856 if(t[i].colonne[k].numero==j)
905 Pbase volatile saved_base;
906 int volatile saved_dimension;
909 frac *
volatile nlle_colonne = NULL;
912 intptr_t i, j, k, h, trouve, ligne, i0, i1, jj, ii ;
919 frac rapport1, rapport2, min1, min2, piv, cc ;
922 DEBUG(
static int simplex_sc_counter = 0;)
929 i=-1, j=-1, k=-1, h=-1, trouve=-1, ligne=-1, i0=-1, i1=-1, jj=-1, ii=-1;
930 poidsM =-1,
valeur=-1, tmpval=-1,w=-1;
938 saved_base = sc_base(sc);
939 saved_dimension = sc_dimension(sc);
949 fprintf(stderr,
"[sc_simplexe_feasibility_ofl_ctrl] "
950 "should not (yet) be called with control %d...\n", ofl_ctrl);
955 DEBUG(simplex_sc_counter ++;
956 fprintf(stderr,
"BEGIN SIMPLEX : %d th\n",simplex_sc_counter);
969 for(pc_tmp = sc->
egalites; pc_tmp!= NULL; pc_tmp=pc_tmp->
succ)
986 DEBUG(
fprintf(stderr,
"arithmetic error or timeout in simplex\n"););
988 for(i = premier_hash ; i !=
PTR_NIL; i = hashtable[i].
succ) {
991 hashtable[i].
hash = 0 ;
1002 sc_base(sc) = saved_base;
1003 sc_dimension(sc) = saved_dimension;
1014 ifscdebug(5) {
fprintf(stderr,
"DNDNDN WARNING: Exception not treated, return feasible!");}
1027 if (CONTROLING_TIMEOUT_SIMPLEX) {
1028 signal(SIGALRM, controling_catch_alarm_Simplex);
1029 alarm(CONTROLING_TIMEOUT_SIMPLEX);
1068 DEBUG2(dump_hashtable(hashtable);)
1079 for(; pv !=0 ; pv=pv->
succ)
1089 if (hashtable[h].nom==pv->
var) {
1093 else { h = (h+1) %
MAX_VAR ; }
1096 hashtable[h].
succ=premier_hash ;
1099 hashtable[h].
numero=compteur++ ;
1100 hashtable[h].
nom=pv->
var ;
1114 else tmpval = pv->
val ;
1124 DEBUG1(dump_tableau(
"cre var ec", t, compteur);)
1130 DEBUG1(
printf(
"ligne ecart = %ld, colonne %ld\n",ligne,i);)
1131 t[i].colonne[1].numero = ligne ;
1154 DEBUG1(dump_tableau(
"cre col cach", t, compteur);)
1160 DEBUG1(dump_hashtable(hashtable);)
1161 DEBUG1(dump_tableau(
"avant sol prov", t, compteur);)
1182 if (pc->
vecteur == NULL)
continue;
1194 if (hashtable[h].nom==pv->
var) {
1198 else { h = (h+1) %
MAX_VAR ; }
1201 hashtable[h].
succ=premier_hash ;
1204 hashtable[h].
numero=compteur++ ;
1206 hashtable[h].
nom=pv->
var ;
1219 else tmpval = pv->
val ;
1255 DEBUG1(dump_tableau(
"cre col cach 2", t, compteur);)
1261 if (pc->
vecteur == NULL)
continue;
1275 if (hashtable[h].nom==pv->
var) {
1279 else { h = (h+1) %
MAX_VAR ; }
1282 hashtable[h].
succ=premier_hash ;
1285 hashtable[h].
numero=compteur++ ;
1286 hashtable[h].
nom=pv->
var ;
1335 DEBUG1(dump_tableau(
"cre col cach 3", t, compteur);)
1384 for(j=2, jj= -1 ;j<compteur;j++)
1385 if(t[j].existe &&
NEGATIF(t[j].colonne[0]))
1394 printf (
"solution :\n") ;
1395 dump_tableau(
"sol", t, compteur) ;
1401 cond =
EGALOFL(objectif[0],t[0].colonne[0]) &&
1402 EGALOFL(objectif[1],t[1].colonne[0]);
1404 cond =
EGAL(objectif[0],t[0].colonne[0]) &&
1405 EGAL(objectif[1],t[1].colonne[0]);
1409 DEBUG1(
printf(
"Systeme soluble (faisable) en rationnels\n");)
1421 dump_tableau(
"avant ch pivot", t, compteur);)
1428 for(i=1, i0=1, i1=1, ii=-1 ; i<t[jj].
taille ; )
1435 if(((i0<t[0].taille && t[jj].colonne[i].numero <=
1436 t[0].colonne[i0].numero) || i0>=t[0].taille)
1437 && ((i1<t[1].taille && t[jj].colonne[i].numero <=
1438 t[1].colonne[i1].numero) || i1>=t[1].taille)) {
1439 if(
POSITIF(t[jj].colonne[i])) {
1445 t[0].colonne[i0]:
frac0;
1450 t[1].colonne[i1]:
frac0;
1461 fprintf(stdout,
"\nand cond: ");)
1467 cond =
INFOFL(rapport2,min2) ||
1471 cond =
INF(rapport2,min2) ||
1472 (
EGAL(rapport2,min2) &&
1473 INF(rapport1,min1));
1478 AFF(min1,rapport1) ;
1479 AFF(min2,rapport2) ;
1480 AFF(piv,t[jj].colonne[i]) ;
1488 if(i0<t[0].taille &&
1489 t[jj].colonne[i].numero> t[0].colonne[i0].numero) i0++ ;
1490 if(i1<t[1].taille &&
1491 t[jj].colonne[i].numero > t[1].colonne[i1].numero) i1++ ;
1496 i<t[jj].taille? t[jj].colonne[i].numero: -1,
1497 i0<t[0].taille? t[0].colonne[i0].numero: -1,
1498 i1<t[1].taille? t[1].colonne[i1].numero: -1);)
1503 DEBUG1(dump_tableau(
"sol infinie", t, compteur);
1504 fprintf(stderr,
"Solution infinie\n");)
1517 for(j=0;j<compteur-2;j++)
1536 t[compteur].taille = 2 ;
1545 for(j=0 ; j<=compteur ; j=(j==(jj-1))?(j+2):(j+1)) {
1551 for(i=1;i<t[j].
taille;i++)
1552 if(t[j].colonne[i].numero==ii)
1553 {
AFF(cc,t[j].colonne[i]); break ; }
1554 else if(t[j].colonne[i].numero>ii)
1558 DEBUG2(
printf(
"k=%ld, j=%ld, i=%ld i1=%ld\n",k,j,i,i1);
1563 printf(
"ATTENTION fraction 0/0 ");
1569 t[j].colonne[i].numero == t[jj].colonne[i1].numero)
1571 if(t[j].colonne[i].numero == ii) {
1572 AFF(nlle_colonne[k],t[j].colonne[i]);
1574 frac *n = &nlle_colonne[k],
1577 pivot(n, (*a), (*b), cc, piv,ofl_ctrl);
1580 if(i==0||nlle_colonne[k].
num!=0) {
1588 if(i>=t[j].taille ||
1590 t[j].colonne[i].numero > t[jj].colonne[i1].numero))
1595 printf(
"t[j].colonne[i].numero > "
1596 "t[jj].colonne[i1].numero , "
1597 "k=%ld, j=%ld, i=%ld i1=%ld\n",
1599 printf(
"j = %ld t[j].taille=%d , "
1600 "t[jj].taille=%d\n",
1601 j,t[j].taille,t[jj].taille);
1602 printf(
"t[j].colonne[i].numero=%d , "
1603 "t[jj].colonne[i1].numero=%d\n",
1604 t[j].colonne[i].numero,
1605 t[jj].colonne[i1].numero);
1609 if(t[jj].colonne[i1].numero == ii) {
1612 frac *n = &(nlle_colonne[k]),
1613 *b = &(t[jj].colonne[i1]);
1617 if(i==0||nlle_colonne[k].
num!=0)
1623 if(i1<t[jj].taille) i1++ ;
else i++ ;
1625 else if(i1>=t[jj].taille ||
1626 t[j].colonne[i].numero <
1627 t[jj].colonne[i1].numero)
1631 "t[jj].colonne[i1].numero , "
1632 "k=%ld, j=%ld, i=%ld i1=%ld\n",
1634 printf(
"j = %ld t[j].taille=%d , "
1635 "t[jj].taille=%d\n",
1636 j,t[j].taille,t[jj].taille););
1637 AFF(nlle_colonne[k],t[j].colonne[i]) ;
1638 if(i==0||nlle_colonne[k].
num!=0) {
1643 if(i<t[j].taille) i++ ;
else i1++ ;
1650 printf(
" [ligne numero %d]\n",
1651 nlle_colonne[k-1].numero);)
1654 if(j==compteur) w = jj ;
else w = j ;
1657 nlle_colonne = colo ;
1659 DEBUG1(
printf(
"w = %ld t[w].taille=%d \n",w,t[w].taille);
1660 dump_tableau(
"last", t, compteur););
1667 DEBUG1(dump_tableau(
"fin simplexe", t, compteur);)
1670 DEBUG(
fprintf(stderr,
"END SIMPLEX: %d th\n",simplex_sc_counter);)
1672 for(i = premier_hash ; i !=
PTR_NIL; i = hashtable[i].
succ){
1674 hashtable[i].
numero = 0 ;
1675 hashtable[i].
hash = 0 ;
1692 sc_base(sc) = saved_base;
1693 sc_dimension(sc) = saved_dimension;
@ simplex_arithmetic_error
#define value_minus(v1, v2)
#define value_oppose(ref)
#define value_notzero_p(val)
#define value_uminus(val)
unary operators on values
#define value_notone_p(val)
#define value_zero_p(val)
#define ABS(x)
was: #define value_mult(v,w) value_direct_multiply(v,w) #define value_product(v,w) value_direct_produ...
#define value_notmone_p(val)
#define value_addto(ref, val)
#define value_eq(v1, v2)
bool operators on values
#define value_division(ref, val)
#define VALUE_TO_LONG(val)
#define value_substract(ref, val)
#define value_mult(v, w)
whether the default is protected or not this define makes no sense any more...
void print_Value(Value)
io.c
#define linear_assert(msg, ex)
int f(int off1, int off2, int n, float r[n], float a[n], float b[n])
int f2(int off1, int off2, int w, int n, float r[n], float a[n], float b[n])
bool sc_weak_consistent_p(Psysteme sc)
check that sc is well defined, that the numbers of equalities and inequalities are consistent with th...
void sc_creer_base(Psysteme ps)
void sc_creer_base(Psysteme ps): initialisation des parametres dimension et base d'un systeme lineair...
void sc_default_dump(Psysteme sc)
void sc_default_dump(Psysteme sc): dump to stderr
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
void partial_pivot_direct(frac *X, frac B, frac C, frac D, bool ofl_ctrl)
#define GCD_ZERO_CTRL(j, a, b)
static int variablescachees[MAX_VAR]
void frac_simpl(Value *a, Value *b)
void full_pivot(frac *X, frac A, frac B, frac C, frac D, bool ofl_ctrl)
void pivot(frac *X, frac A, frac B, frac C, frac D, bool ofl_ctrl)
#define INV_ZERO_CTRL(x, y)
??? value_zero_p(y.num)? Then x.num != VALUE_ZERO and x.den = VALUE_ZERO, it's not good at all.
void frac_div(frac *x, frac y, frac z, bool ofl_ctrl)
void partial_pivot(frac *X, frac B, frac C, frac D, bool ofl_ctrl)
@ MAXVAL
nombre max de variables
static void __attribute__((unused))
For debugging:
static int NB_EQ
test du simplex : Si on compile grace a` "make simp" dans le repertoire /projects/C3/Linear/Developme...
#define DEBUG(code)
debug macros may be trigered with -DDEBUG{,1,2}
void frac_mul(frac *x, frac y, frac z, bool ofl_ctrl)
computes x = simplify(y*z)
bool sc_simplex_feasibility_ofl_ctrl_fixprec(Psysteme sc, int ofl_ctrl)
fonction de calcul de la faisabilite' d'un systeme d'equations et d'inequations Auteur : Robert Mahl,...
void full_pivot_direct(frac *X, frac A, frac B, frac C, frac D, bool ofl_ctrl)
computes X = A - B*C/D, but does not try to avoid arithmetic exceptions
#define tag(x)
for tracing macros after expansion:
#define value_protected_mult(v, w)
multiplies two Values of no arithmetic overflow, or throw exception.
void partial_pivot_sioux(frac *X, frac B, frac C, frac D, bool ofl_ctrl)
idem if A==0
static int variables[MAX_VAR]
void frac_sub(frac *X, frac A, frac B, bool ofl_ctrl)
static int nbvariables
Le nombre de variables visibles est : compteur-2 La i-eme variable visible a le numero : variables[i+...
void full_pivot_sioux(frac *X, frac A, frac B, frac C, frac D, bool ofl_ctrl)
void frac_init(frac *f, int n)
static int hash(Variable s)
dump_tableau
static void printfrac(frac x)
void frac_simplifie(frac *f)
simplifie normalizes fraction f
#define INTPTR_MIN
7.18.2.4.
struct Scontrainte * succ
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
this is already too much...
Entier valeur(Tableau *tp, int i, int j, Entier D)
#define VARIABLE_DEFINED_P(v)
void * Variable
arithmetique is a requirement for vecteur, but I do not want to inforce it in all pips files....
#define VARIABLE_UNDEFINED
#define BASE_NULLE
MACROS SUR LES BASES.
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Value vect_coeff(Variable var, Pvecteur vect)
Variable vect_coeff(Variable var, Pvecteur vect): coefficient de coordonnee var du vecteur vect —> So...