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

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

1.1       maekawa     1: with unchecked_deallocation;
                      2: with integer_io;                         use integer_io;
                      3: with Timing_Package;                     use Timing_Package;
                      4: with Characters_and_Numbers;             use Characters_and_Numbers;
                      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_Complex_Numbers_io;        use Standard_Complex_Numbers_io;
                      9: with Standard_Complex_Vectors_io;        use Standard_Complex_Vectors_io;
                     10: with Standard_Natural_Matrices;
                     11: with Standard_Complex_Matrices;
                     12: with Standard_Complex_Matrices_io;       use Standard_Complex_Matrices_io;
                     13: with Standard_Complex_Polynomials;       use Standard_Complex_Polynomials;
                     14: with Symbol_Table;                       use Symbol_Table;
                     15: with Standard_Complex_Poly_Functions;    use Standard_Complex_Poly_Functions;
                     16: with Standard_Complex_Poly_SysFun;       use Standard_Complex_Poly_SysFun;
                     17: with Standard_Complex_Poly_Systems;      use Standard_Complex_Poly_Systems;
                     18: with Standard_Complex_Poly_Systems_io;   use Standard_Complex_Poly_Systems_io;
                     19: with Standard_Complex_Poly_Matrices;
                     20: with Standard_Complex_Poly_Matrices_io;  use Standard_Complex_Poly_Matrices_io;
                     21: with Brackets,Brackets_io;               use Brackets,Brackets_io;
                     22: with Bracket_Monomials;                  use Bracket_Monomials;
                     23: with Bracket_Polynomials;                use Bracket_Polynomials;
                     24: with Bracket_Systems;                    use Bracket_Systems;
                     25: with Bracket_Systems_io;                 use Bracket_Systems_io;
                     26: with Plane_Representations;              use Plane_Representations;
                     27: with Symbolic_Minor_Equations;           use Symbolic_Minor_Equations;
                     28: with Numeric_Minor_Equations;            use Numeric_Minor_Equations;
                     29: with Determinantal_Systems;              use Determinantal_Systems;
                     30: with Specialization_of_Planes;           use Specialization_of_Planes;
                     31: with Curves_into_Grassmannian;           use Curves_into_Grassmannian;
                     32: with Curves_into_Grassmannian_io;        use Curves_into_Grassmannian_io;
                     33: with Pieri_Homotopies;                   use Pieri_Homotopies;
                     34: with Pieri_Continuation;                 use Pieri_Continuation;
                     35:
                     36: package body Deformation_Posets is
                     37:
                     38: -- BRACKET AUXILIARITIES TO DETERMINE PIVOTS :
                     39:
                     40:   function Complement ( n : natural; b : Bracket ) return Bracket is
                     41:
                     42:   -- DESCRIPTION :
                     43:   --   Returns the complement of the bracket b, defined as a bracket
                     44:   --   of range 1..n-b'length as an ordered subset of {1..n} \ b.
                     45:
                     46:     res : Bracket(1..n-b'last);
                     47:     cnt : natural := 0;
                     48:     ind : natural := 1;
                     49:
                     50:   begin
                     51:     for i in 1..n loop
                     52:       if ((ind > b'last) or else (i < b(ind)))
                     53:        then cnt := cnt+1;
                     54:             res(cnt) := i;
                     55:        elsif i = b(ind)
                     56:            then ind := ind+1;
                     57:       end if;
                     58:     end loop;
                     59:     return res;
                     60:   end Complement;
                     61:
                     62:   function Remove ( b : Bracket; l : natural ) return Bracket is
                     63:
                     64:   -- DESCRIPTION :
                     65:   --   Returns a smaller bracket that does not contain l.
                     66:
                     67:   -- REQUIRED : there exists a k: b(k) = l.
                     68:
                     69:     res : Bracket(1..b'last-1);
                     70:     cnt : natural := 0;
                     71:
                     72:   begin
                     73:     for i in b'range loop
                     74:       if b(i) /= l
                     75:        then cnt := cnt+1;
                     76:             res(cnt) := b(i);
                     77:       end if;
                     78:     end loop;
                     79:     return res;
                     80:   end Remove;
                     81:
                     82:   function Is_In  ( b : Bracket; l : natural ) return boolean is
                     83:
                     84:   -- DESCRIPTION :
                     85:   --   Returns true if there exists an index k such that b(k) = l.
                     86:
                     87:   begin
                     88:     for k in b'range loop
                     89:       if b(k) = l
                     90:        then return true;
                     91:       end if;
                     92:     end loop;
                     93:     return false;
                     94:   end Is_In;
                     95:
                     96:   function Remove ( b1,b2 : Bracket ) return Bracket is
                     97:
                     98:   -- DESCRIPTION :
                     99:   --   Returns b1 minus the first element in b2 that also occurs in b1.
                    100:
                    101:   begin
                    102:     for i in b2'range loop
                    103:       if Is_In(b1,b2(i))
                    104:        then return Remove(b1,b2(i));
                    105:       end if;
                    106:     end loop;
                    107:     return b1;
                    108:   end Remove;
                    109:
                    110:   function Remove ( cols,b,subb : Bracket ) return Bracket is
                    111:
                    112:   -- DESCRIPTION :
                    113:   --   The indices in cols correspond to the entries in b.
                    114:   --   The bracket subb is a sub-bracket of b, with only one entry removed.
                    115:   --   The indices on return correspond to the entries in subb.
                    116:
                    117:     res : Bracket(subb'range);
                    118:
                    119:   begin
                    120:     for i in subb'range loop
                    121:       if b(i) = subb(i)
                    122:        then res(i) := cols(i);
                    123:        else res(i) := cols(i+1);
                    124:       end if;
                    125:     end loop;
                    126:     return res;
                    127:   end Remove;
                    128:
                    129: -- POSET-ORIENTED PIERI DEFORMATIONS :
                    130:
                    131:   function Leaf_Plane ( n : natural; nd : Node )
                    132:                       return Standard_Complex_Matrices.Matrix is
                    133:
                    134:   -- DESCRIPTION :
                    135:   --   Returns the solution plane that corresponds to a leaf of the poset.
                    136:
                    137:     res : Standard_Complex_Matrices.Matrix(1..n,nd.top'range);
                    138:
                    139:   begin
                    140:     for i in res'range(1) loop
                    141:       for j in res'range(2) loop
                    142:         res(i,j) := Create(0.0);
                    143:       end loop;
                    144:     end loop;
                    145:     for i in nd.top'range loop
                    146:       res(nd.top(i),i) := Create(1.0);
                    147:     end loop;
                    148:     return res;
                    149:   end Leaf_Plane;
                    150:
                    151: -- DEFORMATIONS :
                    152:
                    153:   function Path_Coordinates ( level,label,child : natural )
                    154:                             return string is
                    155:   begin
                    156:     return "tracing (User time) at node("
                    157:            & Convert(level) & ")("
                    158:            & Convert(label) & ") from child "
                    159:            & Convert(child);
                    160:   end Path_Coordinates;
                    161:
                    162:   procedure Write_Path_Coordinates
                    163:                  ( file : in file_type;
                    164:                    level,label,path,child,childpath : in natural ) is
                    165:
                    166:   -- DESCRIPTION :
                    167:   --   Writes all coordinates from the current path that is to be traced.
                    168:
                    169:   begin
                    170:     put(file,"Tracing at node("); put(file,level,1); put(file,")(");
                    171:     put(file,label,1); put(file,") path "); put(file,path,1);
                    172:     put(file," as path "); put(file,childpath,1);
                    173:     put(file," from child "); put(file,child,1); new_line(file);
                    174:   end Write_Path_Coordinates;
                    175:
                    176:   procedure Write_Path_Coordinates
                    177:                  ( file : in file_type;
                    178:                    level,label,child : in natural ) is
                    179:
                    180:   -- DESCRIPTION :
                    181:   --   Writes all coordinates from the current path that is to be traced.
                    182:
                    183:   begin
                    184:     put(file,"Tracing paths at node("); put(file,level,1); put(file,")(");
                    185:     put(file,label,1);
                    186:     put(file,") from child "); put(file,child,1); new_line(file);
                    187:   end Write_Path_Coordinates;
                    188:
                    189:   procedure Deform_from_Children
                    190:                  ( file : in file_type;
                    191:                    poset : in out Array_of_Array_of_VecMats;
                    192:                    nd : in Node; n,uplevel : in natural;
                    193:                    homotopy : in Poly_Sys; report,outlog : in boolean;
                    194:                    x : in Standard_Complex_Poly_Matrices.Matrix;
                    195:                    npaths : in out Standard_Natural_Vectors.Vector;
                    196:                    timings : in out Duration_Array ) is
                    197:
                    198:   -- DESCRIPTION :
                    199:   --   Deforms from the i-th non-empty child of nd at uplevel.
                    200:
                    201:   -- ON ENTRY :
                    202:   --   file        to write intermediate results on;
                    203:   --   poset       poset of solution p-planes;
                    204:   --   nd          current node in the localization poset;
                    205:   --   n           dimension of the working space;
                    206:   --   uplevel     level where to find the start planes in the poset;
                    207:   --   homotopy    family of moving planes;
                    208:   --   report      indicates whether intermediate output during continuation;
                    209:   --   outlog      flag to write homotopies on file if set to true.
                    210:   --   x           matrix of unknowns according to a localization pattern.
                    211:
                    212:   -- ON RETURN :
                    213:   --   poset       updated poset of solution p-planes;
                    214:   --   npaths      updated number of paths traced at that level;
                    215:   --   timings     updated elapsed user timings.
                    216:
                    217:     locmap : Standard_Natural_Matrices.Matrix(1..n,1..nd.p);
                    218:     solcnt : natural := 0;
                    219:     label : natural;
                    220:
                    221:   begin
                    222:     for i in nd.child_labels'range loop
                    223:       label := nd.child_labels(i);
                    224:       if not Empty(poset,uplevel,label)  -- child.roco > 0
                    225:        then
                    226:          Write_Path_Coordinates(file,nd.level,nd.label,label);
                    227:          declare
                    228:            planes : VecMat(poset(uplevel)(label)'range);
                    229:            timer : Timing_Widget;
                    230:          begin
                    231:            tstart(timer);
                    232:            for i in planes'range loop  -- create to avoid sharing
                    233:              planes(i) := new Standard_Complex_Matrices.Matrix'
                    234:                                 (poset(uplevel)(label)(i).all);
                    235:            end loop;
                    236:            locmap := Standard_Coordinate_Frame(x,planes(planes'first).all);
                    237:            Trace_Paths(file,homotopy,locmap,report,outlog,planes);
                    238:            for i in planes'range loop
                    239:              solcnt := solcnt+1;
                    240:              poset(nd.level)(nd.label)(solcnt) := planes(i);
                    241:            end loop;
                    242:            tstop(timer);
                    243:            new_line(file);
                    244:            print_times(file,timer,Path_Coordinates(nd.level,nd.label,label));
                    245:            new_line(file);
                    246:            timings(nd.level) := timings(nd.level) + Elapsed_User_Time(timer);
                    247:          end;
                    248:       end if;
                    249:     end loop;
                    250:     npaths(nd.level) := npaths(nd.level) + solcnt;
                    251:   end Deform_from_Children;
                    252:
                    253:   procedure Quantum_Deform_from_Children
                    254:                  ( file : in file_type;
                    255:                    poset : in out Array_of_Array_of_VecMats;
                    256:                    nd : in Node; n,q,uplevel : in natural;
                    257:                    homotopy : in Poly_Sys; conpar,s_mode : in natural;
                    258:                    report,outlog : in boolean;
                    259:                    x : in Standard_Complex_Poly_Matrices.Matrix;
                    260:                    npaths : in out Standard_Natural_Vectors.Vector;
                    261:                    timings : in out Duration_Array ) is
                    262:
                    263:   -- DESCRIPTION :
                    264:   --   Deforms from the i-th non-empty child of nd at uplevel.
                    265:   --   This is the quantum analogue to the hypersurface Pieri.
                    266:
                    267:   -- ON ENTRY :
                    268:   --   file        to write intermediate results on;
                    269:   --   poset       poset of solution p-planes;
                    270:   --   nd          current node in the localization poset;
                    271:   --   n           dimension of the working space;
                    272:   --   q           degree of the curve;
                    273:   --   uplevel     level where to find the start planes in the poset;
                    274:   --   homotopy    family of moving planes;
                    275:   --   conpar      number of the continuation parameter;
                    276:   --   s_mode      if = 0, then s = 0, otherwise s = 1 at start;
                    277:   --   report      indicates whether intermediate output during continuation;
                    278:   --   outlog      flag to write homotopies on file if set to true;
                    279:   --   x           symbolic representation of the curve matrix of polynomials.
                    280:
                    281:   -- ON RETURN :
                    282:   --   poset       updated poset of solution p-planes;
                    283:   --   npaths      updated number of paths at each level;
                    284:   --   timings     updated CPU user timings for each level.
                    285:
                    286:     m : constant natural := n - nd.p;
                    287:     rws : constant natural := n*(q+1);
                    288:     locmap : Standard_Natural_Matrices.Matrix(1..rws,1..nd.p);
                    289:     solcnt : natural := 0;
                    290:     label : natural;
                    291:
                    292:   begin
                    293:     for i in nd.child_labels'range loop
                    294:       label := nd.child_labels(i);
                    295:       if not Empty(poset,uplevel,label)  -- child.roco > 0
                    296:        then
                    297:          Write_Path_Coordinates(file,nd.level,nd.label,label);
                    298:          declare
                    299:            planes : VecMat(poset(uplevel)(label)'range);
                    300:            timer : Timing_Widget;
                    301:          begin
                    302:            tstart(timer);
                    303:            for i in planes'range loop  -- create to avoid sharing
                    304:              planes(i) := new Standard_Complex_Matrices.Matrix'
                    305:                                 (poset(uplevel)(label)(i).all);
                    306:            end loop;
                    307:            locmap := Standard_Coordinate_Frame
                    308:                         (m,nd.p,q,nd.top,nd.bottom,planes(planes'first).all);
                    309:            Quantum_Trace_Paths
                    310:              (file,m,nd.p,q,nd,homotopy,conpar,s_mode,locmap,
                    311:               report,outlog,planes);
                    312:            for i in planes'range loop
                    313:              solcnt := solcnt+1;
                    314:              poset(nd.level)(nd.label)(solcnt) := planes(i);
                    315:            end loop;
                    316:            tstop(timer);
                    317:            new_line(file);
                    318:            print_times(file,timer,Path_Coordinates(nd.level,nd.label,label));
                    319:            new_line(file);
                    320:            timings(nd.level) := timings(nd.level) + Elapsed_User_Time(timer);
                    321:          end;
                    322:       end if;
                    323:     end loop;
                    324:     npaths(nd.level) := npaths(nd.level) + solcnt;
                    325:   end Quantum_Deform_from_Children;
                    326:
                    327:   procedure Hypersurface_Deform
                    328:                  ( file : in file_type; n : in natural;
                    329:                    poset : in out Array_of_Array_of_VecMats;
                    330:                    nd : in Node; expbp : in Bracket_Polynomial;
                    331:                    planes : in VecMat; report,outlog : in boolean;
                    332:                    npaths : in out Standard_Natural_Vectors.Vector;
                    333:                    timings : in out Duration_Array ) is
                    334:
                    335:   -- DESCRIPTION :
                    336:   --   Does the Pieri deformations to the node, same specifications as Solve
                    337:   --   for the hypersurface case.
                    338:
                    339:   -- REQUIRED : nd.level > 0, solutions at children of nd are in poset.
                    340:
                    341:     xpm : Standard_Complex_Poly_Matrices.Matrix(1..n,1..nd.p)
                    342:         := Localization_Pattern(n,nd.top,nd.bottom);
                    343:     homsys : Poly_Sys(1..nd.level);
                    344:
                    345:   begin
                    346:     if nd.tp = mixed
                    347:      then homsys := Two_Hypersurface_Pieri_Homotopy(n,nd,expbp,xpm,planes);
                    348:           Deform_from_Children
                    349:             (file,poset,nd,n,nd.level-2,homsys,report,outlog,
                    350:              xpm,npaths,timings);
                    351:      else homsys := One_Hypersurface_Pieri_Homotopy(n,nd,expbp,xpm,planes);
                    352:           Deform_from_Children
                    353:             (file,poset,nd,n,nd.level-1,homsys,report,outlog,
                    354:              xpm,npaths,timings);
                    355:     end if;
                    356:     Standard_Complex_Poly_Matrices.Clear(xpm);
                    357:     Clear(homsys);
                    358:   end Hypersurface_Deform;
                    359:
                    360:   procedure One_General_Deform
                    361:                   ( file : in file_type; n,ind : in natural;
                    362:                     poset : in out Array_of_Array_of_VecMats; nd : in Node;
                    363:                     start,target : in Standard_Complex_Matrices.Matrix;
                    364:                     planes : in VecMat; bs : in Bracket_System;
                    365:                     report,outlog : in boolean;
                    366:                     npaths : in out Standard_Natural_Vectors.Vector;
                    367:                     timings : in out Duration_Array ) is
                    368:
                    369:   -- DESCRIPTION :
                    370:   --   Does the Pieri deformations to the node, same specifications as Solve
                    371:   --   for the general case.
                    372:
                    373:   -- REQUIRED : nd.level > 0, solutions at children of nd are in poset.
                    374:
                    375:   -- ON ENTRY :
                    376:   --   file         to write intermediate output to;
                    377:   --   n            number of rows in the matrices;
                    378:   --   ind          planes(ind) is currently being folded in with this chain;
                    379:   --   poset        contains solution planes at higher levels;
                    380:   --   nd           current node in the localization poset;
                    381:   --   start        start (m+1-k)-plane for pivots;
                    382:   --   target       target (m+1-k)-plane for pivots;
                    383:   --   planes       target planes;
                    384:   --   bs           structure to expand the minors;
                    385:   --   report       switch to determine output during continuation;
                    386:   --   outlog       flag to write homotopies on file if set to true.
                    387:
                    388:   -- ON RETURN :
                    389:   --   poset        solution planes at (nd.level)(nd.label) are determined;
                    390:   --   npaths       number of paths followed at each level;
                    391:   --   timings      CPU user time at each level.
                    392:
                    393:     xpm : Standard_Complex_Poly_Matrices.Matrix(1..n,1..nd.p)
                    394:         := Localization_Pattern(n,nd.top,nd.bottom);
                    395:     hom : Link_to_Poly_Sys
                    396:         := One_General_Pieri_Homotopy(n,ind,nd,bs,start,target,xpm,planes);
                    397:
                    398:   begin
                    399:     Deform_from_Children
                    400:       (file,poset,nd,n,nd.level-1,hom.all,report,outlog,xpm,npaths,timings);
                    401:     Standard_Complex_Poly_Matrices.Clear(xpm);
                    402:     Clear(hom);
                    403:   end One_General_Deform;
                    404:
                    405:   procedure Two_General_Deform
                    406:                   ( file : in file_type; n,ind : in natural;
                    407:                     poset : in out Array_of_Array_of_VecMats; nd : in Node;
                    408:                     top_start,top_target,bot_start,bot_target
                    409:                       : in Standard_Complex_Matrices.Matrix;
                    410:                     planes : in VecMat; top_bs,bot_bs : in Bracket_System;
                    411:                     report,outlog : in boolean;
                    412:                     npaths : in out Standard_Natural_Vectors.Vector;
                    413:                     timings : in out Duration_Array ) is
                    414:
                    415:   -- DESCRIPTION :
                    416:   --   Does the Pieri deformations to the node, same specifications as Solve
                    417:   --   for the general case.
                    418:
                    419:   -- REQUIRED : nd.level > 0, solutions at children of nd are in poset.
                    420:
                    421:   -- ON ENTRY :
                    422:   --   file         to write intermediate output to;
                    423:   --   n            number of rows in the matrices;
                    424:   --   ind          planes(ind) is currently being folded in with this chain;
                    425:   --   poset        contains solution planes at higher levels;
                    426:   --   nd           current node in the localization poset;
                    427:   --   top_start    start (m+1-k)-plane for top pivots;
                    428:   --   top_target   target (m+1-k)-plane for top pivots;
                    429:   --   bot_start    start (m+1-k)-plane for bottom pivots;
                    430:   --   bot_target   target (m+1-k)-plane for bottom pivots;
                    431:   --   planes       target planes;
                    432:   --   top_bs       structure to expand the minors for top pivots;
                    433:   --   bot_bs       structure to expand the minors for bottom pivots;
                    434:   --   report       switch to determine output during continuation;
                    435:   --   outlog       flag to write homotopies on file if set to true.
                    436:
                    437:   -- ON RETURN :
                    438:   --   poset        solution planes at (nd.level)(nd.label) are determined;
                    439:   --   npaths       number of paths traced at each level;
                    440:   --   timings      updated CPU user times for each level.
                    441:
                    442:     xpm : Standard_Complex_Poly_Matrices.Matrix(1..n,1..nd.p)
                    443:         := Localization_Pattern(n,nd.top,nd.bottom);
                    444:     homotopy : Link_to_Poly_Sys;
                    445:
                    446:   begin
                    447:     case nd.tp is
                    448:       when top
                    449:         => homotopy := One_General_Pieri_Homotopy
                    450:                          (n,ind,nd,top_bs,top_start,top_target,xpm,planes);
                    451:            Deform_from_Children
                    452:              (file,poset,nd,n,nd.level-1,homotopy.all,report,outlog,xpm,
                    453:               npaths,timings);
                    454:       when bottom
                    455:         => homotopy := One_General_Pieri_Homotopy
                    456:                          (n,ind,nd,bot_bs,bot_start,bot_target,xpm,planes);
                    457:            Deform_from_Children
                    458:              (file,poset,nd,n,nd.level-1,homotopy.all,report,outlog,xpm,
                    459:               npaths,timings);
                    460:       when mixed
                    461:         => homotopy := Two_General_Pieri_Homotopy
                    462:                          (n,ind,nd,top_bs,bot_bs,top_start,top_target,
                    463:                           bot_start,bot_target,xpm,planes);
                    464:            Deform_from_Children
                    465:              (file,poset,nd,n,nd.level-2,homotopy.all,report,outlog,xpm,
                    466:               npaths,timings);
                    467:     end case;
                    468:     Standard_Complex_Poly_Matrices.Clear(xpm);
                    469:     Clear(homotopy);
                    470:   end Two_General_Deform;
                    471:
                    472:   procedure Quantum_Deform
                    473:              ( file : in file_type; n,q : in natural;
                    474:                poset : in out Array_of_Array_of_VecMats;
                    475:                nd : in Node; expbp : in Bracket_Polynomial;
                    476:                planes : in VecMat; s : Standard_Complex_Vectors.Vector;
                    477:                report,outlog : in boolean;
                    478:                npaths : in out Standard_Natural_Vectors.Vector;
                    479:                timings : in out Duration_Array ) is
                    480:
                    481:   -- DESCRIPTION :
                    482:   --   This is the q-analogue to the Hypersurface Deform.
                    483:
                    484:   -- REQUIRED : nd.level > 0, solutions at children of nd are in poset.
                    485:
                    486:     m : constant natural := n-nd.p;
                    487:     xpm : Standard_Complex_Poly_Matrices.Matrix(1..n,1..nd.p)
                    488:         := Symbolic_Create(m,nd.p,q,nd.top,nd.bottom);
                    489:
                    490:   begin
                    491:     if outlog
                    492:      then put(file,"Curve at node(");
                    493:           put(file,nd.level,1); put(file,")("); put(file,nd.label,1);
                    494:           put(file,") for pivots (");
                    495:           put(file,nd.top); put(file,","); put(file,nd.bottom);
                    496:           put_line(file,") :");
                    497:           One_Set_up_Symbol_Table(m,nd.p,q,nd.top,nd.bottom);
                    498:           put(file,xpm);
                    499:     end if;
                    500:     if nd.tp = mixed
                    501:      then
                    502:        declare
                    503:          homsys : Poly_Sys(1..nd.level+2);
                    504:        begin
                    505:          homsys := Two_Quantum_Pieri_Homotopy(n,nd,expbp,xpm,planes,s);
                    506:          if outlog
                    507:           then Two_Set_up_Symbol_Table(m,nd.p,q,nd.top,nd.bottom);
                    508:                put_line(file,"The homotopy : "); put_line(file,homsys);
                    509:          end if;
                    510:          Quantum_Deform_from_Children
                    511:            (file,poset,nd,n,q,nd.level-2,homsys,nd.level+3,1,
                    512:             report,outlog,xpm,npaths,timings);
                    513:          Clear(homsys);
                    514:        end;
                    515:      else
                    516:        declare
                    517:          homsys : Poly_Sys(1..nd.level+1);
                    518:        begin
                    519:          homsys := One_Quantum_Pieri_Homotopy(n,nd,expbp,xpm,planes,s);
                    520:          if outlog
                    521:           then put_line(file,"The homotopy : "); put_line(file,homsys);
                    522:          end if;
                    523:          Quantum_Deform_from_Children
                    524:            (file,poset,nd,n,q,nd.level-1,homsys,nd.level+2,1,
                    525:             report,outlog,xpm,npaths,timings);
                    526:          Clear(homsys);
                    527:        end;
                    528:     end if;
                    529:     Standard_Complex_Poly_Matrices.Clear(xpm);
                    530:   end Quantum_Deform;
                    531:
                    532:   function Moving_Point_Mode
                    533:              ( l,k : natural; modpiv : Bracket ) return natural is
                    534:
                    535:   -- DESCRIPTION :
                    536:   --   Returns a natural number that indicates the moving of the
                    537:   --   interpolation point.  The value on return means the following
                    538:   --   when = 0 : s goes from 0 to 1;
                    539:   --        = 1 : s remains constant at 1;
                    540:   --        = 2 : s goes from 1 to a target value.
                    541:
                    542:   begin
                    543:     if l = 0
                    544:      then return 2;
                    545:      elsif l = k-1 and modpiv(1) > 1
                    546:          then return 0;
                    547:          else return 1;
                    548:     end if;
                    549:   end Moving_Point_Mode;
                    550:
                    551:   procedure One_General_Quantum_Deform
                    552:                   ( file : in file_type; n,q,l,k,ind : in natural;
                    553:                     poset : in out Array_of_Array_of_VecMats; nd : in Node;
                    554:                     modpiv : in Bracket;
                    555:                     start,target : in Standard_Complex_Matrices.Matrix;
                    556:                     planes : in VecMat; s : in Standard_Complex_Vectors.Vector;
                    557:                     bs : in Bracket_System; report,outlog : in boolean;
                    558:                     npaths : in out Standard_Natural_Vectors.Vector;
                    559:                     timings : in out Duration_Array ) is
                    560:
                    561:   -- DESCRIPTION :
                    562:   --   This is the quantum analogue to One_General_Deform.
                    563:
                    564:   -- REQUIRED : nd.level > 0, solutions at children of nd are in poset.
                    565:
                    566:   -- ON ENTRY :
                    567:   --   file         to write intermediate output to;
                    568:   --   n            number of rows in the matrices;
                    569:   --   q            degree of the map;
                    570:   --   l            runs from k-1 downto 0;
                    571:   --   k            co-dimension currently being treated;
                    572:   --   ind          planes(ind) is currently being folded in with this chain;
                    573:   --   poset        contains solution planes at higher levels;
                    574:   --   nd           current node in the localization poset;
                    575:   --   modpiv       bottom or top pivots modulo n;
                    576:   --   start        start (m+1-k)-plane for pivots;
                    577:   --   target       target (m+1-k)-plane for pivots;
                    578:   --   planes       target planes;
                    579:   --   s            interpolation points where the maps meets the planes;
                    580:   --   bs           structure to expand the minors;
                    581:   --   report       switch to determine output during continuation;
                    582:   --   outlog       flag to write homotopies on file if set to true.
                    583:
                    584:   -- ON RETURN :
                    585:   --   poset        solution planes at (nd.level)(nd.label) are determined;
                    586:   --   npaths       number of paths followed at each level;
                    587:   --   timings      CPU user time at each level.
                    588:
                    589:     m : constant natural := n-nd.p;
                    590:     xpm : Standard_Complex_Poly_Matrices.Matrix(1..n,1..nd.p)
                    591:         := Symbolic_Create(m,nd.p,q,nd.top,nd.bottom);
                    592:     s_mode : constant natural := Moving_Point_Mode(l,k,modpiv);
                    593:     hom : Link_to_Poly_Sys
                    594:         := One_General_Quantum_Pieri_Homotopy
                    595:              (n,ind,nd,s_mode,bs,start,target,xpm,planes,s);
                    596:
                    597:   begin
                    598:     if outlog
                    599:      then put(file,"level l : "); put(file,l,1); put(file,"  ");
                    600:           put(file,"codim k : "); put(file,k,1); new_line(file);
                    601:           put(file,"Curve at node(");
                    602:           put(file,nd.level,1); put(file,")("); put(file,nd.label,1);
                    603:           put(file,") for pivots (");
                    604:           put(file,nd.top); put(file,","); put(file,nd.bottom);
                    605:           put_line(file,") :");
                    606:           One_Set_up_Symbol_Table(m,nd.p,q,nd.top,nd.bottom);
                    607:           put(file,xpm);
                    608:           put_line(file,"The homotopy : "); put_line(file,hom.all);
                    609:     end if;
                    610:     Quantum_Deform_from_Children
                    611:       (file,poset,nd,n,q,nd.level-1,hom.all,nd.level+2,s_mode,
                    612:        report,outlog,xpm,npaths,timings);
                    613:     Standard_Complex_Poly_Matrices.Clear(xpm);
                    614:     Clear(hom);
                    615:   end One_General_Quantum_Deform;
                    616:
                    617: -- CREATORS :
                    618:
                    619:   function Create ( index_poset : Array_of_Array_of_Nodes )
                    620:                   return Array_of_Array_of_VecMats is
                    621:
                    622:     res : Array_of_Array_of_VecMats(index_poset'range);
                    623:     lnd : Link_to_Node;
                    624:
                    625:   begin
                    626:     for i in index_poset'range loop
                    627:       if index_poset(i) /= null
                    628:        then res(i) := new Array_of_VecMats(index_poset(i)'range);
                    629:             for j in res(i)'range loop
                    630:               lnd := index_poset(i)(j);
                    631:               if lnd.roco /= 0
                    632:                then res(i)(j) := new VecMat(1..lnd.roco);
                    633:               end if;
                    634:             end loop;
                    635:       end if;
                    636:     end loop;
                    637:     return res;
                    638:   end Create;
                    639:
                    640: -- SELECTORS :
                    641:
                    642:   function Empty ( poset : Array_of_Array_of_VecMats; level,label : natural )
                    643:                  return boolean is
                    644:
                    645:     use Standard_Complex_Matrices;
                    646:
                    647:   begin
                    648:     if poset(level) = null
                    649:      then return true;
                    650:      elsif poset(level)(label) = null
                    651:          then return true;
                    652:          else declare
                    653:                 lavm : Link_to_VecMat := poset(level)(label);
                    654:               begin
                    655:                 return (lavm(lavm'first) = null);
                    656:               end;
                    657:     end if;
                    658:   end Empty;
                    659:
                    660: -- ANALOGUES TO THE ROOT COUNTERS :
                    661:
                    662:   procedure Recursive_Hypersurface_Solve
                    663:                ( file : in file_type; n : in natural;
                    664:                  nd : in Node; expbp : in Bracket_Polynomial;
                    665:                  poset : in out Array_of_Array_of_VecMats;
                    666:                  planes : in VecMat; report,outlog : in boolean;
                    667:                  npaths : in out Standard_Natural_Vectors.Vector;
                    668:                  timings : in out Duration_Array ) is
                    669:
                    670:   -- DESCRIPTION :
                    671:   --   This additional layer is added to avoid the repeated construction
                    672:   --   of the structure of the equations, that is now in expbp.
                    673:
                    674:   begin
                    675:     if Empty(poset,nd.level,nd.label)
                    676:      then
                    677:        if nd.level = 0
                    678:         then
                    679:           poset(nd.level)(nd.label)(1)
                    680:             := new Standard_Complex_Matrices.Matrix'(Leaf_Plane(n,nd));
                    681:         else
                    682:           for i in nd.children'range(1) loop
                    683:             for j in nd.children'range(2) loop
                    684:               if nd.children(i,j) /= null
                    685:                then Recursive_Hypersurface_Solve
                    686:                       (file,n,nd.children(i,j).all,expbp,
                    687:                        poset,planes,report,outlog,npaths,timings);
                    688:               end if;
                    689:             end loop;
                    690:           end loop;
                    691:           Hypersurface_Deform
                    692:             (file,n,poset,nd,expbp,planes,report,outlog,npaths,timings);
                    693:        end if;
                    694:     end if;
                    695:   end Recursive_Hypersurface_Solve;
                    696:
                    697:   procedure Solve ( file : in file_type; n : in natural;
                    698:                     poset : in out Array_of_Array_of_VecMats;
                    699:                     nd : in Node; planes : in VecMat;
                    700:                     report,outlog : in boolean;
                    701:                     npaths : in out Standard_Natural_Vectors.Vector;
                    702:                     timings : in out Duration_Array ) is
                    703:
                    704:     bm : Bracket_Monomial := Maximal_Minors(n,n);
                    705:     bs : Bracket_System(0..Number_of_Brackets(bm))
                    706:        := Minor_Equations(n,n-nd.p,bm);
                    707:
                    708:   begin
                    709:     Recursive_Hypersurface_Solve
                    710:       (file,n,nd,bs(1),poset,planes,report,outlog,npaths,timings);
                    711:     Clear(bm); Clear(bs);
                    712:   end Solve;
                    713:
                    714:   procedure One_Solve_along_Chains
                    715:                  ( file : in file_type; nd : in Node; n,l,k,ind : in natural;
                    716:                    poset : in out Array_of_Array_of_VecMats;
                    717:                    pivots,columns : in Bracket; bs : in Bracket_System;
                    718:                    special,start,target : in Standard_Complex_Matrices.Matrix;
                    719:                    planes : in VecMat; report,outlog : in boolean;
                    720:                    npaths : in out Standard_Natural_Vectors.Vector;
                    721:                    timings : in out Duration_Array ) is
                    722:
                    723:   -- DESCRIPTION :
                    724:   --   Applies the general solver along the nodes in all chains that end at
                    725:   --   the current node.  This is the analogue to the hypersurface solver,
                    726:   --   for use in connection with the grandchildren first recursive solving.
                    727:   --   This procedure is only called in "One_Solve".
                    728:
                    729:   -- ON ENTRY :
                    730:   --   file        to write intermediate results on;
                    731:   --   nd          current node in the localization poset;
                    732:   --   n           working dimension, equation m+p;
                    733:   --   l           runs from 0 to k-1;
                    734:   --   k           current codimension condition;
                    735:   --   poset       structure with all solution p-planes;
                    736:   --   ind         ind-1 planes are already folded in;
                    737:   --   pivots      pivot elements used for the special m-plane;
                    738:   --   columns     which columns of the special m-plane are used;
                    739:   --   bs          Laplace expansion of the polynomial equations;
                    740:   --   special     special m-plane for top pivots;
                    741:   --   start       (m+1-k)-plane used at the start of the deformation;
                    742:   --   target      (m+1-k)-plane used as target;
                    743:   --   planes      sequence of (m+1-k)-planes;
                    744:   --   report      indicates whether intermediate output during continuation;
                    745:   --   outlog      flag to write homotopies on file if set to true.
                    746:
                    747:   -- ON RETURN :
                    748:   --   poset       updated structure of all solution p-planes;
                    749:   --   npaths      updated numbers of paths traced at each level;
                    750:   --   timings     updated CPU user times at each level.
                    751:
                    752:     m : constant natural := n - nd.p;
                    753:     new_piv,new_col : Bracket(1..pivots'last-1);
                    754:     new_start : Standard_Complex_Matrices.Matrix(1..n,start'range(2));
                    755:
                    756:   begin
                    757:     if empty(poset,nd.level,nd.label)
                    758:      then
                    759:        if l < k-1
                    760:         then
                    761:           for i in nd.children'range(1) loop
                    762:             for j in nd.children'range(2) loop
                    763:               if ((nd.children(i,j) /= null)
                    764:                 and then (nd.children(i,j).roco > 0))
                    765:                then
                    766:                  if nd.children(i,j).tp = top
                    767:                   then new_piv := Remove(pivots,nd.children(i,j).top);
                    768:                   else new_piv := Remove(pivots,nd.children(i,j).bottom);
                    769:                  end if;
                    770:                  new_col := Remove(columns,pivots,new_piv);
                    771:                  new_start := Special_Plane(n,m,k,new_col,special);
                    772:                  One_Solve_along_Chains
                    773:                    (file,nd.children(i,j).all,n,l+1,k,ind,poset,new_piv,
                    774:                     new_col,bs,special,new_start,start,planes,report,outlog,
                    775:                     npaths,timings);
                    776:               end if;
                    777:             end loop;
                    778:           end loop;
                    779:        end if;
                    780:        One_General_Deform
                    781:          (file,n,ind,poset,nd,start,target,planes,bs,report,outlog,
                    782:           npaths,timings);
                    783:     end if;
                    784:   end One_Solve_along_Chains;
                    785:
                    786:   procedure One_Quantum_Solve_along_Chains
                    787:                  ( file : in file_type; nd : in Node; n,q,l,k,ind : in natural;
                    788:                    poset : in out Array_of_Array_of_VecMats;
                    789:                    pivots,columns : in Bracket; bs : in Bracket_System;
                    790:                    special,start,target : in Standard_Complex_Matrices.Matrix;
                    791:                    planes : in VecMat; s : in Standard_Complex_Vectors.Vector;
                    792:                    report,outlog : in boolean;
                    793:                    npaths : in out Standard_Natural_Vectors.Vector;
                    794:                    timings : in out Duration_Array ) is
                    795:
                    796:   -- DESCRIPTION :
                    797:   --   Applies the general solver along the nodes in all chains that end at
                    798:   --   the current node.  This is the analogue to the hypersurface solver,
                    799:   --   for use in connection with the grandchildren first recursive solving.
                    800:   --   This procedure is only called in the q-analogue of "One_Solve".
                    801:
                    802:   -- ON ENTRY :
                    803:   --   file        to write intermediate results on;
                    804:   --   nd          current node in the localization poset;
                    805:   --   n           working dimension, equation m+p;
                    806:   --   q           degree of the map;
                    807:   --   l           runs from 0 to k-1;
                    808:   --   k           current codimension condition;
                    809:   --   poset       structure with all solution p-planes;
                    810:   --   ind         ind-1 planes are already folded in;
                    811:   --   pivots      pivot elements used for the special m-plane;
                    812:   --   columns     which columns of the special m-plane are used;
                    813:   --   bs          Laplace expansion of the polynomial equations;
                    814:   --   special     special m-plane for top pivots;
                    815:   --   start       (m+1-k)-plane used at the start of the deformation;
                    816:   --   target      (m+1-k)-plane used as target;
                    817:   --   planes      sequence of (m+1-k)-planes;
                    818:   --   s           interpolation points where the map meets the planes;
                    819:   --   report      indicates whether intermediate output during continuation;
                    820:   --   outlog      flag to write homotopies on file if set to true.
                    821:
                    822:   -- ON RETURN :
                    823:   --   poset       updated structure of all solution p-planes;
                    824:   --   npaths      updated numbers of paths traced at each level;
                    825:   --   timings     updated CPU user times at each level.
                    826:
                    827:     m : constant natural := n - nd.p;
                    828:     new_piv,new_col : Bracket(1..pivots'last-1);
                    829:     new_start : Standard_Complex_Matrices.Matrix(1..n,start'range(2));
                    830:     mod_piv : Bracket(1..nd.p);
                    831:
                    832:   begin
                    833:     if empty(poset,nd.level,nd.label)
                    834:      then
                    835:        if l < k-1
                    836:         then
                    837:           for i in nd.children'range(1) loop
                    838:             for j in nd.children'range(2) loop
                    839:               if ((nd.children(i,j) /= null)
                    840:                 and then (nd.children(i,j).roco > 0))
                    841:                then
                    842:                  if nd.children(i,j).tp = top
                    843:                   then mod_piv := Modulo(nd.children(i,j).top,n);
                    844:                        new_piv := Remove(pivots,mod_piv);
                    845:                        put(file,"Top pivots at node : ");
                    846:                        put(file,nd.top);
                    847:                        put(file,"  child top pivots : ");
                    848:                        put(file,nd.children(i,j).top); new_line(file);
                    849:                   else mod_piv := Modulo(nd.children(i,j).bottom,n);
                    850:                        new_piv := Remove(pivots,mod_piv);
                    851:                        put(file,"Bottom pivots at node : ");
                    852:                        put(file,nd.bottom);
                    853:                        put(file,"  child bottom pivots : ");
                    854:                        put(file,nd.children(i,j).bottom); new_line(file);
                    855:                  end if;
                    856:                  put(file,"Modular pivots : "); put(file,mod_piv);
                    857:                  put(file,"  new pivots : "); put(file,new_piv);
                    858:                  new_line(file);
                    859:                  put(file,"Pivot columns : "); put(file,columns);
                    860:                  put(file,"  new columns : "); put(file,new_piv);
                    861:                  new_line(file);
                    862:                  new_col := Remove(columns,pivots,new_piv);
                    863:                  new_start := Special_Plane(n,m,k,new_col,special);
                    864:                  One_Quantum_Solve_along_Chains
                    865:                    (file,nd.children(i,j).all,n,q,l+1,k,ind,poset,new_piv,
                    866:                     new_col,bs,special,new_start,start,planes,s,report,outlog,
                    867:                     npaths,timings);
                    868:               end if;
                    869:             end loop;
                    870:           end loop;
                    871:        end if;
                    872:        One_General_Quantum_Deform
                    873:          (file,n,q,l,k,ind,poset,nd,mod_piv,start,target,planes,s,bs,
                    874:           report,outlog,npaths,timings);
                    875:     end if;
                    876:   end One_Quantum_Solve_along_Chains;
                    877:
                    878:   procedure Solve_along_One_Chain
                    879:                  ( file : in file_type; nd : in Node; n,l,k,ind : in natural;
                    880:                    cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
                    881:                    pivots,columns : in Bracket; bs : in Bracket_System;
                    882:                    special,start,target : in Standard_Complex_Matrices.Matrix;
                    883:                    planes : in VecMat; report,outlog : in boolean;
                    884:                    npaths : in out Standard_Natural_Vectors.Vector;
                    885:                    timings : in out Duration_Array ) is
                    886:
                    887:   -- DESCRIPTION :
                    888:   --   Applies the general solver along the nodes in all chains that end at
                    889:   --   the current node.  This is the analogue to the hypersurface solver,
                    890:   --   which can be used in a general control structure.
                    891:
                    892:   -- ON ENTRY :
                    893:   --   file        to write intermediate results on;
                    894:   --   nd          current node in the localization poset;
                    895:   --   n           working dimension, equation m+p;
                    896:   --   l           runs from 0 to k-1;
                    897:   --   k           current codimension condition;
                    898:   --   poset       structure with all solution p-planes;
                    899:   --   ind         ind-1 planes are already folded in;
                    900:   --   pivots      pivot elements used for the special m-plane;
                    901:   --   columns     which columns of the special m-plane are used;
                    902:   --   bs          Laplace expansion of the polynomial equations;
                    903:   --   special     special m-plane for top pivots;
                    904:   --   start       (m+1-k)-plane used at the start of the deformation;
                    905:   --   target      (m+1-k)-plane used as target;
                    906:   --   planes      sequence of (m+1-k)-planes;
                    907:   --   report      indicates whether intermediate output during continuation;
                    908:   --   outlog      file to write homotopies on if set to true.
                    909:
                    910:   -- ON RETURN :
                    911:   --   poset       updated structure of solution p-planes;
                    912:   --   npaths      updated number of paths traced at each level;
                    913:   --   timings     updated CPU user times for each level.
                    914:
                    915:     m : constant natural := n - nd.p;
                    916:
                    917:   begin
                    918:     if empty(poset,nd.level,nd.label)
                    919:      then
                    920:        if nd.level = 0
                    921:         then poset(nd.level)(nd.label)(1)
                    922:                := new Standard_Complex_Matrices.Matrix'(Leaf_Plane(n,nd));
                    923:         elsif nd.roco > 0
                    924:             then
                    925:               if l = k
                    926:                then
                    927:                  if cod'last > cod'first
                    928:                   then
                    929:                     declare
                    930:                       kk : constant natural := cod(cod'last-1);
                    931:                       kd : constant natural := n+1-kk;
                    932:                       new_piv,new_col : Bracket(1..m);
                    933:                       new_special : Standard_Complex_Matrices.Matrix(1..n,1..m);
                    934:                       new_target : constant Standard_Complex_Matrices.Matrix
                    935:                                  := planes(cod'last-1).all;
                    936:                       new_start
                    937:                         : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk);
                    938:                       new_bm : Bracket_Monomial := Maximal_Minors(n,kd);
                    939:                       new_bs : Bracket_System(0..Number_of_Brackets(new_bm))
                    940:                              := Minor_Equations(kd,kd-nd.p,new_bm);
                    941:                     begin
                    942:                       for i in new_col'range loop
                    943:                         new_col(i) := i;
                    944:                       end loop;
                    945:                       if nd.tp = top
                    946:                        then new_piv := Complement(n,nd.top);
                    947:                             new_special := Special_Top_Plane(m,nd.top);
                    948:                        else new_piv := Complement(n,nd.bottom);
                    949:                             new_special := Special_Bottom_Plane(m,nd.bottom);
                    950:                       end if;
                    951:                       new_start := Special_Plane(n,m,kk,new_col,new_special);
                    952:                       Solve_along_One_Chain
                    953:                         (file,nd,n,0,kk,cod'last-1,cod(cod'first..cod'last-1),
                    954:                          poset,new_piv,new_col,new_bs,new_special,new_start,
                    955:                          new_target,planes,report,outlog,npaths,timings);
                    956:                       Clear(new_bm); Clear(new_bs);
                    957:                     end;
                    958:                  end if;
                    959:                else
                    960:                  declare
                    961:                    new_piv,new_col : Bracket(1..pivots'last-1);
                    962:                    new_start
                    963:                      : Standard_Complex_Matrices.Matrix(1..n,start'range(2));
                    964:                  begin
                    965:                    for i in nd.children'range(1) loop
                    966:                      for j in nd.children'range(2) loop
                    967:                        if ((nd.children(i,j) /= null)
                    968:                          and then (nd.children(i,j).roco > 0))
                    969:                         then
                    970:                           if nd.children(i,j).tp = top
                    971:                            then new_piv := Remove(pivots,nd.children(i,j).top);
                    972:                            else new_piv
                    973:                                   := Remove(pivots,nd.children(i,j).bottom);
                    974:                           end if;
                    975:                           new_col := Remove(columns,pivots,new_piv);
                    976:                           new_start := Special_Plane(n,m,k,new_col,special);
                    977:                           Solve_along_One_Chain
                    978:                             (file,nd.children(i,j).all,n,l+1,k,ind,cod,poset,
                    979:                              new_piv,new_col,bs,special,new_start,start,
                    980:                              planes,report,outlog,npaths,timings);
                    981:                        end if;
                    982:                      end loop;
                    983:                    end loop;
                    984:                    One_General_Deform
                    985:                      (file,n,ind,poset,nd,start,target,planes,bs,
                    986:                       report,outlog,npaths,timings);
                    987:                  end;
                    988:               end if;
                    989:       end if;
                    990:     end if;
                    991:   end Solve_along_One_Chain;
                    992:
                    993:   procedure Solve_along_Two_Chains
                    994:                   ( file : in file_type; nd : in Node;
                    995:                     n,l_top,k_top,l_bot,k_bot,ind : in natural;
                    996:                     cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
                    997:                     top_pivots,top_columns,bot_pivots,bot_columns : in Bracket;
                    998:                     top_bs,bot_bs : in Bracket_System;
                    999:                     top_special,top_start,top_target,bot_special,bot_start,
                   1000:                     bot_target : in Standard_Complex_Matrices.Matrix;
                   1001:                     planes : in VecMat; report,outlog : in boolean;
                   1002:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1003:                     timings : in out Duration_Array );
                   1004:
                   1005:   -- DESCRIPTION :
                   1006:   --   Applies the general solver along the nodes in all chains that end at
                   1007:   --   the current node.  This is the analogue to the hypersurface solver
                   1008:   --   where the type of the node may be anything.
                   1009:
                   1010:   -- ON ENTRY :
                   1011:   --   file         to write intermediate results on;
                   1012:   --   nd           current node in the localization poset;
                   1013:   --   n            working dimension, equation m+p;
                   1014:   --   l_top        runs from 0 to k_top-1;
                   1015:   --   k_top        co-dimension condition satisfied incrementing top pivots;
                   1016:   --   l_bot        runs from 0 to k_bot-1;
                   1017:   --   k_bot        co-dimension condition satisfied decrementing bottom pivots;
                   1018:   --   poset        structure with all solution p-planes;
                   1019:   --   ind          ind-1 planes are already folded in;
                   1020:   --   top_pivots   pivot elements used for the special top m-plane;
                   1021:   --   top_columns  which columns of the special top m-plane are used;
                   1022:   --   bot_pivots   pivot elements used for the special bottom m-plane;
                   1023:   --   bot_columns  which columns of the special bottom m-plane are used;
                   1024:   --   top_bs       Laplace expansion of the polynomial equations;
                   1025:   --   bot_bs       Laplace expansion of the polynomial equations;
                   1026:   --   top_special  special m-plane for top pivots;
                   1027:   --   top_start    (m+1-k)-plane used at the start of the deformation;
                   1028:   --   top_target   (m+1-k)-plane used as target satisfied with top pivots;
                   1029:   --   bot_special  special m-plane for top pivots;
                   1030:   --   bot_start    (m+1-k)-plane used at the start of the deformation;
                   1031:   --   bot_target   (m+1-k)-plane used as target satisfied with bottom pivots;
                   1032:   --   planes       sequence of (m+1-k)-planes;
                   1033:   --   report       indicates whether intermediate output during continuation;
                   1034:   --   outlog       flag to write homotopies on file if set to true.
                   1035:
                   1036:   -- ON RETURN :
                   1037:   --   poset        updated structure of solution p-planes;
                   1038:   --   npaths       updated number of paths traced at each level;
                   1039:   --   timings      updated CPU user timings at each level.
                   1040:
                   1041:   procedure Solve_along_Two_Chains_Deforming_Top_and_Bottom
                   1042:                   ( file : in file_type; nd : in Node;
                   1043:                     n,l_top,k_top,l_bot,k_bot,ind : in natural;
                   1044:                     cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
                   1045:                     top_pivots,top_columns,bot_pivots,bot_columns : in Bracket;
                   1046:                     top_bs,bot_bs : in Bracket_System;
                   1047:                     top_special,top_start,top_target,bot_special,bot_start,
                   1048:                     bot_target : in Standard_Complex_Matrices.Matrix;
                   1049:                     planes : in VecMat; report,outlog : in boolean;
                   1050:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1051:                     timings : in out Duration_Array ) is
                   1052:
                   1053:   -- DESCRIPTION :
                   1054:   --   Assumes that k_top > l_top and k_bot > l_bot so that the deformations
                   1055:   --   involve both incrementing top and decrementing bottom pivots.
                   1056:
                   1057:     m : constant natural := n - nd.p;
                   1058:     top_piv,top_col : Bracket(1..top_pivots'last-1);
                   1059:     bot_piv,bot_col : Bracket(1..bot_pivots'last-1);
                   1060:     new_top_start : Standard_Complex_Matrices.Matrix(1..n,top_start'range(2));
                   1061:     new_bot_start : Standard_Complex_Matrices.Matrix(1..n,bot_start'range(2));
                   1062:
                   1063:   begin
                   1064:     for i in nd.children'range(1) loop
                   1065:       for j in nd.children'range(2) loop
                   1066:         if ((nd.children(i,j) /= null)
                   1067:           and then (nd.children(i,j).roco > 0))
                   1068:          then if nd.children(i,j).tp = top or nd.children(i,j).tp = mixed
                   1069:                then top_piv := Remove(top_pivots,nd.children(i,j).top);
                   1070:                     top_col := Remove(top_columns,top_pivots,top_piv);
                   1071:                     new_top_start
                   1072:                       := Special_Plane(n,m,k_top,top_col,top_special);
                   1073:               end if;
                   1074:               if nd.children(i,j).tp = bottom or nd.children(i,j).tp = mixed
                   1075:                then bot_piv := Remove(bot_pivots,nd.children(i,j).bottom);
                   1076:                     bot_col := Remove(bot_columns,bot_pivots,bot_piv);
                   1077:                     new_bot_start
                   1078:                       := Special_Plane(n,m,k_bot,bot_col,bot_special);
                   1079:               end if;
                   1080:               Solve_along_Two_Chains
                   1081:                 (file,nd.children(i,j).all,
                   1082:                  n,l_top+1,k_top,l_bot+1,k_bot,ind,cod,poset,
                   1083:                  top_piv,top_col,bot_piv,bot_col,top_bs,bot_bs,
                   1084:                  top_special,new_top_start,top_start,
                   1085:                  bot_special,new_bot_start,bot_start,
                   1086:                  planes,report,outlog,npaths,timings);
                   1087:         end if;
                   1088:       end loop;
                   1089:     end loop;
                   1090:     Two_General_Deform
                   1091:       (file,n,ind,poset,nd,top_start,top_target,bot_start,
                   1092:        bot_target,planes,top_bs,bot_bs,report,outlog,npaths,timings);
                   1093:   end Solve_along_Two_Chains_Deforming_Top_and_Bottom;
                   1094:
                   1095:   procedure Switch_Top_and_Solve_along_Two_Chains
                   1096:                   ( file : in file_type; nd : in Node;
                   1097:                     n,l_bot,k_bot,ind : in natural; cod : in Bracket;
                   1098:                     poset : in out Array_of_Array_of_VecMats;
                   1099:                     bot_pivots,bot_columns : in Bracket;
                   1100:                     bot_bs : in Bracket_System;
                   1101:                     bot_special,bot_start,bot_target
                   1102:                       : in Standard_Complex_Matrices.Matrix;
                   1103:                     planes : in VecMat; report,outlog : in boolean;
                   1104:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1105:                     timings : in out Duration_Array ) is
                   1106:
                   1107:   -- DESCRIPTION :
                   1108:   --   Assumes that l_top = k_top, l_bot < k_bot, and ind > cod'first so
                   1109:   --   that first a new top chain can be started, which is then solved
                   1110:   --   along with the existing chain for decrementing bottom pivots.
                   1111:
                   1112:     m : constant natural := n - nd.p;
                   1113:     new_k_top : constant natural := cod(ind);
                   1114:     kd : constant natural := n+1-new_k_top;
                   1115:     new_top_pivots : Bracket(1..m) := Complement(n,nd.top);
                   1116:     new_top_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
                   1117:                     := Special_Top_Plane(m,nd.top);
                   1118:     new_top_target : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_top)
                   1119:                    := planes(ind).all;
                   1120:     new_top_columns : Bracket(1..m);
                   1121:     new_top_start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_top);
                   1122:     new_top_bm : Bracket_Monomial := Maximal_Minors(n,kd);
                   1123:     new_top_bs : Bracket_System(0..Number_of_Brackets(new_top_bm))
                   1124:                := Minor_Equations(kd,kd-nd.p,new_top_bm);
                   1125:
                   1126:   begin
                   1127:     for i in new_top_columns'range loop
                   1128:       new_top_columns(i) := i;
                   1129:     end loop;
                   1130:     new_top_start
                   1131:       := Special_Plane(n,m,new_k_top,new_top_columns,new_top_special);
                   1132:     Solve_along_Two_Chains_Deforming_Top_and_Bottom
                   1133:       (file,nd,n,0,new_k_top,l_bot,k_bot,ind,cod,poset,
                   1134:        new_top_pivots,new_top_columns,bot_pivots,bot_columns,
                   1135:        new_top_bs,bot_bs,new_top_special,new_top_start,new_top_target,
                   1136:        bot_special,bot_start,bot_target,planes,
                   1137:        report,outlog,npaths,timings);
                   1138:     Clear(new_top_bm); Clear(new_top_bs);
                   1139:   end Switch_Top_and_Solve_along_Two_Chains;
                   1140:
                   1141:   procedure Switch_Top_and_Solve_along_One_Chain
                   1142:                   ( file : in file_type; nd : in Node; n,ind : in natural;
                   1143:                     cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
                   1144:                     planes : in VecMat; report,outlog : in boolean;
                   1145:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1146:                     timings : in out Duration_Array ) is
                   1147:
                   1148:   -- DESCRIPTION :
                   1149:   --   Assumes that l_top = k_top, l_bot = k_bot, with nd.tp = top
                   1150:   --   and ind > cod'first so that a new top chain can be started.
                   1151:
                   1152:     m : constant natural := n - nd.p;
                   1153:     new_k_top : constant natural := cod(ind);
                   1154:     kd : constant natural := n+1-new_k_top;
                   1155:     new_top_pivots : Bracket(1..m) := Complement(n,nd.top);
                   1156:     new_top_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
                   1157:                     := Special_Top_Plane(m,nd.top);
                   1158:     new_top_target : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_top)
                   1159:                    := planes(ind).all;
                   1160:     new_top_columns : Bracket(1..m);
                   1161:     new_top_start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_top);
                   1162:     new_top_bm : Bracket_Monomial := Maximal_Minors(n,kd);
                   1163:     new_top_bs : Bracket_System(0..Number_of_Brackets(new_top_bm))
                   1164:                := Minor_Equations(kd,kd-nd.p,new_top_bm);
                   1165:
                   1166:   begin
                   1167:     for i in new_top_columns'range loop
                   1168:       new_top_columns(i) := i;
                   1169:     end loop;
                   1170:     new_top_start
                   1171:       := Special_Plane(n,m,new_k_top,new_top_columns,new_top_special);
                   1172:     Solve_along_One_Chain
                   1173:       (file,nd,n,0,new_k_top,ind,cod(cod'first..ind),poset,
                   1174:        new_top_pivots,new_top_columns,new_top_bs,
                   1175:        new_top_special,new_top_start,new_top_target,
                   1176:        planes,report,outlog,npaths,timings);
                   1177:     Clear(new_top_bm); Clear(new_top_bs);
                   1178:   end Switch_Top_and_Solve_along_One_Chain;
                   1179:
                   1180:   procedure Switch_Bottom_and_Solve_along_Two_Chains
                   1181:                   ( file : in file_type; nd : in Node;
                   1182:                     n,l_top,k_top,ind : in natural; cod : in Bracket;
                   1183:                     poset : in out Array_of_Array_of_VecMats;
                   1184:                     top_pivots,top_columns : in Bracket;
                   1185:                     top_bs : in Bracket_System;
                   1186:                     top_special,top_start,top_target
                   1187:                       : in Standard_Complex_Matrices.Matrix;
                   1188:                     planes : in VecMat; report,outlog : in boolean;
                   1189:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1190:                     timings : in out Duration_Array ) is
                   1191:
                   1192:   -- DESCRIPTION :
                   1193:   --   Assumes that l_top < k_top, l_bot = k_bot, and ind > cod'first so
                   1194:   --   that first a new bottom chain can be launched, which is then solved
                   1195:   --   along with the existing chain for incrementing top pivots.
                   1196:
                   1197:     m : constant natural := n - nd.p;
                   1198:     new_k_bot : constant natural := cod(ind);
                   1199:     kd : constant natural := n+1-new_k_bot;
                   1200:     new_bot_pivots : Bracket(1..m) := Complement(n,nd.bottom);
                   1201:     new_bot_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
                   1202:                     := Special_Bottom_Plane(m,nd.bottom);
                   1203:     new_bot_target : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_bot)
                   1204:                    := planes(ind).all;
                   1205:     new_bot_columns : Bracket(1..m);
                   1206:     new_bot_start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_bot);
                   1207:     new_bot_bm : Bracket_Monomial := Maximal_Minors(n,kd);
                   1208:     new_bot_bs : Bracket_System(0..Number_of_Brackets(new_bot_bm))
                   1209:                := Minor_Equations(kd,kd-nd.p,new_bot_bm);
                   1210:
                   1211:   begin
                   1212:     for i in new_bot_columns'range loop
                   1213:       new_bot_columns(i) := i;
                   1214:     end loop;
                   1215:     new_bot_start
                   1216:       := Special_Plane(n,m,new_k_bot,new_bot_columns,new_bot_special);
                   1217:     Solve_along_Two_Chains_Deforming_Top_and_Bottom
                   1218:       (file,nd,n,l_top,k_top,0,new_k_bot,ind,cod,poset,
                   1219:        top_pivots,top_columns,new_bot_pivots,new_bot_columns,
                   1220:        top_bs,new_bot_bs,top_special,top_start,top_target,
                   1221:        new_bot_special,new_bot_start,new_bot_target,
                   1222:        planes,report,outlog,npaths,timings);
                   1223:     Clear(new_bot_bm); Clear(new_bot_bs);
                   1224:   end Switch_Bottom_and_Solve_along_Two_Chains;
                   1225:
                   1226:   procedure Switch_Bottom_and_Solve_along_One_Chain
                   1227:                   ( file : in file_type; nd : in Node; n,ind : in natural;
                   1228:                     cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
                   1229:                     planes : in VecMat; report,outlog : in boolean;
                   1230:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1231:                     timings : in out Duration_Array ) is
                   1232:
                   1233:   -- DESCRIPTION :
                   1234:   --   Assumes that l_top < k_top, l_bot = k_bot, and ind > cod'first so
                   1235:   --   that first a new bottom chain can be launched, which is then solved
                   1236:   --   along with the existing chain for incrementing top pivots.
                   1237:
                   1238:     m : constant natural := n - nd.p;
                   1239:     new_k_bot : constant natural := cod(ind);
                   1240:     kd : constant natural := n+1-new_k_bot;
                   1241:     new_bot_pivots : Bracket(1..m) := Complement(n,nd.bottom);
                   1242:     new_bot_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
                   1243:                     := Special_Bottom_Plane(m,nd.bottom);
                   1244:     new_bot_target : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_bot)
                   1245:                    := planes(ind).all;
                   1246:     new_bot_columns : Bracket(1..m);
                   1247:     new_bot_start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_bot);
                   1248:     new_bot_bm : Bracket_Monomial := Maximal_Minors(n,kd);
                   1249:     new_bot_bs : Bracket_System(0..Number_of_Brackets(new_bot_bm))
                   1250:                := Minor_Equations(kd,kd-nd.p,new_bot_bm);
                   1251:
                   1252:   begin
                   1253:     for i in new_bot_columns'range loop
                   1254:       new_bot_columns(i) := i;
                   1255:     end loop;
                   1256:     new_bot_start
                   1257:       := Special_Plane(n,m,new_k_bot,new_bot_columns,new_bot_special);
                   1258:     Solve_along_One_Chain
                   1259:       (file,nd,n,0,new_k_bot,ind,cod(cod'first..ind),poset,
                   1260:        new_bot_pivots,new_bot_columns,new_bot_bs,
                   1261:        new_bot_special,new_bot_start,new_bot_target,
                   1262:        planes,report,outlog,npaths,timings);
                   1263:     Clear(new_bot_bm); Clear(new_bot_bs);
                   1264:   end Switch_Bottom_and_Solve_along_One_Chain;
                   1265:
                   1266:   procedure Switch_Top_Bottom_and_Solve_along_Two_Chains
                   1267:                   ( file : in file_type; nd : in Node; n,ind : in natural;
                   1268:                     cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
                   1269:                     planes : in VecMat; report,outlog : in boolean;
                   1270:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1271:                     timings : in out Duration_Array ) is
                   1272:
                   1273:   -- DESCRIPTION :
                   1274:   --   Assumes that l_top = k_top, l_bot = k_bot, and ind > cod'first+1
                   1275:   --   so that first new top and bottom chains can be started which are
                   1276:   --   then solved along.
                   1277:
                   1278:     m : constant natural := n - nd.p;
                   1279:     new_k_top : constant natural := cod(ind);
                   1280:     new_k_bot : constant natural := cod(ind+1);
                   1281:     kd_top : constant natural := n+1-new_k_top;
                   1282:     kd_bot : constant natural := n+1-new_k_bot;
                   1283:     new_top_pivots : Bracket(1..m) := Complement(n,nd.top);
                   1284:     new_bot_pivots : Bracket(1..m) := Complement(n,nd.bottom);
                   1285:     new_top_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
                   1286:                     := Special_Top_Plane(m,nd.top);
                   1287:     new_bot_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
                   1288:                     := Special_Bottom_Plane(m,nd.bottom);
                   1289:     new_top_target : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_top)
                   1290:                    := planes(ind).all;
                   1291:     new_bot_target : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_bot)
                   1292:                    := planes(ind+1).all;
                   1293:     new_top_columns,new_bot_columns : Bracket(1..m);
                   1294:     new_top_start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_top);
                   1295:     new_bot_start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-new_k_bot);
                   1296:     new_top_bm : Bracket_Monomial := Maximal_Minors(n,kd_top);
                   1297:     new_bot_bm : Bracket_Monomial := Maximal_Minors(n,kd_bot);
                   1298:     new_top_bs : Bracket_System(0..Number_of_Brackets(new_top_bm))
                   1299:                := Minor_Equations(kd_top,kd_top-nd.p,new_top_bm);
                   1300:     new_bot_bs : Bracket_System(0..Number_of_Brackets(new_bot_bm))
                   1301:                := Minor_Equations(kd_bot,kd_bot-nd.p,new_bot_bm);
                   1302:
                   1303:   begin
                   1304:     for i in new_bot_columns'range loop
                   1305:       new_top_columns(i) := i;
                   1306:       new_bot_columns(i) := i;
                   1307:     end loop;
                   1308:     new_top_start
                   1309:       := Special_Plane(n,m,new_k_top,new_top_columns,new_top_special);
                   1310:     new_bot_start
                   1311:       := Special_Plane(n,m,new_k_bot,new_bot_columns,new_bot_special);
                   1312:     Solve_along_Two_Chains_Deforming_Top_and_Bottom
                   1313:       (file,nd,n,0,new_k_top,0,new_k_bot,ind,cod,poset,
                   1314:        new_top_pivots,new_top_columns,new_bot_pivots,new_bot_columns,
                   1315:        new_top_bs,new_bot_bs,new_top_special,new_top_start,new_top_target,
                   1316:        new_bot_special,new_bot_start,new_bot_target,
                   1317:        planes,report,outlog,npaths,timings);
                   1318:     Clear(new_top_bm); Clear(new_top_bs);
                   1319:     Clear(new_bot_bm); Clear(new_bot_bs);
                   1320:   end Switch_Top_Bottom_and_Solve_along_Two_Chains;
                   1321:
                   1322:   procedure Solve_along_Two_Chains
                   1323:                   ( file : in file_type; nd : in Node;
                   1324:                     n,l_top,k_top,l_bot,k_bot,ind : in natural;
                   1325:                     cod : in Bracket; poset : in out Array_of_Array_of_VecMats;
                   1326:                     top_pivots,top_columns,bot_pivots,bot_columns : in Bracket;
                   1327:                     top_bs,bot_bs : in Bracket_System;
                   1328:                     top_special,top_start,top_target,bot_special,bot_start,
                   1329:                     bot_target : in Standard_Complex_Matrices.Matrix;
                   1330:                     planes : in VecMat; report,outlog : in boolean;
                   1331:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1332:                     timings : in out Duration_Array ) is
                   1333:
                   1334:   -- DESCRIPTION :
                   1335:   --   Does the dispatching according to the case analysis.
                   1336:
                   1337:   -- IMPORTANT :
                   1338:   --   The control structure in the case analysis matches the structure
                   1339:   --   in Localization_Posets.Recursive_Top_Bottom_Create.
                   1340:
                   1341:   begin
                   1342:     if empty(poset,nd.level,nd.label)
                   1343:      then
                   1344:        if nd.level = 0
                   1345:         then poset(nd.level)(nd.label)(1)
                   1346:                := new Standard_Complex_Matrices.Matrix'(Leaf_Plane(n,nd));
                   1347:         elsif nd.roco > 0
                   1348:             then
                   1349:               if ((l_top < k_top) and (l_bot < k_bot))
                   1350:                then Solve_along_Two_Chains_Deforming_Top_and_Bottom
                   1351:                       (file,nd,n,l_top,k_top,l_bot,k_bot,ind,cod,poset,
                   1352:                        top_pivots,top_columns,bot_pivots,bot_columns,
                   1353:                        top_bs,bot_bs,top_special,top_start,top_target,
                   1354:                        bot_special,bot_start,bot_target,planes,
                   1355:                        report,outlog,npaths,timings);
                   1356:                elsif ((l_top = k_top) and (l_bot < k_bot))
                   1357:                    then
                   1358:                      if ind = cod'first
                   1359:                       then Solve_along_One_Chain
                   1360:                              (file,nd,n,l_bot,k_bot,ind,cod,poset,
                   1361:                               bot_pivots,bot_columns,bot_bs,bot_special,
                   1362:                               bot_start,bot_target,planes,report,outlog,
                   1363:                               npaths,timings);
                   1364:                       else Switch_Top_and_Solve_along_Two_Chains
                   1365:                              (file,nd,n,l_bot,k_bot,ind-1,cod,poset,
                   1366:                               bot_pivots,bot_columns,bot_bs,bot_special,
                   1367:                               bot_start,bot_target,planes,report,outlog,
                   1368:                               npaths,timings);
                   1369:                      end if;
                   1370:                    elsif ((l_top < k_top) and (l_bot = k_bot))
                   1371:                        then
                   1372:                          if ind = cod'first
                   1373:                           then Solve_along_One_Chain
                   1374:                                  (file,nd,n,l_top,k_top,ind,cod,poset,
                   1375:                                   top_pivots,top_columns,top_bs,top_special,
                   1376:                                   top_start,top_target,planes,report,outlog,
                   1377:                                   npaths,timings);
                   1378:                           else Switch_Bottom_and_Solve_along_Two_Chains
                   1379:                                  (file,nd,n,l_top,k_top,ind-1,cod,poset,
                   1380:                                   top_pivots,top_columns,top_bs,top_special,
                   1381:                                   top_start,top_target,planes,report,outlog,
                   1382:                                   npaths,timings);
                   1383:                          end if;
                   1384:                        else -- ((l_top = k_top) and (l_bot = k_bot))
                   1385:                          if ind > cod'first+1
                   1386:                           then Switch_Top_Bottom_and_Solve_along_Two_Chains
                   1387:                                  (file,nd,n,ind-2,cod,poset,planes,
                   1388:                                   report,outlog,npaths,timings);
                   1389:                           elsif ind > cod'first
                   1390:                               then
                   1391:                                 if nd.tp = bottom
                   1392:                                  then
                   1393:                                    Switch_Bottom_and_Solve_along_One_Chain
                   1394:                                      (file,nd,n,ind-1,cod,poset,planes,
                   1395:                                       report,outlog,npaths,timings);
                   1396:                                  else
                   1397:                                    Switch_Top_and_Solve_along_One_Chain
                   1398:                                      (file,nd,n,ind-1,cod,poset,planes,
                   1399:                                       report,outlog,npaths,timings);
                   1400:                                 end if;
                   1401:                          end if;
                   1402:               end if;
                   1403:        end if;
                   1404:     end if;
                   1405:   end Solve_along_Two_Chains;
                   1406:
                   1407:   procedure One_Solve
                   1408:                   ( file : in file_type; n : in natural; cod : in Bracket;
                   1409:                     poset : in out Array_of_Array_of_VecMats;
                   1410:                     nd : in Node; planes : in VecMat;
                   1411:                     report,outlog : in boolean;
                   1412:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1413:                     timings : in out Duration_Array ) is
                   1414:
                   1415:   -- NOTE :
                   1416:   --   We assume that we are always folding in the last condition, with
                   1417:   --   codimension cod(cod'last).  In passing recursively to higher levels
                   1418:   --   in the deformation poset, we take a slice of k, omitting the last one.
                   1419:   --   Applies the solver first to all grandchildren of the current node,
                   1420:   --   which is the additional layer compared to the hypersurface case.
                   1421:   --   This implementation will only work in the non-mixed case.
                   1422:
                   1423:     m : constant natural := n - nd.p;
                   1424:     kk : constant natural := cod(cod'last);
                   1425:     kd : constant natural := n+1-kk;
                   1426:
                   1427:     procedure Solve_Grand_Child
                   1428:                 ( lnd : in Link_to_Node; continue : out boolean ) is
                   1429:
                   1430:     -- DESCRIPTION :
                   1431:     --   This node lnd is a grandchild of the current node.
                   1432:
                   1433:     begin
                   1434:       if Empty(poset,lnd.level,lnd.label)
                   1435:        then if lnd.level = 0
                   1436:              then poset(lnd.level)(lnd.label)(1)
                   1437:                     := new Standard_Complex_Matrices.Matrix'
                   1438:                              (Leaf_Plane(n,lnd.all));
                   1439:              elsif lnd.roco > 0
                   1440:                  then One_Solve(file,n,cod(cod'first..cod'last-1),poset,
                   1441:                                 lnd.all,planes,report,outlog,npaths,timings);
                   1442:             end if;
                   1443:       end if;
                   1444:       continue := true;
                   1445:     end Solve_Grand_Child;
                   1446:
                   1447:     procedure Solve_Grand_Children is
                   1448:       new Enumerate_Grand_Children(Solve_Grand_Child);
                   1449:
                   1450:   begin
                   1451:     if (Empty(poset,nd.level,nd.label) and (nd.roco > 0))
                   1452:      then
                   1453:        if cod'last >= cod'first
                   1454:         then Solve_Grand_Children(nd,kk);
                   1455:        end if;
                   1456:        declare
                   1457:          pivots,columns : Bracket(1..m);
                   1458:          special : Standard_Complex_Matrices.Matrix(1..n,1..m);
                   1459:          target : constant Standard_Complex_Matrices.Matrix
                   1460:                 := planes(cod'last).all;
                   1461:          start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk);
                   1462:          bm : Bracket_Monomial := Maximal_Minors(n,kd);
                   1463:          bs : Bracket_System(0..Number_of_Brackets(bm))
                   1464:             := Minor_Equations(kd,kd-nd.p,bm);
                   1465:        begin
                   1466:          for i in columns'range loop
                   1467:            columns(i) := i;
                   1468:          end loop;
                   1469:          if nd.tp = top
                   1470:           then pivots := Complement(n,nd.top);
                   1471:                special := Special_Top_Plane(m,nd.top);
                   1472:           else pivots := Complement(n,nd.bottom);
                   1473:                special := Special_Bottom_Plane(m,nd.bottom);
                   1474:          end if;
                   1475:          start := Special_Plane(n,m,kk,columns,special);
                   1476:          One_Solve_along_Chains
                   1477:            (file,nd,n,0,kk,cod'last,poset,pivots,columns,bs,
                   1478:             special,start,target,planes,report,outlog,npaths,timings);
                   1479:          Clear(bm); Clear(bs);
                   1480:        end;
                   1481:     end if;
                   1482:   end One_Solve;
                   1483:
                   1484:   procedure Chain_Solve
                   1485:                   ( file : in file_type; n : in natural; cod : in Bracket;
                   1486:                     poset : in out Array_of_Array_of_VecMats; nd : in Node;
                   1487:                     planes : in VecMat; report,outlog : in boolean;
                   1488:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1489:                     timings : in out Duration_Array ) is
                   1490:
                   1491:   -- NOTE :
                   1492:   --   The convention is that the last co-dimension condition is treated
                   1493:   --   when the type of the node is not mixed, otherwise the last two entries
                   1494:   --   of the vector of co-dimension conditions are sliced off when moving
                   1495:   --   to the upper levels.
                   1496:   --   This is another organization of One_Solve and only works when the
                   1497:   --   type of the nodes are not mixed.
                   1498:
                   1499:   begin
                   1500:     if Empty(poset,nd.level,nd.label)
                   1501:      then
                   1502:        if nd.level = 0
                   1503:         then poset(nd.level)(nd.label)(1)
                   1504:                := new Standard_Complex_Matrices.Matrix'(Leaf_Plane(n,nd));
                   1505:         elsif nd.roco > 0
                   1506:             then declare
                   1507:                    m : constant natural := n - nd.p;
                   1508:                    pivots,columns : Bracket(1..m);
                   1509:                    special : Standard_Complex_Matrices.Matrix(1..n,1..m);
                   1510:                    kk : constant natural := cod(cod'last);
                   1511:                    kd : constant natural := n+1-kk;
                   1512:                    start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk);
                   1513:                    target : constant Standard_Complex_Matrices.Matrix
                   1514:                           := planes(planes'last).all;
                   1515:                    bm : Bracket_Monomial := Maximal_Minors(n,kd);
                   1516:                    bs : Bracket_System(0..Number_of_Brackets(bm))
                   1517:                       := Minor_Equations(kd,kd-nd.p,bm);
                   1518:                  begin
                   1519:                    for i in columns'range loop
                   1520:                      columns(i) := i;
                   1521:                    end loop;
                   1522:                    if nd.tp = top
                   1523:                     then pivots := Complement(n,nd.top);
                   1524:                          special := Special_Top_Plane(m,nd.top);
                   1525:                     else pivots := Complement(n,nd.bottom);
                   1526:                          special := Special_Bottom_Plane(m,nd.bottom);
                   1527:                    end if;
                   1528:                    start := Special_Plane(n,m,kk,columns,special);
                   1529:                    Solve_along_One_Chain
                   1530:                      (file,nd,n,0,cod(cod'last),cod'last,cod,poset,
                   1531:                       pivots,columns,bs,special,start,target,planes,
                   1532:                       report,outlog,npaths,timings);
                   1533:                    Clear(bm); Clear(bs);
                   1534:                  end;
                   1535:        end if;
                   1536:     end if;
                   1537:   end Chain_Solve;
                   1538:
                   1539:   procedure Solve ( file : in file_type; n : in natural; cod : in Bracket;
                   1540:                     poset : in out Array_of_Array_of_VecMats; nd : in Node;
                   1541:                     planes : in VecMat; report,outlog : in boolean;
                   1542:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1543:                     timings : in out Duration_Array ) is
                   1544:
                   1545:   -- REQUIREMENT ONE :
                   1546:   --   The convention is that the last co-dimension condition is treated
                   1547:   --   when the type of the node is not mixed, otherwise the last two entries
                   1548:   --   of the vector of co-dimension conditions are sliced off when moving
                   1549:   --   to the upper levels.
                   1550:   -- REQUIREMENT TWO :
                   1551:   --   The nodes that are not mixed appear at the top of the poset.
                   1552:
                   1553:   begin
                   1554:     if Empty(poset,nd.level,nd.label)
                   1555:      then
                   1556:        if nd.level = 0
                   1557:         then poset(nd.level)(nd.label)(1)
                   1558:                := new Standard_Complex_Matrices.Matrix'(Leaf_Plane(n,nd));
                   1559:         elsif nd.roco > 0
                   1560:             then
                   1561:               if nd.tp /= mixed
                   1562:                then
                   1563:                  declare
                   1564:                    m : constant natural := n - nd.p;
                   1565:                    pivots,columns : Bracket(1..m);
                   1566:                    special : Standard_Complex_Matrices.Matrix(1..n,1..m);
                   1567:                    kk : constant natural := cod(cod'last);
                   1568:                    kd : constant natural := n+1-kk;
                   1569:                    start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk);
                   1570:                    target : constant Standard_Complex_Matrices.Matrix
                   1571:                           := planes(planes'last).all;
                   1572:                    bm : Bracket_Monomial := Maximal_Minors(n,kd);
                   1573:                    bs : Bracket_System(0..Number_of_Brackets(bm))
                   1574:                       := Minor_Equations(kd,kd-nd.p,bm);
                   1575:                  begin
                   1576:                    for i in columns'range loop
                   1577:                      columns(i) := i;
                   1578:                    end loop;
                   1579:                    if nd.tp = top
                   1580:                     then pivots := Complement(n,nd.top);
                   1581:                          special := Special_Top_Plane(m,nd.top);
                   1582:                     else pivots := Complement(n,nd.bottom);
                   1583:                          special := Special_Bottom_Plane(m,nd.bottom);
                   1584:                    end if;
                   1585:                    start := Special_Plane(n,m,kk,columns,special);
                   1586:                    Solve_along_One_Chain
                   1587:                      (file,nd,n,0,cod(cod'last),cod'last,cod,poset,
                   1588:                       pivots,columns,bs,special,start,target,planes,
                   1589:                       report,outlog,npaths,timings);
                   1590:                    Clear(bm); Clear(bs);
                   1591:                  end;
                   1592:                else
                   1593:                  declare
                   1594:                    m : constant natural := n - nd.p;
                   1595:                    top_col,bot_col : Bracket(1..m);
                   1596:                    kk_top : constant natural := cod(cod'last-1);
                   1597:                    kk_bot : constant natural := cod(cod'last);
                   1598:                    kd_top : constant natural := n+1-kk_top;
                   1599:                    kd_bot : constant natural := n+1-kk_bot;
                   1600:                    top_bm : Bracket_Monomial := Maximal_Minors(n,kd_top);
                   1601:                    bot_bm : Bracket_Monomial := Maximal_Minors(n,kd_bot);
                   1602:                    top_bs : Bracket_System(0..Number_of_Brackets(top_bm))
                   1603:                           := Minor_Equations(kd_top,kd_top-nd.p,top_bm);
                   1604:                    bot_bs : Bracket_System(0..Number_of_Brackets(bot_bm))
                   1605:                           := Minor_Equations(kd_bot,kd_bot-nd.p,bot_bm);
                   1606:                    top_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
                   1607:                                := Special_Top_Plane(m,nd.top);
                   1608:                    bot_special : Standard_Complex_Matrices.Matrix(1..n,1..m)
                   1609:                                := Special_Bottom_Plane(m,nd.bottom);
                   1610:                    top_piv : Bracket(1..m) := Complement(n,nd.top);
                   1611:                    bot_piv : Bracket(1..m) := Complement(n,nd.bottom);
                   1612:                    top_start,top_target
                   1613:                      : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk_top);
                   1614:                    bot_start,bot_target
                   1615:                      : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk_bot);
                   1616:                  begin
                   1617:                    for i in top_col'range loop
                   1618:                      top_col(i) := i;
                   1619:                    end loop;
                   1620:                    top_start := Special_Plane(n,m,kk_top,top_col,top_special);
                   1621:                    top_target := planes(planes'last-1).all;
                   1622:                    for i in bot_col'range loop
                   1623:                      bot_col(i) := i;
                   1624:                    end loop;
                   1625:                    bot_start := Special_Plane(n,m,kk_bot,bot_col,bot_special);
                   1626:                    bot_target := planes(planes'last).all;
                   1627:                    Solve_along_Two_Chains
                   1628:                      (file,nd,n,0,kk_top,0,kk_bot,cod'last-1,cod,poset,
                   1629:                       top_piv,top_col,bot_piv,bot_col,top_bs,bot_bs,
                   1630:                       top_special,top_start,top_target,bot_special,bot_start,
                   1631:                       bot_target,planes,report,outlog,npaths,timings);
                   1632:                    Clear(top_bm); Clear(top_bs); Clear(bot_bm); Clear(bot_bs);
                   1633:                  end;
                   1634:              end if;
                   1635:        end if;
                   1636:     end if;
                   1637:   end Solve;
                   1638:
                   1639:   procedure Recursive_Quantum_Solve
                   1640:                ( file : in file_type; n,q : in natural;
                   1641:                  nd : in Node; expbp : in Bracket_Polynomial;
                   1642:                  poset : in out Array_of_Array_of_VecMats;
                   1643:                  planes : in VecMat; s : in Standard_Complex_Vectors.Vector;
                   1644:                  report,outlog : in boolean;
                   1645:                  npaths : in out Standard_Natural_Vectors.Vector;
                   1646:                  timings : in out Duration_Array ) is
                   1647:
                   1648:   -- DESCRIPTION :
                   1649:   --   This additional layer is added to avoid the repeated construction
                   1650:   --   of the structure of the equations, that is now in expbp.
                   1651:   --   This is the q-analogue to the Recursive Hypersurface Solver.
                   1652:
                   1653:   begin
                   1654:     if Empty(poset,nd.level,nd.label)
                   1655:      then
                   1656:        if nd.level = 0
                   1657:         then
                   1658:           poset(nd.level)(nd.label)(1)
                   1659:             := new Standard_Complex_Matrices.Matrix'(Leaf_Plane(n*(q+1),nd));
                   1660:         else
                   1661:           for i in nd.children'range(1) loop
                   1662:             for j in nd.children'range(2) loop
                   1663:               if nd.children(i,j) /= null
                   1664:                then Recursive_Quantum_Solve
                   1665:                       (file,n,q,nd.children(i,j).all,expbp,poset,
                   1666:                        planes,s,report,outlog,npaths,timings);
                   1667:               end if;
                   1668:             end loop;
                   1669:           end loop;
                   1670:           Quantum_Deform(file,n,q,poset,nd,expbp,planes,s,report,outlog,
                   1671:                          npaths,timings);
                   1672:        end if;
                   1673:     end if;
                   1674:   end Recursive_Quantum_Solve;
                   1675:
                   1676:   procedure Solve ( file : in file_type; n,q : in natural;
                   1677:                     poset : in out Array_of_Array_of_VecMats; nd : in Node;
                   1678:                     planes : in VecMat; s : in Standard_Complex_Vectors.Vector;
                   1679:                     report,outlog : in boolean;
                   1680:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1681:                     timings : in out Duration_Array ) is
                   1682:
                   1683:     bm : Bracket_Monomial := Maximal_Minors(n,n);
                   1684:     bs : Bracket_System(0..Number_of_Brackets(bm))
                   1685:        := Minor_Equations(n,n-nd.p,bm);
                   1686:
                   1687:   begin
                   1688:     Recursive_Quantum_Solve(file,n,q,nd,bs(1),poset,planes,s,report,outlog,
                   1689:                             npaths,timings);
                   1690:     Clear(bm); Clear(bs);
                   1691:   end Solve;
                   1692:
                   1693:   procedure One_Solve
                   1694:                   ( file : in file_type; n,q : in natural; cod : in Bracket;
                   1695:                     poset : in out Array_of_Array_of_VecMats; nd : in Node;
                   1696:                     planes : in VecMat; s : in Standard_Complex_Vectors.Vector;
                   1697:                     report,outlog : in boolean;
                   1698:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1699:                     timings : in out Duration_Array ) is
                   1700:
                   1701:     m : constant natural := n - nd.p;
                   1702:     kk : constant natural := cod(cod'last);
                   1703:     kd : constant natural := n+1-kk;
                   1704:
                   1705:     procedure Solve_Grand_Child
                   1706:                 ( lnd : in Link_to_Node; continue : out boolean ) is
                   1707:
                   1708:     -- DESCRIPTION :
                   1709:     --   This node lnd is a grandchild of the current node.
                   1710:
                   1711:     begin
                   1712:       if Empty(poset,lnd.level,lnd.label)
                   1713:        then if lnd.level = 0
                   1714:              then poset(lnd.level)(lnd.label)(1)
                   1715:                     := new Standard_Complex_Matrices.Matrix'
                   1716:                              (Leaf_Plane(n*(q+1),lnd.all));
                   1717:              elsif lnd.roco > 0
                   1718:                  then One_Solve(file,n,q,cod(cod'first..cod'last-1),poset,
                   1719:                                 lnd.all,planes,s,report,outlog,npaths,timings);
                   1720:             end if;
                   1721:       end if;
                   1722:       continue := true;
                   1723:     end Solve_Grand_Child;
                   1724:
                   1725:     procedure Solve_Grand_Children is
                   1726:       new Enumerate_Grand_Children(Solve_Grand_Child);
                   1727:
                   1728:   begin
                   1729:     if (Empty(poset,nd.level,nd.label) and (nd.roco > 0))
                   1730:      then
                   1731:        if cod'last >= cod'first
                   1732:         then Solve_Grand_Children(nd,kk);
                   1733:        end if;
                   1734:        declare
                   1735:          pivots,columns : Bracket(1..m);
                   1736:          mod_piv : Bracket(1..nd.p);
                   1737:          special : Standard_Complex_Matrices.Matrix(1..n,1..m);
                   1738:          target : constant Standard_Complex_Matrices.Matrix
                   1739:                 := planes(cod'last).all;
                   1740:          start : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kk);
                   1741:          bm : Bracket_Monomial := Maximal_Minors(n,kd);
                   1742:          bs : Bracket_System(0..Number_of_Brackets(bm))
                   1743:             := Minor_Equations(kd,kd-nd.p,bm);
                   1744:        begin
                   1745:          for i in columns'range loop
                   1746:            columns(i) := i;
                   1747:          end loop;
                   1748:          if nd.tp = top
                   1749:           then mod_piv := Modulo(nd.top,n);
                   1750:                pivots := Complement(n,mod_piv);
                   1751:                special := Special_Top_Plane(m,mod_piv);
                   1752:           else mod_piv := Modulo(nd.bottom,n);
                   1753:                pivots := Complement(n,mod_piv);
                   1754:                special := Special_Bottom_Plane(m,mod_piv);
                   1755:          end if;
                   1756:          start := Special_Plane(n,m,kk,columns,special);
                   1757:          One_Quantum_Solve_along_Chains
                   1758:            (file,nd,n,q,0,kk,cod'last,poset,pivots,columns,bs,
                   1759:             special,start,target,planes,s,report,outlog,npaths,timings);
                   1760:          Clear(bm); Clear(bs);
                   1761:        end;
                   1762:     end if;
                   1763:   end One_Solve;
                   1764:
                   1765:   procedure Solve ( file : in file_type; n,q : in natural; cod : in Bracket;
                   1766:                     poset : in out Array_of_Array_of_VecMats; nd : in Node;
                   1767:                     planes : in VecMat; s : in Standard_Complex_Vectors.Vector;
                   1768:                     report,outlog : in boolean;
                   1769:                     npaths : in out Standard_Natural_Vectors.Vector;
                   1770:                     timings : in out Duration_Array ) is
                   1771:
                   1772:   begin
                   1773:     null;
                   1774:   end Solve;
                   1775:
                   1776: -- DESTRUCTORS :
                   1777:
                   1778:   procedure Clear ( avm : in out Array_of_VecMats ) is
                   1779:   begin
                   1780:     for i in avm'range loop
                   1781:       Deep_Clear(avm(i));
                   1782:     end loop;
                   1783:   end Clear;
                   1784:
                   1785:   procedure Clear ( avm : in out Link_to_Array_of_VecMats ) is
                   1786:
                   1787:     procedure free is
                   1788:       new unchecked_deallocation(Array_of_VecMats,Link_to_Array_of_VecMats);
                   1789:
                   1790:   begin
                   1791:     if avm /= null
                   1792:      then Clear(avm.all);
                   1793:           free(avm);
                   1794:     end if;
                   1795:   end Clear;
                   1796:
                   1797:   procedure Clear ( avm : in out Array_of_Array_of_VecMats ) is
                   1798:   begin
                   1799:     for i in avm'range loop
                   1800:       if avm(i) /= null
                   1801:        then Clear(avm(i).all);
                   1802:       end if;
                   1803:     end loop;
                   1804:   end Clear;
                   1805:
                   1806: end Deformation_Posets;

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