bug-glpk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-glpk] 1e-0 vs. 1e+0


From: Frank Eschmann
Subject: [Bug-glpk] 1e-0 vs. 1e+0
Date: Fri, 21 Mar 2003 11:11:18 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021130

Hi,

I formulated a scheduling problem for a special computer architecture in GLPK/L. I am using glpsol 3.2.4. After a few bug fixes in my formulation I tried a little larger problem -- and got a wrong solution. So I constrained the variables to the values I expected, and I couldn't found a violation of the dependencies, though glpsol says, that there is no feasible solution, even for the nomip problem.

So I expanded the output of glpsol a little bit, that I get information which constraints are violated (maybe a good idea for a next version... :o) ) and the exact values of activity and the bounds -- my changes are also attached.
With that I found that the problems arise at following constraints:


  2676 mf_only_one_site[m1]
B 1 1 = fx: vx=1.000000e-00, lb=1.000000e+00
  2677 mf_only_one_site[m2]
B 1 1 = fx: vx=1.000000e-00, lb=1.000000e+00
[...]
  2679 mf_only_one_site[m4]
B 1 1 = fx: vx=1.000000e-00, lb=1.000000e+00


The constraint is obviously fullfilled, but because of the exponent they are identified as not identically.
Could this be the reason, why glpsol says, the solution is infeasible?

Thanks a lot for any help,

Frank Eschmann




--
Dipl.-Inform. Frank Eschmann
Johann Wolfgang Goethe-Universität
Professur für Technische Informatik
Robert-Mayer-Straße 11-15, 60054 Frankfurt
Zi: 213   Tel: 069-798-28242   Fax: 069-798-22351
email: address@hidden
/*-----------------------------------------------------------------*/
/* Beschreibung des optimalen globalen Schedulings fuer SDAARC als */
/* ganzzahliges lineares Programm.                                 */
/*                                                                 */
/* Autor: Frank Eschmann <address@hidden>         */
/* Datum: 21.02.2003                                               */
/*                                                                 */
/* Grundlage: Bericht "Berechnung eines optimalen Schedulings      */
/*            fuer SDAARC mittels Ganzzahliger Linearer            */
/*            Programmierung" (F. Eschmann und J. Haase)           */
/*                                                                 */
/* 
$Header: 
/home/ti/atools/cvsroot/SDAARC_intern/Projekte/Scheduling/globales_Scheduling/ILP-Formulierung/GLPK-Beschreibung/SDAARC-Scheduling.lpm,v
 1.4 2003/02/27 10:28:13 eschmann Exp $
*/
/*                                                                 */
/* Format: GLPK/L                                                  */
/*                                                                 */
/* zur Benutzung mit glpk                                          */
/*-----------------------------------------------------------------*/

model SDAARC_Scheduling;



/*-----------------------------------------------------------------*/
/* Beschreibung der Zeitrahmens                                    */
/*-----------------------------------------------------------------*/


set Time  /* Zeitpunkte */ =

   ( t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15 
);

/*
   ( t01, t02, t03, t04, t05, t06, t07, t08, t09, t10,
     t11, t12, t13, t14, t15, t16, t17, t18, t19, t20,
     t21, t22, t23, t24, t25, t26, t27, t28, t29, t30,
     t31, t32, t33, t34, t35, t36, t37, t38, t39, t40,
     t41, t42, t43, t44, t45, t46, t47, t48, t49, t50 );
*/


parameter T; /* Anzahl der maximal notwendigen Takte */


parameter t_count[Time];
t_count[t] := 1;
T := sum(t, t_count[t]);



parameter t_ord[Time]; /* Ordnung auf der Zeitskala */

t_ord[t] := data(t in Time:
                   t01   1
                   t02   2
                   t03   3
                   t04   4
                   t05   5 
                   t06   6
                   t07   7
                   t08   8
                   t09   9
                   t10  10
                   t11  11
                   t12  12
                   t13  13
                   t14  14
                   t15  15
 );
/*
                   t01   1
                   t02   2
                   t03   3
                   t04   4
                   t05   5
                   t06   6
                   t07   7
                   t08   8
                   t09   9
                   t10  10
                   t11  11
                   t12  12
                   t13  13
                   t14  14
                   t15  15
                   t16  16
                   t17  17
                   t18  18
                   t19  19
                   t20  20
                   t21  21
                   t22  22
                   t23  23
                   t24  24
                   t25  25
                   t26  26
                   t27  27
                   t28  28
                   t29  29
                   t30  30
                   t31  31
                   t32  32
                   t33  33
                   t34  34
                   t35  35
                   t36  36
                   t37  37
                   t38  38
                   t39  39
                   t40  40
                   t41  41
                   t42  42
                   t43  43
                   t44  44
                   t45  45
                   t46  46
                   t47  47
                   t48  48
                   t49  49
                   t50  50 );
*/
                   


predicate t_leq[Time, Time];

t_leq[t,u] := t_ord[t]-t_ord[u] <= 0;



/*-----------------------------------------------------------------*/
/* Beschreibung der Rechner                                        */
/*-----------------------------------------------------------------*/

set Sites /* teilnehmende Rechner */ =  

         ( s1, s2 );

/*
         ( s1, s2, s3, s4, s5);
*/



parameter S; /* Anzahl der teilnehmenden Rechner */

parameter s_count[Sites];
s_count[t] := 1;
S := sum(s, s_count[s]);



parameter CPI[Sites];  /* Geschwindigkeit der Rechner */

CPI[s] := data(s in Sites:
                 s1    1.0
                 s2    1.0 );

/*
                 s1    0.5
                 s2    0.3
                 s3    1.0
                 s4    0.2
                 s5    0.7);
*7


            

/*-----------------------------------------------------------------*/
/* Beschreibung der Netzwerkverbindung                             */
/*-----------------------------------------------------------------*/

parameter NL[Sites,Sites]; /* Netzwerk-Latenz */


/* ACHTUNG: Auf Einhaltung der Dreiecks-Ungleichung achten! */

NL[i,j] := table(i in Sites, j in Sites:
                       s1 s2:
                   s1   0  1 
                   s2   1  0 );


/*
                       s1  s2  s3  s4  s5:
                   s1   0   2   1   2   2
                   s2   2   0   1   2   4
                   s3   4   1   0   3   2
                   s4   3   2   1   0   1
                   s5   1   2   3   1   0  );
*/




                   



/*-----------------------------------------------------------------*/
/* Beschreibung der Microframes                                    */
/*-----------------------------------------------------------------*/


set Microframes = 
     ( m1, m2, m3, m4 );

/*
     (m1, m2, m3, m4, m5, m6, m7, m8, m9, m10);
*/



parameter INSTR[Microframes]; /* Instruktionsanzahl der Microframes */

INSTR[m] := data(m in Microframes:
                   m1    3
                   m2    3
                   m3    5
                   m4    3 );


/*
                   m1    10
                   m2    20
                   m3     5
                   m4    50
                   m5    30
                   m6    35
                   m7    40
                   m8    70
                   m9    20
                   m10   10 );
*/





/* 1 <-> die Zeit zwischen z und t ist gleich NL[r,s] */
/* wird gebraucht um die Zeitverschiebungen in den Summen zu implementieren. */

/* es gilt dann: Pos[m,r,t-NL[r,s]] <--> Pos[m,r,z] where t_NL_1[t,z,r,s]   */


predicate t_NL_1[Time, Time, Sites, Sites];

t_NL_1[t,z,r,s] := t_ord[t] - t_ord[z] - (NL[r,s] + 1) = 0;




/*-----------------------------------------------------------------*/
/* Beschreibung der Allokations-Abhängigkeiten                     */
/*-----------------------------------------------------------------*/


parameter ALLOK[Microframes, Microframes];  /* MF-Allokation */

/* ACHTUNG: Jeder Microframe darf nur einmal allokiert werden, */
/*          d.h. pro Spalte darf nur eine 1 stehen.            */

ALLOK[m,n] := table(m in Microframes, n in Microframes:
                          m1 m2 m3 m4:
                      m1   0  1  1  1 
                      m2   0  0  0  0 
                      m3   0  0  0  0
                      m4   0  0  0  0 );

/*
                          m1 m2 m3 m4 m5 m6 m7 m8 m9 m10:
                      m1  0  1  1  1  0  0  0  0  1  1 
                      m2  0  0  0  0  0  0  0  0  0  0
                      m3  0  0  0  0  0  0  0  0  0  0
                      m4  0  0  0  0  1  1  1  0  0  0
                      m5  0  0  0  0  0  0  0  1  0  0
                      m6  0  0  0  0  0  0  0  0  0  0
                      m7  0  0  0  0  0  0  0  0  0  0
                      m8  0  0  0  0  0  0  0  0  0  0
                      m9  0  0  0  0  0  0  0  0  0  0
                      m10 0  0  0  0  0  0  0  0  0  0  );
*/




parameter NOALLOK[Microframes];  /* MFs, die nicht allokiert werden */

NOALLOK[m] :=  1 - sum(l, ALLOK[l,m]);




/*-----------------------------------------------------------------*/
/* Beschreibung der Daten-Abhängigkeiten                           */
/*-----------------------------------------------------------------*/


parameter DEP[Microframes, Microframes];


DEP[m,n] := table(m in Microframes, n in Microframes:

                          m1 m2 m3 m4:
                      m1   0  1  1  0 
                      m2   0  0  0  1
                      m3   0  0  0  1 
                      m4   0  0  0  0 );

/*
                          m1 m2 m3 m4 m5 m6 m7 m8 m9 m10: 
                      m1  0  1  1  0  0  0  0  0  0  0 
                      m2  0  0  0  0  0  0  0  0  0  1
                      m3  0  0  0  1  0  0  0  0  0  0
                      m4  0  0  0  0  1  1  0  0  0  0
                      m5  0  0  0  0  0  0  0  1  0  0
                      m6  0  0  0  0  0  0  0  0  0  1
                      m7  0  0  0  0  0  0  0  0  0  1
                      m8  0  0  0  0  0  0  0  0  1  0
                      m9  0  0  0  0  0  0  0  0  0  1
                      m10 0  0  0  0  0  0  0  0  0  0  );
*/




/* Microframes, die keine Daten verschicken, sind End-Microframes */

predicate NOBODY_DEPENDS_ON[Microframes];

NOBODY_DEPENDS_ON[m] := sum(n, DEP[m,n]) = 0;


/*
display (NOALLOK[m]),(NOBODY_DEPENDS_ON[m]);
*/


/*-----------------------------------------------------------------*/
/* Ausführungszeitraum und -Bedingungen der Microframes            */
/*-----------------------------------------------------------------*/

binary variable Exec[Microframes, Sites, Time]; /* Ausführungszeitraum  und 
-ort der MF */

binary variable ExecSite[Microframes, Sites]; /* Site auf der der MF ausgeführt 
wird */



/* Microframes dürfen nur auf einer Site ausgeführt werden */

constraint mf_only_one_site[Microframes];

mf_only_one_site[m] := sum(s, ExecSite[m,s]) = 1;



/* Microframes müssen komplett ausgeführt werden */

constraint mf_complete_execution_1[Microframes, Sites];

mf_complete_execution_1[m,s] := sum(t, Exec[m,s,t]) >= 
ExecSite[m,s]*CPI[s]*INSTR[m];


constraint mf_complete_execution_2[Microframes, Sites];

mf_complete_execution_2[m,s] := sum(t, Exec[m,s,t]) <= 
ExecSite[m,s]*CPI[s]*INSTR[m] + 1;
/* ein "<" geht leider nicht */




/* pro Site und Zeitpunkt darf nur ein MF ausgeführt werden */

constraint mf_only_one_per_time[Sites, Time];

mf_only_one_per_time[s,t] := sum(m, Exec[m,s,t]) <= 1;




/*-----------------------------------------------------------------*/
/* Start- und Endzeitpunkt der Microframe-Ausführung               */
/*-----------------------------------------------------------------*/

binary variable StartExec[Microframes, Time];

binary variable EndExec[Microframes, Time];



/* es muss genau einen Start- und Endzeitpunkt pro MF geben */

constraint mf_only_one_start[Microframes];

constraint mf_only_one_end[Microframes];

mf_only_one_start[m] := sum(t, StartExec[m,t]) = 1;

mf_only_one_end[m] := sum(t, EndExec[m,t]) = 1;



/* vor dem Startzeitpunkt darf der MF noch nicht ausgeführt werden */

constraint mf_no_work_before_start[Microframes, Time];

mf_no_work_before_start[m,t] := T*sum(z, StartExec[m,z] where t_leq[z,t]) >=
                                sum((z,s), Exec[m,s,z] where t_leq[z,t]);


/* nach dem Endzeitpunkt darf der MF nicht mehr ausgeführt werden */

constraint mf_no_work_after_end[Microframes, Time];

mf_no_work_after_end[m,t] := T*sum(z, EndExec[m,z] where t_leq[t,z]) >=
                             sum((z,s), Exec[m,s,z] where t_leq[t,z]);


/* zum Startzeitpunkt muss der MF schon ausgeführt werden */

constraint mf_start_at_start[Microframes, Time];

mf_start_at_start[m,t] := StartExec[m,t] <= sum(s, Exec[m,s,t]);



/* zum Endzeitpunkt muss der MF noch ausgeführt werden */

constraint mf_end_at_end[Microframes, Time];

mf_end_at_end[m,t] := EndExec[m,t] <= sum(s, Exec[m,s,t]);




/*-----------------------------------------------------------------*/
/* Position der Microframes                                        */
/*-----------------------------------------------------------------*/

binary variable Pos[Microframes, Sites, Time];

/* 1 <-> MF befindet sich aktuell auf dieser Site */


binary variable Mig[Microframes, Time];

/* 1 <-> MF migriert gerade */



/* während der Ausführung muss der MF auf dem ausführenden Rechner liegen */

constraint mf_pos_while_execution[Microframes, Sites, Time];

mf_pos_while_execution[m,s,t] := Exec[m,s,t] <= Pos[m,s,t];




/* obere Schranke für Existenzzeitraum-Bestimmung */

constraint mf_exist_upper_limit[Microframes, Time];

mf_exist_upper_limit[m,t] := sum(s, Pos[m,s,t])+Mig[m,t] <= 1;



/* Existenzzeitraum-Bestimmung, Fall 1 */

constraint mf_exist_case_1[Microframes, Time];

mf_exist_case_1[m,t] := sum(s, Pos[m,s,t])+Mig[m,t] >=
                        sum((l,z), ALLOK[l,m]*EndExec[l,z] where t_leq[z,t]) +
                          NOALLOK[m] + sum(z, EndExec[m,z] where t_leq[t,z]) - 
1;



/* Existenzzeitraum-Bestimmung, Fall 2 */

constraint mf_exist_case_2a[Microframes, Time];

mf_exist_case_2a[m,t] := sum(s, Pos[m,s,t])+Mig[m,t] <=
                         sum((l,z), ALLOK[l,m]*EndExec[l,z] where t_leq[z,t]) +
                           NOALLOK[m];

constraint mf_exist_case_2b[Microframes, Time];

mf_exist_case_2b[m,t] := sum(s, Pos[m,s,t])+Mig[m,t] <=
                         sum(z, EndExec[m,z] where t_leq[t,z]);




/* alle Nicht-allokierten MFs zum Startzeitpunkt auf Site 1 zwingen */


Pos.fx[m,#s1,#t01] := NOALLOK[m];
/* das funktioniert so nicht, dann soll der Solver es sich halt selbst 
ausrechnen...
Pos.fx[m,s,#t01] where (s!=#s1) := 0;
*/





/* Allokation findet auf der Site des allokierenden MF statt */

constraint mf_allok_site_1[Microframes, Microframes, Sites, Time];

mf_allok_site_1[l,m,s,t] := Pos[m,s,t] <= 
                            Pos[l,s,t] + (1 - ALLOK[l,m]*EndExec[l,t]);

constraint mf_allok_site_2[Microframes, Microframes, Sites, Time];

mf_allok_site_2[l,m,s,t] := Pos[m,s,t] >=
                            Pos[l,s,t] - (1 - ALLOK[l,m]*EndExec[l,t]);





/*-----------------------------------------------------------------*/
/* Migration von Microframes                                       */
/*-----------------------------------------------------------------*/

constraint mf_mig_pos_1[Microframes, Sites, Time];

mf_mig_pos_1[m,s,t] where t_ord[t]>=2 := sum((r,z), Pos[m,r,z] where 
t_NL_1[t,z,r,s]) + 
                         sum(l, ALLOK[l,m]*EndExec[l,t]) >=
                       Pos[m,s,t];


constraint mf_mig_pos_2[Microframes, Sites, Time];

mf_mig_pos_2[m,s,t] where t_ord[t]>=2 := sum((r,z), Pos[m,r,z] where 
t_NL_1[t,z,r,s]]) + 
                         sum(l, ALLOK[l,m]*EndExec[l,t]) <=
                       S - (S-1)*Pos[m,s,t];


constraint mf_mig_neg[Microframes, Sites, Time];

mf_mig_neg[m,s,t] := sum((r,z), Pos[m,r,z] 
                       where (t_ord[t]-NL[r,s]-t_ord[z]<=0 and 
t_ord[t]-1-t_ord[z]>=0))
                     <= (1-Pos[m,s,t])*S*T;





/*-----------------------------------------------------------------*/
/* Verschickung der Argumente                                      */
/*-----------------------------------------------------------------*/

/* 1 <-> Argument befindet sich gerade auf dieser Site */

binary variable ArgPos[m in Microframes, n in Microframes, s in Sites, t in 
Time] 
                                                                      where 
DEP[m,n]=1;

binary variable ArgMig[m in Microframes, n in Microframes, t in Time] where 
DEP[m,n]=1; 



/* Existenzzeitraum der Argumente */

constraint arg_exist[Microframes, Microframes, Time];

arg_exist[m,n,t] where DEP[m,n]=1 := DEP[m,n]*(sum(z, EndExec[m,z] where 
t_leq[z,t])
                                       -sum(z, StartExec[n,z-1] where 
t_leq[z,t])) =
                                     sum(s, ArgPos[m,n,s,t]+ArgMig[m,n,t]);


/* Argument muss sein Leben auf der erzeugenden Site starten */

constraint arg_start_site_1[Microframes, Microframes, Sites, Time];

arg_start_site_1[m,n,s,t] where DEP[m,n]=1 := ArgPos[m,n,s,t] <= 
                             Pos[m,s,t] + (1-EndExec[m,t]);


constraint arg_start_site_2[Microframes, Microframes, Sites, Time];

arg_start_site_2[m,n,s,t] where DEP[m,n]=1 := ArgPos[m,n,s,t] >= 
                             Pos[m,s,t] - (1-EndExec[m,t]);



/* Argument muss sein Leben auf der konsumierenden Site beenden */

constraint arg_end_site_1[Microframes, Microframes, Sites, Time];

arg_end_site_1[m,n,s,t] where DEP[m,n]=1 := ArgPos[m,n,s,t] <=
                           Pos[n,s,t] + (1-StartExec[n,t]);



constraint arg_end_site_2[Microframes, Microframes, Sites, Time];

arg_end_site_2[m,n,s,t] where DEP[m,n]=1 := ArgPos[m,n,s,t] >=
                           Pos[n,s,t] - (1-StartExec[n,t]);






/*-----------------------------------------------------------------*/
/* Migration von Argumenten                                        */
/*-----------------------------------------------------------------*/

constraint arg_mig_neg[Microframes, Microframes, Sites, Time];

/*
arg_mig_neg[m,n,s,t] where DEP[m,n]=1 := sum((r,z), ArgPos[m,n,r,z] 
                          where (t_ord[t]-NL[r,s]-t_ord[z] <= 0 and 
t_ord[t]-1-t_ord[z]>=0))
                        <= (1-ArgPos[m,n,s,t])*S*T;
*/

arg_mig_neg[m,n,s,t] where DEP[m,n]=1 := sum((r,z), ArgPos[m,n,r,z] 
                          where (t_ord[t]-NL[r,s]-t_ord[z] <= 0 and 
t_ord[t]-1-t_ord[z]>=0))
                        - (1-ArgPos[m,n,s,t])*S*T -1 <= -1;


/*
display (arg_end_site_1[m,n,s,t]), (arg_mig_neg[m,n,s,t]);
*/

constraint arg_mig_pos_1[Microframes, Microframes, Sites, Time];

arg_mig_pos_1[m,n,s,t] where DEP[m,n]=1 := sum((r,z), ArgPos[m,n,r,z] where 
t_NL_1[t,z,r,s]) + 
                            EndExec[m,t] >=
                          ArgPos[m,n,s,t];


constraint arg_mig_pos_2[Microframes, Microframes, Sites, Time];

arg_mig_pos_2[m,n,s,t] where DEP[m,n]=1 := sum((r,z), ArgPos[m,n,r,z] where 
t_NL_1[t,z,r,s]) +
                            EndExec[m,t] <=
                          S - (S-1)*ArgPos[m,n,s,t];




/*-----------------------------------------------------------------*/
/* Das Optimierungsziel                                            */
/*-----------------------------------------------------------------*/


constraint execution_time;

execution_time := sum((m,t), t_ord[t]*EndExec[m,t] where NOBODY_DEPENDS_ON[m]);



minimize execution_time;




/*-----------------------------------------------------------------*/
/* Fixierung von Variablen zu Test-Zwecken                         */
/*-----------------------------------------------------------------*/

ExecSite.fx[#m1, #s1] := 1;
ExecSite.fx[#m1, #s2] := 0;

ExecSite.fx[#m2, #s2] := 1;
ExecSite.fx[#m2, #s1] := 0;

ExecSite.fx[#m3, #s1] := 1;
ExecSite.fx[#m3, #s2] := 0;

ExecSite.fx[#m4, #s1] := 1;
ExecSite.fx[#m4, #s2] := 0;


StartExec.fx[#m1, #t01] := 1;
StartExec.fx[#m1, #t02] := 0;
StartExec.fx[#m1, #t03] := 0;
StartExec.fx[#m1, #t04] := 0;
StartExec.fx[#m1, #t05] := 0;
StartExec.fx[#m1, #t06] := 0;
StartExec.fx[#m1, #t07] := 0;
StartExec.fx[#m1, #t08] := 0;
StartExec.fx[#m1, #t09] := 0;
StartExec.fx[#m1, #t10] := 0;
StartExec.fx[#m1, #t11] := 0;
StartExec.fx[#m1, #t12] := 0;
StartExec.fx[#m1, #t13] := 0;
StartExec.fx[#m1, #t14] := 0;
StartExec.fx[#m1, #t15] := 0;

StartExec.fx[#m2, #t05] := 1;
StartExec.fx[#m2, #t01] := 0;
StartExec.fx[#m2, #t02] := 0;
StartExec.fx[#m2, #t03] := 0;
StartExec.fx[#m2, #t04] := 0;
StartExec.fx[#m2, #t06] := 0;
StartExec.fx[#m2, #t07] := 0;
StartExec.fx[#m2, #t08] := 0;
StartExec.fx[#m2, #t09] := 0;
StartExec.fx[#m2, #t10] := 0;
StartExec.fx[#m2, #t11] := 0;
StartExec.fx[#m2, #t12] := 0;
StartExec.fx[#m2, #t13] := 0;
StartExec.fx[#m2, #t14] := 0;
StartExec.fx[#m2, #t15] := 0;

StartExec.fx[#m3, #t04] := 1;
StartExec.fx[#m3, #t01] := 0;
StartExec.fx[#m3, #t02] := 0;
StartExec.fx[#m3, #t03] := 0;
StartExec.fx[#m3, #t05] := 0;
StartExec.fx[#m3, #t06] := 0;
StartExec.fx[#m3, #t07] := 0;
StartExec.fx[#m3, #t08] := 0;
StartExec.fx[#m3, #t09] := 0;
StartExec.fx[#m3, #t10] := 0;
StartExec.fx[#m3, #t11] := 0;
StartExec.fx[#m3, #t12] := 0;
StartExec.fx[#m3, #t13] := 0;
StartExec.fx[#m3, #t14] := 0;
StartExec.fx[#m3, #t15] := 0;

StartExec.fx[#m4, #t09] := 1;
StartExec.fx[#m4, #t01] := 0;
StartExec.fx[#m4, #t02] := 0;
StartExec.fx[#m4, #t03] := 0;
StartExec.fx[#m4, #t04] := 0;
StartExec.fx[#m4, #t05] := 0;
StartExec.fx[#m4, #t06] := 0;
StartExec.fx[#m4, #t07] := 0;
StartExec.fx[#m4, #t08] := 0;
StartExec.fx[#m4, #t10] := 0;
StartExec.fx[#m4, #t11] := 0;
StartExec.fx[#m4, #t12] := 0;
StartExec.fx[#m4, #t13] := 0;
StartExec.fx[#m4, #t14] := 0;
StartExec.fx[#m4, #t15] := 0;


EndExec.fx[#m1, #t03] := 1;
EndExec.fx[#m1, #t01] := 0;
EndExec.fx[#m1, #t02] := 0;
EndExec.fx[#m1, #t04] := 0;
EndExec.fx[#m1, #t05] := 0;
EndExec.fx[#m1, #t06] := 0;
EndExec.fx[#m1, #t07] := 0;
EndExec.fx[#m1, #t08] := 0;
EndExec.fx[#m1, #t09] := 0;
EndExec.fx[#m1, #t10] := 0;
EndExec.fx[#m1, #t11] := 0;
EndExec.fx[#m1, #t12] := 0;
EndExec.fx[#m1, #t13] := 0;
EndExec.fx[#m1, #t14] := 0;
EndExec.fx[#m1, #t15] := 0;

EndExec.fx[#m2, #t07] := 1;
EndExec.fx[#m2, #t01] := 0;
EndExec.fx[#m2, #t02] := 0;
EndExec.fx[#m2, #t03] := 0;
EndExec.fx[#m2, #t04] := 0;
EndExec.fx[#m2, #t05] := 0;
EndExec.fx[#m2, #t06] := 0;
EndExec.fx[#m2, #t08] := 0;
EndExec.fx[#m2, #t09] := 0;
EndExec.fx[#m2, #t10] := 0;
EndExec.fx[#m2, #t11] := 0;
EndExec.fx[#m2, #t12] := 0;
EndExec.fx[#m2, #t13] := 0;
EndExec.fx[#m2, #t14] := 0;
EndExec.fx[#m2, #t15] := 0;

EndExec.fx[#m3, #t08] := 1;
EndExec.fx[#m3, #t01] := 0;
EndExec.fx[#m3, #t02] := 0;
EndExec.fx[#m3, #t03] := 0;
EndExec.fx[#m3, #t04] := 0;
EndExec.fx[#m3, #t05] := 0;
EndExec.fx[#m3, #t06] := 0;
EndExec.fx[#m3, #t07] := 0;
EndExec.fx[#m3, #t09] := 0;
EndExec.fx[#m3, #t10] := 0;
EndExec.fx[#m3, #t11] := 0;
EndExec.fx[#m3, #t12] := 0;
EndExec.fx[#m3, #t13] := 0;
EndExec.fx[#m3, #t14] := 0;
EndExec.fx[#m3, #t15] := 0;

EndExec.fx[#m4, #t11] := 1;
EndExec.fx[#m4, #t01] := 0;
EndExec.fx[#m4, #t02] := 0;
EndExec.fx[#m4, #t03] := 0;
EndExec.fx[#m4, #t04] := 0;
EndExec.fx[#m4, #t05] := 0;
EndExec.fx[#m4, #t06] := 0;
EndExec.fx[#m4, #t07] := 0;
EndExec.fx[#m4, #t08] := 0;
EndExec.fx[#m4, #t09] := 0;
EndExec.fx[#m4, #t10] := 0;
EndExec.fx[#m4, #t12] := 0;
EndExec.fx[#m4, #t13] := 0;
EndExec.fx[#m4, #t14] := 0;
EndExec.fx[#m4, #t15] := 0;


Exec.fx[#m1, #s1, #t01] := 1;
Exec.fx[#m1, #s1, #t02] := 1;
Exec.fx[#m1, #s1, #t03] := 1;
Exec.fx[#m1, #s1, #t04] := 0;
Exec.fx[#m1, #s1, #t05] := 0;
Exec.fx[#m1, #s1, #t06] := 0;
Exec.fx[#m1, #s1, #t07] := 0;
Exec.fx[#m1, #s1, #t08] := 0;
Exec.fx[#m1, #s1, #t09] := 0;
Exec.fx[#m1, #s1, #t10] := 0;
Exec.fx[#m1, #s1, #t11] := 0;
Exec.fx[#m1, #s1, #t12] := 0;
Exec.fx[#m1, #s1, #t13] := 0;
Exec.fx[#m1, #s1, #t14] := 0;
Exec.fx[#m1, #s1, #t15] := 0;

Exec.fx[#m1, #s2, t] := 0;


Exec.fx[#m2, #s2, #t01] := 0;
Exec.fx[#m2, #s2, #t02] := 0;
Exec.fx[#m2, #s2, #t03] := 0;
Exec.fx[#m2, #s2, #t04] := 0;
Exec.fx[#m2, #s2, #t05] := 1;
Exec.fx[#m2, #s2, #t06] := 1;
Exec.fx[#m2, #s2, #t07] := 1;
Exec.fx[#m2, #s2, #t08] := 0;
Exec.fx[#m2, #s2, #t09] := 0;
Exec.fx[#m2, #s2, #t10] := 0;
Exec.fx[#m2, #s2, #t11] := 0;
Exec.fx[#m2, #s2, #t12] := 0;
Exec.fx[#m2, #s2, #t13] := 0;
Exec.fx[#m2, #s2, #t14] := 0;
Exec.fx[#m2, #s2, #t15] := 0;

Exec.fx[#m2, #s1, t] := 0;


Exec.fx[#m3, #s1, #t01] := 0;
Exec.fx[#m3, #s1, #t02] := 0;
Exec.fx[#m3, #s1, #t03] := 0;
Exec.fx[#m3, #s1, #t04] := 1;
Exec.fx[#m3, #s1, #t05] := 1;
Exec.fx[#m3, #s1, #t06] := 1;
Exec.fx[#m3, #s1, #t07] := 1;
Exec.fx[#m3, #s1, #t08] := 1;
Exec.fx[#m3, #s1, #t09] := 0;
Exec.fx[#m3, #s1, #t10] := 0;
Exec.fx[#m3, #s1, #t11] := 0;
Exec.fx[#m3, #s1, #t12] := 0;
Exec.fx[#m3, #s1, #t13] := 0;
Exec.fx[#m3, #s1, #t14] := 0;
Exec.fx[#m3, #s1, #t15] := 0;

Exec.fx[#m3, #s2, t] := 0;


Exec.fx[#m4, #s1, #t01] := 0;
Exec.fx[#m4, #s1, #t02] := 0;
Exec.fx[#m4, #s1, #t03] := 0;
Exec.fx[#m4, #s1, #t04] := 0;
Exec.fx[#m4, #s1, #t05] := 0;
Exec.fx[#m4, #s1, #t06] := 0;
Exec.fx[#m4, #s1, #t07] := 0;
Exec.fx[#m4, #s1, #t08] := 0;
Exec.fx[#m4, #s1, #t09] := 1;
Exec.fx[#m4, #s1, #t10] := 1;
Exec.fx[#m4, #s1, #t11] := 1;
Exec.fx[#m4, #s1, #t12] := 0;
Exec.fx[#m4, #s1, #t13] := 0;
Exec.fx[#m4, #s1, #t14] := 0;
Exec.fx[#m4, #s1, #t15] := 0;

Exec.fx[#m4, #s2, t] := 0;


Pos.fx[#m1, #s1, #t01] := 1;
Pos.fx[#m1, #s1, #t02] := 1;
Pos.fx[#m1, #s1, #t03] := 1;
Pos.fx[#m1, #s1, #t04] := 0;
Pos.fx[#m1, #s1, #t05] := 0;
Pos.fx[#m1, #s1, #t06] := 0;
Pos.fx[#m1, #s1, #t07] := 0;
Pos.fx[#m1, #s1, #t08] := 0;
Pos.fx[#m1, #s1, #t09] := 0;
Pos.fx[#m1, #s1, #t10] := 0;
Pos.fx[#m1, #s1, #t11] := 0;
Pos.fx[#m1, #s1, #t12] := 0;
Pos.fx[#m1, #s1, #t13] := 0;
Pos.fx[#m1, #s1, #t14] := 0;
Pos.fx[#m1, #s1, #t15] := 0;

Pos.fx[#m1, #s2, t] := 0;

Mig.fx[#m1, t] := 0;


Pos.fx[#m2, #s1, #t01] := 0;
Pos.fx[#m2, #s1, #t02] := 0;
Pos.fx[#m2, #s1, #t03] := 1;
Pos.fx[#m2, #s1, #t04] := 0;
Pos.fx[#m2, #s1, #t05] := 0;
Pos.fx[#m2, #s1, #t06] := 0;
Pos.fx[#m2, #s1, #t07] := 0;
Pos.fx[#m2, #s1, #t08] := 0;
Pos.fx[#m2, #s1, #t09] := 0;
Pos.fx[#m2, #s1, #t10] := 0;
Pos.fx[#m2, #s1, #t11] := 0;
Pos.fx[#m2, #s1, #t12] := 0;
Pos.fx[#m2, #s1, #t13] := 0;
Pos.fx[#m2, #s1, #t14] := 0;
Pos.fx[#m2, #s1, #t15] := 0;

Pos.fx[#m2, #s2, #t01] := 0;
Pos.fx[#m2, #s2, #t02] := 0;
Pos.fx[#m2, #s2, #t03] := 0;
Pos.fx[#m2, #s2, #t04] := 0;
Pos.fx[#m2, #s2, #t05] := 1;
Pos.fx[#m2, #s2, #t06] := 1;
Pos.fx[#m2, #s2, #t07] := 1;
Pos.fx[#m2, #s2, #t08] := 0;
Pos.fx[#m2, #s2, #t09] := 0;
Pos.fx[#m2, #s2, #t10] := 0;
Pos.fx[#m2, #s2, #t11] := 0;
Pos.fx[#m2, #s2, #t12] := 0;
Pos.fx[#m2, #s2, #t13] := 0;
Pos.fx[#m2, #s2, #t14] := 0;
Pos.fx[#m2, #s2, #t15] := 0;

Mig.fx[#m2, #t01] := 0;
Mig.fx[#m2, #t02] := 0;
Mig.fx[#m2, #t03] := 0;
Mig.fx[#m2, #t04] := 1;
Mig.fx[#m2, #t05] := 0;
Mig.fx[#m2, #t06] := 0;
Mig.fx[#m2, #t07] := 0;
Mig.fx[#m2, #t08] := 0;
Mig.fx[#m2, #t09] := 0;
Mig.fx[#m2, #t10] := 0;
Mig.fx[#m2, #t11] := 0;
Mig.fx[#m2, #t12] := 0;
Mig.fx[#m2, #t13] := 0;
Mig.fx[#m2, #t14] := 0;
Mig.fx[#m2, #t15] := 0;


Pos.fx[#m3, #s1, #t01] := 0;
Pos.fx[#m3, #s1, #t02] := 0;
Pos.fx[#m3, #s1, #t03] := 1;
Pos.fx[#m3, #s1, #t04] := 1;
Pos.fx[#m3, #s1, #t05] := 1;
Pos.fx[#m3, #s1, #t06] := 1;
Pos.fx[#m3, #s1, #t07] := 1;
Pos.fx[#m3, #s1, #t08] := 1;
Pos.fx[#m3, #s1, #t09] := 0;
Pos.fx[#m3, #s1, #t10] := 0;
Pos.fx[#m3, #s1, #t11] := 0;
Pos.fx[#m3, #s1, #t12] := 0;
Pos.fx[#m3, #s1, #t13] := 0;
Pos.fx[#m3, #s1, #t14] := 0;
Pos.fx[#m3, #s1, #t15] := 0;

Pos.fx[#m3, #s2, t] := 0;

Mig.fx[#m3, t] := 0;


Pos.fx[#m4, #s1, #t01] := 0;
Pos.fx[#m4, #s1, #t02] := 0;
Pos.fx[#m4, #s1, #t03] := 1;
Pos.fx[#m4, #s1, #t04] := 1;
Pos.fx[#m4, #s1, #t05] := 1;
Pos.fx[#m4, #s1, #t06] := 1;
Pos.fx[#m4, #s1, #t07] := 1;
Pos.fx[#m4, #s1, #t08] := 1;
Pos.fx[#m4, #s1, #t09] := 1;
Pos.fx[#m4, #s1, #t10] := 1;
Pos.fx[#m4, #s1, #t11] := 1;
Pos.fx[#m4, #s1, #t12] := 0;
Pos.fx[#m4, #s1, #t13] := 0;
Pos.fx[#m4, #s1, #t14] := 0;
Pos.fx[#m4, #s1, #t15] := 0;

Pos.fx[#m4, #s2, t] := 0;

Mig.fx[#m4, t] := 0;



ArgPos.fx[#m1, #m2, #s1, #t01] := 0;
ArgPos.fx[#m1, #m2, #s1, #t02] := 0;
ArgPos.fx[#m1, #m2, #s1, #t03] := 1;
ArgPos.fx[#m1, #m2, #s1, #t04] := 0;
ArgPos.fx[#m1, #m2, #s1, #t05] := 0;
ArgPos.fx[#m1, #m2, #s1, #t06] := 0;
ArgPos.fx[#m1, #m2, #s1, #t07] := 0;
ArgPos.fx[#m1, #m2, #s1, #t08] := 0;
ArgPos.fx[#m1, #m2, #s1, #t09] := 0;
ArgPos.fx[#m1, #m2, #s1, #t10] := 0;
ArgPos.fx[#m1, #m2, #s1, #t11] := 0;
ArgPos.fx[#m1, #m2, #s1, #t12] := 0;
ArgPos.fx[#m1, #m2, #s1, #t13] := 0;
ArgPos.fx[#m1, #m2, #s1, #t14] := 0;
ArgPos.fx[#m1, #m2, #s1, #t15] := 0;

ArgPos.fx[#m1, #m2, #s2, #t01] := 0;
ArgPos.fx[#m1, #m2, #s2, #t02] := 0;
ArgPos.fx[#m1, #m2, #s2, #t03] := 0;
ArgPos.fx[#m1, #m2, #s2, #t04] := 0;
ArgPos.fx[#m1, #m2, #s2, #t05] := 1;
ArgPos.fx[#m1, #m2, #s2, #t06] := 0;
ArgPos.fx[#m1, #m2, #s2, #t07] := 0;
ArgPos.fx[#m1, #m2, #s2, #t08] := 0;
ArgPos.fx[#m1, #m2, #s2, #t09] := 0;
ArgPos.fx[#m1, #m2, #s2, #t10] := 0;
ArgPos.fx[#m1, #m2, #s2, #t11] := 0;
ArgPos.fx[#m1, #m2, #s2, #t12] := 0;
ArgPos.fx[#m1, #m2, #s2, #t13] := 0;
ArgPos.fx[#m1, #m2, #s2, #t14] := 0;
ArgPos.fx[#m1, #m2, #s2, #t15] := 0;

ArgMig.fx[#m1, #m2, #t01] := 0;
ArgMig.fx[#m1, #m2, #t02] := 0;
ArgMig.fx[#m1, #m2, #t03] := 0;
ArgMig.fx[#m1, #m2, #t04] := 1;
ArgMig.fx[#m1, #m2, #t05] := 0;
ArgMig.fx[#m1, #m2, #t06] := 0;
ArgMig.fx[#m1, #m2, #t07] := 0;
ArgMig.fx[#m1, #m2, #t08] := 0;
ArgMig.fx[#m1, #m2, #t09] := 0;
ArgMig.fx[#m1, #m2, #t10] := 0;
ArgMig.fx[#m1, #m2, #t11] := 0;
ArgMig.fx[#m1, #m2, #t12] := 0;
ArgMig.fx[#m1, #m2, #t13] := 0;
ArgMig.fx[#m1, #m2, #t14] := 0;
ArgMig.fx[#m1, #m2, #t15] := 0;


ArgPos.fx[#m1, #m3, #s1, #t01] := 0;
ArgPos.fx[#m1, #m3, #s1, #t02] := 0;
ArgPos.fx[#m1, #m3, #s1, #t03] := 1;
ArgPos.fx[#m1, #m3, #s1, #t04] := 1;
ArgPos.fx[#m1, #m3, #s1, #t05] := 0;
ArgPos.fx[#m1, #m3, #s1, #t06] := 0;
ArgPos.fx[#m1, #m3, #s1, #t07] := 0;
ArgPos.fx[#m1, #m3, #s1, #t08] := 0;
ArgPos.fx[#m1, #m3, #s1, #t09] := 0;
ArgPos.fx[#m1, #m3, #s1, #t10] := 0;
ArgPos.fx[#m1, #m3, #s1, #t11] := 0;
ArgPos.fx[#m1, #m3, #s1, #t12] := 0;
ArgPos.fx[#m1, #m3, #s1, #t13] := 0;
ArgPos.fx[#m1, #m3, #s1, #t14] := 0;
ArgPos.fx[#m1, #m3, #s1, #t15] := 0;

ArgPos.fx[#m1, #m3, #s2, t] := 0;

ArgMig.fx[#m1, #m3, t] := 0;


ArgPos.fx[#m1, #m4, #s1, #t01] := 0;
ArgPos.fx[#m1, #m4, #s1, #t02] := 0;
ArgPos.fx[#m1, #m4, #s1, #t03] := 1;
ArgPos.fx[#m1, #m4, #s1, #t04] := 1;
ArgPos.fx[#m1, #m4, #s1, #t05] := 1;
ArgPos.fx[#m1, #m4, #s1, #t06] := 1;
ArgPos.fx[#m1, #m4, #s1, #t07] := 1;
ArgPos.fx[#m1, #m4, #s1, #t08] := 1;
ArgPos.fx[#m1, #m4, #s1, #t09] := 1;
ArgPos.fx[#m1, #m4, #s1, #t10] := 0;
ArgPos.fx[#m1, #m4, #s1, #t11] := 0;
ArgPos.fx[#m1, #m4, #s1, #t12] := 0;
ArgPos.fx[#m1, #m4, #s1, #t13] := 0;
ArgPos.fx[#m1, #m4, #s1, #t14] := 0;
ArgPos.fx[#m1, #m4, #s1, #t15] := 0;

ArgPos.fx[#m1, #m4, #s2, t] := 0;

ArgMig.fx[#m1, #m4, t] := 0;


ArgPos.fx[#m2, #m4, #s1, #t01] := 0;
ArgPos.fx[#m2, #m4, #s1, #t02] := 0;
ArgPos.fx[#m2, #m4, #s1, #t03] := 0;
ArgPos.fx[#m2, #m4, #s1, #t04] := 0;
ArgPos.fx[#m2, #m4, #s1, #t05] := 0;
ArgPos.fx[#m2, #m4, #s1, #t06] := 0;
ArgPos.fx[#m2, #m4, #s1, #t07] := 0;
ArgPos.fx[#m2, #m4, #s1, #t08] := 0;
ArgPos.fx[#m2, #m4, #s1, #t09] := 1;
ArgPos.fx[#m2, #m4, #s1, #t10] := 0;
ArgPos.fx[#m2, #m4, #s1, #t11] := 0;
ArgPos.fx[#m2, #m4, #s1, #t12] := 0;
ArgPos.fx[#m2, #m4, #s1, #t13] := 0;
ArgPos.fx[#m2, #m4, #s1, #t14] := 0;
ArgPos.fx[#m2, #m4, #s1, #t15] := 0;

ArgPos.fx[#m2, #m4, #s2, #t01] := 0;
ArgPos.fx[#m2, #m4, #s2, #t02] := 0;
ArgPos.fx[#m2, #m4, #s2, #t03] := 0;
ArgPos.fx[#m2, #m4, #s2, #t04] := 0;
ArgPos.fx[#m2, #m4, #s2, #t05] := 0;
ArgPos.fx[#m2, #m4, #s2, #t06] := 0;
ArgPos.fx[#m2, #m4, #s2, #t07] := 1;
ArgPos.fx[#m2, #m4, #s2, #t08] := 0;
ArgPos.fx[#m2, #m4, #s2, #t09] := 0;
ArgPos.fx[#m2, #m4, #s2, #t10] := 0;
ArgPos.fx[#m2, #m4, #s2, #t11] := 0;
ArgPos.fx[#m2, #m4, #s2, #t12] := 0;
ArgPos.fx[#m2, #m4, #s2, #t13] := 0;
ArgPos.fx[#m2, #m4, #s2, #t14] := 0;
ArgPos.fx[#m2, #m4, #s2, #t15] := 0;

ArgMig.fx[#m2, #m4, #t01] := 0;
ArgMig.fx[#m2, #m4, #t02] := 0;
ArgMig.fx[#m2, #m4, #t03] := 0;
ArgMig.fx[#m2, #m4, #t04] := 0;
ArgMig.fx[#m2, #m4, #t05] := 0;
ArgMig.fx[#m2, #m4, #t06] := 0;
ArgMig.fx[#m2, #m4, #t07] := 0;
ArgMig.fx[#m2, #m4, #t08] := 1;
ArgMig.fx[#m2, #m4, #t09] := 0;
ArgMig.fx[#m2, #m4, #t10] := 0;
ArgMig.fx[#m2, #m4, #t11] := 0;
ArgMig.fx[#m2, #m4, #t12] := 0;
ArgMig.fx[#m2, #m4, #t13] := 0;
ArgMig.fx[#m2, #m4, #t14] := 0;
ArgMig.fx[#m2, #m4, #t15] := 0;


ArgPos.fx[#m3, #m4, #s1, #t01] := 0;
ArgPos.fx[#m3, #m4, #s1, #t02] := 0;
ArgPos.fx[#m3, #m4, #s1, #t03] := 0;
ArgPos.fx[#m3, #m4, #s1, #t04] := 0;
ArgPos.fx[#m3, #m4, #s1, #t05] := 0;
ArgPos.fx[#m3, #m4, #s1, #t06] := 0;
ArgPos.fx[#m3, #m4, #s1, #t07] := 0;
ArgPos.fx[#m3, #m4, #s1, #t08] := 1;
ArgPos.fx[#m3, #m4, #s1, #t09] := 1;
ArgPos.fx[#m3, #m4, #s1, #t10] := 0;
ArgPos.fx[#m3, #m4, #s1, #t11] := 0;
ArgPos.fx[#m3, #m4, #s1, #t12] := 0;
ArgPos.fx[#m3, #m4, #s1, #t13] := 0;
ArgPos.fx[#m3, #m4, #s1, #t14] := 0;
ArgPos.fx[#m3, #m4, #s1, #t15] := 0;

ArgPos.fx[#m3, #m4, #s2, t] := 0;

ArgMig.fx[#m3, #m4, t] := 0;


/*
Pos.fx[#m1,#s1,#t01] := 1;
Pos.fx[#m1,#s1,#t02] := 1;

Exec.fx[#m1,#s1,#t01] := 1;
Exec.fx[#m1,#s1,#t02] := 1;

StartExec.fx[#m1,#t01] := 1;
EndExec.fx[#m1,#t02] := 1;


Pos.fx[#m2,#s1,#t01] := 1;
Pos.fx[#m2,#s1,#t01] := 1;
Pos.fx[#m2,#s1,#t03] := 1;
Pos.fx[#m2,#s1,#t04] := 1;

Exec.fx[#m2,#s1,#t01] := 0;
Exec.fx[#m2,#s1,#t03] := 1;
Exec.fx[#m2,#s1,#t04] := 1;

StartExec.fx[#m2,#t03] := 1;
EndExec.fx[#m2,#t04] := 1;

ArgPos.fx[#m1,#m2,#s1,#t02] := 1;
ArgPos.fx[#m1,#m2,#s1,#t03] := 1;

ArgMig.fx[#m1,#m2,#t02] := 0;
ArgMig.fx[#m1,#m2,#t03] := 0;
*/


/*

StartExec.fx[#m1,#t01] := 1;
StartExec.fx[#m1,#t02] := 0;
StartExec.fx[#m1,#t03] := 0;
StartExec.fx[#m1,#t04] := 0;
StartExec.fx[#m1,#t05] := 0;

EndExec.fx[#m1,#t01] := 0;
EndExec.fx[#m1,#t02] := 1;
EndExec.fx[#m1,#t03] := 0;
EndExec.fx[#m1,#t04] := 0;
EndExec.fx[#m1,#t05] := 0;

Exec.fx[#m1,#s1,#t01] := 1;
Exec.fx[#m1,#s1,#t02] := 1;
Exec.fx[#m1,#s1,#t03] := 0;
Exec.fx[#m1,#s1,#t04] := 0;
Exec.fx[#m1,#s1,#t05] := 0;

ExecSite.fx[#m1,#s1] := 1;

Mig.fx[#m1,#t01] := 0;
Mig.fx[#m1,#t02] := 0;
Mig.fx[#m1,#t03] := 0;
Mig.fx[#m1,#t04] := 0;
Mig.fx[#m1,#t05] := 0;

Pos.fx[#m1,#s1,#t02] := 1;

*/



end;
--- source/glplpx8a.c.orig      Fri Mar 21 10:57:58 2003
+++ source/glplpx8a.c   Fri Mar 21 10:21:25 2003
@@ -1080,14 +1080,14 @@
       /* main sheet */
       for (what = 1; what <= 2; what++)
       {  int mn, ij;
          fprintf(fp, "\n");
          fprintf(fp, "   No. %-12s St   Activity     Lower bound   Uppe"
-            "r bound    Marginal\n",
+            "r bound    Marginal     Failure\n",
             what == 1 ? "  Row name" : "Column name");
          fprintf(fp, "------ ------------ -- ------------- ------------"
-            "- ------------- -------------\n");
+            "- ------------- ------------- ---------\n");
          mn = (what == 1 ? lpx_get_num_rows(lp) : lpx_get_num_cols(lp));
          for (ij = 1; ij <= mn; ij++)
          {  char *name;
             int typx, tagx;
             double lb, ub, vx, dx;
@@ -1140,10 +1140,20 @@
             {  if (dx == 0.0)
                   fprintf(fp, "%13s", "< eps");
                else
                   fprintf(fp, "%13.6g", dx);
             }
+            else
+               fprintf(fp, "             ");
+                                               /* failure of dependencies */
+                                               if (typx == LPX_LO && (vx < lb))
+                                                       fprintf(fp, "     lb");
+                                               else if (typx == LPX_DB && (vx 
> ub))
+                                                       fprintf(fp, "     ub");
+                                               else if (typx == LPX_FX && (vx 
!= lb))
+                                                       fprintf(fp, "     fx: 
vx=%e, lb=%e", vx, lb);
+//                                                     fprintf(fp, "     fx");
             /* end of line */
             fprintf(fp, "\n");
          }
       }
       fprintf(fp, "\n");

reply via email to

[Prev in Thread] Current Thread [Next in Thread]