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

Annotation of OpenXM_contrib/PHC/Ada/Schubert/ts_org_pieri.adb, Revision 1.1

1.1     ! maekawa     1: with text_io,integer_io;                 use text_io,integer_io;
        !             2: with Communications_with_User;           use Communications_with_User;
        !             3: with Timing_Package;                     use Timing_Package;
        !             4: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
        !             5: with Standard_Natural_Vectors;           use Standard_Natural_Vectors;
        !             6: with Standard_Natural_Vectors_io;        use Standard_Natural_Vectors_io;
        !             7: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
        !             8: with Standard_Complex_Vectors;
        !             9: with Standard_Complex_Vectors_io;        use Standard_Complex_Vectors_io;
        !            10: with Standard_Complex_Matrices;
        !            11: with Standard_Complex_Matrices_io;       use Standard_Complex_Matrices_io;
        !            12: with Standard_Complex_VecMats;           use Standard_Complex_VecMats;
        !            13: with Standard_Complex_VecMats_io;        use Standard_Complex_VecMats_io;
        !            14: with Standard_Random_Matrices;           use Standard_Random_Matrices;
        !            15: with Standard_Complex_Poly_Matrices;
        !            16: with Standard_Complex_Poly_Matrices_io;  use Standard_Complex_Poly_Matrices_io;
        !            17: with Symbol_Table;                       use Symbol_Table;
        !            18: with Standard_Complex_Polynomials;       use Standard_Complex_Polynomials;
        !            19: with Standard_Complex_Polynomials_io;    use Standard_Complex_Polynomials_io;
        !            20: with Standard_Complex_Poly_Systems;      use Standard_Complex_Poly_Systems;
        !            21: with Standard_Complex_Poly_Systems_io;   use Standard_Complex_Poly_Systems_io;
        !            22: with Standard_Complex_Poly_SysFun;       use Standard_Complex_Poly_SysFun;
        !            23: with Matrix_Indeterminates;              use Matrix_Indeterminates;
        !            24: with Drivers_for_Poly_Continuation;      use Drivers_for_Poly_Continuation;
        !            25: with Brackets,Brackets_io;               use Brackets,Brackets_io;
        !            26: with Bracket_Monomials;                  use Bracket_Monomials;
        !            27: with Bracket_Monomials_io;               use Bracket_Monomials_io;
        !            28: with Bracket_Expansions;                 use Bracket_Expansions;
        !            29: with Bracket_Polynomials;                use Bracket_Polynomials;
        !            30: with Bracket_Polynomials_io;             use Bracket_Polynomials_io;
        !            31: with Bracket_Systems;                    use Bracket_Systems;
        !            32: with Pieri_Trees,Pieri_Trees_io;         use Pieri_Trees,Pieri_Trees_io;
        !            33: with Pieri_Root_Counts;                  use Pieri_Root_Counts;
        !            34: with Symbolic_Minor_Equations;           use Symbolic_Minor_Equations;
        !            35: with Numeric_Minor_Equations;            use Numeric_Minor_Equations;
        !            36: with Solve_Pieri_Leaves;
        !            37: with Specialization_of_Planes;           use Specialization_of_Planes;
        !            38: with Pieri_Deformations;                 use Pieri_Deformations;
        !            39:
        !            40: procedure ts_org_pieri is
        !            41:
        !            42: -- DESCRIPTION :
        !            43: --   This program executes the original implementation of the Pieri homotopy
        !            44: --   algorithm, implemented strictly along the lines of the description in
        !            45: --   the paper "Numerical Schubert Calculus" of Birkett Huber, Frank Sottile
        !            46: --   and Bernd Sturmfels.
        !            47:
        !            48:   function Maximum ( n1,n2 : natural ) return natural is
        !            49:   begin
        !            50:     if n1 >= n2
        !            51:      then return n1;
        !            52:      else return n2;
        !            53:     end if;
        !            54:   end Maximum;
        !            55:
        !            56:   procedure Add_t_Symbol is
        !            57:
        !            58:   -- DESCRIPTION :
        !            59:   --   Adds the symbol for the continuation parameter t to the symbol table.
        !            60:
        !            61:     tsb : Symbol;
        !            62:
        !            63:   begin
        !            64:     Symbol_Table.Enlarge(1);
        !            65:     tsb(1) := 't';
        !            66:     for i in 2..tsb'last loop
        !            67:       tsb(i) := ' ';
        !            68:     end loop;
        !            69:     Symbol_Table.Add(tsb);
        !            70:   end Add_t_Symbol;
        !            71:
        !            72: -- DISPLAYING THE REPRESENTATIONS OF THE PLANES :
        !            73:
        !            74:   procedure Display_Polynomial_Pattern
        !            75:               ( file : in file_type; n : in natural; b1,b2 : in Bracket ) is
        !            76:
        !            77:   -- DESCRIPTION :
        !            78:   --   Displays the pattern by a polynomial matrix.
        !            79:
        !            80:     pm : Standard_Complex_Poly_Matrices.Matrix(1..n,b1'range)
        !            81:        := Schubert_Pattern(n,b1,b2);
        !            82:
        !            83:   begin
        !            84:     put(file,pm);
        !            85:     Standard_Complex_Poly_Matrices.Clear(pm);
        !            86:   end Display_Polynomial_Pattern;
        !            87:
        !            88: -- AUXILIARIES TO SET UP EQUATIONS :
        !            89:
        !            90:   procedure Expand_Minors ( file : in file_type;
        !            91:                             mat : in Standard_Complex_Poly_Matrices.Matrix;
        !            92:                             bm : in Bracket_Monomial ) is
        !            93:
        !            94:   -- DESCRIPTION :
        !            95:   --   Expands the quadratic bracket monomial.
        !            96:
        !            97:     first : boolean := true;
        !            98:     lb : Link_to_Bracket;
        !            99:
        !           100:     procedure Visit_Bracket ( b : in Bracket; continue : out boolean ) is
        !           101:
        !           102:       p : Poly := Null_Poly;
        !           103:
        !           104:     begin
        !           105:       if first
        !           106:        then lb := new Bracket'(b);
        !           107:             first := false;
        !           108:        else p := Expanded_Minor(mat,b);
        !           109:             if p /= Null_Poly
        !           110:              then put(file,lb.all);
        !           111:                   put(file,"*("); put(file,p); put(file,")");
        !           112:             end if;
        !           113:             Clear(lb); Clear(p);
        !           114:       end if;
        !           115:       continue := true;
        !           116:     end Visit_Bracket;
        !           117:     procedure Visit_Brackets is new Enumerate_Brackets(Visit_Bracket);
        !           118:
        !           119:   begin
        !           120:     Visit_Brackets(bm);
        !           121:   end Expand_Minors;
        !           122:
        !           123:   procedure Expand_Minors ( file : in file_type;
        !           124:                             mat : in Standard_Complex_Poly_Matrices.Matrix;
        !           125:                             bp : Bracket_Polynomial ) is
        !           126:
        !           127:   -- DESCRIPTION :
        !           128:   --   Writes the expansion of the matrix, using the bracket polynomial which
        !           129:   --   is a list of quadratic monomials that represent the Laplace expansion.
        !           130:
        !           131:     procedure Visit_Term ( t : in Bracket_Term; continue : out boolean ) is
        !           132:     begin
        !           133:       if REAL_PART(t.coeff) > 0.0
        !           134:        then put("+");
        !           135:        else put("-");
        !           136:       end if;
        !           137:       Expand_Minors(file,mat,t.monom);
        !           138:       continue := true;
        !           139:     end Visit_Term;
        !           140:     procedure Visit_Terms is new Enumerate_Terms(Visit_Term);
        !           141:
        !           142:   begin
        !           143:     Visit_Terms(bp);
        !           144:   end Expand_Minors;
        !           145:
        !           146:   procedure Pieri_Equations
        !           147:               ( file : in file_type; n,d : in natural; bs : in Bracket_System;
        !           148:                 b1,b2 : in Bracket ) is
        !           149:
        !           150:   -- DESCRIPTION :
        !           151:   --   Writes the Pieri equations corresponding to the pair of brackets.
        !           152:
        !           153:     cffmat : Standard_Complex_Matrices.Matrix(1..n,1..(n-d))
        !           154:            := Random_Matrix(n,n-d);
        !           155:     polmat : Standard_Complex_Poly_Matrices.Matrix(1..n,1..d)
        !           156:            := Schubert_Pattern(n,b1,b2);
        !           157:     sys : Poly_Sys(bs'first+1..bs'last);
        !           158:     sol : Standard_Complex_Matrices.Matrix(1..n,1..d);
        !           159:
        !           160:   begin
        !           161:     put(file,"Plane X for (");
        !           162:     put(file,b1); put(file,","); put(file,b2); put_line(file,") :");
        !           163:     put(file,polmat);
        !           164:     put_line(file,"The system with expanded minors of X : ");
        !           165:     for i in 1..bs'last loop
        !           166:       Expand_Minors(file,polmat,bs(i)); new_line(file);
        !           167:     end loop;
        !           168:    -- put("Give a "); put(n,1); put("x"); put(n-d,1);
        !           169:    -- put_line("-matrix of complex numbers : ");
        !           170:    -- get(cffmat);
        !           171:    -- put("Your "); put(n-d,1); put_line("-plane : "); put(cffmat);
        !           172:    -- put("A random "); put(n-d,1); put_line("-plane : "); put(cffmat);
        !           173:     put("The minors evaluated at a random ");
        !           174:     put(n-d,1); put_line("-plane :");
        !           175:     sys := Expanded_Minors(cffmat,polmat,bs);
        !           176:     put_line(sys);
        !           177:     Standard_Complex_Poly_Matrices.Clear(polmat);
        !           178:     if Pieri_Condition(n,b1,b2)
        !           179:      then put("The "); put(d,1); put_line("-plane at the leaves :");
        !           180:           sol := Solve_Pieri_Leaves(Standard_Output,b1,b2,cffmat); put(sol);
        !           181:           put_line("The solution evaluated at the system : ");
        !           182:           put(Evaluate(sys,sol)); new_line;
        !           183:      else put_line("Pair of leaves does not satisfy Pieri's condition.");
        !           184:     end if;
        !           185:   end Pieri_Equations;
        !           186:
        !           187:   procedure Expand_Minors ( n,d : in natural; bs : in Bracket_System ) is
        !           188:
        !           189:   -- DESCRIPTION :
        !           190:   --   Expands the minors to obtain a symbolic formulation of the equations.
        !           191:
        !           192:     b1,b2 : Bracket(1..d);
        !           193:
        !           194:   begin
        !           195:     put("Give 1st bracket : "); get(b1);
        !           196:     put("Give 2nd bracket : "); get(b2);
        !           197:     Pieri_Equations(Standard_Output,n,d,bs,b1,b2);
        !           198:   end Expand_Minors;
        !           199:
        !           200:   procedure Pieri_Equations_for_Paired_Chains
        !           201:               ( file : in file_type; n,d : in natural; bs : in Bracket_System;
        !           202:                 b1,b2 : in bracket_Array ) is
        !           203:
        !           204:   -- DESCRIPTION :
        !           205:   --   Writes the equations for each node along a pair of chains.
        !           206:
        !           207:     maxlen : constant natural := Maximum(b1'last,b2'last);
        !           208:     lb1,lb2 : Link_to_Bracket;
        !           209:
        !           210:   begin
        !           211:     for i in b1'first..maxlen loop
        !           212:       if i <= b1'last
        !           213:        then lb1 := b1(i);
        !           214:        else lb1 := b1(b1'last);
        !           215:       end if;
        !           216:       if i <= b2'last
        !           217:        then lb2 := b2(i);
        !           218:        else lb2 := b2(b2'last);
        !           219:       end if;
        !           220:       Pieri_Equations(file,n,d,bs,lb1.all,lb2.all);
        !           221:     end loop;
        !           222:   end Pieri_Equations_for_Paired_Chains;
        !           223:
        !           224:   procedure Write_Pieri_Equations
        !           225:               ( file : in file_type; n,d : in natural; t1,t2 : in Pieri_Tree;
        !           226:                 bs : in Bracket_System ) is
        !           227:
        !           228:   -- DESCRIPTION :
        !           229:   --   Writes the Pieri Equations for all pairs of chains.
        !           230:
        !           231:     procedure Visit_Chain ( b1,b2 : in Bracket_Array; cont : out boolean ) is
        !           232:     begin
        !           233:       Pieri_Equations_for_Paired_Chains(file,n,d,bs,b1,b2);
        !           234:       cont := true;
        !           235:     end Visit_Chain;
        !           236:     procedure Visit_Chains is new Enumerate_Paired_Chains(Visit_Chain);
        !           237:
        !           238:   begin
        !           239:     Visit_Chains(t1,t2);
        !           240:   end Write_Pieri_Equations;
        !           241:
        !           242:   procedure Write_Pieri_Equations
        !           243:               ( n,d : in natural; t1,t2 : in Pieri_Tree ) is
        !           244:
        !           245:     k,kd : natural;
        !           246:     bm : Bracket_Monomial;
        !           247:     file : file_type;
        !           248:
        !           249:   begin
        !           250:     new_line; skip_line;
        !           251:     put_line("Reading the name of the output file.");
        !           252:     Read_Name_and_Create_File(file);
        !           253:     put("Give k to determine (m-k+1)-plane : "); get(k);
        !           254:     kd := n-k+1;
        !           255:     bm := Maximal_Minors(n,kd);      -- because n = m+p
        !           256:     put(file,"All maximal minors : "); put(file,bm); new_line(file);
        !           257:     declare
        !           258:       bs : constant Bracket_System := Minor_Equations(kd,kd-d,bm);
        !           259:     begin
        !           260:       put_line(file,"The generic equation in the Laplace expansion : ");
        !           261:       put(file,bs(0));
        !           262:       put_line(file,"The specific equations in the system : ");
        !           263:       for i in 1..bs'last loop
        !           264:         put(file,bs(i));
        !           265:       end loop;
        !           266:       Write_Pieri_Equations(file,n,d,t1,t2,bs);
        !           267:     end;
        !           268:     Close(file);
        !           269:     Clear(bm);
        !           270:   end Write_Pieri_Equations;
        !           271:
        !           272: -- AUXILIARIES TO REPRESENT PIERI TREES :
        !           273:
        !           274:   procedure Write_a_Chain ( file : in file_type; b : in Bracket_Array ) is
        !           275:   begin
        !           276:     put(b(b'first).all);
        !           277:     for i in b'first+1..b'last loop
        !           278:       put(" < "); put(b(i).all);
        !           279:     end loop;
        !           280:     new_line;
        !           281:   end Write_a_Chain;
        !           282:
        !           283:   procedure Write_Chains ( t : in Pieri_Tree ) is
        !           284:
        !           285:     procedure Write_Chain ( b : in Bracket_Array; cont : out boolean ) is
        !           286:     begin
        !           287:       Write_a_Chain(Standard_Output,b);
        !           288:       cont := true;
        !           289:     end Write_Chain;
        !           290:     procedure Write is new Enumerate_Chains(Write_Chain);
        !           291:
        !           292:   begin
        !           293:     Write(t);
        !           294:   end Write_Chains;
        !           295:
        !           296: -- AUXILIARIES TO COUNT THE ROOTS :
        !           297:
        !           298:   procedure Write_Polynomial_Patterns
        !           299:               ( file : in file_type;
        !           300:                 n : in natural; b1,b2 : in Bracket_Array ) is
        !           301:
        !           302:   -- DESCRIPTION :
        !           303:   --   Writes the two chains in a paired fashion.  If they have unequal
        !           304:   --   length, then the last element of the shortest chain appears repeated.
        !           305:
        !           306:     maxlen : constant natural := Maximum(b1'last,b2'last);
        !           307:     lb1,lb2 : Link_to_Bracket;
        !           308:
        !           309:   begin
        !           310:     for i in b1'first..maxlen loop
        !           311:       put(file,"(");
        !           312:       if i <= b1'last
        !           313:        then lb1 := b1(i);
        !           314:        else lb1 := b1(b1'last);
        !           315:       end if;
        !           316:       put(file,lb1.all); put(file,",");
        !           317:       if i <= b2'last
        !           318:        then lb2 := b2(i);
        !           319:        else lb2 := b2(b2'last);
        !           320:       end if;
        !           321:       put(file,lb2.all); put_line(file,") has pattern : ");
        !           322:       Display_Polynomial_Pattern(file,n,lb1.all,lb2.all);
        !           323:     end loop;
        !           324:   end Write_Polynomial_Patterns;
        !           325:
        !           326:   procedure Write_Paired_Chain
        !           327:               ( file : in file_type;
        !           328:                 n : in natural; b1,b2 : in Bracket_Array ) is
        !           329:
        !           330:   -- DESCRIPTION :
        !           331:   --   Writes the two chains in a paired fashion.  If they have unequal
        !           332:   --   length, then the last element of the shortest chain appears repeated.
        !           333:
        !           334:     maxlen : constant natural := Maximum(b1'last,b2'last);
        !           335:
        !           336:   begin
        !           337:     put(file,"("); put(file,b1(b1'first).all); put(file,",");
        !           338:                    put(file,b2(b2'first).all); put(file,")");
        !           339:     for i in b1'first+1..maxlen loop
        !           340:       put(file," < "); put(file,"(");
        !           341:       if i <= b1'last
        !           342:        then put(file,b1(i).all);
        !           343:        else put(file,b1(b1'last).all);
        !           344:       end if;
        !           345:       put(file,",");
        !           346:       if i <= b2'last
        !           347:        then put(file,b2(i).all);
        !           348:        else put(file,b2(b2'last).all);
        !           349:       end if;
        !           350:       put(file,")");
        !           351:     end loop;
        !           352:     new_line(file);
        !           353:     Write_Polynomial_Patterns(Standard_Output,n,b1,b2);
        !           354:     if Pieri_Condition(n,b1(b1'last).all,b2(b2'last).all)
        !           355:      then put_line("Leaves satisfy Pieri's condition.");
        !           356:      else put_line("Leaves do not satisfy Pieri's condition.");
        !           357:     end if;
        !           358:   end Write_Paired_Chain;
        !           359:
        !           360:   procedure Write_Pieri_Chains ( n : in natural; t1,t2 : in Pieri_Tree ) is
        !           361:
        !           362:   -- DESCRIPTION :
        !           363:   --   Enumerates all pairs of chains and checks Pieri's condition
        !           364:   --   at the leaves.
        !           365:
        !           366:     procedure Visit_Chain ( b1,b2 : in Bracket_Array; cont : out boolean ) is
        !           367:     begin
        !           368:       Write_Paired_Chain(Standard_Output,n,b1,b2);
        !           369:       cont := true;
        !           370:     end Visit_Chain;
        !           371:     procedure Visit_Chains is new Enumerate_Paired_Chains(Visit_Chain);
        !           372:
        !           373:   begin
        !           374:     Visit_Chains(t1,t2);
        !           375:   end Write_Pieri_Chains;
        !           376:
        !           377:   function First_Standard_Plane
        !           378:               ( n,m,r : natural ) return Standard_Complex_Matrices.Matrix is
        !           379:
        !           380:   -- DESCRIPTION :
        !           381:   --   Returns the plane spanned by the first m+1-r standard basis vectors.
        !           382:
        !           383:     res : Standard_Complex_Matrices.Matrix := Random_Matrix(n,m+1-r);
        !           384:
        !           385:   begin
        !           386:     for i in res'range(1) loop
        !           387:       for j in res'range(2) loop
        !           388:         if i = j
        !           389:          then res(i,j) := Create(1.0);
        !           390:          else res(i,j) := Create(0.0);
        !           391:         end if;
        !           392:       end loop;
        !           393:     end loop;
        !           394:     return res;
        !           395:   end First_Standard_Plane;
        !           396:
        !           397:   function Last_Standard_Plane
        !           398:               ( n,m,r : natural ) return Standard_Complex_Matrices.Matrix is
        !           399:
        !           400:   -- DESCRIPTION :
        !           401:   --   Returns the plane spanned by the first m+1-r standard basis vectors.
        !           402:
        !           403:     res : Standard_Complex_Matrices.Matrix := Random_Matrix(n,m+1-r);
        !           404:
        !           405:   begin
        !           406:     for i in res'range(1) loop
        !           407:       for j in res'range(2) loop
        !           408:         if i = res'last(2) + 1 - j
        !           409:          then res(i,j) := Create(1.0);
        !           410:          else res(i,j) := Create(0.0);
        !           411:         end if;
        !           412:       end loop;
        !           413:     end loop;
        !           414:     return res;
        !           415:   end Last_Standard_Plane;
        !           416:
        !           417:   function First_Random_Input_Sequence
        !           418:              ( n,m,a : natural; kp : Vector ) return VecMat is
        !           419:
        !           420:   -- DESCRIPTION :
        !           421:   --   Returns the first sequence of random input planes.  The first plane
        !           422:   --   in the sequence is spanned by the first standard basis vectors.
        !           423:   --   The dimensions of the planes are m+1-kp(i), for the appropriate i.
        !           424:
        !           425:     res : VecMat(0..a-1);
        !           426:
        !           427:   begin
        !           428:     res(0) := new Standard_Complex_Matrices.Matrix'
        !           429:                     (First_Standard_Plane(n,m,kp(1)));
        !           430:     for i in 1..res'last loop
        !           431:       res(i) := new Standard_Complex_Matrices.Matrix'
        !           432:                       (Random_Matrix(n,m+1-kp(i+1)));
        !           433:     end loop;
        !           434:     return res;
        !           435:   end First_Random_Input_Sequence;
        !           436:
        !           437:   function Second_Random_Input_Sequence
        !           438:              ( n,m,a : natural; kp : Vector ) return VecMat is
        !           439:
        !           440:   -- DESCRIPTION :
        !           441:   --   Returns the second sequence of random input planes.  The first plane
        !           442:   --   in the sequence is spanned by the last standard basis vectors.
        !           443:
        !           444:     res : VecMat(0..kp'last-a-2);
        !           445:
        !           446:   begin
        !           447:     res(0) := new Standard_Complex_Matrices.Matrix'
        !           448:                     (Last_Standard_Plane(n,m,kp(1)));
        !           449:     for i in 1..res'last loop
        !           450:       res(i) := new Standard_Complex_Matrices.Matrix'
        !           451:                       (Random_Matrix(n,m+1-kp(a+1+i)));
        !           452:     end loop;
        !           453:     return res;
        !           454:   end Second_Random_Input_Sequence;
        !           455:
        !           456:   procedure Reallify ( c : in out Complex_Number ) is
        !           457:
        !           458:   -- DESCRIPTION :
        !           459:   --   Sets the imaginary part of c to zero.
        !           460:
        !           461:   begin
        !           462:     c := Create(REAL_PART(c),0.0);
        !           463:   end Reallify;
        !           464:
        !           465:   procedure Reallify ( m : in out Standard_Complex_Matrices.Matrix ) is
        !           466:
        !           467:   -- DESCRIPTION :
        !           468:   --   Sets the imaginary part of every entry in the matrix to zero.
        !           469:
        !           470:   begin
        !           471:     for i in m'range(1) loop
        !           472:       for j in m'range(2) loop
        !           473:         Reallify(m(i,j));
        !           474:       end loop;
        !           475:     end loop;
        !           476:   end Reallify;
        !           477:
        !           478:   procedure Reallify ( v : in out VecMat ) is
        !           479:
        !           480:   -- DESCRIPTION :
        !           481:   --   Sets the imaginary part of every entry of every matrix in v to zero
        !           482:   --   and makes the matrices orthonormal.
        !           483:
        !           484:   begin
        !           485:     for i in v'range loop
        !           486:       Reallify(v(i).all);
        !           487:       v(i).all := Orthogonalize(v(i).all);
        !           488:     end loop;
        !           489:   end Reallify;
        !           490:
        !           491:   procedure Orthogonalize ( v : in out VecMat ) is
        !           492:
        !           493:   -- DESCRIPTION :
        !           494:   --   Orthonormalizes every matrix in the array.
        !           495:
        !           496:   begin
        !           497:     for i in v'range loop
        !           498:       v(i).all := Orthogonalize(v(i).all);
        !           499:     end loop;
        !           500:   end Orthogonalize;
        !           501:
        !           502:   procedure Set_Parameters ( file : in file_type; report : out boolean ) is
        !           503:
        !           504:   -- DESCRIPTION :
        !           505:   --   Interactive determination of the continuation and output parameters.
        !           506:
        !           507:     oc : natural;
        !           508:
        !           509:   begin
        !           510:     new_line;
        !           511:     Driver_for_Continuation_Parameters(file);
        !           512:     new_line;
        !           513:     Driver_for_Process_io(file,oc);
        !           514:     report := not (oc = 0);
        !           515:   end Set_Parameters;
        !           516:
        !           517:   function Select_Pairs ( lps : List_of_Paired_Nodes )
        !           518:                         return List_of_Paired_Nodes is
        !           519:
        !           520:   -- DESCRIPTION :
        !           521:   --   Returns a selection of the list of pairs.
        !           522:
        !           523:     res,res_last : List_of_Paired_Nodes;
        !           524:     k : natural;
        !           525:     tmp : List_of_Paired_Nodes := lps;
        !           526:
        !           527:   begin
        !           528:     put("Give the number of pairs : "); get(k);
        !           529:     declare
        !           530:       sel : Standard_Natural_Vectors.Vector(1..k);
        !           531:       ind : natural := 1;
        !           532:     begin
        !           533:       put("Give an increasing sequence of "); put(k,1); put(" numbers : ");
        !           534:       get(sel);
        !           535:       for i in 1..Length_Of(lps) loop
        !           536:         if i = sel(ind)
        !           537:          then ind := ind+1;
        !           538:               Append(res,res_last,Head_Of(tmp));
        !           539:         end if;
        !           540:         tmp := Tail_Of(tmp);
        !           541:       end loop;
        !           542:     end;
        !           543:     skip_line;
        !           544:     return res;
        !           545:   end Select_Pairs;
        !           546:
        !           547:   procedure put ( file : in file_type; lp : in List_of_Paired_Nodes ) is
        !           548:
        !           549:     tmp : List_of_Paired_Nodes := lp;
        !           550:     pnd : Paired_Nodes;
        !           551:
        !           552:   begin
        !           553:     put_line(file,"The pairs of leaves that satisfy Pieri's condition :");
        !           554:     for i in 1..Length_Of(lp) loop
        !           555:       pnd := Head_Of(tmp);
        !           556:       put(file,"Leaf "); put(file,i,3); put(file," : ");
        !           557:       put(file,"("); put(file,pnd.left.node); put(file,",");
        !           558:       put(file,pnd.right.node); put_line(file,")");
        !           559:       tmp := Tail_Of(tmp);
        !           560:     end loop;
        !           561:   end put;
        !           562:
        !           563:   procedure Root_Count ( n,d,a : in natural; kp : in Vector ) is
        !           564:
        !           565:   -- DESCRIPTION :
        !           566:   --   Set up of Pieri trees from a partition of the planes.
        !           567:
        !           568:   -- ON ENTRY :
        !           569:   --  n          the dimension of the space we are working in;
        !           570:   --  d          dimension of the brackets, of the output planes;
        !           571:   --  a          number of planes in the first set of the partition;
        !           572:   --  kp         the dimensions of the input planes are m+1-kp(i),
        !           573:   --             where m = n-d.
        !           574:
        !           575:     file : file_type;
        !           576:     timer : Timing_Widget;
        !           577:     ans : character;
        !           578:     m : constant natural := n-d;
        !           579:     v1 : Vector(0..a-1) := kp(1..a);
        !           580:     t1 : Pieri_Tree(d,a-1) := Create(n,d,v1);
        !           581:     a2 : constant natural := kp'last-a-1;
        !           582:     v2 : Vector(0..a2-1) := kp(a+1..kp'last-1);
        !           583:     t2 : Pieri_Tree(d,a2) := Create(n,d,v2);
        !           584:     lp : List_of_Paired_Nodes := Create(n,d,t1,t2);
        !           585:     np : Nodal_Pair(d) := Create(d,lp);
        !           586:     sel_lp : List_of_Paired_Nodes;
        !           587:     rc : constant natural := Length_Of(lp);
        !           588:     nb : constant natural := Number_of_Paths(np);
        !           589:     l1 : VecMat(0..a-1) := First_Random_Input_Sequence(n,m,a,kp);
        !           590:     l2 : VecMat(0..kp'last-a-2) := Second_Random_Input_Sequence(n,m,a,kp);
        !           591:     ln : Standard_Complex_Matrices.Matrix(1..n,1..m+1-kp(kp'last))
        !           592:        := Random_Matrix(n,m+1-kp(kp'last));
        !           593:     report,outlog : boolean;
        !           594:     sols : VecMat(1..rc);
        !           595:
        !           596:   begin
        !           597:     skip_line;
        !           598:     new_line;
        !           599:     put_line("Reading the name of the output file.");
        !           600:     Read_Name_and_Create_File(file);
        !           601:     new_line;
        !           602:     put_line("See the output file for results.");
        !           603:     new_line;
        !           604:     put(file,"(m = "); put(file,m,1); put(file,",p = "); put(file,d,1);
        !           605:     put(file,")");
        !           606:     put(file," k = {");
        !           607:     for i in 1..a-1 loop
        !           608:       put(file,kp(i),1); put(file,",");
        !           609:     end loop;
        !           610:     put(file,kp(a),1);
        !           611:     put(file,"}");
        !           612:     put(file,"{");
        !           613:     for i in a+1..kp'last-2 loop
        !           614:       put(file,kp(i),1); put(file,",");
        !           615:     end loop;
        !           616:     put(file,kp(kp'last-1),1);
        !           617:     put(file,"} ");
        !           618:     put(file,kp(kp'last),1);
        !           619:     new_line(file);
        !           620:     put(file,"The first Pieri tree has height "); put(file,Height(t1),1);
        !           621:     put_line(file," :"); Write_Tree(file,t1); -- put(file,t1);
        !           622:     put(file,"The second Pieri tree has height "); put(file,Height(t2),1);
        !           623:     put_line(file," :"); Write_Tree(file,t2); -- put(file,t2);
        !           624:     put(file,"The root count equals : "); put(file,rc,1); new_line(file);
        !           625:     put("The root count equals : "); put(rc,1); new_line;
        !           626:     put(file,lp);
        !           627:     put_line(file,"The tree of paired nodes :");
        !           628:     Write(file,np);
        !           629:     put("The number of paths : "); put(nb,1); new_line;
        !           630:     put(file,"The number of paths : "); put(file,nb,1); new_line(file);
        !           631:     new_line;
        !           632:     put("Do you want real random input planes ? (y/n) "); get(ans);
        !           633:     if ans = 'y'
        !           634:      then Reallify(l1); Reallify(l2); Reallify(ln);
        !           635:      else Orthogonalize(l1); Orthogonalize(l2);
        !           636:           ln := Orthogonalize(ln);
        !           637:     end if;
        !           638:     put("Do you want moving cycles/polynomial systems on file ? (y/n) ");
        !           639:     Ask_Yes_or_No(ans);
        !           640:     outlog := (ans = 'y');
        !           641:     put("Do you want to select only certain pairs ? (y/n) ? ");
        !           642:     Ask_Yes_or_No(ans);
        !           643:     if ans = 'y'
        !           644:      then sel_lp := Select_Pairs(lp);
        !           645:      else sel_lp := lp;
        !           646:     end if;
        !           647:     Set_Parameters(file,report);
        !           648:     new_line(file);
        !           649:     put_line(file,"The first sequence of random input planes :");
        !           650:     put(file,l1,2);
        !           651:     put_line(file,"The second sequence of random input planes :");
        !           652:     put(file,l2,2);
        !           653:     put_line(file,"The last random input plane :"); put(file,ln,2);
        !           654:     put_line(file,"Starting the deformations at the paired leaves.");
        !           655:     Matrix_Indeterminates.Initialize_Symbols(n,d);
        !           656:     Add_t_Symbol;
        !           657:     tstart(timer);
        !           658:     Deform_Pairs(file,n,d,sel_lp,l1,l2,ln,report,outlog,sols);
        !           659:     tstop(timer);
        !           660:     new_line(file);
        !           661:     print_times(file,timer,"Pieri Deformations");
        !           662:     Matrix_Indeterminates.Clear_Symbols;
        !           663:     Clear(t1); Clear(t2); Clear(lp);
        !           664:     Clear(l1); Clear(l2); Clear(sols);
        !           665:     Close(file);
        !           666:   end Root_Count;
        !           667:
        !           668: -- FIVE MAJOR TEST PROGRAMS :
        !           669:
        !           670:   procedure Test_Pieri_Condition ( n,d : in natural ) is
        !           671:
        !           672:   -- DESCRIPTION :
        !           673:   --   Reads two brackets and tests Pieri's condition.
        !           674:
        !           675:     b1,b2 : Bracket(1..d);
        !           676:     ans : character;
        !           677:     cnt : natural := 0;
        !           678:
        !           679:   begin
        !           680:     new_line;
        !           681:     put_line("Interactive test on Pieri's condition for pair of brackets.");
        !           682:     Matrix_Indeterminates.Initialize_Symbols(n,d);
        !           683:     loop
        !           684:       new_line;
        !           685:       put("Give first bracket : "); get(b1);
        !           686:       put("Give second bracket : "); get(b2);
        !           687:       put("("); put(b1); put(","); put(b2); put(")");
        !           688:       if Pieri_Condition(n,b1,b2)
        !           689:        then put_line(" satisfies Pieri's condition.");
        !           690:        else put_line(" does not satisfy Pieri's condition.");
        !           691:       end if;
        !           692:       put("Do you want more tests ? (y/n) "); get(ans);
        !           693:       exit when ans /= 'y';
        !           694:     end loop;
        !           695:     Matrix_Indeterminates.Clear_Symbols;
        !           696:   end Test_Pieri_Condition;
        !           697:
        !           698:   procedure Test_Pieri_Tree ( n,d : in natural ) is
        !           699:
        !           700:   -- DESCRIPTION :  Constructs T(r_0,r_1,..,r_a).
        !           701:
        !           702:     a : natural;
        !           703:     ans : character;
        !           704:
        !           705:   begin
        !           706:     new_line;
        !           707:     put_line("Interactive test on the construction of Pieri trees");
        !           708:     loop
        !           709:       new_line;
        !           710:       put("Give number of jumped-branching levels : "); get(a);
        !           711:       declare
        !           712:         v : Vector(0..a);
        !           713:         t : Pieri_Tree(d,a);
        !           714:       begin
        !           715:         put("Give "); put(a+1,1); put(" natural numbers : "); get(v);
        !           716:         t := Create(n,d,v);
        !           717:         put_line("The Pieri tree : "); Write_Tree(t); --put(t);
        !           718:         put_line("The chains in the Pieri tree :"); Write_Chains(t);
        !           719:         Clear(t);
        !           720:       end;
        !           721:       put("Do you want more tests ? (y/n) "); get(ans);
        !           722:       exit when ans /= 'y';
        !           723:     end loop;
        !           724:   end Test_Pieri_Tree;
        !           725:
        !           726:   procedure Test_Root_Count ( n,d : in natural ) is
        !           727:
        !           728:   -- DESCRIPTION :
        !           729:   --   Reads the input planes and sets up a pair of trees to perform
        !           730:   --   the combinatorial root count.
        !           731:
        !           732:     m : constant natural := n-d;
        !           733:     np,sum,a : natural;
        !           734:     ans : character;
        !           735:
        !           736:   begin
        !           737:     new_line;
        !           738:     put_line("Counting roots combinatorially by Pieri trees");
        !           739:     loop
        !           740:       new_line;
        !           741:       put("Give the number of planes to intersect : "); get(np);
        !           742:       declare
        !           743:         kp : Vector(1..np);
        !           744:       begin
        !           745:         put("Give "); put(np,1); put(" co-dimensions of the planes : ");
        !           746:         get(kp);
        !           747:         put("m = "); put(m,1); put(" p = "); put(d,1);
        !           748:         put(" Sum : "); put(kp(kp'first),1);
        !           749:         sum := kp(kp'first);
        !           750:         for i in kp'first+1..kp'last loop
        !           751:           put(" + "); put(kp(i),1);
        !           752:           sum := sum + kp(i);
        !           753:         end loop;
        !           754:         put(" = "); put(sum,1);
        !           755:         if sum = m*d
        !           756:          then put_line(" = m*p");
        !           757:               loop
        !           758:                 put("Give number of elements in first set : "); get(a);
        !           759:                 Root_Count(n,d,a,kp);
        !           760:                 new_line;
        !           761:                 put("Do you want to test other partitions ? (y/n) "); get(ans);
        !           762:                 exit when ans /= 'y';
        !           763:               end loop;
        !           764:          else put_line(" /= m*p");
        !           765:         end if;
        !           766:       end;
        !           767:       put("Do you want more tests ? (y/n) "); get(ans);
        !           768:       exit when ans /= 'y';
        !           769:     end loop;
        !           770:   end Test_Root_Count;
        !           771:
        !           772:   procedure Test_Pieri_Equations ( n,d : in natural ) is
        !           773:
        !           774:   -- DESCRIPTION :
        !           775:   --   Set up of the expansions of the maximal minors.
        !           776:
        !           777:     k,kd,nb : natural;
        !           778:     bm : Bracket_Monomial;
        !           779:     ans : character;
        !           780:     b1,b2 : Bracket(1..d);
        !           781:
        !           782:   begin
        !           783:     new_line;
        !           784:     put_line("Set up equations for certain Schubert conditions.");
        !           785:     Matrix_Indeterminates.Initialize_Symbols(n,d);
        !           786:     loop
        !           787:       new_line;
        !           788:       put("Give k to determine (m-k+1)-plane : "); get(k);
        !           789:       kd := n-k+1;
        !           790:       bm := Maximal_Minors(n,kd);      -- because n = m+p
        !           791:       put("All maximal minors : "); put(bm); new_line;
        !           792:       declare
        !           793:         bs : constant Bracket_System := Minor_Equations(kd,kd-d,bm);
        !           794:       begin
        !           795:         put_line("The generic equation in the Laplace expansion : ");
        !           796:         put(bs(0));
        !           797:         put_line("The specific equations in the system : ");
        !           798:         for i in 1..bs'last loop
        !           799:           put(bs(i));
        !           800:         end loop;
        !           801:         Expand_Minors(n,d,bs);
        !           802:       end;
        !           803:       put("Do you want more tests ? (y/n) "); get(ans);
        !           804:       Clear(bm);
        !           805:       exit when (ans /= 'y');
        !           806:     end loop;
        !           807:     Matrix_Indeterminates.Clear_Symbols;
        !           808:     new_line;
        !           809:     put("Do you want to test memory consumption ? (y/n) "); get(ans);
        !           810:     if ans = 'y'
        !           811:      then put("Give number of times : "); get(nb);
        !           812:           k := 1;
        !           813:           for i in 1..d loop
        !           814:             b1(i) := i;
        !           815:             b2(i) := i;
        !           816:           end loop;
        !           817:           for i in 1..nb loop
        !           818:             kd := n-k+1;
        !           819:             bm := Maximal_Minors(n,kd);
        !           820:             declare
        !           821:               nva : constant natural := n*d+1;
        !           822:               bs : Bracket_System(0..Number_of_Brackets(bm))
        !           823:                  := Minor_Equations(kd,kd-d,bm);
        !           824:               cffmat : Standard_Complex_Matrices.Matrix(1..n,1..(n-d))
        !           825:                      := Random_Matrix(n,n-d);
        !           826:               stamat : Standard_Complex_Matrices.Matrix(1..n,1..(n-d))
        !           827:                      := Random_Matrix(n,n-d);
        !           828:               movmat : Standard_Complex_Poly_Matrices.Matrix
        !           829:                          (cffmat'range(1),cffmat'range(2))
        !           830:                      := Moving_U_Matrix(nva,stamat,cffmat);
        !           831:               polmat : Standard_Complex_Poly_Matrices.Matrix(1..n,1..d)
        !           832:                      := Schubert_Pattern(n,b1,b2);
        !           833:               sys : Poly_Sys(1..bs'last)
        !           834:                   := Expanded_Minors(cffmat,polmat,bs);
        !           835:               movcyc : Poly_Sys(1..bs'last)
        !           836:                      := Lifted_Expanded_Minors(movmat,polmat,bs);
        !           837:             begin
        !           838:               Clear(bm); Clear(bs);
        !           839:               Standard_Complex_Poly_Matrices.Clear(movmat);
        !           840:               Standard_Complex_Poly_Matrices.Clear(polmat);
        !           841:               Clear(sys); Clear(movcyc);
        !           842:             end;
        !           843:           end loop;
        !           844:     end if;
        !           845:   end Test_Pieri_Equations;
        !           846:
        !           847:   procedure Test_Pieri_Homotopies ( n,d : in natural ) is
        !           848:
        !           849:   -- DESCRIPTION :
        !           850:   --   Set up of the parametric families in the Pieri homotopy algorithm.
        !           851:
        !           852:     b1,b2 : Bracket(1..d);
        !           853:     m : constant natural := n-d;
        !           854:     nva : constant natural := n*d+1;
        !           855:     k,kd : natural;
        !           856:     bm : Bracket_Monomial;
        !           857:     F1 : constant Standard_Complex_Matrices.Matrix
        !           858:        := Random_Upper_Triangular(n);
        !           859:     F2 : constant Standard_Complex_Matrices.Matrix
        !           860:        := Random_Lower_Triangular(n);
        !           861:
        !           862:   begin
        !           863:     new_line;
        !           864:     put_line("Set up the moving cycles in the Pieri homotopy algorithm.");
        !           865:     new_line;
        !           866:     Matrix_Indeterminates.Initialize_Symbols(n,d);
        !           867:     Add_t_Symbol;
        !           868:     put_line("The general upper triangular matrix F : "); put(F1,2);
        !           869:     put_line("The general lower triangular matrix F' : "); put(F2,2);
        !           870:     put("Give first "); put(d,1); put("-bracket : "); get(b1);
        !           871:     put("Give second "); put(d,1); put("-bracket : "); get(b2);
        !           872:     put("The pair of brackets : ");
        !           873:     put("("); put(b1); put(","); put(b2); put_line(")");
        !           874:     put("Give k to determine (m-k+1)-plane : "); get(k);
        !           875:     kd := n-k+1;
        !           876:     bm := Maximal_Minors(n,kd);
        !           877:     declare
        !           878:       L : constant Standard_Complex_Matrices.Matrix := Random_Matrix(n,m+1-k);
        !           879:       X : Standard_Complex_Poly_Matrices.Matrix(1..n,b1'range);
        !           880:       U1 : constant Standard_Complex_Matrices.Matrix := U_Matrix(F1,b1);
        !           881:       movU1 : Standard_Complex_Poly_Matrices.Matrix(L'range(1),L'range(2));
        !           882:       U2 : constant Standard_Complex_Matrices.Matrix := U_Matrix(F2,b2);
        !           883:       movU2 : Standard_Complex_Poly_Matrices.Matrix(L'range(1),L'range(2));
        !           884:       bs : constant Bracket_System := Minor_Equations(kd,kd-d,bm);
        !           885:       movcyc1,movcyc2 : Poly_Sys(1..bs'last);
        !           886:     begin
        !           887:       put("The U-matrix for F and "); put(b1); put_line(" :"); put(U1,2);
        !           888:       put("The U-matrix for F' and "); put(b2); put_line(" :"); put(U2,2);
        !           889:       put("A random "); put(m+1-k,1); put_line("-plane :"); put(L,2);
        !           890:       movU1 := Moving_U_Matrix(nva,U1,L);
        !           891:       put_line("The first moving U-matrix :"); put(movU1);
        !           892:       movU2 := Moving_U_Matrix(nva,U2,L);
        !           893:       put_line("The second moving U-matrix :"); put(movU2);
        !           894:       X := Schubert_Pattern(n,b1,b2);
        !           895:       put("The unknown "); put(d,1); put_line("-plane X :"); put(X);
        !           896:       movcyc1 := Lifted_Expanded_Minors(movU1,X,bs);
        !           897:       put_line("The polynomial system for the first moving U-matrix :");
        !           898:       put_line(movcyc1);
        !           899:       movcyc2 := Lifted_Expanded_Minors(movU2,X,bs);
        !           900:       put_line("The polynomial system for the second moving U-matrix :");
        !           901:       put_line(movcyc2);
        !           902:       put_line("Target system at t = 1 :");
        !           903:       put_line(Eval(movcyc2,Create(1.0),Number_of_Unknowns(movcyc2(1))));
        !           904:       put_line("System that must be solved :");
        !           905:       put_line(Expanded_Minors(L,X,bs));
        !           906:     end;
        !           907:     Matrix_Indeterminates.Clear_Symbols;
        !           908:   end Test_Pieri_Homotopies;
        !           909:
        !           910:   procedure Main is
        !           911:
        !           912:     m,p,n : natural;
        !           913:     ans : character;
        !           914:
        !           915:   begin
        !           916:     new_line;
        !           917:     put_line("Interactive test for setting up of Pieri homotopies.");
        !           918:     new_line;
        !           919:     put("Give m, m+p = n, dimension of space : "); get(m);
        !           920:     put("Give p, number of entries in brackets : "); get(p);
        !           921:     n := m+p;
        !           922:     new_line;
        !           923:     put_line("MENU for testing the Pieri Homotopy Algorithm : ");
        !           924:     put_line("  1. Construction of a Pieri tree. ");
        !           925:     put_line("  2. Interactively test Pieri's condition on pairs of brackets.");
        !           926:     put_line("  3. Set up equations for certain Schubert conditions.");
        !           927:     put_line("  4. Set up the moving cycles in the Pieri homotopy algorithm.");
        !           928:     put_line("  5. Test combinatorial root count and start deforming.");
        !           929:     put("Make your choice (1, 2, 3, 4 or 5) : "); get(ans);
        !           930:     case ans is
        !           931:       when '1'    => Test_Pieri_Tree(n,p);
        !           932:       when '2'    => Test_Pieri_Condition(n,p);
        !           933:       when '3'    => Test_Pieri_Equations(n,p);
        !           934:       when '4'    => Test_Pieri_Homotopies(n,p);
        !           935:       when '5'    => Test_Root_Count(n,p);
        !           936:       when others => null;
        !           937:     end case;
        !           938:   end Main;
        !           939:
        !           940: begin
        !           941:   Main;
        !           942: end ts_org_pieri;

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