[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     ! 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>