[BACK]Return to driver_for_sagbi_homotopies.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Schubert

Annotation of OpenXM_contrib/PHC/Ada/Schubert/driver_for_sagbi_homotopies.adb, Revision 1.1.1.1

1.1       maekawa     1: with integer_io;                         use integer_io;
                      2: with Timing_Package;                     use Timing_Package;
                      3: with Communications_with_User;           use Communications_with_User;
                      4: with Numbers_io;                         use Numbers_io;
                      5: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
                      6: with Standard_Floating_Numbers_io;       use Standard_Floating_Numbers_io;
                      7: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
                      8: with Standard_Random_Numbers;            use Standard_Random_Numbers;
                      9: with Standard_Integer_Vectors;
                     10: with Standard_Natural_Matrices;
                     11: with Standard_Natural_Matrices_io;       use Standard_Natural_Matrices_io;
                     12: with Standard_Complex_Vectors;
                     13: with Standard_Complex_VecVecs;
                     14: with Standard_Random_Vectors;            use Standard_Random_Vectors;
                     15: with Standard_Floating_Vectors;
                     16: with Standard_Floating_Vectors_io;       use Standard_Floating_Vectors_io;
                     17: with Standard_Floating_Matrices;
                     18: with Standard_Floating_Matrices_io;      use Standard_Floating_Matrices_io;
                     19: with Standard_Complex_Matrices;
                     20: with Standard_Complex_Norms_Equals;      use Standard_Complex_Norms_Equals;
                     21: with Standard_Random_Matrices;           use Standard_Random_Matrices;
                     22: with Symbol_Table;                       use Symbol_Table;
                     23: with Standard_Complex_Polynomials;       use Standard_Complex_Polynomials;
                     24: with Standard_Complex_Polynomials_io;    use Standard_Complex_Polynomials_io;
                     25: with Standard_Complex_Poly_Functions;    use Standard_Complex_Poly_Functions;
                     26: with Standard_Complex_Poly_Systems;      use Standard_Complex_Poly_Systems;
                     27: with Standard_Complex_Poly_Systems_io;   use Standard_Complex_Poly_Systems_io;
                     28: with Standard_Complex_Poly_SysFun;       use Standard_Complex_Poly_SysFun;
                     29: with Standard_Complex_Jaco_Matrices;
                     30: with Standard_Complex_Laur_Systems;      use Standard_Complex_Laur_Systems;
                     31: with Standard_Complex_Laur_Functions;    use Standard_Complex_Laur_Functions;
                     32: with Standard_Complex_Laur_Systems;      use Standard_Complex_Laur_Systems;
                     33: with Standard_Complex_Laur_SysFun;       use Standard_Complex_Laur_SysFun;
                     34: with Standard_Complex_Laur_Jacomats;
                     35: with Exponent_Vectors;                   use Exponent_Vectors;
                     36: with Standard_Poly_Laur_Convertors;      use Standard_Poly_Laur_Convertors;
                     37: with Matrix_Indeterminates;
                     38: with Homotopy;
                     39: with Standard_Complex_Solutions;         use Standard_Complex_Solutions;
                     40: with Standard_Complex_Solutions_io;      use Standard_Complex_Solutions_io;
                     41: with Lists_of_Integer_Vectors;           use Lists_of_Integer_Vectors;
                     42: with Lists_of_Integer_Vectors_io;        use Lists_of_Integer_Vectors_io;
                     43: with Arrays_of_Integer_Vector_Lists;     use Arrays_of_Integer_Vector_Lists;
                     44: with Increment_and_Fix_Continuation;     use Increment_and_Fix_Continuation;
                     45: with Standard_Root_Refiners;             use Standard_Root_Refiners;
                     46: with Drivers_for_Poly_Continuation;      use Drivers_for_Poly_Continuation;
                     47: with Power_Lists;                        use Power_Lists;
                     48: with Integer_Lifting_Utilities;          use Integer_Lifting_Utilities;
                     49: with Integer_Mixed_Subdivisions;         use Integer_Mixed_Subdivisions;
                     50: with Integer_Polyhedral_Continuation;    use Integer_Polyhedral_Continuation;
                     51: with Triangulations;                     use Triangulations;
                     52: with Dynamic_Triangulations;             use Dynamic_Triangulations;
                     53: with Triangulations_and_Subdivisions;    use Triangulations_and_Subdivisions;
                     54: with Bracket_Expansions;                 use Bracket_Expansions;
                     55: with SAGBI_Homotopies;                   use SAGBI_Homotopies;
                     56: with Matrix_Homotopies;
                     57: with Matrix_Homotopies_io;
                     58: with Osculating_Planes;                  use Osculating_Planes;
                     59:
                     60: procedure Driver_for_SAGBI_Homotopies
                     61:               ( file : in file_type; n,d : in natural ) is
                     62:
                     63:   dim : constant natural := (n-d)*d;
                     64:
                     65:   function Convert ( mat : Standard_Floating_Matrices.Matrix )
                     66:                    return Standard_Complex_Matrices.Matrix is
                     67:
                     68:     res : Standard_Complex_Matrices.Matrix(mat'range(1),mat'range(2));
                     69:
                     70:   begin
                     71:     for i in mat'range(1) loop
                     72:       for j in mat'range(2) loop
                     73:         res(i,j) := Create(mat(i,j));
                     74:       end loop;
                     75:     end loop;
                     76:     return res;
                     77:   end Convert;
                     78:
                     79:   function Random_Osculating_SAGBI_Homotopy
                     80:              ( file : file_type; locmap : Standard_Natural_Matrices.Matrix )
                     81:              return Poly_Sys is
                     82:
                     83:   -- DESCRIPTION :
                     84:   --   Generates planes that are osculating a rational normal curve.
                     85:   --   The system on return is the SAGBI homotopy.
                     86:
                     87:     p : Poly;
                     88:     l : Poly_Sys(1..dim);
                     89:     s : double_float;
                     90:     inc : double_float := 2.0/(double_float(dim));
                     91:     mat : Standard_Floating_Matrices.Matrix(1..n,1..n-d);
                     92:
                     93:   begin
                     94:    -- p := Lifted_Localized_Laplace_Expansion(n,d);
                     95:     p := Lifted_Localized_Laplace_Expansion(locmap);
                     96:     new_line(file);
                     97:     put_line(file,"The selected s-values : ");
                     98:     s := Random;
                     99:     for i in l'range loop
                    100:       s := s + inc;
                    101:       if s >= 1.0
                    102:        then s := s - 2.0;
                    103:       end if;      -- s lies in [-1.0,+1.0]
                    104:       put(file,s); new_line(file);
                    105:       mat := Orthogonal_Basis(n,n-d,s);
                    106:       Matrix_Homotopies.Add_Target(i,Convert(mat));
                    107:       l(i) := Intersection_Condition(mat,p);
                    108:     end loop;
                    109:     return l;
                    110:   end Random_Osculating_SAGBI_Homotopy;
                    111:
                    112:   function Given_Osculating_SAGBI_Homotopy
                    113:              ( file : file_type; locmap : Standard_Natural_Matrices.Matrix )
                    114:              return Poly_Sys is
                    115:
                    116:   -- DESCRIPTION :
                    117:   --   Reads s-values and generates planes that are osculating a
                    118:   --   rational normal curve.
                    119:   --   The system on return is the SAGBI homotopy.
                    120:
                    121:     p : Poly;
                    122:     l : Poly_Sys(1..dim);
                    123:     s : Standard_Floating_Vectors.Vector(1..dim);
                    124:     mat : Standard_Floating_Matrices.Matrix(1..n,1..n-d);
                    125:
                    126:   begin
                    127:    -- p := Lifted_Localized_Laplace_Expansion(n,d);
                    128:     p := Lifted_Localized_Laplace_Expansion(locmap);
                    129:     new_line;
                    130:     put("Give "); put(dim,1); put_line(" distinct real values for s : ");
                    131:     for i in s'range loop
                    132:       Read_Double_Float(s(i));
                    133:     end loop;
                    134:     new_line(file);
                    135:     put_line(file,"The selected s-values : ");
                    136:     put_line(file,s);
                    137:     for i in l'range loop
                    138:       mat := Orthogonal_Basis(n,n-d,s(i));
                    139:       Matrix_Homotopies.Add_Target(i,Convert(mat));
                    140:       l(i) := Intersection_Condition(mat,p);
                    141:     end loop;
                    142:     return l;
                    143:   end Given_Osculating_SAGBI_Homotopy;
                    144:
                    145:   function Read_Input_SAGBI_Homotopy
                    146:              ( file : file_type; locmap : Standard_Natural_Matrices.Matrix )
                    147:              return Poly_Sys is
                    148:
                    149:   -- DESCRIPTION :
                    150:   --   Reads the input planes from file.
                    151:   --   The system on return is the SAGBI homotopy.
                    152:
                    153:     planesfile : file_type;
                    154:     p : Poly;
                    155:     l : Poly_Sys(1..dim);
                    156:     mat : Standard_Floating_Matrices.Matrix(1..n,1..n-d);
                    157:
                    158:   begin
                    159:    -- p := Lifted_Localized_Laplace_Expansion(n,d);
                    160:     p := Lifted_Localized_Laplace_Expansion(locmap);
                    161:     new_line;
                    162:     put_line("Reading the name of the file with the input planes.");
                    163:     Read_Name_and_Open_File(planesfile);
                    164:     new_line(file);
                    165:     put_line(file,"The input planes : ");
                    166:     for i in l'range loop
                    167:       get(planesfile,mat);
                    168:       new_line(file); put(file,mat);
                    169:       mat := Orthogonalize(mat);
                    170:       Matrix_Homotopies.Add_Target(i,Convert(mat));
                    171:       l(i) := Intersection_Condition(mat,p);
                    172:     end loop;
                    173:     Close(planesfile);
                    174:     return l;
                    175:   end Read_Input_SAGBI_Homotopy;
                    176:
                    177:   function Complex_Random_SAGBI_Homotopy
                    178:              ( locmap : Standard_Natural_Matrices.Matrix ) return Poly_Sys is
                    179:
                    180:   -- DESCRIPTION :
                    181:   --   Generates a SAGBI homotopy by taking random complex (n-d)-planes.
                    182:   --   This system will be the start system in the Cheater's homotopy.
                    183:
                    184:     p : Poly;
                    185:     l : Poly_Sys(1..dim);
                    186:     mat : Standard_Complex_Matrices.Matrix(1..n,1..n-d);
                    187:
                    188:   begin
                    189:    -- p := Lifted_Localized_Laplace_Expansion(n,d);
                    190:     p := Lifted_Localized_Laplace_Expansion(locmap);
                    191:     for i in l'range loop
                    192:       mat := Random_Orthogonal_Matrix(n,n-d);
                    193:       Matrix_Homotopies.Add_Start(i,mat);
                    194:       l(i) := Intersection_Condition(mat,p);
                    195:     end loop;
                    196:     return l;
                    197:   end Complex_Random_SAGBI_Homotopy;
                    198:
                    199:   function Start_System ( l : Poly_Sys ) return Poly_Sys is
                    200:
                    201:   -- DESCRIPTION :
                    202:   --   Returns the system l after evaluation for t = 0.
                    203:   --   This will be the start system in the SAGBI homotopy, flat deformation.
                    204:
                    205:     r : Poly_Sys(l'range);
                    206:     m : constant natural := Number_of_Unknowns(l(l'first));
                    207:
                    208:   begin
                    209:     for i in l'range loop
                    210:       r(i) := Eval(l(i),Create(0.0),m);
                    211:     end loop;
                    212:     return r;
                    213:   end Start_System;
                    214:
                    215:   function Target_System ( l : Poly_Sys ) return Poly_Sys is
                    216:
                    217:   -- DESCRIPTION :
                    218:   --   Returns the system l after evaluation for t = 1.
                    219:   --   This will be the target system in the SAGBI homotopy, flat deformation.
                    220:
                    221:     r : Poly_Sys(l'range);
                    222:     m : constant natural := Number_of_Unknowns(l(l'first));
                    223:
                    224:   begin
                    225:     for i in l'range loop
                    226:       r(i) := Eval(l(i),Create(1.0),m);
                    227:     end loop;
                    228:     return r;
                    229:   end Target_System;
                    230:
                    231:   procedure Polyhedral_Homotopy_Continuation
                    232:                ( file : in file_type;
                    233:                  p : in Poly_Sys; sols : in out Solution_List;
                    234:                  t : in Triangulation; lifted : in List; rep : in boolean ) is
                    235:
                    236:   -- DESCRIPTION :
                    237:   --   This is the first continuation stage, the resolution of the start system
                    238:   --   in the SAGBI homotopy by means of polyhedral homotopy continuation.
                    239:
                    240:     use Standard_Complex_Laur_JacoMats;
                    241:
                    242:     timer : Timing_Widget;
                    243:     lifted_lq,lq : Laur_Sys(p'range);
                    244:     mix : Standard_Integer_Vectors.Vector(1..1) := (1..1 => p'last);
                    245:     lif : Array_of_Lists(1..1) := (1..1 => lifted);
                    246:     h : Eval_Coeff_Laur_Sys(p'range);
                    247:     c : Standard_Complex_VecVecs.VecVec(h'range);
                    248:     e : Exponent_Vectors_Array(h'range);
                    249:     j : Eval_Coeff_Jaco_Mat(h'range,h'first..h'last+1);
                    250:     m : Mult_Factors(j'range(1),j'range(2));
                    251:     mixsub : Mixed_Subdivision;
                    252:
                    253:   begin
                    254:     tstart(timer);
                    255:     mixsub := Shallow_Create(p'last,t);
                    256:     lq := Polynomial_to_Laurent_System(p);
                    257:     lifted_lq := Perform_Lifting(p'last,mix,lif,lq);
                    258:     h := Create(lq);
                    259:     for i in c'range loop
                    260:       declare
                    261:         coeff_lq : constant Standard_Complex_Vectors.Vector := Coeff(lq(i));
                    262:       begin
                    263:         c(i) := new Standard_Complex_Vectors.Vector(coeff_lq'range);
                    264:         for k in coeff_lq'range loop
                    265:           c(i)(k) := coeff_lq(k);
                    266:         end loop;
                    267:       end;
                    268:     end loop;
                    269:     e := Create(lq);
                    270:     Create(lq,j,m);
                    271:     if rep
                    272:      then Mixed_Solve(file,lifted_lq,lif,h,c,e,j,m,mix,mixsub,sols);
                    273:      else Mixed_Solve(lifted_lq,lif,h,c,e,j,m,mix,mixsub,sols);
                    274:     end if;
                    275:     tstop(timer);
                    276:     new_line(file);
                    277:     print_times(file,timer,"Polyhedral Homotopy Continuation");
                    278:   end Polyhedral_Homotopy_Continuation;
                    279:
                    280:   procedure Solve_Start_System
                    281:                ( file : in file_type;
                    282:                  p : in Poly_Sys; sols : in out Solution_List;
                    283:                  report : in boolean ) is
                    284:
                    285:   -- DESCRIPTION :
                    286:   --   Computes the volume of the support of p.  This is the
                    287:   --   combinatorial-geometric set up for the first continuation stage.
                    288:
                    289:     timer : Timing_Widget;
                    290:     support : List := Create(p(p'first));
                    291:     lifted,lifted_last : List;
                    292:     t : Triangulation;
                    293:     vol : natural;
                    294:
                    295:   begin
                    296:     new_line(file);
                    297:     put_line(file,"The support of the start system : ");
                    298:     new_line(file);
                    299:     put(file,support);
                    300:     tstart(timer);
                    301:     Dynamic_Lifting(support,false,false,0,lifted,lifted_last,t);
                    302:     new_line(file);
                    303:     put_line(file,"The lifted support : ");
                    304:     new_line(file);
                    305:     put(file,lifted);
                    306:     vol := Volume(t);
                    307:     tstop(timer);
                    308:     new_line(file);
                    309:     put(file,"The volume : "); put(file,vol,1); new_line(file);
                    310:     new_line(file);
                    311:     print_times(file,timer,"Triangulation and Volume Computation");
                    312:     Polyhedral_Homotopy_Continuation(file,p,sols,t,lifted,report);
                    313:     Clear(t);
                    314:   end Solve_Start_System;
                    315:
                    316:   procedure Flat_Deformation
                    317:                ( file : in file_type; sh : in Poly_Sys;
                    318:                  sols : in out Solution_List; report : in boolean ) is
                    319:
                    320:   -- DESCRIPTION :
                    321:   --   Performs flat deformation as defined by the SAGBI homotopy.
                    322:   --   This is the second stage in the continuation.
                    323:
                    324:     use Standard_Complex_Jaco_Matrices;
                    325:
                    326:     timer : Timing_Widget;
                    327:     sh_eval : Eval_Poly_Sys(sh'range);
                    328:     jac_mat : Jaco_Mat(sh'range,sh'first..sh'last+1);
                    329:     eva_jac : Eval_Jaco_Mat(jac_mat'range(1),jac_mat'range(2));
                    330:
                    331:     function Eval ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
                    332:                   return Standard_Complex_Vectors.Vector is
                    333:
                    334:       xt : Standard_Complex_Vectors.Vector(x'first..x'last+1);
                    335:
                    336:     begin
                    337:       xt(x'range) := x;
                    338:       xt(xt'last) := t;
                    339:       return Eval(sh_eval,xt);
                    340:     end Eval;
                    341:
                    342:     function Diff ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
                    343:                   return Standard_Complex_Matrices.Matrix is
                    344:
                    345:       res : Standard_Complex_Matrices.Matrix(x'range,x'range);
                    346:       xt : Standard_Complex_Vectors.Vector(x'first..x'last+1);
                    347:
                    348:     begin
                    349:       xt(x'range) := x;
                    350:       xt(xt'last) := t;
                    351:       for i in res'range(1) loop
                    352:         for j in res'range(2) loop
                    353:           res(i,j) := Eval(eva_jac(i,j),xt);
                    354:         end loop;
                    355:       end loop;
                    356:       return res;
                    357:     end Diff;
                    358:
                    359:     function Diff ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
                    360:                   return Standard_Complex_Vectors.Vector is
                    361:
                    362:       res : Standard_Complex_Vectors.Vector(x'range);
                    363:       xt : Standard_Complex_Vectors.Vector(x'first..x'last+1);
                    364:
                    365:     begin
                    366:       xt(x'range) := x;
                    367:       xt(xt'last) := t;
                    368:       for i in res'range loop
                    369:         res(i) := Eval(eva_jac(i,eva_jac'last(2)),xt);
                    370:       end loop;
                    371:       return res;
                    372:     end Diff;
                    373:
                    374:     procedure Sil_Cont is new Silent_Continue(Max_Norm,Eval,Diff,Diff);
                    375:     procedure Rep_Cont is new Reporting_Continue(Max_Norm,Eval,Diff,Diff);
                    376:
                    377:   begin
                    378:     tstart(timer);
                    379:     sh_eval := Create(sh);
                    380:     jac_mat := Create(sh);
                    381:     eva_jac := Create(jac_mat);
                    382:     Set_Continuation_Parameter(sols,Create(0.0));
                    383:     if report
                    384:      then Rep_Cont(file,sols,false,Create(1.0));
                    385:      else Sil_Cont(sols,false,Create(1.0));
                    386:     end if;
                    387:     tstop(timer);
                    388:     new_line(file); print_times(file,timer,"Flat Deformation");
                    389:     Clear(sh_eval);
                    390:     Clear(jac_mat);
                    391:     Clear(eva_jac);
                    392:   end Flat_Deformation;
                    393:
                    394:   procedure Solve_Target_System
                    395:                ( file : in file_type; start,target : in Poly_Sys;
                    396:                  sols : in out Solution_List; report : in boolean ) is
                    397:
                    398:   -- DESCRIPTION :
                    399:   --   This is the third and last continuation stage: Cheater's homotopy.
                    400:   --   It is implemented in the space of polynomials.
                    401:
                    402:     timer : Timing_Widget;
                    403:     n : constant natural := target'last;
                    404:     a : Standard_Complex_Vectors.Vector(1..n) := Random_Vector(1,n);
                    405:     b : Standard_Complex_Vectors.Vector(1..n) := Random_Vector(1,n);
                    406:
                    407:   begin
                    408:     tstart(timer);
                    409:     Homotopy.Create(target,start,2,a,b,true);            -- linear cheater
                    410:     Set_Continuation_Parameter(sols,Create(0.0));
                    411:     declare
                    412:       procedure Sil_Cont is
                    413:         new Silent_Continue(Max_Norm,
                    414:                             Homotopy.Eval,Homotopy.Diff,Homotopy.Diff);
                    415:       procedure Rep_Cont is
                    416:         new Reporting_Continue(Max_Norm,
                    417:                                Homotopy.Eval,Homotopy.Diff,Homotopy.Diff);
                    418:     begin
                    419:       if report
                    420:        then Rep_Cont(file,sols,false,Create(1.0));
                    421:        else Sil_Cont(sols,false,Create(1.0));
                    422:       end if;
                    423:     end;
                    424:     tstop(timer);
                    425:     new_line(file);
                    426:     print_times(file,timer,"Cheater's homotopy to target system");
                    427:   end Solve_Target_System;
                    428:
                    429:   procedure Solve_Target_System
                    430:                ( file : in file_type; symtarget : in Poly;
                    431:                  sols : in out Solution_List; report : in boolean ) is
                    432:
                    433:   -- DESCRIPTION :
                    434:   --   This is the third and last continuation stage: Cheater's homotopy.
                    435:   --   It uses a coefficient-matrix homotopy and takes as input the target
                    436:   --   system with coefficients as brackets.
                    437:   --   This is far more expensive than the linear Cheater's homotopy.
                    438:
                    439:     use Standard_Complex_Jaco_Matrices;
                    440:
                    441:     timer : Timing_Widget;
                    442:     h : Standard_Complex_Poly_Functions.Eval_Coeff_Poly := Create(symtarget);
                    443:     homsys : Poly_Sys(1..dim);
                    444:     jacmat : Eval_Coeff_Jaco_Mat(1..dim,1..dim);
                    445:     mulfac : Mult_Factors(1..dim,1..dim);
                    446:     brkcff : Standard_Complex_Vectors.Vector := Coeff(symtarget);
                    447:     syscff : Standard_Complex_VecVecs.VecVec(1..dim);
                    448:
                    449:   begin
                    450:     tstart(timer);
                    451:     Set_Continuation_Parameter(sols,Create(0.0));
                    452:     for i in homsys'range loop
                    453:       Copy(symtarget,homsys(i));
                    454:     end loop;
                    455:     Create(homsys,jacmat,mulfac);
                    456:     for i in syscff'range loop
                    457:       syscff(i) := new Standard_Complex_Vectors.Vector(brkcff'range);
                    458:     end loop;
                    459:     declare
                    460:
                    461:       function Eval ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
                    462:                     return Standard_Complex_Vectors.Vector is
                    463:
                    464:         y : Standard_Complex_Vectors.Vector(x'range);
                    465:         c : Standard_Complex_Vectors.Vector(brkcff'range);
                    466:
                    467:       begin
                    468:         for i in y'range loop
                    469:           c := Intersection_Coefficients(Matrix_Homotopies.Eval(i,t),brkcff);
                    470:           y(i) := Eval(h,c,x);
                    471:         end loop;
                    472:         return y;
                    473:       end Eval;
                    474:
                    475:       function dHt ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
                    476:                    return Standard_Complex_Vectors.Vector is
                    477:
                    478:         y : Standard_Complex_Vectors.Vector(x'range) := x;
                    479:
                    480:       begin
                    481:         return y;
                    482:       end dHt;
                    483:
                    484:       function dHx ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
                    485:                    return Standard_Complex_Matrices.Matrix is
                    486:       begin
                    487:         for i in syscff'range loop
                    488:           syscff(i).all
                    489:             := Intersection_Coefficients(Matrix_Homotopies.Eval(i,t),brkcff);
                    490:         end loop;
                    491:         return Eval(jacmat,mulfac,syscff,x);
                    492:       end dHx;
                    493:
                    494:       procedure Sil_Cont is new Silent_Continue(Max_Norm,Eval,dHt,dHx);
                    495:       procedure Rep_Cont is new Reporting_Continue(Max_Norm,Eval,dHt,dHx);
                    496:
                    497:     begin
                    498:       if report
                    499:        then Rep_Cont(file,sols,false,Create(1.0));
                    500:        else Sil_Cont(sols,false,Create(1.0));
                    501:       end if;
                    502:     end;
                    503:     Standard_Complex_VecVecs.Clear(syscff);
                    504:     tstop(timer);
                    505:     new_line(file);
                    506:     print_times(file,timer,"Cheater's homotopy to target system");
                    507:   end Solve_Target_System;
                    508:
                    509:   procedure Refine_Roots ( file : in file_type;
                    510:                            p : in Poly_Sys; sols : in out Solution_List ) is
                    511:
                    512:     epsxa : constant double_float := 10.0**(-8);
                    513:     epsfa : constant double_float := 10.0**(-8);
                    514:     tolsing : constant double_float := 10.0**(-8);
                    515:     max : constant natural := 3;
                    516:     numit : natural := 0;
                    517:
                    518:   begin
                    519:     Reporting_Root_Refiner(file,p,sols,epsxa,epsfa,tolsing,numit,max,false);
                    520:   end Refine_Roots;
                    521:
                    522:   procedure Set_Parameters ( file : in file_type; report : out boolean ) is
                    523:
                    524:   -- DESCRIPTION :
                    525:   --   Interactive determination of the continuation and output parameters.
                    526:
                    527:     oc : natural;
                    528:
                    529:   begin
                    530:     new_line;
                    531:     Driver_for_Continuation_Parameters(file);
                    532:     new_line;
                    533:     Driver_for_Process_io(file,oc);
                    534:     report := not (oc = 0);
                    535:     new_line;
                    536:     put_line("See the output file for results.");
                    537:     new_line;
                    538:   end Set_Parameters;
                    539:
                    540:   function t_Symbol return Symbol is
                    541:
                    542:   -- DESCRIPTION :
                    543:   --   Returns the symbol to represent the continuation parameter t.
                    544:
                    545:     res : Symbol;
                    546:
                    547:   begin
                    548:     res(1) := 't';
                    549:     for i in 2..res'last loop
                    550:       res(i) := ' ';
                    551:     end loop;
                    552:     return res;
                    553:   end t_Symbol;
                    554:
                    555:   function Lowest_Degree_Localization_Map
                    556:              ( n,d : natural ) return Standard_Natural_Matrices.Matrix is
                    557:
                    558:   -- DESCRIPTION :
                    559:   --   Returns the lowest-degree localization map.
                    560:
                    561:     res : Standard_Natural_Matrices.Matrix(1..n,1..d);
                    562:
                    563:   begin
                    564:     for i in 1..n-d loop
                    565:       for j in 1..d loop
                    566:         res(i,j) := 2;
                    567:       end loop;
                    568:     end loop;
                    569:     for i in n-d+1..n loop
                    570:       for j in 1..d loop
                    571:         if i = j+n-d
                    572:          then res(i,j) := 1;
                    573:          else res(i,j) := 0;
                    574:         end if;
                    575:       end loop;
                    576:     end loop;
                    577:     return res;
                    578:   end Lowest_Degree_Localization_Map;
                    579:
                    580:   function Read_Localization_Map
                    581:              ( n,d : natural ) return Standard_Natural_Matrices.Matrix is
                    582:
                    583:   -- DESCRIPTION :
                    584:   --   Reads a localization map from standard input.
                    585:
                    586:     res : Standard_Natural_Matrices.Matrix(1..n,1..d);
                    587:
                    588:   begin
                    589:     put_line("Reading localization map: 0,1 for I and 2 = free element.");
                    590:     put_line("The lowest-degree localization map looks like :");
                    591:     put(Lowest_Degree_Localization_Map(n,d));
                    592:     put_line("and the general localization map is :");
                    593:     put(Localization_Map(n,d));
                    594:     put("Give a "); put(n,1); put("-by-"); put(d,1);
                    595:     put_line(" matrix to represent your own map :");
                    596:     get(res); skip_line;
                    597:     return res;
                    598:   end Read_Localization_Map;
                    599:
                    600:   procedure Main is
                    601:
                    602:   -- DESCRIPTION :
                    603:   --   There are four parts in the elaboration of the SAGBI homotopy :
                    604:   --     0. Set up of the polynomials in the SAGBI homotopy;
                    605:   --     1. Solve the start system by polyhedral continuation;
                    606:   --     2. Apply the flat deformations to solve complex instance;
                    607:   --     3. Cheater's homotopy from complex to real instance.
                    608:
                    609:     timer,totaltimer : Timing_Widget;
                    610:     realsagbih,compsagbih,realtarget,comptarget,starts : Poly_Sys(1..dim);
                    611:     sols : Solution_List;
                    612:     report : boolean;
                    613:     inputchoice,localchoice : character;
                    614:     locmap : Standard_Natural_Matrices.Matrix(1..n,1..d);
                    615:
                    616:   begin
                    617:     new_line;
                    618:     put_line("MENU for a localization for the output planes : ");
                    619:     put_line("  1. Lowest-degree map, with I in lower-right corner.");
                    620:     put_line("  2. General map, able to represent any intersection.");
                    621:     put_line("  3. Give in your own localization map.");
                    622:     put("Type 1, 2, or 3 to select : "); Ask_Alternative(localchoice,"123");
                    623:     case localchoice is
                    624:       when '1' => locmap := Lowest_Degree_Localization_Map(n,d);
                    625:       when '2' => locmap := Localization_Map(n,d);
                    626:       when '3' => locmap := Read_Localization_Map(n,d);
                    627:       when others => null;
                    628:     end case;
                    629:     new_line;
                    630:     put_line("MENU for constructing target system based on input planes : ");
                    631:     put_line("  1. Generate input planes osculating a rational normal curve.");
                    632:     put_line("  2. Interactively give s-values for the "
                    633:                                & "osculating input planes.");
                    634:     put_line("  3. Give the name of the file with input planes.");
                    635:     put("Type 1, 2, or 3 to select : "); Ask_Alternative(inputchoice,"123");
                    636:     tstart(totaltimer);
                    637:     tstart(timer);
                    638:     Matrix_Indeterminates.Initialize_Symbols(n,d);
                    639:     Matrix_Indeterminates.Reduce_Symbols(locmap);
                    640:     Matrix_Homotopies.Init(dim);
                    641:     case inputchoice is
                    642:       when '1' => realsagbih := Random_Osculating_SAGBI_Homotopy(file,locmap);
                    643:       when '2' => realsagbih := Given_Osculating_SAGBI_Homotopy(file,locmap);
                    644:       when '3' => realsagbih := Read_Input_SAGBI_Homotopy(file,locmap);
                    645:       when others => null;
                    646:     end case;
                    647:     realtarget := Target_System(realsagbih);
                    648:     compsagbih := Complex_Random_SAGBI_Homotopy(locmap);
                    649:     comptarget := Target_System(compsagbih);
                    650:     starts := Start_System(compsagbih);
                    651:     Symbol_Table.Add(t_Symbol);
                    652:     new_line(file);
                    653:     put_line(file,"The target polynomial system with real coefficients : ");
                    654:     new_line(file);
                    655:     put(file,realtarget'last,realtarget);
                    656:     new_line(file);
                    657:     put_line(file,"The localization map : "); put(file,locmap);
                    658:     new_line(file);
                    659:     Matrix_Homotopies_io.Write(file);
                    660:     put_line(file,"The target polynomial system with complex coefficients : ");
                    661:     put_line(file,comptarget);
                    662:     new_line(file);
                    663:     put_line(file,"The SAGBI Homotopy as complex polynomial system : ");
                    664:     new_line(file);
                    665:     put_line(file,compsagbih);
                    666:     new_line(file);
                    667:     put_line(file,"The SAGBI Homotopy at t=0, the start system : ");
                    668:     new_line(file);
                    669:     put_line(file,starts);
                    670:     tstop(timer);
                    671:     new_line(file);
                    672:     print_times(file,timer,"Setting up the polynomials in the SAGBI homotopy");
                    673:     Set_Parameters(file,report);
                    674:     Solve_Start_System(file,starts,sols,report);
                    675:     Flat_Deformation(file,compsagbih,sols,report);
                    676:     Solve_Target_System(file,comptarget,realtarget,sols,report);
                    677:    -- Solve_Target_System(file,symtarget,sols,report);
                    678:    --  this is the determinantal cheater's homotopy, very expensive
                    679:     Refine_Roots(file,realtarget,sols);
                    680:     Matrix_Indeterminates.Clear_Symbols;
                    681:     tstop(totaltimer);
                    682:     new_line(file);
                    683:     print_times(file,totaltimer,"Total time for Solving the System");
                    684:   end Main;
                    685:
                    686: begin
                    687:   Main;
                    688: end Driver_for_SAGBI_Homotopies;

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