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

Annotation of OpenXM_contrib/PHC/Ada/Schubert/ts_defpos.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_Complex_Matrices;
                      5: with Standard_Complex_Matrices_io;       use Standard_Complex_Matrices_io;
                      6: with Standard_Random_Matrices;           use Standard_Random_Matrices;
                      7: with Standard_Complex_VecMats;           use Standard_Complex_VecMats;
                      8: with Symbol_Table;                       use Symbol_Table;
                      9: with Matrix_Indeterminates;
                     10: with Standard_Complex_Poly_Matrices;
                     11: with Standard_Complex_Poly_Matrices_io;  use Standard_Complex_Poly_Matrices_io;
                     12: with Drivers_for_Poly_Continuation;      use Drivers_for_Poly_Continuation;
                     13: with Brackets,Brackets_io;               use Brackets,Brackets_io;
                     14: with Symbolic_Minor_Equations;           use Symbolic_Minor_Equations;
                     15: with Pieri_Homotopies;                   use Pieri_Homotopies;
                     16: with Localization_Posets;                use Localization_Posets;
                     17: with Localization_Posets_io;             use Localization_Posets_io;
                     18: with Deformation_Posets;                 use Deformation_Posets;
                     19:
                     20: procedure ts_defpos is
                     21:
                     22: -- DESCRIPTION :
                     23: --   Test on the deformation posets.
                     24:
                     25:   procedure Add_t_Symbol is
                     26:
                     27:   -- DESCRIPTION :
                     28:   --   Adds the symbol for the continuation parameter t to the symbol table.
                     29:
                     30:     tsb : Symbol;
                     31:
                     32:   begin
                     33:     Symbol_Table.Enlarge(1);
                     34:     tsb(1) := 't';
                     35:     for i in 2..tsb'last loop
                     36:       tsb(i) := ' ';
                     37:     end loop;
                     38:     Symbol_Table.Add(tsb);
                     39:   end Add_t_Symbol;
                     40:
                     41:   procedure Set_Parameters ( file : in file_type; report : out boolean ) is
                     42:
                     43:   -- DESCRIPTION :
                     44:   --   Interactive determination of the continuation and output parameters.
                     45:
                     46:     oc : natural;
                     47:
                     48:   begin
                     49:     new_line;
                     50:     Driver_for_Continuation_Parameters(file);
                     51:     new_line;
                     52:     Driver_for_Process_io(file,oc);
                     53:     report := not (oc = 0);
                     54:     new_line;
                     55:     put_line("No more input expected.  See output file for results...");
                     56:     new_line;
                     57:     new_line(file);
                     58:   end Set_Parameters;
                     59:
                     60:   function Random_Input_Planes ( m,p : natural ) return VecMat is
                     61:
                     62:   -- DESCRIPTION :
                     63:   --   Returns a vector of m*p random m-planes.
                     64:
                     65:     res : VecMat(1..m*p);
                     66:     n : constant natural := m+p;
                     67:
                     68:   begin
                     69:     for i in res'range loop
                     70:       res(i) := new Standard_Complex_Matrices.Matrix'(Random_Matrix(n,m));
                     71:     end loop;
                     72:     return res;
                     73:   end Random_Input_Planes;
                     74:
                     75:   function Random_Input_Planes ( m,p : natural; k : Bracket ) return VecMat is
                     76:
                     77:   -- DESCRIPTION :
                     78:   --   Returns a vector of m*p random m-planes.
                     79:
                     80:     res : VecMat(k'range);
                     81:     n : constant natural := m+p;
                     82:
                     83:   begin
                     84:     for i in res'range loop
                     85:       res(i)
                     86:         := new Standard_Complex_Matrices.Matrix'(Random_Matrix(n,m+1-k(i)));
                     87:     end loop;
                     88:     return res;
                     89:   end Random_Input_Planes;
                     90:
                     91:   procedure Solve_Deformation_Poset
                     92:                ( file : in file_type; m,p : in natural;
                     93:                  level_poset : in Array_of_Nodes;
                     94:                  index_poset : in Array_of_Array_of_Nodes ) is
                     95:
                     96:   -- DESCRIPTION :
                     97:   --   Creates a deformation poset and applies the Solve operator.
                     98:
                     99:     deform_poset : Array_of_Array_of_VecMats(index_poset'range)
                    100:                  := Create(index_poset);
                    101:     planes : VecMat(1..m*p) := Random_Input_Planes(m,p);
                    102:     report : boolean;
                    103:     timer : Timing_Widget;
                    104:     target_level : natural := m*p;
                    105:     nbp : natural := 0;
                    106:
                    107:   begin
                    108:     put_line("The size of the deformation poset : ");
                    109:     put_line(file,"The size of the deformation poset : ");
                    110:     put_roco(index_poset);
                    111:     put_roco(file,index_poset);
                    112:     new_line;
                    113:     put("Give target level <= "); put(target_level,1);
                    114:     put(" = root level : "); get(target_level);
                    115:     for i in 1..target_level loop
                    116:       nbp := nbp + Row_Root_Count_Sum(level_poset,i);
                    117:     end loop;
                    118:     put("The number of paths : "); put(nbp,1); new_line;
                    119:     put(file,"The number of paths : "); put(file,nbp,1); new_line(file);
                    120:     Matrix_Indeterminates.Initialize_Symbols(m+p,p);
                    121:     Add_t_Symbol;
                    122:     skip_line;
                    123:     Set_Parameters(file,report);
                    124:     tstart(timer);
                    125:     for i in index_poset(target_level)'range loop
                    126:       declare
                    127:         root : Node := index_poset(target_level)(i).all;
                    128:       begin
                    129:         Solve(file,m+p,deform_poset,root,planes,report);
                    130:       end;
                    131:     end loop;
                    132:     tstop(timer);
                    133:     new_line(file);
                    134:     print_times(file,timer,"Solving along the deformation poset");
                    135:   end Solve_Deformation_Poset;
                    136:
                    137:   procedure Solve_Deformation_Poset
                    138:                ( file : in file_type; m,p : in natural; k : in Bracket;
                    139:                  index_poset : in Array_of_Array_of_Nodes ) is
                    140:
                    141:   -- DESCRIPTION :
                    142:   --   Applies the solver to general intersection conditions.
                    143:
                    144:     deform_poset : Array_of_Array_of_VecMats(index_poset'range)
                    145:                  := Create(index_poset);
                    146:     planes : VecMat(k'range) := Random_Input_Planes(m,p,k);
                    147:     report : boolean;
                    148:     timer : Timing_Widget;
                    149:     target_level : natural := m*p;
                    150:
                    151:   begin
                    152:     put_line("The size of the deformation poset : ");
                    153:     put_line(file,"The size of the deformation poset : ");
                    154:     put_roco(index_poset);
                    155:     put_roco(file,index_poset);
                    156:     new_line;
                    157:     put("Give target level <= "); put(target_level,1);
                    158:     put(" = root level : "); get(target_level);
                    159:     Matrix_Indeterminates.Initialize_Symbols(m+p,p);
                    160:     Add_t_Symbol;
                    161:     skip_line;
                    162:     Set_Parameters(file,report);
                    163:     tstart(timer);
                    164:     for i in index_poset(target_level)'range loop
                    165:       declare
                    166:         root : Node := index_poset(target_level)(i).all;
                    167:       begin
                    168:         if ((root.tp = top) or (root.tp = bottom))
                    169:          then --One_Solve(file,m+p,k,deform_poset,root,planes,report);
                    170:               Solve(file,m+p,k,deform_poset,root,planes,report);
                    171:          else Solve(file,m+p,k,deform_poset,root,planes,report);
                    172:         end if;
                    173:       end;
                    174:     end loop;
                    175:     tstop(timer);
                    176:     new_line(file);
                    177:     print_times(file,timer,"Solving along the deformation poset");
                    178:   end Solve_Deformation_Poset;
                    179:
                    180:   procedure Create_Top_Hypersurface_Poset
                    181:               ( file : in file_type; m,p : in natural ) is
                    182:
                    183:   -- DESCRIPTION :
                    184:   --   Create the poset by incrementing only top pivots.
                    185:
                    186:     root : Node(p) := Trivial_Root(m,p);
                    187:     lnkroot : Link_to_Node := new Node'(root);
                    188:     level_poset : Array_of_Nodes(0..m*p);
                    189:     index_poset : Array_of_Array_of_Nodes(0..m*p);
                    190:
                    191:   begin
                    192:     Top_Create(lnkroot,m+p);
                    193:     put_line("The poset created from the top : ");
                    194:     put_line(file,"The poset created from the top : ");
                    195:     level_poset := Create_Leveled_Poset(lnkroot);
                    196:     Count_Roots(level_poset);
                    197:     index_poset := Create_Indexed_Poset(level_poset);
                    198:     put(index_poset);
                    199:     put(file,index_poset);
                    200:     Solve_Deformation_Poset(file,m,p,level_poset,index_poset);
                    201:   end Create_Top_Hypersurface_Poset;
                    202:
                    203:   procedure Create_Bottom_Hypersurface_Poset
                    204:               ( file : in file_type; m,p : in natural ) is
                    205:
                    206:   -- DESCRIPTION :
                    207:   --   Create the poset by decrementing only bottom pivots.
                    208:
                    209:     root : Node(p) := Trivial_Root(m,p);
                    210:     lnkroot : Link_to_Node := new Node'(root);
                    211:     level_poset : Array_of_Nodes(0..m*p);
                    212:     index_poset : Array_of_Array_of_Nodes(0..m*p);
                    213:
                    214:   begin
                    215:     Bottom_Create(lnkroot);
                    216:     put_line("The poset created from the bottom : ");
                    217:     put_line(file,"The poset created from the bottom : ");
                    218:     level_poset := Create_Leveled_Poset(lnkroot);
                    219:     Count_Roots(level_poset);
                    220:     index_poset := Create_Indexed_Poset(level_poset);
                    221:     put(index_poset);
                    222:     put(file,index_poset);
                    223:     Solve_Deformation_Poset(file,m,p,level_poset,index_poset);
                    224:   end Create_Bottom_Hypersurface_Poset;
                    225:
                    226:   procedure Create_Mixed_Hypersurface_Poset
                    227:               ( file : in file_type; m,p : in natural ) is
                    228:
                    229:   -- DESCRIPTION :
                    230:   --   Create the poset by incrementing top and decrementing bottom pivots.
                    231:
                    232:     root : Node(p) := Trivial_Root(m,p);
                    233:     lnkroot : Link_to_Node := new Node'(root);
                    234:     level_poset : Array_of_Nodes(0..m*p);
                    235:     index_poset : Array_of_Array_of_Nodes(0..m*p);
                    236:
                    237:   begin
                    238:     Top_Bottom_Create(lnkroot,m+p);
                    239:     put_line("The poset created in a mixed fashion : ");
                    240:     put_line(file,"The poset created in a mixed fashion : ");
                    241:     level_poset := Create_Leveled_Poset(lnkroot);
                    242:     Count_Roots(level_poset);
                    243:     index_poset := Create_Indexed_Poset(level_poset);
                    244:     put(index_poset);
                    245:     put(file,index_poset);
                    246:     Solve_Deformation_Poset(file,m,p,level_poset,index_poset);
                    247:   end Create_Mixed_Hypersurface_Poset;
                    248:
                    249:   function Finite ( dim : Bracket; m,p : natural ) return boolean is
                    250:
                    251:   -- DESCRIPTION :
                    252:   --   Returns true if the codimensions yield a finite number of solutions.
                    253:
                    254:     sum : natural := 0;
                    255:
                    256:   begin
                    257:     for i in dim'range loop
                    258:       sum := sum + dim(i);
                    259:     end loop;
                    260:     if sum = m*p
                    261:      then return true;
                    262:      else return false;
                    263:     end if;
                    264:   end Finite;
                    265:
                    266:   function Read_Codimensions ( m,p : natural ) return Bracket is
                    267:
                    268:   -- DESCRIPTION :
                    269:   --   Reads the vector of codimensions and checks on finiteness.
                    270:
                    271:     codim : Bracket(1..m*p);
                    272:     n : natural;
                    273:     poset : Array_of_Nodes(0..m*p);
                    274:
                    275:   begin
                    276:     loop
                    277:       put("Give number of intersection conditions : "); get(n);
                    278:       put("Give "); put(n,1); put(" codimensions : ");
                    279:       for i in 1..n loop
                    280:         get(codim(i));
                    281:       end loop;
                    282:       for i in 1..n-1 loop
                    283:         put(codim(i),1); put(" + ");
                    284:       end loop;
                    285:       put(codim(n),1);
                    286:       if Finite(codim(1..n),m,p)
                    287:           then put(" = "); put(m*p,1); put_line("  Finite #sols.");
                    288:             exit;
                    289:           else put(" /= "); put(m*p,1);
                    290:             put_line("  Please try again.");
                    291:       end if;
                    292:     end loop;
                    293:     return codim(1..n);
                    294:   end Read_Codimensions;
                    295:
                    296:   procedure Create_Top_General_Poset
                    297:               ( file : in file_type; m,p : in natural ) is
                    298:
                    299:   -- DESCRIPTION :
                    300:   --   Creates a poset for counting general subspace intersections,
                    301:   --   by consistently incrementing the top pivots.
                    302:
                    303:     root : Node(p) := Trivial_Root(m,p);
                    304:     lnkroot : Link_to_Node := new Node'(root);
                    305:     codim : constant Bracket := Read_Codimensions(m,p);
                    306:     level_poset : Array_of_Nodes(0..m*p);
                    307:     index_poset : Array_of_Array_of_Nodes(0..m*p);
                    308:
                    309:   begin
                    310:     put(file,"  k = "); put(file,codim); new_line(file);
                    311:     Top_Create(lnkroot,codim,m+p);
                    312:     put_line("The poset created from the top : ");
                    313:     put_line(file,"The poset created from the top : ");
                    314:     level_poset := Create_Leveled_Poset(lnkroot);
                    315:     Count_Roots(level_poset);
                    316:     index_poset := Create_Indexed_Poset(level_poset);
                    317:     put(index_poset);
                    318:        put(file,index_poset);
                    319:     Solve_Deformation_Poset(file,m,p,codim,index_poset);
                    320:   end Create_Top_General_Poset;
                    321:
                    322:   procedure Create_Bottom_General_Poset
                    323:               ( file : in file_type; m,p : in natural ) is
                    324:
                    325:   -- DESCRIPTION :
                    326:   --   Creates a poset for counting general subspace intersections,
                    327:   --   by consistently incrementing the top pivots.
                    328:
                    329:     root : Node(p) := Trivial_Root(m,p);
                    330:     lnkroot : Link_to_Node := new Node'(root);
                    331:     codim : constant Bracket := Read_Codimensions(m,p);
                    332:     level_poset : Array_of_Nodes(0..m*p);
                    333:     index_poset : Array_of_Array_of_Nodes(0..m*p);
                    334:
                    335:   begin
                    336:     put(file,"  k = "); put(file,codim); new_line(file);
                    337:     Bottom_Create(lnkroot,codim);
                    338:     put_line("The poset created from the bottom : ");
                    339:     put_line(file,"The poset created from the bottom : ");
                    340:     level_poset := Create_Leveled_Poset(lnkroot);
                    341:     Count_Roots(level_poset);
                    342:     index_poset := Create_Indexed_Poset(level_poset);
                    343:     put(index_poset);
                    344:     put(file,index_poset);
                    345:     Solve_Deformation_Poset(file,m,p,codim,index_poset);
                    346:   end Create_Bottom_General_Poset;
                    347:
                    348:   procedure Create_Mixed_General_Poset
                    349:               ( file : in file_type; m,p : in natural ) is
                    350:
                    351:   -- DESCRIPTION :
                    352:   --   Creates a poset for counting general subspace intersections,
                    353:   --   by incrementing the top and decrementing the bottom pivots.
                    354:
                    355:     root : Node(p) := Trivial_Root(m,p);
                    356:     lnkroot : Link_to_Node := new Node'(root);
                    357:     codim : constant Bracket := Read_Codimensions(m,p);
                    358:     level_poset : Array_of_Nodes(0..m*p);
                    359:     index_poset : Array_of_Array_of_Nodes(0..m*p);
                    360:
                    361:   begin
                    362:     put(file,"  k = "); put(file,codim); new_line(file);
                    363:     Top_Bottom_Create(lnkroot,codim,m+p);
                    364:     put_line("The poset created in a mixed fashion : ");
                    365:     put_line(file,"The poset created in a mixed fashion : ");
                    366:     level_poset := Create_Leveled_Poset(lnkroot);
                    367:     Count_Roots(level_poset);
                    368:     index_poset := Create_Indexed_Poset(level_poset);
                    369:     put(index_poset);
                    370:     put(file,index_poset);
                    371:     Solve_Deformation_Poset(file,m,p,codim,index_poset);
                    372:   end Create_Mixed_General_Poset;
                    373:
                    374:   procedure Main is
                    375:
                    376:     m,p : natural;
                    377:     ans : character;
                    378:     file : file_type;
                    379:
                    380:   begin
                    381:     new_line;
                    382:     put_line("MENU for posets for deforming p-planes in (m+p)-space : ");
                    383:     put_line("  1. k_i = 1  consistently incrementing the top pivots.");
                    384:     put_line("  2.          consistently decrementing the bottom pivots.");
                    385:     put_line("  3.          mixed top-bottom sequence for poset creation.");
                    386:     put_line("  4. k_i >= 1 consistently incrementing the top pivots.");
                    387:     put_line("  5.          consistently decrementing the bottom pivots.");
                    388:     put_line("  6.          mixed top-bottom sequence for poset creation.");
                    389:     put("Type 1, 2, 3, 4, 5, or 6 to choose : "); get(ans);
                    390:     skip_line; new_line;
                    391:     put_line("Reading the name of the file for the deformations.");
                    392:     Read_Name_and_Create_File(file);
                    393:     new_line;
                    394:     put("Give p, the number of entries in bracket : "); get(p);
                    395:     put("Give m, the complementary dimension : "); get(m);
                    396:     put(file,"p = "); put(file,p,1); put(file,"  m = "); put(file,m,1);
                    397:     new_line;
                    398:     case ans is
                    399:       when '1' => new_line(file); Create_Top_Hypersurface_Poset(file,m,p);
                    400:       when '2' => new_line(file); Create_Bottom_Hypersurface_Poset(file,m,p);
                    401:       when '3' => new_line(file); Create_Mixed_Hypersurface_Poset(file,m,p);
                    402:       when '4' => Create_Top_General_Poset(file,m,p);
                    403:       when '5' => Create_Bottom_General_Poset(file,m,p);
                    404:       when '6' => Create_Mixed_General_Poset(file,m,p);
                    405:       when others => put_line("Option not recognized.  Please try again.");
                    406:     end case;
                    407:   end Main;
                    408:
                    409: begin
                    410:   new_line;
                    411:   put_line("Test on deformation posets for linear subspace intersections.");
                    412:   Main;
                    413: end ts_defpos;

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