%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  clp(q,r)                                         version 1.3.2 %
%                                                                 %
%  (c) Copyright 1992,1993,1994,1995                              %
%  Austrian Research Institute for Artificial Intelligence (OFAI) %
%  Schottengasse 3                                                %
%  A-1010 Vienna, Austria                                         %
%                                                                 %
%  File:   simplex.pl                                             %
%  Author: Christian Holzbaur           christian@ai.univie.ac.at %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% b152 p.32	40/160/17200
example( 1, [X1,X2], Z) :-
  {
    X1=<50,
    X2=<200,
    X1+0.2*X2=<72,
    150*X1+25*X2=<10000,
    Z = 250*X1+45*X2
  },
  maximize(Z).

% p.33	       1/0/1.5/7
example( 2,[X1,X2,X3], Z) :-
  {
    X1=<2,
    X1+X2+2*X3=<4,
    3*X2+4*X3=<6,
    X1>=0,
    X2>=0,
    X3>=0,
    Z = X1+2*X2+4*X3
  },
  maximize(Z).

% p.38		38/170/18850
example( 3, [X1,X2], Z) :-
  {
    X1=<50,
    X2=<200,
    X1+0.2*X2=<72,
    150*X1+25*X2=<10000,
    10*X1+X2>=550,
    Z = 250*X1+55*X2
  },
  maximize(Z).

% 7/2/310
example( 4, [X,Y], Z) :-
  {
    2*X+Y =< 16,
    X+2*Y =< 11,
    X+3*Y =< 15,
    Z = 30*X+50*Y
  },
  maximize(Z).

% b30313 p.315	 0/0/2.5/5
example( 5, [X,Y,Z], Min) :-
  {
    X+3*Y+2*Z >= 5,
    2*X+2*Y+Z >= 2,
    4*X-2*Y+3*Z >= -1,
    X >= 0,
    Y >= 0,
    Z >= 0,
    Min = 6*X+5*Y+2*Z
  },
  minimize(Min).

% -7
example( 6, [X1,X2,X3], Min) :-
 {
  X1=<2,
  X1+X2+2*X3=<4,
  3*X2+4*X3=<6,
  X1>=0,
  X2>=0,
  X3>=0,
  Min = -X1-2*X2-4*X3
 },
 minimize( Min).

% -70
example( 7, [X1,X2,X3,X4,X5,X6,X7], Min) :-
 {
  X1 +	   X3 - X4 +   X5 + 2*X6 +   X7 =< 6,
       X2     + X4 - 2*X5 +   X6 - 2*X7 =< 4,
	   X3 - X4	  + 2*X6 +   X7 =< 1,

  0 =< X1, X1 =<  6,
  0 =< X2, X2 =<  6,
  0 =< X3,
  0 =< X4, X4 =<  4,
  0 =< X5, X5 =<  2,
  0 =< X6, X6 =< 10,
  0 =< X7,
  Min = -3*X1 + 4*X2 + 2*X3 - 2*X4 - 14*X5 + 11*X6 - 5*X7
 },
 minimize( Min).

% -39/2
example( 8, [X1,X2,X3,X4,X5,X6,X7], Min) :-
 {
  X1 +	   X3 - X4 +   X5 + 2*X6 +   X7 =< 6,
       X2     + X4 - 2*X5 +   X6 - 2*X7 =< 4,
	   X3 - X4	  + 2*X6 +   X7 =< 1,

  0 =< X1, X1 =<  6,
  0 =< X2, X2 =<  6,
  0 =< X3,
  0 =< X4, X4 =<  4,
  0 =< X5, X5 =<  2,
  0 =< X6, X6 =< 10,
  0 =< X7,
  Min = 3*X1 - 4*X2 - 2*X3 + 2*X4 + 14*X5 - 11*X6 + 5*X7
 },
 minimize( Min).

%
% min = 11429082625/9792 = 1167185.7255923203
%
example( 9, Vs, Obj) :-

 Vs = [ Anm1,Anm2,Anm3,Anm4,Anm5,Anm6,
	   Stm1,Stm2,Stm3,Stm4,Stm5,Stm6,
	   UE1,UE2,UE3,UE4,UE5,UE6
      ],

 allpos( Vs),
 {
   +1*Stm1  = 60,
   +0.9*Stm1 +1*Anm1 -1*Stm2  = 0,
   +0.9*Stm2 +1*Anm2 -1*Stm3  = 0,
   +0.9*Stm3 +1*Anm3 -1*Stm4  = 0,
   +0.9*Stm4 +1*Anm4 -1*Stm5  = 0,
   +0.9*Stm5 +1*Anm5 -1*Stm6  = 0,
   +150*Stm1 -100*Anm1 +1*UE1 >= 8000,
   +150*Stm2 -100*Anm2 +1*UE2 >= 9000,
   +150*Stm3 -100*Anm3 +1*UE3 >= 8000,
   +150*Stm4 -100*Anm4 +1*UE4 >= 10000,
   +150*Stm5 -100*Anm5 +1*UE5 >= 9000,
   +150*Stm6 -100*Anm6 +1*UE6 >= 12000,
   -20*Stm1 +1*UE1 =< 0,
   -20*Stm2 +1*UE2 =< 0,
   -20*Stm3 +1*UE3 =< 0,
   -20*Stm4 +1*UE4 =< 0,
   -20*Stm5 +1*UE5 =< 0,
   -20*Stm6 +1*UE6 =< 0,
     Anm1 =< 18,
     57 =< Stm2,
     Stm2 =< 75,
     Anm2 =< 18,
     57 =< Stm3,
     Stm3 =< 75,
     Anm3 =< 18,
     57 =< Stm4,
     Stm4 =< 75,
     Anm4 =< 18,
     57 =< Stm5,
     Stm5 =< 75,
     Anm5 =< 18,
     57 =< Stm6,
     Stm6 =< 75,
     Anm6 =< 18,

     Obj =  +2700*Stm1 +1500*Anm1 +30*UE1
	    +2700*Stm2 +1500*Anm2 +30*UE2
	    +2700*Stm3 +1500*Anm3 +30*UE3
	    +2700*Stm4 +1500*Anm4 +30*UE4
	    +2700*Stm5 +1500*Anm5 +30*UE5
	    +2700*Stm6 +1500*Anm6 +30*UE6
  },
  minimize( Obj).


% b20011, p144
%
example( utility, Vs, Min) :-

  Vs = [ X11, X12, X13, X14, X15,
	 X21, X22, X23, X24, X25,
	 Y11, Y12, Y13, Y14,
	 Y21, Y22, Y23, Y24, Y25,
	 Z11, Z12, Z13, Z14,
	 Z21, Z22, Z23, Z24, Z25],
  {
    X11 + X12 + X13 + X14 + X15 = 1000,
    X21 + X22 + X23 + X24 + X25 = 1000,

    3*X11 + 2*X21 - Y11 - Y14 - Z11 - Z14  =< 0,
   -3*X12 - 2*X22 + Y11 - Y12 + Z11 - Z12 = 0,
   -3*X13 - 2*X23 - Y13 + Y14 - Z13 + Z14 = 0,
   -3*X14 - 2*X24 + Y12 + Z12 = 0,
   -3*X15 - 2*X25 + Y13 + Z13 = 0,

    4*X11 + 5*X21 - Y21 - Z21 =< 0,
   -4*X12 - 5*X22 + Y22 + Z22 = 0,
   -4*X13 - 5*X23 + Y24 - Y25 + Z24 - Z25 = 0,
   -4*X14 - 5*X24 + Y21 - Y22 - Y23 + Y25
		  + Z21 - Z22 - Z23 + Z25 = 0,
   -4*X15 - 5*X25 + Y23 - Y24 + Z23 - Z24 = 0,

    7*X11 + 9*X21 >= 0,
    7*X12 + 9*X22 =< 3000,
    7*X13 + 9*X23 =< 200,
    7*X14 + 9*X24 =< 10000,
    7*X15 + 9*X25 =< 7000,

    Z11 =< 1000,
    Z12 =< 500,
    Z13 =< 2000,
    Z14 =< 100,
    Z21 =< 5000,
    Z22 =< 250,
    Z23 =< 600,
    Z24 =< 7000,
    Z25 =< 4000,

    X11 >= 0, X12 >= 0, X13 >= 0, X14 >= 0, X15 >= 0,
    X21 >= 0, X22 >= 0, X23 >= 0, X24 >= 0, X25 >= 0,

    Y11 >= 0, Y12 >= 0, Y13 >= 0, Y14 >= 0,
    Y21 >= 0, Y22 >= 0, Y23 >= 0, Y24 >= 0, Y25 >= 0,

    Z11 >= 0, Z12 >= 0, Z13 >= 0, Z14 >= 0,
    Z21 >= 0, Z22 >= 0, Z23 >= 0, Z24 >= 0, Z25 >= 0,

    M = 99999,
    Min = M*X11 + M*X21 + 3*Y11 + 7*Y12 + 9*Y13 + Y14 + 4*Y21 + 7*Y22 + 3*Y23 +
			  8*Y24 + 5*Y25
  },
  minimize(Min).

example( electricity, Vs, Min) :-

  Vs = [ X11, X12, X13, X14, X15,
	 X21, X22, X23, X24, X25,
	 Y11, Y12, Y13, Y14,
	 Z11, Z12, Z13, Z14],
  {
    X11 + X12 + X13 + X14 + X15 = 1000,
    X21 + X22 + X23 + X24 + X25 = 1000,

    3*X11 + 2*X21 - Y11 - Y14 - Z11 - Z14 =< 0,
   -3*X12 - 2*X22 + Y11 - Y12 + Z11 - Z12 = 0,
   -3*X13 - 2*X23 - Y13 + Y14 - Z13 + Z14 = 0,
   -3*X14 - 2*X24 + Y12 + Z12 = 0,
   -3*X15 - 2*X25 + Y13 + Z13 = 0,

    7*X11 + 9*X21 >= 0,
    7*X12 + 9*X22 =< 3000,
    7*X13 + 9*X23 =< 200,
    7*X14 + 9*X24 =< 10000,
    7*X15 + 9*X25 =< 7000,

    Z11 =< 1000,
    Z12 =< 500,
    Z13 =< 2000,
    Z14 =< 100,

    X11 >= 0, X12 >= 0, X13 >= 0, X14 >= 0, X15 >= 0,
    X21 >= 0, X22 >= 0, X23 >= 0, X24 >= 0, X25 >= 0,
    Y11 >= 0, Y12 >= 0, Y13 >= 0, Y14 >= 0,
    Z11 >= 0, Z12 >= 0, Z13 >= 0, Z14 >= 0,

    M = 99999,
    Min = M*X11 + M*X21 + 3*Y11 + 7*Y12 + 9*Y13 + Y14
  },
  minimize(Min).

example( water, Vs, Min) :-

  Vs = [ X11, X12, X13, X14, X15,
	 X21, X22, X23, X24, X25,
	 Y21, Y22, Y23, Y24, Y25,
	 Z21, Z22, Z23, Z24, Z25],
  {
    X11 + X12 + X13 + X14 + X15 = 1000,
    X21 + X22 + X23 + X24 + X25 = 1000,

    4*X11 + 5*X21 - Y21 - Z21 =< 0,
   -4*X12 - 5*X22 + Y22 + Z22 = 0,
   -4*X13 - 5*X23 + Y24 - Y25 + Z24 - Z25 = 0,
   -4*X14 - 5*X24 + Y21 - Y22 - Y23 + Y25
		  + Z21 - Z22 - Z23 + Z25 = 0,
   -4*X15 - 5*X25 + Y23 - Y24 + Z23 - Z24 = 0,

    7*X11 + 9*X21 >= 0,
    7*X12 + 9*X22 =< 3000,
    7*X13 + 9*X23 =< 200,
    7*X14 + 9*X24 =< 10000,
    7*X15 + 9*X25 =< 7000,

    Z21 =< 5000,
    Z22 =< 250,
    Z23 =< 600,
    Z24 =< 7000,
    Z25 =< 4000,

    X11 >= 0, X12 >= 0, X13 >= 0, X14 >= 0, X15 >= 0,
    X21 >= 0, X22 >= 0, X23 >= 0, X24 >= 0, X25 >= 0,

    Y21 >= 0, Y22 >= 0, Y23 >= 0, Y24 >= 0, Y25 >= 0,

    Z21 >= 0, Z22 >= 0, Z23 >= 0, Z24 >= 0, Z25 >= 0,

    M = 99999,
    Min = M*X11 + M*X21 + 4*Y21 + 7*Y22 + 3*Y23 +  8*Y24 + 5*Y25
  },
  minimize(Min).

allpos( []).
allpos( [V|Vs]) :-
  { V >= 0 },
  allpos( Vs).

% --------------------------------------------------------------------------

test(0) :- { A=<2,B=<3,C=<4,A+B+C=10 }. 	% must fail

test(5) :-
 {
  2*X1 + 4*X2 + 3*X3 - 4*W1 - 10*W2 =  0,
  2*X1 +   X2 +   X3		    =  4,
  5*X1 + 3*X2 + 2*X3		    = 10,
		       2*W1 +  5*W2 =< 2,
			 W1 +  3*W2 =< 4,
			 W1 +  2*W2 =< 3,
    X1 >= 0,
    X2 >= 0,
    X3 >= 0
 }.