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

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

1.1       maekawa     1: with text_io,integer_io;                 use text_io,integer_io;
                      2: with Communications_with_User;           use Communications_with_User;
                      3: with Timing_Package;                     use Timing_Package;
                      4: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
                      5: with Standard_Natural_Vectors;
                      6: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
                      7: with Standard_Complex_Vectors;
                      8: with Standard_Complex_Vectors_io;        use Standard_Complex_Vectors_io;
                      9: with Standard_Natural_Matrices;
                     10: with Standard_Natural_Matrices_io;       use Standard_Natural_Matrices_io;
                     11: with Standard_Floating_Matrices;
                     12: with Standard_Complex_Matrices;
                     13: with Standard_Complex_Matrices_io;       use Standard_Complex_Matrices_io;
                     14: with Standard_Complex_Norms_Equals;      use Standard_Complex_Norms_Equals;
                     15: with Standard_Random_Numbers;            use Standard_Random_Numbers;
                     16: with Standard_Random_Vectors;            use Standard_Random_Vectors;
                     17: with Standard_Matrix_Inversion;          use Standard_Matrix_Inversion;
                     18: with Standard_Complex_VecMats;           use Standard_Complex_VecMats;
                     19: with Symbol_Table;                       use Symbol_Table;
                     20: with Matrix_Indeterminates;
                     21: with Standard_Complex_Polynomials;       use Standard_Complex_Polynomials;
                     22: with Standard_Complex_Poly_Matrices;
                     23: with Standard_Complex_Poly_Matrices_io;  use Standard_Complex_Poly_Matrices_io;
                     24: with Standard_Complex_Poly_Systems;      use Standard_Complex_Poly_Systems;
                     25: with Standard_Complex_Poly_SysFun;       use Standard_Complex_Poly_SysFun;
                     26: with Standard_Complex_Poly_Systems_io;   use Standard_Complex_Poly_Systems_io;
                     27: with Homotopy;
                     28: with Standard_Complex_Solutions;         use Standard_Complex_Solutions;
                     29: with Standard_Complex_Solutions_io;      use Standard_Complex_Solutions_io;
                     30: with Standard_Root_Refiners;             use Standard_Root_Refiners;
                     31: with Increment_and_Fix_Continuation;     use Increment_and_Fix_Continuation;
                     32: with Drivers_for_Poly_Continuation;      use Drivers_for_Poly_Continuation;
                     33: with Brackets,Brackets_io;               use Brackets,Brackets_io;
                     34: with Bracket_Monomials,Bracket_Systems;  use Bracket_Monomials,Bracket_Systems;
                     35: with Specialization_of_Planes;           use Specialization_of_Planes;
                     36: with Symbolic_Minor_Equations;           use Symbolic_Minor_Equations;
                     37: with Numeric_Minor_Equations;            use Numeric_Minor_Equations;
                     38: with Determinantal_Systems;              use Determinantal_Systems;
                     39: with Plane_Representations;              use Plane_Representations;
                     40: with Localization_Posets;                use Localization_Posets;
                     41: with Localization_Posets_io;             use Localization_Posets_io;
                     42: with Deformation_Posets;                 use Deformation_Posets;
                     43: with Drivers_for_Input_Planes;           use Drivers_for_Input_Planes;
                     44:
                     45: procedure Driver_for_Pieri_Homotopies
                     46:                 ( file : in file_type; n,d : in natural ) is
                     47:
                     48: -- AUXILIARIES IN THE SOLVERS :
                     49:
                     50:   procedure Add_t_Symbol is
                     51:
                     52:   -- DESCRIPTION :
                     53:   --   Adds the symbol for the continuation parameter t to the symbol table.
                     54:
                     55:     tsb : Symbol;
                     56:
                     57:   begin
                     58:     Symbol_Table.Enlarge(1);
                     59:     tsb(1) := 't';
                     60:     for i in 2..tsb'last loop
                     61:       tsb(i) := ' ';
                     62:     end loop;
                     63:     Symbol_Table.Add(tsb);
                     64:   end Add_t_Symbol;
                     65:
                     66:   procedure Set_Parameters ( file : in file_type; report : out boolean ) is
                     67:
                     68:   -- DESCRIPTION :
                     69:   --   Interactive determination of the continuation and output parameters.
                     70:
                     71:     oc : natural;
                     72:
                     73:   begin
                     74:     new_line;
                     75:     Driver_for_Continuation_Parameters(file);
                     76:     new_line;
                     77:     Driver_for_Process_io(file,oc);
                     78:     report := not (oc = 0);
                     79:     new_line;
                     80:     put_line("No more input expected.  See output file for results...");
                     81:     new_line;
                     82:     new_line(file);
                     83:   end Set_Parameters;
                     84:
                     85:   function First_Standard_Plane
                     86:              ( m,p : natural ) return Standard_Complex_Matrices.Matrix is
                     87:
                     88:   -- DESCRIPTION :
                     89:   --   Returns the m-plane spanned by the first m standard basis vectors.
                     90:
                     91:     res : Standard_Complex_Matrices.Matrix(1..m+p,1..m);
                     92:
                     93:   begin
                     94:     for j in 1..m loop                 -- assign j-th column
                     95:       for i in 1..m+p loop
                     96:         res(i,j) := Create(0.0);       -- initialize with zeros
                     97:       end loop;
                     98:       res(j,j) := Create(1.0);         -- j-th column = j-th basis vector
                     99:     end loop;
                    100:     return res;
                    101:   end First_Standard_Plane;
                    102:
                    103:   function Last_Standard_Plane
                    104:              ( m,p : natural ) return Standard_Complex_Matrices.Matrix is
                    105:
                    106:   -- DESCRIPTION :
                    107:   --   Returns the m-plane spanned by the last m standard basis vectors.
                    108:
                    109:     res : Standard_Complex_Matrices.Matrix(1..m+p,1..m);
                    110:
                    111:   begin
                    112:     for j in 1..m loop                  -- assign j-th column
                    113:       for i in 1..m+p loop
                    114:         res(i,j) := Create(0.0);        -- initialize with zeros
                    115:       end loop;
                    116:       res(p+j,j) := Create(1.0);        -- j-th vector = (p+j)-th basis vector
                    117:     end loop;
                    118:     return res;
                    119:   end Last_Standard_Plane;
                    120:
                    121:   procedure Basis_Change ( n : in natural; vm : in VecMat; transvm : out VecMat;
                    122:                            trans : out Standard_Complex_Matrices.Matrix ) is
                    123:
                    124:   -- DESCRIPTION :
                    125:   --   Changes basis so that the last two planes in vm are spanned by
                    126:   --   the first and last standard basis vectors respectively.
                    127:
                    128:     wrk : Standard_Complex_Matrices.Matrix(1..n,1..n);
                    129:    -- penuplane : constant Standard_Complex_Matrices.Matrix
                    130:    --   := vm(vm'last-1).all;
                    131:     frstplane : constant Standard_Complex_Matrices.Matrix := vm(vm'first).all;
                    132:     lastplane : constant Standard_Complex_Matrices.Matrix := vm(vm'last).all;
                    133:     colind : natural := 0;
                    134:     use Standard_Complex_Matrices;
                    135:     ranflt : double_float;
                    136:
                    137:   begin
                    138:     for j in frstplane'range(2) loop              -- fill up the work matrix
                    139:       colind := colind + 1;
                    140:       for i in frstplane'range(1) loop
                    141:          wrk(i,colind) := frstplane(i,j);
                    142:       end loop;
                    143:     end loop;
                    144:     for j in colind+1..(n-lastplane'length(2)) loop  -- random spacing
                    145:       for i in 1..n loop
                    146:         ranflt := Random;
                    147:         wrk(i,j) := Create(ranflt);
                    148:       end loop;
                    149:     end loop;
                    150:     colind := n+1;
                    151:     for j in reverse lastplane'range(2) loop
                    152:       colind := colind - 1;
                    153:       for i in lastplane'range(1) loop
                    154:          wrk(i,colind) := lastplane(i,j);
                    155:       end loop;
                    156:     end loop;
                    157:     trans := Inverse(wrk);                        -- transformation = inverse
                    158:     for i in vm'first+1..vm'last-1 loop
                    159:       transvm(i-1) := new Standard_Complex_Matrices.Matrix'
                    160:                            (trans*vm(i).all);
                    161:     end loop;
                    162:     transvm(transvm'last-1)
                    163:       := new Standard_Complex_Matrices.Matrix'(trans*vm(vm'first).all);
                    164:     transvm(transvm'last)
                    165:       := new Standard_Complex_Matrices.Matrix'(trans*vm(vm'last).all);
                    166:   end Basis_Change;
                    167:
                    168:   function Solution_Plane ( locmap : Standard_Natural_Matrices.Matrix;
                    169:                             mat : Standard_Complex_Matrices.Matrix )
                    170:                           return Solution is
                    171:
                    172:   -- DESCRIPTION :
                    173:   --   Returns the representation of the solution plane as a vector.
                    174:
                    175:     solloc : constant Standard_Complex_Vectors.Vector
                    176:            := Vector_Rep(locmap,Localize(locmap,mat));
                    177:     sol : Solution(solloc'length);
                    178:
                    179:   begin
                    180:     sol.m := 1;
                    181:     sol.t := Create(0.0);
                    182:     sol.res := 0.0;
                    183:     sol.err := 0.0;
                    184:     sol.rco := 0.0;
                    185:     sol.v := solloc;
                    186:     return sol;
                    187:   end Solution_Plane;
                    188:
                    189:   function Solution_Planes ( locmap : Standard_Natural_Matrices.Matrix;
                    190:                              vm : VecMat ) return Solution_List is
                    191:
                    192:   -- DESCRIPTION :
                    193:   --   Returns the representation of the vector of planes as a solution list.
                    194:
                    195:     res,res_last : Solution_List;
                    196:
                    197:   begin
                    198:     for i in vm'range loop
                    199:       Append(res,res_last,Solution_Plane(locmap,vm(i).all));
                    200:     end loop;
                    201:     return res;
                    202:   end Solution_Planes;
                    203:
                    204:   function Create_Hypersurface_System
                    205:              ( n : natural; locmap : Standard_Natural_Matrices.Matrix;
                    206:                xpm : Standard_Complex_Poly_Matrices.Matrix; planes : VecMat )
                    207:              return Poly_Sys is
                    208:
                    209:   -- DESCRIPTION :
                    210:   --   Returns the polynomial system that collects the hypersurface
                    211:   --   intersection conditions for meeting the given m-planes.
                    212:   --   The system is localized according to the given localization map.
                    213:
                    214:     wrksys : Poly_Sys(1..n) := Polynomial_Equations(planes(1..n),xpm);
                    215:     res : Poly_Sys(1..n) := Localize(locmap,wrksys);
                    216:
                    217:   begin
                    218:     Clear(wrksys);
                    219:     return res;
                    220:   end Create_Hypersurface_System;
                    221:
                    222:   function Create_General_System
                    223:              ( locmap : Standard_Natural_Matrices.Matrix;
                    224:                xpm : Standard_Complex_Poly_Matrices.Matrix; planes : VecMat )
                    225:              return Poly_Sys is
                    226:
                    227:   -- DESCRIPTION :
                    228:   --   Returns the polynomial system that collects the general
                    229:   --   intersection conditions for meeting the given (m+1-k(i))-planes.
                    230:   --   The system is localized according to the given localization map.
                    231:
                    232:     wrksys : constant Poly_Sys := Polynomial_Equations(planes,xpm);
                    233:     res : constant Poly_Sys := Localize(locmap,wrksys);
                    234:     tmp : Poly;
                    235:
                    236:   begin
                    237:     for i in wrksys'range loop
                    238:       tmp := wrksys(i);
                    239:       Clear(tmp);
                    240:     end loop;
                    241:     return res;
                    242:   end Create_General_System;
                    243:
                    244:   procedure Evaluate_Roots ( file : in file_type;
                    245:                              p : in Poly_sys; sols : in out Solution_List ) is
                    246:
                    247:   -- DESCRIPTION :
                    248:   --   Evaluates the roots at the system, good for overdetermined systems.
                    249:
                    250:     tmp : Solution_List := sols;
                    251:
                    252:   begin
                    253:     for i in 1..Length_Of(sols) loop
                    254:       put(file,"Solution "); put(file,i,1);
                    255:       put_line(file," evaluated at the system : ");
                    256:       put_line(file,Eval(p,Head_Of(tmp).v));
                    257:       tmp := Tail_Of(tmp);
                    258:     end loop;
                    259:   end Evaluate_Roots;
                    260:
                    261:   function Square ( n : natural; p : Poly_Sys ) return Poly_Sys is
                    262:
                    263:   -- DESCRIPTION :
                    264:   --   Returns a n-by-n system, by adding random linear combinations of
                    265:   --   the polynomials p(i), i > n, to the first n polynomials.
                    266:
                    267:     res : Poly_Sys(1..n);
                    268:     acc : Poly;
                    269:
                    270:   begin
                    271:     for i in res'range loop
                    272:       Copy(p(i),res(i));
                    273:       for j in n+1..p'last loop
                    274:         acc := Random1*p(j);
                    275:         Add(res(i),acc);
                    276:         Clear(acc);
                    277:       end loop;
                    278:     end loop;
                    279:     return res;
                    280:   end Square;
                    281:
                    282:   procedure Refine_Roots ( file : in file_type;
                    283:                            p : in Poly_Sys; sols : in out Solution_List ) is
                    284:
                    285:   -- DESCRIPTION :
                    286:   --   Calls the root refiner, for square polynomial systems only.
                    287:
                    288:     epsxa : constant double_float := 10.0**(-8);
                    289:     epsfa : constant double_float := 10.0**(-8);
                    290:     tolsing : constant double_float := 10.0**(-8);
                    291:     max : constant natural := 3;
                    292:     numit : natural := 0;
                    293:
                    294:   begin
                    295:     Reporting_Root_Refiner(file,p,sols,epsxa,epsfa,tolsing,numit,max,false);
                    296:   end Refine_Roots;
                    297:
                    298:   function General_Homotopy
                    299:               ( xpm : Standard_Complex_Poly_Matrices.Matrix;
                    300:                 locmap : Standard_Natural_Matrices.Matrix;
                    301:                 start,target : VecMat ) return Poly_Sys is
                    302:
                    303:   -- DESCRIPTION :
                    304:   --   Returns a general homotopy between start and target planes.
                    305:   --   The continuation parameter is inside the determinants.
                    306:
                    307:   -- REQUIRED : dimensions of start and target matrices must correspond.
                    308:
                    309:     res : Link_to_Poly_Sys;
                    310:     n : constant natural := xpm'length(1);
                    311:     p : constant natural := xpm'length(2);
                    312:     m : constant natural := n-p;
                    313:     nva : constant natural := n*p + 1;
                    314:
                    315:   begin
                    316:     for i in start'range loop
                    317:       declare
                    318:         moving : Standard_Complex_Poly_Matrices.Matrix
                    319:                    (start(i)'range(1),start(i)'range(2))
                    320:                := Moving_U_Matrix(nva,start(i).all,target(i).all);
                    321:         kd : constant natural := p + start(i)'length(2);
                    322:         bm : Bracket_Monomial := Maximal_Minors(n,kd);
                    323:         bs : Bracket_System(0..Number_of_Brackets(bm))
                    324:            := Minor_Equations(kd,kd-p,bm);
                    325:         sys : Poly_Sys(1..bs'last)
                    326:             := Lifted_Expanded_Minors(moving,xpm,bs);
                    327:       begin
                    328:         Concat(res,sys);
                    329:         Standard_Complex_Poly_Matrices.Clear(moving);
                    330:       end;
                    331:     end loop;
                    332:     declare
                    333:       locres : constant Poly_Sys := Localize(locmap,res.all);
                    334:     begin
                    335:       Clear(res);
                    336:       return locres;
                    337:     end;
                    338:   end General_Homotopy;
                    339:
                    340:   procedure Continuation ( file : in file_type; sols : in out Solution_List;
                    341:                            report : in boolean ) is
                    342:
                    343:   -- DESCRIPTION :
                    344:   --   Calls the path trackers starting at the given solutions.
                    345:
                    346:   -- REQUIRED : Homotopy is properly created.
                    347:
                    348:     procedure Sil_Cont is
                    349:       new Silent_Continue(Max_Norm,
                    350:                           Homotopy.Eval,Homotopy.Diff,Homotopy.Diff);
                    351:     procedure Rep_Cont is
                    352:       new Reporting_Continue(Max_Norm,
                    353:                              Homotopy.Eval,Homotopy.Diff,Homotopy.Diff);
                    354:
                    355:   begin
                    356:     Set_Continuation_Parameter(sols,Create(0.0));
                    357:     if report
                    358:      then Rep_Cont(file,sols,false,Create(1.0));
                    359:      else Sil_Cont(sols,false,Create(1.0));
                    360:     end if;
                    361:   end Continuation;
                    362:
                    363:   procedure General_Path_Following
                    364:                ( file : in file_type; target,homsys : in Poly_Sys;
                    365:                  sols : in out Solution_List; report : in boolean ) is
                    366:
                    367:   -- DESCRIPTION :
                    368:   --   Given a homotopy with start solutions, the path trackers will
                    369:   --   trace the paths defined by this homotopy.
                    370:
                    371:   -- REQUIRED : not Is_Null(sols).
                    372:
                    373:     timer : Timing_Widget;
                    374:     neq : constant natural := homsys'last;       -- number of equations
                    375:     dim : constant natural := Head_Of(sols).n;   -- actual dimension
                    376:     squhom : Poly_Sys(1..dim) := Square(dim,homsys);
                    377:
                    378:   begin
                    379:     tstart(timer);
                    380:     Homotopy.Create(squhom,dim+1);
                    381:     Continuation(file,sols,report);
                    382:     tstop(timer);
                    383:     new_line(file);
                    384:     print_times(file,timer,"Determinantal Cheater's homotopy to target system");
                    385:     new_line(file);
                    386:     Evaluate_Roots(file,target,sols);
                    387:   end General_Path_Following;
                    388:
                    389:   procedure Path_Following_with_Cheater
                    390:                ( file : in file_type; start,target : in Poly_Sys;
                    391:                  sols : in out Solution_List; report : in boolean ) is
                    392:
                    393:   -- DESCRIPTION :
                    394:   --   Calls the standard continuation routines to solve a specific
                    395:   --   target system, starting at the solutions of the start system.
                    396:   --   This is the usual linear cheater between start and target system,
                    397:   --   although it will take nonsquare inputs, it should only be used
                    398:   --   for hypersurface intersection conditions.
                    399:
                    400:   -- REQUIRED : not Is_Null(sols).
                    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:     dimsol : constant natural := Head_Of(sols).n;
                    407:     squ_target,squ_start : Poly_Sys(1..dimsol);
                    408:
                    409:   begin
                    410:     tstart(timer);
                    411:     if dimsol = n
                    412:      then Homotopy.Create(target,start,2,a,b,true);        -- linear cheater
                    413:      else squ_target := Square(dimsol,target);
                    414:           squ_start  := Square(dimsol,start);
                    415:           Homotopy.Create(squ_target,squ_start,2,a,b,true);
                    416:     end if;
                    417:     Continuation(file,sols,report);
                    418:     tstop(timer);
                    419:     new_line(file);
                    420:     print_times(file,timer,"Linear Cheater's homotopy to target system");
                    421:     if dimsol = n
                    422:      then Refine_Roots(file,target,sols);
                    423:      else Refine_Roots(file,squ_target,sols);
                    424:           Evaluate_Roots(file,target,sols);
                    425:     end if;
                    426:   end Path_Following_with_Cheater;
                    427:
                    428:   procedure Solve_Hypersurface_Target_System
                    429:                      ( file : in file_type; m,p : in natural;
                    430:                        start_planes,target_planes : in VecMat;
                    431:                        index_poset : in Array_of_Array_of_Nodes;
                    432:                        deform_poset : in Array_of_Array_of_VecMats;
                    433:                        target_level : in natural; report : in boolean ) is
                    434:
                    435:   -- DESCRIPTION :
                    436:   --   This procedure tests the output of the deformation poset,
                    437:   --   creating polynomial representations of the intersection conditions
                    438:   --   and solution lists representing the solution planes.
                    439:
                    440:   -- ON ENTRY :
                    441:   --   file            to write intermediate output on;
                    442:   --   m               dimension of the input planes;
                    443:   --   p               dimension of the solution planes;
                    444:   --   start_planes    input m-planes in general position;
                    445:   --   target_planes   specific input m-planes;
                    446:   --   index_poset     indexed localization poset;
                    447:   --   deform_poset    poset with the solution p-planes;
                    448:   --   target_level    indicates lowest node in deform_poset that is filled;
                    449:   --   report          switch for intermediate output during continuation.
                    450:
                    451:     dim : constant natural := m*p;
                    452:     xpm : Standard_Complex_Poly_Matrices.Matrix(1..m+p,1..p)
                    453:         := Localization_Pattern(m+p,index_poset(dim)(1).top,
                    454:                                     index_poset(dim)(1).bottom);
                    455:     solplanes : constant VecMat := deform_poset(target_level)(1).all;
                    456:     locmap : Standard_Natural_Matrices.Matrix(1..m+p,1..p)
                    457:            := Standard_Coordinate_Frame(xpm,solplanes(1).all);
                    458:     locsys : Poly_Sys(start_planes'range)
                    459:            := Create_Hypersurface_System(dim,locmap,xpm,start_planes);
                    460:     target : Poly_Sys(target_planes'range)
                    461:            := Create_Hypersurface_System(dim,locmap,xpm,target_planes);
                    462:     sols : Solution_List := Solution_Planes(locmap,solplanes);
                    463:
                    464:   begin
                    465:     Matrix_Indeterminates.Reduce_Symbols(locmap);
                    466:     put_line(file,"THE GENERIC SYSTEM : ");
                    467:     put_line(file,locsys);
                    468:     new_line(file);
                    469:     put_line(file,"The localization map :"); put(file,locmap);
                    470:     Refine_Roots(file,locsys,sols);
                    471:     new_line(file);
                    472:     put_line(file,"THE TARGET SYSTEM : ");
                    473:     put_line(file,target);
                    474:     new_line(file);
                    475:     Path_Following_with_Cheater(file,locsys,target,sols,report);
                    476:   end Solve_Hypersurface_Target_System;
                    477:
                    478:   procedure Solve_General_Target_System
                    479:                      ( file : in file_type; m,p : in natural; k : in Bracket;
                    480:                        start_planes,target_planes : in VecMat;
                    481:                        index_poset : in Array_of_Array_of_Nodes;
                    482:                        deform_poset : in Array_of_Array_of_VecMats;
                    483:                        target_level : in natural; report : in boolean ) is
                    484:
                    485:   -- DESCRIPTION :
                    486:   --   This procedure tests the output of the deformation poset,
                    487:   --   creating polynomial representations of the intersection conditions
                    488:   --   and solution lists representing the solution planes.
                    489:
                    490:   -- ON ENTRY :
                    491:   --   file            to write intermediate output on;
                    492:   --   m               dimension of the input planes;
                    493:   --   p               dimension of the solution planes;
                    494:   --   k               co-dimension conditions;
                    495:   --   start_planes    input (m+1-k(i))-planes in general position;
                    496:   --   target_planes   specific input (m+1-k(i))-planes;
                    497:   --   index_poset     indexed localization poset;
                    498:   --   deform_poset    poset with the solution p-planes;
                    499:   --   target_level    indicates lowest node in deform_poset that is filled;
                    500:   --   report          switch for intermediate output during continuation.
                    501:
                    502:     dim : constant natural := m*p;
                    503:     xpm : Standard_Complex_Poly_Matrices.Matrix(1..m+p,1..p)
                    504:         := Localization_Pattern(m+p,index_poset(dim)(1).top,
                    505:                                     index_poset(dim)(1).bottom);
                    506:     solplanes : constant VecMat := deform_poset(target_level)(1).all;
                    507:     locmap : Standard_Natural_Matrices.Matrix(1..m+p,1..p)
                    508:            := Standard_Coordinate_Frame(xpm,solplanes(1).all);
                    509:     homtpy : constant Poly_Sys
                    510:            := General_Homotopy(xpm,locmap,start_planes,target_planes);
                    511:     locsys : constant Poly_Sys
                    512:            := Create_General_System(locmap,xpm,start_planes);
                    513:     target : constant Poly_Sys
                    514:            := Create_General_System(locmap,xpm,target_planes);
                    515:     sols : Solution_List := Solution_Planes(locmap,solplanes);
                    516:
                    517:   begin
                    518:     Matrix_Indeterminates.Reduce_Symbols(locmap);
                    519:     put_line(file,"THE GENERIC SYSTEM : ");
                    520:     put_line(file,locsys);
                    521:     new_line(file);
                    522:     put_line(file,"The localization map :"); put(file,locmap);
                    523:     Evaluate_Roots(file,locsys,sols);
                    524:     new_line(file);
                    525:     put_line(file,"THE TARGET SYSTEM : ");
                    526:     put_line(file,target);
                    527:     new_line(file);
                    528:     General_Path_Following(file,target,homtpy,sols,report);
                    529:   end Solve_General_Target_System;
                    530:
                    531:   procedure Write_Poset_Times
                    532:                ( file : in file_type; timer : in Timing_Widget;
                    533:                  npaths : in Standard_Natural_Vectors.Vector;
                    534:                  timings : in Duration_Array ) is
                    535:
                    536:   -- DESCRIPTION :
                    537:   --   Writes a overview of #paths and timings spent during deformations
                    538:   --   along the poset structure.
                    539:
                    540:   begin
                    541:     new_line(file);
                    542:     put_line(file,"--------------------------------------");
                    543:     put_line(file,"|    TIMING INFORMATION OVERVIEW     |");
                    544:     put_line(file,"--------------------------------------");
                    545:     put_line(file,"|   n   |  #paths  |  user cpu time  |");
                    546:     put_line(file,"--------------------------------------");
                    547:     for i in npaths'range loop
                    548:       if npaths(i) /= 0
                    549:        then put(file,"|"); put(file,i,4); put(file,"   |");
                    550:             put(file,npaths(i),7);        put(file,"   | ");
                    551:             print_hms(file,timings(i));   put(file,"  |"); new_line(file);
                    552:       end if;
                    553:     end loop;
                    554:     put_line(file,"--------------------------------------");
                    555:     put(file,"| total |");
                    556:     put(file,Standard_Natural_Vectors.Sum(npaths),7);
                    557:     put(file,"   | ");
                    558:     print_hms(file,Elapsed_User_Time(timer));
                    559:     put(file,"  |"); new_line(file);
                    560:     put_line(file,"--------------------------------------");
                    561:   end Write_Poset_Times;
                    562:
                    563:   procedure Solve_Hypersurface_Deformation_Poset
                    564:                ( file : in file_type; m,p : in natural;
                    565:                  level_poset : in Array_of_Nodes;
                    566:                  index_poset : in Array_of_Array_of_Nodes ) is
                    567:
                    568:   -- DESCRIPTION :
                    569:   --   Creates a deformation poset and applies the Solve operator.
                    570:
                    571:     n : constant natural := m+p;
                    572:     deform_poset : Array_of_Array_of_VecMats(index_poset'range)
                    573:                  := Create(index_poset);
                    574:     planes : VecMat(1..m*p) := Random_Complex_Planes(m,p);
                    575:     target_planes : VecMat(1..m*p);
                    576:     ans : character;
                    577:     report,outlog : boolean;
                    578:     timer : Timing_Widget;
                    579:     target_level : natural := m*p;
                    580:     nbp : natural := 0;
                    581:     npaths : Standard_Natural_Vectors.Vector(1..target_level)
                    582:            := (1..target_level => 0);
                    583:     timings : Duration_Array(1..target_level) := (1..target_level => 0.0);
                    584:
                    585:   begin
                    586:     put_line("The size of the deformation poset : ");
                    587:     put_line(file,"The size of the deformation poset : ");
                    588:     put_roco(index_poset);
                    589:     put_roco(file,index_poset);
                    590:     new_line;
                    591:     put("Give target level <= "); put(target_level,1);
                    592:     put(" = root level by default : "); get(target_level);
                    593:     for i in 1..target_level loop
                    594:       nbp := nbp + Row_Root_Count_Sum(level_poset,i);
                    595:     end loop;
                    596:     put("The number of paths : "); put(nbp,1); new_line;
                    597:     put(file,"The number of paths : "); put(file,nbp,1); new_line(file);
                    598:     new_line;
                    599:     put("Do you want to have the homotopies on file ? (y/n) ");
                    600:     Ask_Yes_or_No(ans);
                    601:     outlog := (ans = 'y');
                    602:     if target_level < m*p
                    603:      then planes(m*p).all := Last_Standard_Plane(m,p);
                    604:           if target_level < m*p-1
                    605:            then planes(m*p-1).all := First_Standard_Plane(m,p);
                    606:           end if;
                    607:     end if;
                    608:     Driver_for_Input_Planes(file,m,p,target_planes);
                    609:     Matrix_Indeterminates.Initialize_Symbols(m+p,p);
                    610:     Add_t_Symbol;
                    611:     Set_Parameters(file,report);
                    612:     tstart(timer);
                    613:     for i in index_poset(target_level)'range loop
                    614:       declare
                    615:         root : Node := index_poset(target_level)(i).all;
                    616:       begin
                    617:         Solve(file,m+p,deform_poset,root,planes(1..target_level),
                    618:               report,outlog,npaths,timings);
                    619:       end;
                    620:     end loop;
                    621:     tstop(timer);
                    622:     new_line(file);
                    623:     print_times(file,timer,"Solving along the deformation poset");
                    624:     Write_Poset_Times(file,timer,
                    625:                       npaths(1..target_level),timings(1..target_level));
                    626:     if deform_poset(target_level)(1) /= null
                    627:      then new_line(file);
                    628:           Solve_Hypersurface_Target_System
                    629:             (file,m,p,planes,target_planes,index_poset,deform_poset,
                    630:              target_level,report);
                    631:     end if;
                    632:   end Solve_Hypersurface_Deformation_Poset;
                    633:
                    634:   procedure Solve_General_Deformation_Poset
                    635:                ( file : in file_type; m,p : in natural; k : in Bracket;
                    636:                  index_poset : in Array_of_Array_of_Nodes ) is
                    637:
                    638:   -- DESCRIPTION :
                    639:   --   Applies the solver to general intersection conditions.
                    640:
                    641:     deform_poset : Array_of_Array_of_VecMats(index_poset'range)
                    642:                  := Create(index_poset);
                    643:     planes : VecMat(k'range) := Random_Complex_Planes(m,p,k);
                    644:     target_planes : VecMat(k'range);
                    645:     ans : character;
                    646:     report,outlog : boolean;
                    647:     timer : Timing_Widget;
                    648:     target_level : natural := m*p;
                    649:     npaths : Standard_Natural_Vectors.Vector(1..target_level)
                    650:            := (1..target_level => 0);
                    651:     timings : Duration_Array(1..target_level) := (1..target_level => 0.0);
                    652:
                    653:   begin
                    654:     put_line("The size of the deformation poset : ");
                    655:     put_line(file,"The size of the deformation poset : ");
                    656:     put_roco(index_poset);
                    657:     put_roco(file,index_poset);
                    658:     new_line;
                    659:     put("Give target level <= "); put(target_level,1);
                    660:     put(" = root level by default : "); get(target_level);
                    661:     new_line;
                    662:     put("Do you want to have the homotopies on file ? (y/n) ");
                    663:     Ask_Yes_or_No(ans);
                    664:     outlog := (ans = 'y');
                    665:     Driver_for_Input_Planes(file,m,p,k,target_planes);
                    666:     Matrix_Indeterminates.Initialize_Symbols(m+p,p);
                    667:     Add_t_Symbol;
                    668:     Set_Parameters(file,report);
                    669:     tstart(timer);
                    670:     for i in index_poset(target_level)'range loop
                    671:       declare
                    672:         root : Node := index_poset(target_level)(i).all;
                    673:       begin
                    674:         Solve(file,m+p,k,deform_poset,root,planes,report,outlog,
                    675:               npaths,timings);
                    676:       end;
                    677:     end loop;
                    678:     tstop(timer);
                    679:     new_line(file);
                    680:     print_times(file,timer,"Solving along the deformation poset");
                    681:     Write_Poset_Times(file,timer,
                    682:                       npaths(1..target_level),timings(1..target_level));
                    683:     if deform_poset(target_level)(1) /= null
                    684:      then new_line(file);
                    685:           Solve_General_Target_System
                    686:             (file,m,p,k,planes,target_planes,index_poset,deform_poset,
                    687:              target_level,report);
                    688:     end if;
                    689:   end Solve_General_Deformation_Poset;
                    690:
                    691: -- HYPERSURFACE SOLVERS :
                    692:
                    693:   procedure Create_Top_Hypersurface_Poset
                    694:               ( file : in file_type; m,p : in natural ) is
                    695:
                    696:   -- DESCRIPTION :
                    697:   --   Create the poset by incrementing only top pivots.
                    698:
                    699:     timer : Timing_Widget;
                    700:     root : Node(p) := Trivial_Root(m,p);
                    701:     lnkroot : Link_to_Node := new Node'(root);
                    702:     level_poset : Array_of_Nodes(0..m*p);
                    703:     index_poset : Array_of_Array_of_Nodes(0..m*p);
                    704:
                    705:   begin
                    706:     tstart(timer);
                    707:     Top_Create(lnkroot,m+p);
                    708:     put_line("The poset created from the top : ");
                    709:     put_line(file,"The poset created from the top : ");
                    710:     level_poset := Create_Leveled_Poset(lnkroot);
                    711:     Count_Roots(level_poset);
                    712:     index_poset := Create_Indexed_Poset(level_poset);
                    713:     put(index_poset);
                    714:     put(file,index_poset);
                    715:     Solve_Hypersurface_Deformation_Poset(file,m,p,level_poset,index_poset);
                    716:     tstop(timer);
                    717:     new_line(file);
                    718:     print_times(file,timer,
                    719:                 "Total time for Hypersurface Pieri Homotopy Algorithm");
                    720:   end Create_Top_Hypersurface_Poset;
                    721:
                    722:   procedure Create_Bottom_Hypersurface_Poset
                    723:               ( file : in file_type; m,p : in natural ) is
                    724:
                    725:   -- DESCRIPTION :
                    726:   --   Create the poset by decrementing only bottom pivots.
                    727:
                    728:     timer : Timing_Widget;
                    729:     root : Node(p) := Trivial_Root(m,p);
                    730:     lnkroot : Link_to_Node := new Node'(root);
                    731:     level_poset : Array_of_Nodes(0..m*p);
                    732:     index_poset : Array_of_Array_of_Nodes(0..m*p);
                    733:
                    734:   begin
                    735:     tstart(timer);
                    736:     Bottom_Create(lnkroot);
                    737:     put_line("The poset created from the bottom : ");
                    738:     put_line(file,"The poset created from the bottom : ");
                    739:     level_poset := Create_Leveled_Poset(lnkroot);
                    740:     Count_Roots(level_poset);
                    741:     index_poset := Create_Indexed_Poset(level_poset);
                    742:     put(index_poset);
                    743:     put(file,index_poset);
                    744:     Solve_Hypersurface_Deformation_Poset(file,m,p,level_poset,index_poset);
                    745:     tstop(timer);
                    746:     new_line(file);
                    747:     print_times(file,timer,
                    748:                 "Total time for Hypersurface Pieri Homotopy Algorithm");
                    749:   end Create_Bottom_Hypersurface_Poset;
                    750:
                    751:   procedure Create_Mixed_Hypersurface_Poset
                    752:               ( file : in file_type; m,p : in natural ) is
                    753:
                    754:   -- DESCRIPTION :
                    755:   --   Create the poset by incrementing top and decrementing bottom pivots.
                    756:
                    757:     timer : Timing_Widget;
                    758:     root : Node(p) := Trivial_Root(m,p);
                    759:     lnkroot : Link_to_Node := new Node'(root);
                    760:     level_poset : Array_of_Nodes(0..m*p);
                    761:     index_poset : Array_of_Array_of_Nodes(0..m*p);
                    762:
                    763:   begin
                    764:     tstart(timer);
                    765:     Top_Bottom_Create(lnkroot,m+p);
                    766:     put_line("The poset created in a mixed fashion : ");
                    767:     put_line(file,"The poset created in a mixed fashion : ");
                    768:     level_poset := Create_Leveled_Poset(lnkroot);
                    769:     Count_Roots(level_poset);
                    770:     index_poset := Create_Indexed_Poset(level_poset);
                    771:     put(index_poset);
                    772:     put(file,index_poset);
                    773:     Solve_Hypersurface_Deformation_Poset(file,m,p,level_poset,index_poset);
                    774:     tstop(timer);
                    775:     new_line(file);
                    776:     print_times(file,timer,
                    777:                 "Total time for Hypersurface Pieri Homotopy Algorithm");
                    778:   end Create_Mixed_Hypersurface_Poset;
                    779:
                    780: -- GENERAL SOLVERS :
                    781:
                    782:   procedure Create_Top_General_Poset
                    783:               ( file : in file_type; m,p : in natural ) is
                    784:
                    785:   -- DESCRIPTION :
                    786:   --   Creates a poset for counting general subspace intersections,
                    787:   --   by consistently incrementing the top pivots.
                    788:
                    789:     timer : Timing_Widget;
                    790:     root : Node(p) := Trivial_Root(m,p);
                    791:     lnkroot : Link_to_Node := new Node'(root);
                    792:     codim : constant Bracket := Read_Codimensions(m,p,0);
                    793:     level_poset : Array_of_Nodes(0..m*p);
                    794:     index_poset : Array_of_Array_of_Nodes(0..m*p);
                    795:
                    796:   begin
                    797:     put(file,"  k = "); put(file,codim); new_line(file);
                    798:     tstart(timer);
                    799:     Top_Create(lnkroot,codim,m+p);
                    800:     put_line("The poset created from the top : ");
                    801:     put_line(file,"The poset created from the top : ");
                    802:     level_poset := Create_Leveled_Poset(lnkroot);
                    803:     Count_Roots(level_poset);
                    804:     index_poset := Create_Indexed_Poset(level_poset);
                    805:     put(index_poset);
                    806:        put(file,index_poset);
                    807:     Solve_General_Deformation_Poset(file,m,p,codim,index_poset);
                    808:     tstop(timer);
                    809:     new_line(file);
                    810:     print_times(file,timer,
                    811:                 "Total time for General Pieri Homotopy Algorithm");
                    812:   end Create_Top_General_Poset;
                    813:
                    814:   procedure Create_Bottom_General_Poset
                    815:               ( file : in file_type; m,p : in natural ) is
                    816:
                    817:   -- DESCRIPTION :
                    818:   --   Creates a poset for counting general subspace intersections,
                    819:   --   by consistently incrementing the top pivots.
                    820:
                    821:     timer : Timing_Widget;
                    822:     root : Node(p) := Trivial_Root(m,p);
                    823:     lnkroot : Link_to_Node := new Node'(root);
                    824:     codim : constant Bracket := Read_Codimensions(m,p,0);
                    825:     level_poset : Array_of_Nodes(0..m*p);
                    826:     index_poset : Array_of_Array_of_Nodes(0..m*p);
                    827:
                    828:   begin
                    829:     put(file,"  k = "); put(file,codim); new_line(file);
                    830:     tstart(timer);
                    831:     Bottom_Create(lnkroot,codim);
                    832:     put_line("The poset created from the bottom : ");
                    833:     put_line(file,"The poset created from the bottom : ");
                    834:     level_poset := Create_Leveled_Poset(lnkroot);
                    835:     Count_Roots(level_poset);
                    836:     index_poset := Create_Indexed_Poset(level_poset);
                    837:     put(index_poset);
                    838:     put(file,index_poset);
                    839:     Solve_General_Deformation_Poset(file,m,p,codim,index_poset);
                    840:     tstop(timer);
                    841:     new_line(file);
                    842:     print_times(file,timer,
                    843:                 "Total time for General Pieri Homotopy Algorithm");
                    844:   end Create_Bottom_General_Poset;
                    845:
                    846:   procedure Create_Mixed_General_Poset
                    847:               ( file : in file_type; m,p : in natural ) is
                    848:
                    849:   -- DESCRIPTION :
                    850:   --   Creates a poset for counting general subspace intersections,
                    851:   --   by incrementing the top and decrementing the bottom pivots.
                    852:
                    853:     timer : Timing_Widget;
                    854:     root : Node(p) := Trivial_Root(m,p);
                    855:     lnkroot : Link_to_Node := new Node'(root);
                    856:     codim : constant Bracket := Read_Codimensions(m,p,0);
                    857:     level_poset : Array_of_Nodes(0..m*p);
                    858:     index_poset : Array_of_Array_of_Nodes(0..m*p);
                    859:
                    860:   begin
                    861:     put(file,"  k = "); put(file,codim); new_line(file);
                    862:     tstart(timer);
                    863:     Top_Bottom_Create(lnkroot,codim,m+p);
                    864:     put_line("The poset created in a mixed fashion : ");
                    865:     put_line(file,"The poset created in a mixed fashion : ");
                    866:     level_poset := Create_Leveled_Poset(lnkroot);
                    867:     Count_Roots(level_poset);
                    868:     index_poset := Create_Indexed_Poset(level_poset);
                    869:     put(index_poset);
                    870:     put(file,index_poset);
                    871:     Solve_General_Deformation_Poset(file,m,p,codim,index_poset);
                    872:     tstop(timer);
                    873:     new_line(file);
                    874:     print_times(file,timer,
                    875:                 "Total time for General Pieri Homotopy Algorithm");
                    876:   end Create_Mixed_General_Poset;
                    877:
                    878:   procedure Main is
                    879:
                    880:     p : constant natural := d;
                    881:     m : constant natural := n-d;
                    882:     ans : character;
                    883:
                    884:   begin
                    885:     new_line;
                    886:     put_line("MENU for deforming p-planes in (m+p)-space, co-dimensions k : ");
                    887:     put_line("  1. k_i = 1  consistently incrementing the top pivots.");
                    888:     put_line("  2.          consistently decrementing the bottom pivots.");
                    889:     put_line("  3.          mixed top-bottom sequence for poset creation.");
                    890:     put_line("  4. k_i >= 1 consistently incrementing the top pivots.");
                    891:     put_line("  5.          consistently decrementing the bottom pivots.");
                    892:     put_line("  6.          mixed top-bottom sequence for poset creation.");
                    893:     put("Type 1, 2, 3, 4, 5, or 6 to choose : ");
                    894:     Ask_Alternative(ans,"123456");
                    895:     new_line;
                    896:     case ans is
                    897:       when '1' => new_line(file); Create_Top_Hypersurface_Poset(file,m,p);
                    898:       when '2' => new_line(file); Create_Bottom_Hypersurface_Poset(file,m,p);
                    899:       when '3' => new_line(file); Create_Mixed_Hypersurface_Poset(file,m,p);
                    900:       when '4' => Create_Top_General_Poset(file,m,p);
                    901:       when '5' => Create_Bottom_General_Poset(file,m,p);
                    902:       when '6' => Create_Mixed_General_Poset(file,m,p);
                    903:       when others => put_line("Option not recognized.  Please try again.");
                    904:     end case;
                    905:   end Main;
                    906:
                    907: begin
                    908:   Main;
                    909: end Driver_for_Pieri_Homotopies;

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