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

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

1.1       maekawa     1: with integer_io;                         use integer_io;
                      2: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
                      3: with Standard_Floating_Numbers_io;       use Standard_Floating_Numbers_io;
                      4: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
                      5: with Standard_Natural_Matrices;
                      6: with Standard_Natural_Matrices_io;       use Standard_Natural_Matrices_io;
                      7: with Standard_Complex_Vectors;
                      8: with Standard_Complex_Vectors_io;        use Standard_Complex_Vectors_io;
                      9: with Standard_Complex_Norms_Equals;      use Standard_Complex_Norms_Equals;
                     10: with Standard_Complex_Matrices_io;       use Standard_Complex_Matrices_io;
                     11: with Standard_Complex_Poly_Matrices;
                     12: with Standard_Complex_Poly_Matrices_io;  use Standard_Complex_Poly_Matrices_io;
                     13: with Standard_Complex_Polynomials;       use Standard_Complex_Polynomials;
                     14: with Standard_Complex_Poly_Systems;      use Standard_Complex_Poly_Systems;
                     15: with Standard_Complex_Poly_Systems_io;   use Standard_Complex_Poly_Systems_io;
                     16: with Standard_Complex_Poly_SysFun;       use Standard_Complex_Poly_SysFun;
                     17: with Brackets,Brackets_io;               use Brackets,Brackets_io;
                     18: with Bracket_Monomials;                  use Bracket_Monomials;
                     19: with Bracket_Monomials_io;               use Bracket_Monomials_io;
                     20: with Bracket_Polynomials;                use Bracket_Polynomials;
                     21: with Bracket_Polynomials_io;             use Bracket_Polynomials_io;
                     22: with Bracket_Systems;                    use Bracket_Systems;
                     23: with Pieri_Trees,Pieri_Trees_io;         use Pieri_Trees,Pieri_Trees_io;
                     24: with Symbolic_Minor_Equations;           use Symbolic_Minor_Equations;
                     25: with Numeric_Minor_Equations;            use Numeric_Minor_Equations;
                     26: with Determinantal_Systems;              use Determinantal_Systems;
                     27: with Solve_Pieri_Leaves;
                     28: with Plane_Representations;              use Plane_Representations;
                     29: with Specialization_of_Planes;           use Specialization_of_Planes;
                     30: with Pieri_Continuation;                 use Pieri_Continuation;
                     31:
                     32: package body Pieri_Deformations is
                     33:
                     34:   function Coordinate_Bracket
                     35:              ( nd : Pieri_Node; jmp : natural ) return Bracket is
                     36:
                     37:   -- DESCRIPTION :
                     38:   --   On return we find the bracket determines the local coordinates.
                     39:   --   This bracket depends whether jmp = nd.node'last or not.
                     40:
                     41:   begin
                     42:     if Is_Leaf(nd) or jmp < nd.node'last
                     43:      then return nd.node;
                     44:      else return Upper_Jump_Decrease(nd);
                     45:     end if;
                     46:   end Coordinate_Bracket;
                     47:
                     48:   procedure Test_Solution
                     49:                  ( file : in file_type; nd1,nd2 : in Pieri_Node;
                     50:                    id : in natural; l1,l2 : in VecMat; l : in Matrix;
                     51:                    x : Standard_Complex_Poly_Matrices.Matrix;
                     52:                    solpla : in Matrix ) is
                     53:
                     54:   -- DESCRIPTION :
                     55:   --   Evaluates the system that represents the intersection conditions
                     56:   --   for the planes in l1,l2 and the plane l in the given solution plane.
                     57:
                     58:     sys : Link_to_Poly_Sys := new Poly_Sys'(Polynomial_Equations(l,x));
                     59:     eva : Standard_Complex_Vectors.Vector(sys'range);
                     60:     fst : natural;
                     61:
                     62:   begin
                     63:     if Is_Leaf(nd1)
                     64:      then fst := l1'last+1;
                     65:      elsif nd1.i = 0
                     66:          then fst := nd1.c;
                     67:          else fst := nd1.c+1;
                     68:     end if;
                     69:     for i in fst..l1'last loop
                     70:       Concat(sys,Polynomial_Equations(l1(i).all,x));
                     71:     end loop;
                     72:     if Is_Leaf(nd2)
                     73:      then fst := l2'last+1;
                     74:      elsif nd2.i = 0
                     75:          then fst := nd2.c;
                     76:          else fst := nd2.c+1;
                     77:     end if;
                     78:     for i in fst..l2'last loop
                     79:       Concat(sys,Polynomial_Equations(l2(i).all,x));
                     80:     end loop;
                     81:    -- put_line(file,"The polynomial system that has been solved :");
                     82:    -- put_line(file,sys.all);
                     83:     eva := Eval(sys.all,Vector_Rep(solpla));
                     84:     put(file,"Residual at the target system :");
                     85:     put(file,Max_Norm(eva),3);
                     86:     Clear(sys);
                     87:     if (((nd1.i = 0) and (nd1.c = 1))
                     88:       or else ((nd2.i = 0) and (nd2.c = 1)))
                     89:      then put(file," PAIR "); put(file,id,1); put_line(file," DONE.");
                     90:      else put_line(file,".");
                     91:     end if;
                     92:   end Test_Solution;
                     93:
                     94:   procedure Test_Solutions
                     95:                  ( file : in file_type;
                     96:                    l1,l2 : in VecMat; l : in Matrix;
                     97:                    x : Standard_Complex_Poly_Matrices.Matrix;
                     98:                    solpla : in VecMat ) is
                     99:
                    100:   -- DESCRIPTION :
                    101:   --   Evaluates the system that represents the intersection conditions
                    102:   --   for the planes in l1,l2 and the plane l in the given solution plane.
                    103:
                    104:     sys : Link_to_Poly_Sys := new Poly_Sys'(Polynomial_Equations(l,x));
                    105:
                    106:   begin
                    107:     for i in l1'range loop
                    108:       Concat(sys,Polynomial_Equations(l1(i).all,x));
                    109:     end loop;
                    110:     for i in l2'range loop
                    111:       Concat(sys,Polynomial_Equations(l2(i).all,x));
                    112:     end loop;
                    113:     put_line(file,"The polynomial system that has been solved :");
                    114:     put_line(file,sys.all);
                    115:     for i in solpla'range loop
                    116:       exit when (solpla(i) = null);
                    117:       put(file,"Solution plane no. "); put(file,i,1); put_line(file," :");
                    118:       put(file,solpla(i).all,2);
                    119:       put_line(file,"The system evaluated at the plane :");
                    120:       put_line(file,Eval(sys.all,Vector_Rep(solpla(i).all)));
                    121:     end loop;
                    122:     Clear(sys);
                    123:   end Test_Solutions;
                    124:
                    125:   procedure Start_at_Leaves
                    126:               ( file : in file_type; pnd : in Paired_Nodes;
                    127:                 ln : in Matrix; sol : in out Matrix ) is
                    128:
                    129:   -- DESCRIPTION :
                    130:   --   Computes the start solutions at the leaves.
                    131:
                    132:    -- xpm : Standard_Complex_Poly_Matrices.Matrix(sol'range(1),sol'range(2))
                    133:    --     := Schubert_Pattern(sol'last(1),pnd.left.node,pnd.right.node);
                    134:    -- sys : Link_to_Poly_Sys := new Poly_Sys'(Polynomial_Equations(ln,xpm));
                    135:
                    136:   begin
                    137:     sol := Solve_Pieri_Leaves(file,pnd.left.node,pnd.right.node,ln);
                    138:     put_line(file,"The solution plane at the leaves : ");
                    139:     put(file,sol,2);
                    140:    -- put_line(file,"The polynomial equations : "); put(file,sys.all);
                    141:    -- put(file,"The solution evaluated at the polynomial equations : ");
                    142:    -- put(file,Evaluate(sys.all,sol),3); new_line(file);
                    143:    -- Standard_Complex_Poly_Matrices.Clear(xpm);
                    144:    -- Clear(sys);
                    145:   end Start_at_Leaves;
                    146:
                    147:   function Moving_U_Matrix
                    148:               ( file : in file_type; outlog : in boolean;
                    149:                 nd : Pieri_Node; lb : Bracket;
                    150:                 f : Standard_Complex_Matrices.Matrix; l : VecMat )
                    151:               return Standard_Complex_Poly_Matrices.Matrix is
                    152:
                    153:   -- DESCRIPTION :
                    154:   --   Returns the moving U-matrix.
                    155:
                    156:   -- REQUIRED : nd.c > 0.
                    157:
                    158:     n : constant natural := f'length(1);
                    159:     p : constant natural := lb'length;
                    160:     nva : constant natural := n*p+1;
                    161:     m : constant natural := n-p;
                    162:     lc : constant natural := l(nd.c)'length(2);
                    163:     r : natural;
                    164:     U : constant Standard_Complex_Matrices.Matrix := U_Matrix(f,lb);
                    165:
                    166:   begin
                    167:     if outlog
                    168:      then put_line(file,"The U-matrix : "); put(file,U,2);
                    169:     end if;
                    170:     if nd.i = 0
                    171:      then return Moving_U_Matrix(nva,U,l(nd.c).all);
                    172:      else r := m+1 - lc;
                    173:           return Moving_U_Matrix(U,nd.i,r,lb);
                    174:     end if;
                    175:   end Moving_U_Matrix;
                    176:
                    177:   function Moving_Cycle ( movU,x : Standard_Complex_Poly_Matrices.Matrix )
                    178:                         return Poly_Sys is
                    179:
                    180:   -- DESCRIPTION :
                    181:   --   Returns the moving cycle expaned as polynomial system.
                    182:
                    183:     n : constant natural := x'length(1);
                    184:     p : constant natural := x'length(2);
                    185:     kd : constant natural := p + movU'length(2);
                    186:     bm : Bracket_Monomial := Maximal_Minors(n,kd);
                    187:     bs : Bracket_System(0..Number_of_Brackets(bm))
                    188:        := Minor_Equations(kd,kd-p,bm);
                    189:     res : constant Poly_Sys := Lifted_Expanded_Minors(movU,x,bs);
                    190:
                    191:   begin
                    192:     Clear(bm); Clear(bs);
                    193:     return res;
                    194:   end Moving_Cycle;
                    195:
                    196:   function One_Moving_Cycle
                    197:               ( file : in file_type; nd : Pieri_Node; lb : Bracket;
                    198:                 f : Standard_Complex_Matrices.Matrix; l : VecMat;
                    199:                 x : Standard_Complex_Poly_Matrices.Matrix; outlog : boolean )
                    200:               return Poly_Sys is
                    201:
                    202:   -- DESCRIPTION :
                    203:   --   Returns the moving part for one node in case i = 0.
                    204:
                    205:   -- REQUIRED : nd.c > 0.
                    206:
                    207:     lc : constant natural := l(nd.c)'length(2);
                    208:     movU : Standard_Complex_Poly_Matrices.Matrix(x'range(1),1..lc)
                    209:          := Moving_U_Matrix(file,outlog,nd,lb,f,l);
                    210:     res : constant Poly_Sys := Moving_Cycle(movU,x);
                    211:
                    212:   begin
                    213:     if outlog
                    214:      then put_line(file,"The moving U matrix : "); put(file,MovU);
                    215:           put_line(file,"The equations of the moving cycle : "); put(file,res);
                    216:     end if;
                    217:     Standard_Complex_Poly_Matrices.Clear(movU);
                    218:     return res;
                    219:   end One_Moving_Cycle;
                    220:
                    221:   function Left_Moving_Cycle
                    222:               ( file : file_type; nd : Pieri_Node; lb : Bracket; jmp : natural;
                    223:                 f : Standard_Complex_Matrices.Matrix; l : VecMat;
                    224:                 x : Standard_Complex_Poly_Matrices.Matrix; outlog : boolean )
                    225:               return Poly_Sys is
                    226:
                    227:   -- DESCRIPTION :
                    228:   --   Returns the moving part for the case i > 0 and jmp < p,
                    229:   --   for the node from the first Pieri tree.
                    230:
                    231:   -- REQUIRED : nd.c > 0.
                    232:
                    233:     n : constant natural := x'length(1);
                    234:     p : constant natural := x'length(2);
                    235:     lc : constant natural := l(nd.c)'length(2);
                    236:     movU : Standard_Complex_Poly_Matrices.Matrix(x'range(1),1..lc)
                    237:          := Moving_U_Matrix(file,outlog,nd,lb,f,l);
                    238:     movUsec : constant Standard_Complex_Poly_Matrices.Matrix
                    239:             := Lower_Section(movU,n+1-lb(jmp));
                    240:     res : constant Poly_Sys := Moving_Cycle(movUsec,x);
                    241:
                    242:   begin
                    243:     if outlog
                    244:      then put_line(file,"The left moving U matrix : "); put(file,movU);
                    245:           put_line(file,"The left moving cycle : "); put(file,movUsec);
                    246:           put_line(file,"The equations of the moving cycle : "); put(file,res);
                    247:     end if;
                    248:     Standard_Complex_Poly_Matrices.Clear(movU);
                    249:     return res;
                    250:   end Left_Moving_Cycle;
                    251:
                    252:   function Right_Moving_Cycle
                    253:               ( file : file_type; nd : Pieri_Node; lb : Bracket; jmp : natural;
                    254:                 f : Standard_Complex_Matrices.Matrix; l : VecMat;
                    255:                 x : Standard_Complex_Poly_Matrices.Matrix; outlog : boolean )
                    256:               return Poly_Sys is
                    257:
                    258:   -- DESCRIPTION :
                    259:   --   Returns the moving part for the case i > 0 and jmp < p,
                    260:   --   for the node from the second Pieri tree.
                    261:
                    262:   -- REQUIRED : nd.c > 0.
                    263:
                    264:     lc : constant natural := l(nd.c)'length(2);
                    265:     movU : Standard_Complex_Poly_Matrices.Matrix(x'range(1),1..lc)
                    266:          := Moving_U_Matrix(file,outlog,nd,lb,f,l);
                    267:     movUsec : constant Standard_Complex_Poly_Matrices.Matrix
                    268:             := Upper_Section(movU,lb(jmp));
                    269:     res : constant Poly_Sys := Moving_Cycle(movUsec,x);
                    270:
                    271:   begin
                    272:     if outlog
                    273:      then put_line(file,"The right moving U matrix : "); put(file,movU);
                    274:           put_line(file,"The right moving cycle : "); put(file,movUsec);
                    275:           put_line(file,"The equations of the moving cycle :"); put(file,res);
                    276:     end if;
                    277:     Standard_Complex_Poly_Matrices.Clear(movU);
                    278:     return res;
                    279:   end Right_Moving_Cycle;
                    280:
                    281:   procedure Moving_Cycles
                    282:               ( file : in file_type; pnd : in Paired_Nodes; id : in natural;
                    283:                 jmp1,jmp2 : in natural; b1,b2 : in Bracket;
                    284:                 f1,f2 : in Standard_Complex_Matrices.Matrix;
                    285:                 l1,l2 : in VecMat; ln : in Matrix; report,outlog : in boolean;
                    286:                 sol : in out Matrix ) is
                    287:
                    288:   -- DESCRIPTION :
                    289:   --   Set up the moving cycles for the current pair of nodes down to
                    290:   --   the nodes (b1,b2), jumping along the indices (jmp1,jmp2).
                    291:   --   The other parameters are the same as in Deform_Pair.
                    292:
                    293:     cb1 : constant Bracket := Coordinate_Bracket(pnd.left.all,jmp1);
                    294:     cb2 : constant Bracket := Coordinate_Bracket(pnd.right.all,jmp2);
                    295:     xpm : Standard_Complex_Poly_Matrices.Matrix(sol'range(1),sol'range(2))
                    296:         := Schubert_Pattern(sol'last(1),cb1,cb2);
                    297:     homotopy : Link_to_Poly_Sys;
                    298:     locmap : constant Standard_Natural_Matrices.Matrix
                    299:            := Standard_Coordinate_Frame(xpm,sol);
                    300:
                    301:   begin
                    302:     if outlog
                    303:      then
                    304:        put_line(file,"The localization map of the solution at the pair :");
                    305:        put(file,xpm);
                    306:     end if;
                    307:     homotopy := new Poly_Sys'(Polynomial_Equations(ln,xpm));
                    308:     for i in pnd.left.c+1..l1'last loop
                    309:       Concat(homotopy,Polynomial_Equations(l1(i).all,xpm));
                    310:     end loop;
                    311:     for i in pnd.right.c+1..l2'last loop
                    312:       Concat(homotopy,Polynomial_Equations(l2(i).all,xpm));
                    313:     end loop;
                    314:     for i in homotopy'range loop
                    315:       Embed(homotopy(i));
                    316:     end loop;
                    317:     if not Is_Leaf(pnd.left.all) and (pnd.left.c > 0)
                    318:      then
                    319:        if pnd.left.i = 0
                    320:         then Concat(homotopy,
                    321:                     One_Moving_Cycle(file,pnd.left.all,b1,f1,l1,xpm,outlog));
                    322:         elsif jmp1 < b1'last
                    323:             then Concat(homotopy,
                    324:                         Left_Moving_Cycle
                    325:                           (file,pnd.left.all,b1,jmp1,f1,l1,xpm,outlog));
                    326:        end if;
                    327:     end if;
                    328:     if not Is_Leaf(pnd.right.all) and (pnd.right.c > 0)
                    329:      then
                    330:        if pnd.right.i = 0
                    331:         then Concat(homotopy,
                    332:                     One_Moving_Cycle(file,pnd.right.all,b2,f2,l2,xpm,outlog));
                    333:         elsif jmp2 < b2'last
                    334:             then
                    335:               Concat(homotopy,
                    336:                      Right_Moving_Cycle
                    337:                        (file,pnd.right.all,b2,jmp2,f2,l2,xpm,outlog));
                    338:        end if;
                    339:     end if;
                    340:     if outlog
                    341:      then put_line(file,"All equations in the homotopy :");
                    342:           put_line(file,homotopy.all);
                    343:     end if;
                    344:     Trace_Paths(file,homotopy.all,locmap,report,outlog,sol);
                    345:     Test_Solution(file,pnd.left.all,pnd.right.all,id,l1,l2,ln,xpm,sol);
                    346:     Standard_Complex_Poly_Matrices.Clear(xpm);
                    347:     Clear(homotopy);
                    348:   end Moving_Cycles;
                    349:
                    350: -- TARGET PROCEDURES :
                    351:
                    352:   procedure Deform_Pair
                    353:               ( file : in file_type; pnd : in Paired_Nodes; id : in natural;
                    354:                 f1,f2 : in Standard_Complex_Matrices.Matrix;
                    355:                 l1,l2 : in VecMat; ln : in Matrix; report,outlog : in boolean;
                    356:                 sol : in out Matrix ) is
                    357:
                    358:     down : Paired_Nodes;
                    359:     jmp1 : constant natural := Jump(pnd.left.all);
                    360:     jmp2 : constant natural := Jump(pnd.right.all);
                    361:     lb1 : constant Bracket := Lower_Jump_Decrease(pnd.left.all);
                    362:     lb2 : constant Bracket := Lower_Jump_Decrease(pnd.right.all);
                    363:
                    364:   begin
                    365:     put(file,"JUMP @(");
                    366:     put(file,pnd.left.all); put(file,",");
                    367:     put(file,pnd.right.all); put(file,")"); put(file," = (");
                    368:     put(file,jmp1,1); put(file,","); put(file,jmp2,1); put(file,") -> (");
                    369:     put(file,lb1); put(file,","); put(file,lb2); put_line(file,").");
                    370:     if (Is_Leaf(pnd.left.all) and Is_Leaf(pnd.right.all))
                    371:      then Start_at_Leaves(file,pnd,ln,sol);
                    372:      else Moving_Cycles
                    373:             (file,pnd,id,jmp1,jmp2,lb1,lb2,f1,f2,l1,l2,ln,report,outlog,sol);
                    374:     end if;
                    375:     if not At_First_Branch_Point(pnd)
                    376:      then down := Ancestor(pnd);
                    377:           Deform_Pair(file,down,id,f1,f2,l1,l2,ln,report,outlog,sol);
                    378:     end if;
                    379:    -- if pnd.left.h = pnd.right.h
                    380:    --  then if (((pnd.left.c <= 1) and (pnd.right.c <=1))
                    381:    --         and then (((pnd.left.i = 0) and (pnd.left.c = 1))
                    382:    --          or else ((pnd.right.i = 0) and (pnd.right.c = 1))))
                    383:    --        then null;
                    384:    --        else down.left := pnd.left.ancestor;
                    385:    --             down.right := pnd.right.ancestor;
                    386:    --             Deform_Pair(file,down,id,f1,f2,l1,l2,ln,report,outlog,sol);
                    387:    --       end if;
                    388:    --  elsif pnd.left.h > pnd.right.h
                    389:    --      then down.left := pnd.left.ancestor;
                    390:    --           down.right := pnd.right;
                    391:    --           Deform_Pair(file,down,id,f1,f2,l1,l2,ln,report,outlog,sol);
                    392:    --      else down.left := pnd.left;
                    393:    --           down.right := pnd.right.ancestor;
                    394:    --           Deform_Pair(file,down,id,f1,f2,l1,l2,ln,report,outlog,sol);
                    395:    -- end if;
                    396:   end Deform_Pair;
                    397:
                    398:   procedure Write_Paired_Chains ( file : in file_type;
                    399:                                   pnd : in Paired_Nodes; ind : in natural ) is
                    400:
                    401:   -- DESCRIPTION :
                    402:   --   Writes the chains downwards that start at the leaves of pnd.
                    403:   --   The paired nodes have index number ind.
                    404:
                    405:   begin
                    406:     put(file,"DESCENDING THE PAIRED CHAINS "); put(file,ind,1);
                    407:     put_line(file," :");
                    408:     put(file,pnd.left);  new_line(file);
                    409:     put(file,pnd.right); new_line(file);
                    410:   end Write_Paired_Chains;
                    411:
                    412:   procedure Deform_Pairs
                    413:               ( file : in file_type; n,d : in natural;
                    414:                 lp : in List_of_Paired_Nodes; l1,l2 : in VecMat;
                    415:                 ln : in Matrix; report,outlog : in boolean;
                    416:                 sols : out VecMat ) is
                    417:
                    418:     tmp : List_of_Paired_Nodes := lp;
                    419:     pnd : Paired_Nodes;
                    420:     f1 : constant Standard_Complex_Matrices.Matrix
                    421:        := Random_Upper_Triangular(n);
                    422:     f2 : constant Standard_Complex_Matrices.Matrix
                    423:        := Random_Lower_Triangular(n);
                    424:     firstpair : Paired_Nodes := Head_Of(lp);
                    425:     lb1 : constant Bracket := Lowest_Jump_Decrease(firstpair.left.all);
                    426:     lb2 : constant Bracket := Lowest_Jump_Decrease(firstpair.right.all);
                    427:     xpm : Standard_Complex_Poly_Matrices.Matrix(ln'range(1),lb1'range)
                    428:         := Schubert_Pattern(ln'last(1),lb1,lb2);
                    429:
                    430:   begin
                    431:     for i in 1..Length_Of(lp) loop
                    432:       pnd := Head_Of(tmp);
                    433:       Write_Paired_Chains(file,pnd,i);
                    434:       sols(i) := new Standard_Complex_Matrices.Matrix(1..n,1..d);
                    435:       Deform_Pair(file,pnd,i,f1,f2,l1,l2,ln,report,outlog,sols(i).all);
                    436:       tmp := Tail_Of(tmp);
                    437:     end loop;
                    438:     Test_Solutions(file,l1,l2,ln,xpm,sols);
                    439:   end Deform_Pairs;
                    440:
                    441: end Pieri_Deformations;

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