25 #include "pips_config.h"
42 while(
x)
x >>= 1, n++;
51 if(p->row[i].flags & masque)
break;
66 int virt, reel, ncol, off, dh, dw;
72 q = (
char *)rp + 2 *
sizeof(
int) + (virt + reel + dh) *
sizeof(
struct L);
74 for(i = off; i<virt + reel; i++)
79 for(j = 0; j<ncol; j++)
Index(rp,i,j) =
Index(tp,i-off,j);
80 for(j = ncol; j<ncol+dw; j++)
Index(rp,i,j) = 0;
88 int nvar, ncol, bigparm;
92 for(i = 0; i<tp->height; i++)
96 {
if(bigparm >= 0 && (
x =
Index(tp,i, bigparm)))
104 for(j = nvar; j<ncol; j++)
107 else if (
x>0) fff =
Plus;
109 if(fff !=
Zero && fff != ff)
110 if(ff ==
Zero) ff = fff;
116 if(ff ==
Minus)
return(i);
126 int ni, nvar, nparm, nc;
130 int cPlus, cMinus, isCritic;
134 if(nparm == 0)
return;
136 fprintf(stderr,
"Trop de parametres : %d\n", nparm);
140 for(i = 0; i<ni + nvar; i++)
144 for(j = 0; j<nvar; j++)
if(
Index(tp, i, j) > 0)
148 for(j = 0; j < nparm; j++) discr[j] =
Index(tp, i, j+nvar+1);
149 discr[nparm] =
Index(tp, i, nvar)- (isCritic ? 0 : 1);
152 for(j = 0; j<=nparm; j++)
Index(tPlus, nparm+nc, j) = discr[j];
157 for(j = 0; j<nparm+1; j++) discr[j] = -discr[j];
158 discr[nparm] = discr[nparm] - (isCritic ? 1 : 2);
161 for(j = 0; j<= nparm; j++)
Index(tMinus, nparm+nc, j) = discr[j];
184 return(tp->row[i].objet.unit == j ?
D : 0);
185 else return(
Index(tp, i, j));
193 int ncol = nvar + nparm + 1;
195 for(i = 0; i<nvar; i++)
197 for(j = nvar+1; j<ncol; j++)
205 int pivi, nvar, nligne;
211 for(j = 0; j<nvar; j++)
212 {
if((foo =
Index(tp, pivi, j)) <= 0)
continue;
218 for(k = 0; k<nligne; k++)
238 int ncol = nvar + nparm + 1;
239 int nligne = nvar + ni;
243 long int pivot, foo, z;
246 fprintf(stderr,
"Trop de colonnes : %d\n", ncol);
252 if(pivj < 0)
return(-1);
254 for(j = 0; j<ncol; j++)
new[j] = (j == pivj ?
D : -
Index(tp, pivi, j));
255 for(k = 0; k<nligne; k++)
257 if(k == pivi)
continue;
258 foo =
Index(tp, k, pivj);
259 for(j = 0; j<ncol; j++)
260 {
if(j == pivj)
continue;
263 if(z%
D || z > 32767L *
D)
264 {
fprintf(stderr,
"%ld/Catastrophe en li %d co %d "
274 p = tp->row[pivi].objet.val;
275 for(k = 0; k<nligne; k++)
276 if((
Flag(tp, k) &
Unit) && tp->row[k].objet.unit == pivj)
break;
278 tp->row[k].objet.val = p;
279 for(j = 0; j<ncol; j++) *p++ =
new[j];
281 tp->row[pivi].objet.unit = pivj;
283 for(k = 0; k<nligne; k++)
285 if(ff &
Unit)
continue;
288 else if(
x == 0) fff =
Zero;
290 if(fff !=
Zero && fff != ff)
303 void traiter(tp, ctxt, iq,
D, nvar, nparm, ni, nc, bigparm)
305 int iq, nvar, nparm, ni, nc, bigparm;
309 int pivi, nligne, ncol;
318 {nligne = nvar+ni; ncol = nvar+nparm+1;
319 if(nligne > tp->height || ncol > tp->width)
324 if(pivi < nligne)
goto pirouette;
326 pivi =
exam_coef(tp, nvar, ncol, bigparm);
327 if(pivi < nligne)
goto pirouette;
332 if(pivi < nligne)
goto pirouette;
348 fprintf(stderr,
"Trop de parametres : %d\n", nparm);
352 ntp =
expanser(tp, nvar, ni, ncol, 0, 0, 0);
356 for(j = 0; j<nparm; j++)
357 {discr[j] =
Index(tp, pivi, j + nvar +1);
358 com_dem =
sol_pgcd(com_dem, discr[j]);
360 discr[nparm] =
Index(tp, pivi, nvar);
361 com_dem =
sol_pgcd(com_dem, discr[nparm]);
363 {
printf(
"pgcd negatif ! %d : trt\n", com_dem);
366 for(j = 0; j<=nparm; j++)
367 {discr[j] /= com_dem;
375 for(j = 0; j<nparm; j++) discr[j] = -discr[j];
376 discr[nparm] = -discr[nparm] - 1;
378 for(j = 0; j<=nparm; j++)
392 &nvar, &nparm, &ni, &nc);
393 if(pivi >= 0)
goto pirouette;
405 if((
D =
pivoter(tp, pivi,
D, nvar, nparm, ni)) < 0)
int integrer(Tableau **ptp, Tableau **pcontext, int D, int *pnvar, int *pnparm, int *pni, int *pnc)
FILE * dump
Should not be used : put here for Pip copatibility.
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
void pivot(frac *X, frac A, frac B, frac C, frac D, bool ofl_ctrl)
int pivoter(Tableau *tp, int pivi, Entier D, int nvar, int nparm, int ni)
void solution(Tableau *tp, int nvar, int nparm, Entier D)
Tableau * expanser(Tableau *tp, int virt, int reel, int ncol, int off, int dh, int dw)
il est convenu que traiter ne doit modifier ni le tableau, ni le contexte; le tableau peut grandir en...
int choisir_piv(Tableau *tp, int pivi, int nvar, int nligne, Entier D)
Entier valeur(Tableau *tp, int i, int j, Entier D)
static char vcid_pip_traiter[]
int exam_coef(Tableau *tp, int nvar, int ncol, int bigparm)
void compa_test(Tableau *tp, Tableau *context, int ni, int nvar, int nparm, int nc)
int chercher(Tableau *p, int masque, int n)