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

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

1.1       maekawa     1: with text_io,integer_io;                 use text_io,integer_io;
                      2: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
                      3: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
                      4: with Standard_Natural_Vectors;           use Standard_Natural_Vectors;
                      5: with Standard_Natural_Vectors_io;        use Standard_Natural_Vectors_io;
                      6: with Standard_Complex_Vectors;           use Standard_Complex_Vectors;
                      7: with Symbol_Table;                       use Symbol_Table;
                      8: with Standard_Complex_Polynomials;       use Standard_Complex_Polynomials;
                      9: with Standard_Complex_Polynomials_io;    use Standard_Complex_Polynomials_io;
                     10: with Standard_Complex_Poly_Functions;    use Standard_Complex_Poly_Functions;
                     11: with Matrix_Indeterminates;
                     12: with Brackets,Brackets_io;               use Brackets,Brackets_io;
                     13: with Bracket_Monomials;                  use Bracket_Monomials;
                     14: with Bracket_Polynomials;                use Bracket_Polynomials;
                     15: with Bracket_Polynomials_io;             use Bracket_Polynomials_io;
                     16: with Straightening_Syzygies;             use Straightening_Syzygies;
                     17: with Bracket_Expansions;                 use Bracket_Expansions;
                     18:
                     19: procedure ts_expand is
                     20:
                     21: -- DESCRIPTION :
                     22: --   Test on the implementation of bracket expansion.
                     23: ---  This procedure pre-dates the package SAGBI_Homotopies.
                     24:
                     25:   function Number_of_Brackets ( n,d : natural ) return natural is
                     26:
                     27:   -- DESCIPTION :
                     28:   --   Returns the number of brackets of d entries chosen from n numbers.
                     29:
                     30:     a,b : natural;
                     31:
                     32:   begin
                     33:     a := 1;
                     34:     for i in d+1..n loop
                     35:       a := a*i;
                     36:     end loop;
                     37:     b := 1;
                     38:     for i in 1..n-d loop
                     39:       b := b*i;
                     40:     end loop;
                     41:     return a/b;
                     42:   end Number_of_Brackets;
                     43:
                     44:   procedure Write_Laplace_Expansion
                     45:               ( n,d : in natural; p : in Bracket_Polynomial ) is
                     46:
                     47:   -- DESCRIPTION :
                     48:   --   Writes the Laplace expansion in expanded form, i.e.: with xij's.
                     49:
                     50:     procedure Write_Term ( t : in Bracket_Term; continue : out boolean ) is
                     51:
                     52:       first : boolean;
                     53:
                     54:       procedure Write_Bracket ( b : in Bracket; cont : out boolean ) is
                     55:       begin
                     56:         if first
                     57:          then if REAL_PART(t.coeff) > 0.0
                     58:                then put("+");
                     59:                else put("-");
                     60:               end if;
                     61:               put(b); put("*(");
                     62:               first := false;
                     63:          else put(Expand(n,d,b));
                     64:               put(")");
                     65:               new_line;
                     66:         end if;
                     67:         cont := true;
                     68:       end Write_Bracket;
                     69:       procedure Write_Brackets is new Enumerate_Brackets(Write_Bracket);
                     70:
                     71:     begin
                     72:       first := true;
                     73:       Write_Brackets(t.monom);
                     74:       continue := true;
                     75:     end Write_Term;
                     76:     procedure Write_Terms is new Enumerate_Terms(Write_Term);
                     77:
                     78:   begin
                     79:     Write_Terms(p);
                     80:   end Write_Laplace_Expansion;
                     81:
                     82:   function Localize ( p : Poly; n,d : natural ) return Poly is
                     83:
                     84:   -- DESCRIPTION :
                     85:   --   The last (n-d)*d variables are replaced by ones or zeros.
                     86:
                     87:     res,tmp : Poly;
                     88:     last : natural := d*n;
                     89:
                     90:   begin
                     91:     Copy(p,res);
                     92:     for i in 1..d loop
                     93:       for j in 1..d loop
                     94:         if i = j
                     95:          then tmp := Eval(res,Create(1.0),last);
                     96:          else tmp := Eval(res,Create(0.0),last);
                     97:         end if;
                     98:         Copy(tmp,res); Clear(tmp);
                     99:         last := last-1;
                    100:       end loop;
                    101:     end loop;
                    102:     return res;
                    103:   end Localize;
                    104:
                    105:   procedure Write_Localized_Laplace_Expansion
                    106:                 ( p : in Bracket_Polynomial; n,d : in natural ) is
                    107:
                    108:   -- DESCRIPTION :
                    109:   --   Writes the Laplace expansion in expanded form, i.e.: with xij's
                    110:   --   and with the last d*d variables set to zeros or ones.
                    111:
                    112:     procedure Write_Term ( t : in Bracket_Term; continue : out boolean ) is
                    113:
                    114:       first : boolean;
                    115:
                    116:       procedure Write_Bracket ( b : in Bracket; cont : out boolean ) is
                    117:       begin
                    118:         if first
                    119:          then if REAL_PART(t.coeff) > 0.0
                    120:                then put("+");
                    121:                else put("-");
                    122:               end if;
                    123:               put(b); put("*(");
                    124:               first := false;
                    125:          else put(Localize(Expand(n,d,b),n,d));
                    126:               put(")");
                    127:               new_line;
                    128:         end if;
                    129:         cont := true;
                    130:       end Write_Bracket;
                    131:       procedure Write_Brackets is new Enumerate_Brackets(Write_Bracket);
                    132:
                    133:     begin
                    134:       first := true;
                    135:       Write_Brackets(t.monom);
                    136:       continue := true;
                    137:     end Write_Term;
                    138:     procedure Write_Terms is new Enumerate_Terms(Write_Term);
                    139:
                    140:   begin
                    141:     Write_Terms(p);
                    142:   end Write_Localized_Laplace_Expansion;
                    143:
                    144:   function Coordinatize ( b : Bracket ) return natural is
                    145:
                    146:   -- DESCRIPTION :
                    147:   --   Returns the decimal expansion of the bracket.
                    148:
                    149:     res : natural := 0;
                    150:
                    151:   begin
                    152:     for i in b'range loop
                    153:       res := res*10 + b(i);
                    154:     end loop;
                    155:     return res;
                    156:   end Coordinatize;
                    157:
                    158:   function Coordinatize ( p : Bracket_Polynomial ) return Bracket_Polynomial is
                    159:
                    160:   -- DESCRIPTION :
                    161:   --   Replaces the first bracket in every monomial by the decimal expansion.
                    162:
                    163:     res : Bracket_Polynomial;
                    164:
                    165:     procedure Coordinatize_Term ( t : in Bracket_Term; cont1 : out boolean ) is
                    166:
                    167:       first,second : boolean;
                    168:       bm : Bracket_Monomial;
                    169:       bt : Bracket_Term;
                    170:
                    171:       procedure Coordinatize_Bracket ( b : in Bracket; cont2 : out boolean ) is
                    172:       begin
                    173:         if first
                    174:          then bt.coeff := Create(double_float(Coordinatize(b)));
                    175:               first := false;
                    176:               second := true;
                    177:          elsif second
                    178:              then bm := Create(b);
                    179:              else Multiply(bm,b);
                    180:         end if;
                    181:         cont2 := true;
                    182:       end Coordinatize_Bracket;
                    183:       procedure Coordinatize_Brackets is
                    184:         new Enumerate_Brackets(Coordinatize_Bracket);
                    185:
                    186:     begin
                    187:       first := true; second := false;
                    188:       Coordinatize_Brackets(t.monom);
                    189:       bt.monom := bm;
                    190:       if REAL_PART(t.coeff) < 0.0
                    191:        then Min(res,bt);
                    192:        else Add(res,bt);
                    193:       end if;
                    194:       cont1 := true;
                    195:     end Coordinatize_Term;
                    196:     procedure Coordinatize_Terms is new Enumerate_Terms(Coordinatize_Term);
                    197:
                    198:   begin
                    199:     Coordinatize_Terms(p);
                    200:     return res;
                    201:   end Coordinatize;
                    202:
                    203:   function Weight ( e : Standard_Natural_Vectors.Vector; n,d : natural )
                    204:                   return natural is
                    205:
                    206:   -- DESCRIPTION :
                    207:   --   Returns the weight of the exponent vector.
                    208:
                    209:     res : natural := 0;
                    210:     jmp,ind : natural;
                    211:
                    212:   begin
                    213:     for j in 1..d loop
                    214:       jmp := d-j;
                    215:       for i in 1..n-d loop
                    216:         ind := (i-1)*d + j;
                    217:         if e(ind) > 0
                    218:          then res := res + e(ind)*(i-1)*jmp;
                    219:         end if;
                    220:       end loop;
                    221:     end loop;
                    222:     return res;
                    223:   end Weight;
                    224:
                    225:   procedure Divide ( p : in out Poly; w : in natural ) is
                    226:
                    227:   -- DESCRIPTION :
                    228:   --   Divides the polynomial by t^w.
                    229:
                    230:     procedure Divide_Term ( t : in out Term; continue : out boolean ) is
                    231:     begin
                    232:       t.dg(t.dg'last) := t.dg(t.dg'last) - w;
                    233:       continue := true;
                    234:     end Divide_Term;
                    235:     procedure Divide_Terms is new Changing_Iterator(Divide_Term);
                    236:
                    237:   begin
                    238:     Divide_Terms(p);
                    239:   end Divide;
                    240:
                    241:   function Lift ( p : Poly; n,d : natural ) return Poly is
                    242:
                    243:   -- DESCRIPTION :
                    244:   --   Returns the lifted polynomial, which should be an expanded bracket.
                    245:
                    246:     res : Poly := Null_Poly;
                    247:     minwei : natural := 10000;
                    248:
                    249:     procedure Lift_Term ( t : in Term; continue : out boolean ) is
                    250:
                    251:       tt : Term;
                    252:       wei : natural;
                    253:
                    254:     begin
                    255:       tt.cf := t.cf;
                    256:       tt.dg := new Standard_Natural_Vectors.Vector(1..n*d+1);
                    257:       for i in t.dg'range loop
                    258:         tt.dg(i) := t.dg(i);
                    259:       end loop;
                    260:       tt.dg(t.dg'last+1..tt.dg'last) := (t.dg'last+1..tt.dg'last => 0);
                    261:       wei := Weight(tt.dg.all,n,d);
                    262:       tt.dg(tt.dg'last) := wei;
                    263:       Add(res,tt);
                    264:       Clear(tt.dg);
                    265:       if wei < minwei
                    266:        then minwei := wei;
                    267:       end if;
                    268:       continue := true;
                    269:     end Lift_Term;
                    270:     procedure Lift_Terms is new Visiting_Iterator(Lift_Term);
                    271:
                    272:   begin
                    273:     Lift_Terms(p);
                    274:     if minwei /= 0
                    275:      then Divide(res,minwei);
                    276:     end if;
                    277:     return res;
                    278:   end Lift;
                    279:
                    280:   procedure Write_Lifted_Localized_Laplace_Expansion
                    281:                ( p : in Bracket_Polynomial; n,d : in natural; l : out Poly ) is
                    282:
                    283:   -- DESCRIPTION :
                    284:   --   Writes the Laplace expansion in expanded form, i.e.: with xij's
                    285:   --   and with the last d*d variables set to zeros or ones.
                    286:   --   Returns the lifted coordinatized polynomial.
                    287:
                    288:     res : Poly := Null_Poly;
                    289:
                    290:     procedure Write_Term ( t : in Bracket_Term; continue : out boolean ) is
                    291:
                    292:       first : boolean;
                    293:       cf : integer;
                    294:
                    295:       procedure Write_Bracket ( b : in Bracket; cont : out boolean ) is
                    296:
                    297:         lp : Poly;
                    298:
                    299:       begin
                    300:         if first
                    301:          then cf := Coordinatize(b);
                    302:               if REAL_PART(t.coeff) > 0.0
                    303:                then put("+");
                    304:                else put("-"); cf := -cf;
                    305:               end if;
                    306:               put(b); put("*(");
                    307:               first := false;
                    308:          else lp := Lift(Localize(Expand(n,d,b),n,d),n,d);
                    309:               put(lp);
                    310:               put(")");
                    311:               new_line;
                    312:               Mul(lp,Create(double_float(cf)));
                    313:               Add(res,lp);
                    314:               Clear(lp);
                    315:         end if;
                    316:         cont := true;
                    317:       end Write_Bracket;
                    318:       procedure Write_Brackets is new Enumerate_Brackets(Write_Bracket);
                    319:
                    320:     begin
                    321:       first := true;
                    322:       Write_Brackets(t.monom);
                    323:       continue := true;
                    324:     end Write_Term;
                    325:     procedure Write_Terms is new Enumerate_Terms(Write_Term);
                    326:
                    327:   begin
                    328:     Write_Terms(p);
                    329:     l := res;
                    330:   end Write_Lifted_Localized_Laplace_Expansion;
                    331:
                    332:   procedure Expand_Laplace ( n,d : natural ) is
                    333:
                    334:   -- DESCRIPTION :
                    335:   --   Writes the expanded bracket polynomial.
                    336:
                    337:     p : Bracket_Polynomial := Laplace_Expansion(n,n-d);
                    338:     q : Bracket_Polynomial; -- := Coordinatize(p);
                    339:     lq : Poly; --  := Expand(q);
                    340:     ld : Poly; --  := Localize(lq,n,d);
                    341:     lt,l0 : Poly;
                    342:     tsb : Symbol_Table.Symbol;
                    343:
                    344:   begin
                    345:     put("The Laplace expansion of "); put(n,1); put("*"); put(n,1);
                    346:     put("-determinant as product of "); put(d,1); put("- and ");
                    347:     put(n-d,1); put_line("-blocks : ");
                    348:     put(p);
                    349:     return;
                    350:    -- put_line("The coordinatized Laplace expansion : ");
                    351:    -- put(q);
                    352:     put_line("Expanded in terms of xij's : ");
                    353:     Write_Laplace_Expansion(n,d,p);
                    354:    -- put_line("The coordinatized Laplace expansion in terms of xij's : ");
                    355:    -- put(lq); new_line;
                    356:     put_line("The localized version : ");
                    357:     Write_Localized_Laplace_Expansion(p,n,d);
                    358:    -- put(ld); new_line;
                    359:     Symbol_Table.Enlarge(1);
                    360:     tsb(1) := 't';
                    361:     for i in 2..tsb'last loop
                    362:       tsb(i) := ' ';
                    363:     end loop;
                    364:     Symbol_Table.Add(tsb);
                    365:    -- lt := Lift(ld,n,d);
                    366:     put_line("The lifted localized version :");
                    367:     Write_Lifted_Localized_Laplace_Expansion(p,n,d,lt);
                    368:     put_line("The coordinatized lifted localized polynomial : ");
                    369:     put(lt); new_line;
                    370:     put_line("The polynomial in the start system : ");
                    371:     l0 := Eval(lt,Create(0.0),n*d+1);
                    372:     put(l0); new_line;
                    373:   end Expand_Laplace;
                    374:
                    375:   procedure Memory_Consumption ( n,d : natural ) is
                    376:
                    377:     nb : natural;
                    378:     bp : Bracket_Polynomial;
                    379:
                    380:   begin
                    381:     put("Give number of expansions : "); get(nb);
                    382:     for i in 1..nb loop
                    383:       for j in 1..n loop
                    384:         bp := Laplace_Expansion(n,j);
                    385:         Clear(bp);
                    386:       end loop;
                    387:     end loop;
                    388:   end Memory_Consumption;
                    389:
                    390:   procedure Expand_Brackets ( n,d : in natural ) is
                    391:
                    392:   -- DESCRIPTION :
                    393:   --   Reads a bracket and writes the bracket expansion.
                    394:
                    395:     ans : character;
                    396:     b : Bracket(1..d);
                    397:
                    398:   begin
                    399:     loop
                    400:       put("Give "); put(d,1); put(" entries for the bracket : ");
                    401:       get(b);
                    402:       put("The expansion of the bracket "); put(b); put_line(" :");
                    403:       put(Expand(n,d,b)); new_line;
                    404:       put("Do you want to expand other brackets ? (y/n) "); get(ans);
                    405:       exit when ans /= 'y';
                    406:     end loop;
                    407:   end Expand_Brackets;
                    408:
                    409:   procedure Localized_Expand_Brackets ( n,d : in natural ) is
                    410:
                    411:   -- DESCRIPTION :
                    412:   --   Reads a bracket and writes the bracket expansion.
                    413:
                    414:     ans : character;
                    415:     b : Bracket(1..d);
                    416:
                    417:   begin
                    418:     loop
                    419:       put("Give "); put(d,1); put(" entries for the bracket : "); get(b);
                    420:       put("The expansion of the bracket "); put(b); put_line(" :");
                    421:       put(Localized_Expand(n,d,b)); new_line;
                    422:       put("Do you want to expand other brackets ? (y/n) "); get(ans);
                    423:       exit when ans /= 'y';
                    424:     end loop;
                    425:   end Localized_Expand_Brackets;
                    426:
                    427:   procedure Main is
                    428:
                    429:     n,d : natural;
                    430:     ans : character;
                    431:
                    432:   begin
                    433:     new_line;
                    434:     put_line("Testing bracket expansions");
                    435:     loop
                    436:          new_line;
                    437:       put("Give number of elements to choose from : "); get(n);
                    438:       put("Give the number of entries in bracket : "); get(d);
                    439:       Matrix_Indeterminates.Initialize_Symbols(n,d);
                    440:       put_line("Choose one of the following :");
                    441:       put_line("  1. Expand single brackets.");
                    442:       put_line("  2. Expand single brackets in local coordinates.");
                    443:       put_line("  3. Apply Laplace expansion.");
                    444:       put_line("  4. Test memory consumption.");
                    445:       put("Make your choice (1,2,3, or 4) : "); get(ans);
                    446:       put("(n,d) = ("); put(n,1); put(","); put(d,1); put(")");
                    447:       put("    #brackets : "); put(Number_of_Brackets(n,d),1);
                    448:       put("    #equations : "); put((n-d)*d,1); new_line;
                    449:       case ans is
                    450:         when '1' => Expand_Brackets(n,d);
                    451:         when '2' => Localized_Expand_Brackets(n,d);
                    452:         when '3' => Expand_Laplace(n,d);
                    453:         when '4' => Memory_Consumption(n,d);
                    454:         when others => put_line("option not available");
                    455:       end case;
                    456:       Matrix_Indeterminates.Clear_Symbols;
                    457:       put("Do you want more tests for other n and d ? (y/n) "); get(ans);
                    458:       exit when ans /= 'y';
                    459:     end loop;
                    460:   end Main;
                    461:
                    462: begin
                    463:   Main;
                    464: end ts_expand;

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