[BACK]Return to drivers_for_implicit_lifting.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Root_Counts / Implift

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Implift/drivers_for_implicit_lifting.adb, Revision 1.1.1.1

1.1       maekawa     1: with integer_io;                         use integer_io;
                      2: with Communications_with_User;           use Communications_with_User;
                      3: with Timing_Package;                     use Timing_Package;
                      4: with Numbers_io;                         use Numbers_io;
                      5: with Standard_Natural_Vectors;
                      6: with Standard_Complex_Poly_Systems_io;   use Standard_Complex_Poly_Systems_io;
                      7: with Standard_Complex_Solutions_io;      use Standard_Complex_Solutions_io;
                      8: with Set_Structure,Set_Structure_io;
                      9: with Drivers_for_Vertex_Points;          use Drivers_for_Vertex_Points;
                     10: with Trees_of_Vectors;                   use Trees_of_Vectors;
                     11: with Trees_of_Vectors_io;                use Trees_of_Vectors_io;
                     12: with Set_Structures_and_Volumes;         use Set_Structures_and_Volumes;
                     13: with Generic_Position;
                     14: with Driver_for_Polyhedral_Continuation;
                     15:
                     16: package body Drivers_for_Implicit_Lifting is
                     17:
                     18:   procedure Implicit_Lifting_Info is
                     19:
                     20:     i : array(1..20) of string(1..65);
                     21:
                     22:   begin
                     23:     i( 1):="  The mixed volume of the tuple  of  Newton  polytopes  gives  an";
                     24:     i( 2):="upper  bound  for  the  number of complex isolated solutions with";
                     25:     i( 3):="nonzero coefficients.  This BKK bound (called  after  Bernshtein,";
                     26:     i( 4):="Koushnirenko  and  Khovanskii) is exact when the coefficients are";
                     27:     i( 5):="sufficiently chosen at  random  or  when  the  polytopes  are  in";
                     28:     i( 6):="generic position w.r.t. each other.                              ";
                     29:     i( 7):="  By implicit lifting, the mixed volume is computed by lifting up";
                     30:     i( 8):="the origin of the first polytope and by computing those facets of";
                     31:     i( 9):="the lower hull of the Minkowski sum that are spanned by edge-edge";
                     32:     i(10):="combinations.   This  procedure  to compute the mixed volume uses";
                     33:     i(11):="recursion on the dimension.                                      ";
                     34:     i(12):="  A random coefficient start system has the same Newton polytopes";
                     35:     i(13):="as  the  target  system, but all coefficients are randomly chosen";
                     36:     i(14):="complex numbers.  To solve a  random  coefficient  start  system,";
                     37:     i(15):="homotopy  continuation  is invoked in a recursive way, similar to";
                     38:     i(16):="the computation of the mixed volume.                             ";
                     39:     i(17):="  By constructing a set structure for the first k  equations  and";
                     40:     i(18):="computing  the  mixed  volumes  of  the  remaining  n-k equations";
                     41:     i(19):="obtained  after  elimination,  a  combined  Bezout-BKK  bound  is";
                     42:     i(20):="computed.                                                        ";
                     43:     for k in i'range loop
                     44:       put_line(i(k));
                     45:     end loop;
                     46:   end Implicit_Lifting_Info;
                     47:
                     48:   procedure Driver_for_Mixture_Bezout_BKK
                     49:                  ( file : in file_type; p : in Poly_Sys; byebye : in boolean;
                     50:                    q : out Poly_Sys; qsols : out Solution_List;
                     51:                    b : out natural ) is
                     52:
                     53:     welcome : constant string := "Mixed-Volume Computation by Implicit Lifting";
                     54:
                     55:    -- VARIABLES :
                     56:
                     57:     n,bkk,k : natural;
                     58:     ans : character;
                     59:     timer : timing_widget;
                     60:     tdft,gft,solsft : file_type;
                     61:     td : Tree_of_Vectors;
                     62:     pp,qq : Poly_Sys(p'range);
                     63:     qqsols : Solution_List;
                     64:
                     65:  -- SWITCHES TO BE SET :
                     66:
                     67:     verpts   : boolean;   -- to extract the vertex points
                     68:     havetd   : boolean;   -- already a tree of directions available
                     69:     wanttd   : boolean;   -- put a tree of directions on separate file
                     70:     tosolve  : boolean;   -- a system has to be solved
                     71:     ranstart : boolean;   -- for random coefficient start system
                     72:     contrep  : boolean;   -- reporting during continuation
                     73:
                     74:   begin
                     75:     new_line; put_line(welcome);
                     76:     n := p'length;
                     77:     new_line;
                     78:     put("Do you first want to extract the vertex points ? (y/n) ");
                     79:     Ask_Yes_or_No(ans);
                     80:     verpts := (ans = 'y');
                     81:     if verpts
                     82:      then put_line("Computing the vertex points...");
                     83:           Copy(p,pp);
                     84:           Vertex_Points(file,pp);
                     85:      else pp := p;
                     86:     end if;
                     87:     new_line;
                     88:     put_line("MENU for Mixture between Bezout and BKK Bound :");
                     89:     put_line("  k = 0 : for computation of the BKK bound;");
                     90:     put("  k = "); put(n,1); put_line(" : for a generalized Bezout number;");
                     91:     put("  0 < k < "); put(n,1); put_line(" : gives a mixed Bezout BKK bound.");
                     92:     put("Give the number k between 0 and "); put(n,1); put(" : ");
                     93:     Read_Natural(k);
                     94:     if k > 0
                     95:      then new_line;
                     96:           put_line("Do you have a good set structure");
                     97:           put("for the first "); put(k,1); put(" polynomials ? (y/n) ");
                     98:           Ask_Yes_or_No(ans);
                     99:           if ans = 'y'
                    100:            then declare
                    101:                   ns : Standard_Natural_Vectors.Vector(p'range);
                    102:                 begin
                    103:                  for i in 1..k loop
                    104:                    put("  Give the number of sets for polynomial ");
                    105:                    put(i,1); put(" : "); Read_Natural(ns(i));
                    106:                   end loop;
                    107:                  ns(k+1..n) := (k+1..n => 0);
                    108:                  Set_Structure.Init(ns);
                    109:                  put_line("Give the set structure :");
                    110:                  Set_Structure_io.get;
                    111:                 end;
                    112:            else Build_RPS(k,n,pp);
                    113:           end if;
                    114:           new_line(file);
                    115:           put_line(file,
                    116:                      "******* MIXTURE BETWEEN BEZOUT AND BKK BOUND *******");
                    117:           new_line(file);
                    118:           put(file,"Set structure for the first "); put(file,k,1);
                    119:           put_line(file," polynomials : ");
                    120:           Set_Structure_io.put(file);
                    121:     end if;
                    122:     new_line;
                    123:     put("Do you have a tree of useful directions ? (y/n) "); Ask_Yes_or_No(ans);
                    124:     if ans = 'y'
                    125:      then put_line("Reading the name of the file where the tree is.");
                    126:           declare
                    127:             tdf : file_type;
                    128:           begin
                    129:             Read_Name_and_Open_File(tdf);
                    130:             get(tdf,n-k,td);
                    131:             Close(tdf);
                    132:             havetd := true;
                    133:           exception
                    134:             when others =>
                    135:                    put_line("There is something wrong with your tree ...");
                    136:                    havetd := false;
                    137:           end;
                    138:      else havetd := false;
                    139:     end if;
                    140:     if not havetd
                    141:      then put("Do you want the useful directions on separate file ? (y/n) ");
                    142:           Ask_Yes_or_No(ans);
                    143:           wanttd := (ans = 'y');
                    144:           if wanttd
                    145:            then put_line("Reading a name of a file to write tree on.");
                    146:                 Read_Name_and_Create_File(tdft);
                    147:           end if;
                    148:      else wanttd := false;
                    149:     end if;
                    150:     Driver_for_Polyhedral_Continuation
                    151:       (file,pp,k,byebye,qq,gft,solsft,tosolve,ranstart,contrep);
                    152:     tstart(timer);
                    153:     if tosolve
                    154:      then new_line(file);
                    155:           put_line(file,"INTERMEDIATE RESULTS :");
                    156:           new_line(file);
                    157:           if havetd
                    158:            then Mixed_Solve(file,k,n,pp,td,bkk,qq,qqsols);
                    159:            elsif wanttd
                    160:                then Bezout_BKK(k,n,pp,td,bkk);
                    161:                     put(tdft,td); Close(tdft);
                    162:                     Mixed_Solve(file,k,n,pp,td,bkk,qq,qqsols);
                    163:                else Bezout_BKK(k,n,pp,td,bkk);
                    164:                     Mixed_Solve(file,k,n,pp,td,bkk,qq,qqsols);
                    165:           end if;
                    166:           if k > 0
                    167:            then put(gft,qq'last,qq);
                    168:                 new_line(file);
                    169:                 put_line(file,"THE START SYSTEM : ");
                    170:                 new_line(file);
                    171:                 put_line(file,qq);
                    172:           end if;
                    173:           if ranstart
                    174:            then new_line(gft); put_line(gft,"THE SOLUTIONS :"); new_line(gft);
                    175:                 put(gft,Length_Of(qqsols),n,qqsols);
                    176:                 Close(gft);
                    177:            else put(solsft,Length_Of(qqsols),n,qqsols); Close(solsft);
                    178:           end if;
                    179:           q := qq; qsols := qqsols;
                    180:      else if havetd
                    181:            then bkk := Bezout_BKK(k,n,pp,td);
                    182:            elsif wanttd
                    183:               then Bezout_BKK(k,n,pp,td,bkk);
                    184:                     put(tdft,td);
                    185:                     Close(tdft);
                    186:                else Bezout_Bkk(k,n,pp,td,bkk);
                    187:           end if;
                    188:     end if;
                    189:     tstop(timer);
                    190:     b := bkk;
                    191:     new_line(file);
                    192:     if k > 0
                    193:      then put(file,"The mixed Bezout BKK bound equals ");
                    194:      else put(file,"The BKK bound equals ");
                    195:     end if;
                    196:     put(file,bkk,1); put_line(file,".");
                    197:     new_line(file);
                    198:     if not Is_Null(td)
                    199:      then put_line(file,"The tree of useful directions : ");
                    200:           put(file,td);
                    201:           new_line(file);
                    202:           if k = 0
                    203:            then
                    204:              if Generic_Position(pp,td)
                    205:               then put_line(file,"The polytopes may be in generic position.");
                    206:               else put_line(file,"The polytopes are not in generic position.");
                    207:              end if;
                    208:              new_line(file);
                    209:           end if;
                    210:     end if;
                    211:     print_times(file,timer,"mixed homotopy method");
                    212:     new_line(file);
                    213:     if ans = 'y'
                    214:      then new_line(file);
                    215:           put_line(file,"RANDOM COEFFICIENT START SYSTEM :");
                    216:           new_line(file);
                    217:           put(file,qq'last,qq);
                    218:           new_line(file);
                    219:           put_line(file,"THE SOLUTIONS : ");
                    220:           put(file,Length_Of(qqsols),n,qqsols);
                    221:     end if;
                    222:     if verpts
                    223:      then Clear(pp);
                    224:     end if;
                    225:   end Driver_for_Mixture_Bezout_BKK;
                    226:
                    227: end Drivers_for_Implicit_Lifting;

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