[BACK]Return to ts_diclp.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Math_Lib / Supports

Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Supports/ts_diclp.adb, Revision 1.1.1.1

1.1       maekawa     1: with text_io,integer_io;                 use text_io,integer_io;
                      2: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
                      3: with Standard_Floating_Numbers_io;       use Standard_Floating_Numbers_io;
                      4: with Standard_Integer_Vectors;
                      5: with Standard_Floating_Vectors;          use Standard_Floating_Vectors;
                      6: with Standard_Floating_Matrices;         use Standard_Floating_Matrices;
                      7: with Dictionaries,Linear_Programming;    use Dictionaries,Linear_Programming;
                      8:
                      9: procedure ts_diclp is
                     10:
                     11: -- DESCRIPTION :
                     12: --   This procedure can be used for solving the primal problem:
                     13: --
                     14: --      max <c,x>
                     15: --          <a,x> <= 0
                     16: --
                     17: --   where x = (1,x1,x2,..,xn)
                     18: --
                     19: --   and for solving the dual problem :
                     20: --
                     21: --      min <c,x>
                     22: --          <a,x> >= 0
                     23: --
                     24: --   where x = (1,x1,x2,..,xn).
                     25:
                     26:
                     27:   n,m : natural;
                     28:   ans : character;
                     29:   eps : constant double_float := 10.0**(-12);
                     30:
                     31: -- OUTPUT ROUTINES :
                     32:
                     33:   procedure Write ( file : in file_type; dic : in Matrix;
                     34:                     in_bas,out_bas : in Standard_Integer_Vectors.Vector;
                     35:                     fo,af,ex : in natural ) is
                     36:
                     37:   -- DESCRIPTION :
                     38:   --   This procedure writes the dictionary on standard output or on file.
                     39:
                     40:   -- ON ENTRY :
                     41:   --   dic          matrix for the dictionary;
                     42:   --   in_bas       unknowns in the basis;
                     43:   --   out_bas      unknowns out the basis;
                     44:   --   fo           the number of decimal literals before the dot;
                     45:   --   af           the number of decimal literals after the dot;
                     46:   --   ex           the number of decimal literals in the exponent.
                     47:
                     48:   begin
                     49:     new_line(file);
                     50:     put_line(file,"*****  THE DICTIONARY  *****");
                     51:     new_line(file);
                     52:     put_line(file,"The elements in the basis : ");
                     53:     for i in in_bas'range loop
                     54:       put(file," "); put(file,in_bas(i),1);
                     55:     end loop;
                     56:     new_line(file);
                     57:     put_line(file,"The dictionary : ");
                     58:     for i in dic'range(1) loop
                     59:       for j in dic'range(2) loop
                     60:         put(file,dic(i,j), fore => fo, aft => af, exp => ex );
                     61:       end loop;
                     62:       new_line(file);
                     63:     end loop;
                     64:   end Write;
                     65:
                     66:   procedure Report ( dic : in Matrix;
                     67:                      in_bas,out_bas : in Standard_Integer_Vectors.Vector ) is
                     68:   begin
                     69:     Write(Standard_Output,dic,in_bas,out_bas,3,3,3);
                     70:   end Report;
                     71:
                     72:   procedure plp is new Generic_Primal_Simplex(Report);
                     73:   procedure dlp is new Generic_Dual_Simplex(Report);
                     74:
                     75: begin
                     76:
                     77: -- INPUT OF THE DATA :
                     78:
                     79:   put("Give the number of unknowns : "); get(n);
                     80:   put("Give the number of constraints : "); get(m);
                     81:
                     82:   declare
                     83:     c : Standard_Floating_Vectors.vector(0..n);
                     84:     a : matrix(1..m,0..n);
                     85:     dic : matrix(0..m,0..n);
                     86:     inbas : Standard_Integer_Vectors.Vector(1..m) := (1..m => 0);
                     87:     outbas : Standard_Integer_Vectors.Vector(1..n) := (1..n => 0);
                     88:     primsol : Standard_Floating_Vectors.Vector(1..n);
                     89:     dualsol : Standard_Floating_Vectors.Vector(1..m);
                     90:     nit : natural := 0;
                     91:     ok : boolean := false;
                     92:     feasibound : boolean;
                     93:   begin
                     94:
                     95:     put_line("Give the coefficients of the target :");
                     96:     for i in c'range loop
                     97:       get(c(i));
                     98:     end loop;
                     99:     put_line("Give the coefficients of the constraints :");
                    100:     for i in a'range(1) loop
                    101:       for j in a'range(2) loop
                    102:        get(a(i,j));
                    103:       end loop;
                    104:     end loop;
                    105:     loop
                    106:       put("Primal of Dual simplex problem ? (p/d) "); get(ans);
                    107:       if ans = 'p'
                    108:        then Dictionaries.Primal_Init(c,a,dic,inbas,outbas); ok := true;
                    109:        elsif ans = 'd'
                    110:           then Dictionaries.Dual_Init(c,a,dic,inbas,outbas); ok := true;
                    111:           else put_line("try again ...");  ok := false;
                    112:       end if;
                    113:       exit when ok;
                    114:     end loop;
                    115:
                    116:     if ans = 'p'
                    117:      then plp(dic,eps,inbas,outbas,nit,feasibound);
                    118:      else dlp(dic,eps,inbas,outbas,nit,feasibound);
                    119:     end if;
                    120:
                    121:     primsol := Dictionaries.Primal_Solution(dic,inbas,outbas);
                    122:     new_line;
                    123:     put_line("THE PRIMAL SOLUTION :");
                    124:     for i in primsol'range loop
                    125:       put("  x"); put(i,1); put(" : ");
                    126:       put(primsol(i),3,3,3); new_line;
                    127:     end loop;
                    128:
                    129:     if ans = 'd'
                    130:      then dualsol := -Dictionaries.Dual_Solution(dic,inbas,outbas);
                    131:      else dualsol :=  Dictionaries.Dual_Solution(dic,inbas,outbas);
                    132:     end if;
                    133:     new_line;
                    134:     put_line("THE DUAL SOLUTION :");
                    135:     for i in dualsol'range loop
                    136:       put("  x"); put(i,1); put(" : ");
                    137:       put(dualsol(i),3,3,3); new_line;
                    138:     end loop;
                    139:
                    140:     new_line;
                    141:     put("OPTIMUM : "); put(Optimum(dic)); new_line;
                    142:     put("NUMBER OF ITERATIONS : "); put(nit,1); new_line;
                    143:     if ans = 'd'
                    144:      then if feasibound
                    145:            then put_line("THE PROBLEM IS FEASIBLE");
                    146:            else put_line("THE PROBLEM IS NOT FEASIBLE");
                    147:           end if;
                    148:      else if feasibound
                    149:            then put_line("THE PROBLEM IS UNBOUNDED");
                    150:            else put_line("THE PROBLEM IS NOT UNBOUNDED");
                    151:           end if;
                    152:     end if;
                    153:
                    154:   end;
                    155:
                    156: end ts_diclp;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>