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

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

1.1       maekawa     1: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
                      2: with Standard_Natural_Vectors;           use Standard_Natural_Vectors;
                      3:
                      4: package body Straightening_Syzygies is
                      5:
                      6: -- AUXILIARIES :
                      7:
                      8:   function Create ( v1,v2 : Vector ) return Bracket_Term is
                      9:
                     10:     b1 : Bracket(v1'range);
                     11:     b2 : Bracket(v2'range);
                     12:     sig1,sig2 : integer;
                     13:     bm : Bracket_Monomial;
                     14:     bt : Bracket_Term;
                     15:
                     16:   begin
                     17:     Create(v1,b1,sig1);
                     18:     if Is_Zero(b1)
                     19:      then bt.coeff := Create(0.0);
                     20:      else Create(v2,b2,sig2);
                     21:           if Is_Zero(b2)
                     22:            then bt.coeff := Create(0.0);
                     23:            else bm := Create(b1);
                     24:                 Multiply(bm,b2);
                     25:                 if sig1*sig2 > 0
                     26:                  then bt.coeff := Create(1.0);
                     27:                  else bt.coeff := -Create(1.0);
                     28:                 end if;
                     29:           end if;
                     30:     end if;
                     31:     bt.monom := bm;
                     32:     return bt;
                     33:   end Create;
                     34:
                     35:   function Sort ( v : Vector ) return Vector is
                     36:
                     37:   -- DESCRIPTION :
                     38:   --   Returns the sorted vector v, in increasing order.
                     39:
                     40:     res : Vector(v'range) := v;
                     41:     ind,min : natural;
                     42:
                     43:   begin
                     44:     for i in v'first..v'last-1 loop
                     45:       min := res(i);
                     46:       ind := i;
                     47:       for j in i+1..res'last loop
                     48:         if res(j) < min
                     49:          then min := res(j);
                     50:               ind := j;
                     51:         end if;
                     52:       end loop;
                     53:       if ind /= i
                     54:        then res(ind) := res(i);
                     55:             res(i) := min;
                     56:       end if;
                     57:     end loop;
                     58:     return res;
                     59:   end Sort;
                     60:
                     61:   function Sign ( v1,v2 : Vector ) return integer is
                     62:
                     63:   -- DESCRIPTION :
                     64:   --   Returns the sign of the permutation (v1,v2).
                     65:
                     66:     d : constant natural := v1'length+v2'length;
                     67:     b : Bracket(1..d);
                     68:     v : Vector(1..d);
                     69:     sig : integer;
                     70:
                     71:   begin
                     72:     v(v1'range) := v1;
                     73:     v(v1'last+1..v'last) := v2;
                     74:     Create(v,b,sig);
                     75:     return sig;
                     76:   end Sign;
                     77:
                     78:   function Complement ( n : natural; v : Vector ) return Vector is
                     79:
                     80:   -- DESCRIPTION :
                     81:   --   Returns the complement of the vector w.r.t. the set 1..n.
                     82:
                     83:     res : Vector(1..n-v'length);
                     84:     cnt : natural := 0;
                     85:     found : boolean;
                     86:
                     87:   begin
                     88:     for i in 1..n loop
                     89:       found := false;
                     90:       for j in v'range loop
                     91:         if v(j) = i
                     92:          then found := true;
                     93:               exit;
                     94:         end if;
                     95:       end loop;
                     96:       if not found
                     97:        then cnt := cnt + 1;
                     98:             res(cnt) := i;
                     99:       end if;
                    100:     end loop;
                    101:     return res;
                    102:   end Complement;
                    103:
                    104:   procedure Enumerate ( start,i,n : in natural; accu : in out Vector;
                    105:                         s : in natural; b1,b2 : in Bracket;
                    106:                         frame : in Vector; bp : in out Bracket_Polynomial ) is
                    107:
                    108:   -- DESCRIPTION :
                    109:   --   Enumerates all subsets of 1..n, of size accu'length, starting to
                    110:   --   fill up accu(i) with entries in start..n.
                    111:
                    112:     v1,v2 : Vector(1..b1'last);
                    113:
                    114:   begin
                    115:     if i > accu'last
                    116:      then declare
                    117:             comp : constant Vector := Complement(n,accu);
                    118:           begin
                    119:             v1(b1'first..s-1)
                    120:               := Standard_Natural_Vectors.Vector(b1(b1'first..s-1));
                    121:             for j in accu'range loop
                    122:               v1(s+j-1) := frame(accu(j));
                    123:             end loop;
                    124:             v2(s+1..b2'last)
                    125:               := Standard_Natural_Vectors.Vector(b2(s+1..b2'last));
                    126:             for j in comp'range loop
                    127:               v2(j) := frame(comp(j));
                    128:             end loop;
                    129:             declare
                    130:               bt : Bracket_Term := Create(v1,v2);
                    131:             begin
                    132:               if bt.coeff /= Create(0.0)
                    133:                then if Sign(accu,comp) > 0
                    134:                      then Frontal_Add(bp,bt);
                    135:                      else Frontal_Min(bp,bt);
                    136:                     end if;
                    137:               end if;
                    138:               Clear(bt);
                    139:             end;
                    140:           end;
                    141:      else for l in start..n loop
                    142:             accu(i) := l;
                    143:             Enumerate(l+1,i+1,n,accu,s,b1,b2,frame,bp);
                    144:           end loop;
                    145:     end if;
                    146:   end Enumerate;
                    147:
                    148:   function Create ( b1,b2 : Bracket ) return Bracket_Term is
                    149:
                    150:     bm : Bracket_Monomial := Create(b1);
                    151:     bt : Bracket_Term;
                    152:
                    153:   begin
                    154:     Multiply(bm,b2);
                    155:     bt.coeff := Create(1.0);
                    156:     bt.monom := bm;
                    157:     return bt;
                    158:   end Create;
                    159:
                    160:   procedure Enumerate2 ( n,d,k,start : in natural; b : in Bracket;
                    161:                          accu : in out Bracket;
                    162:                          cntstd,cntnonstd : in out natural;
                    163:                          nonstd : in out Bracket_Polynomial ) is
                    164:
                    165:   -- DESCRIPTION :
                    166:   --   Lexicographic enumeration of all brackets, with b < accu and with
                    167:   --   a test whether the pair b*accu forms a Standard monomial.
                    168:
                    169:   -- ON ENTRY :
                    170:   --   n             total number of indices to choose from;
                    171:   --   d             number of indices in the brackets;
                    172:   --   k             current entry in accu that is to be filled;
                    173:   --   start         indices will be taken in between start..n;
                    174:   --   b             previously enumerated bracket;
                    175:   --   accu          accumulating parameter, filled in upto (k-1)th entry;
                    176:   --   cntstd        current number of quadratic standard monomials;
                    177:   --   cntnonstd     current number of quadratic nonstandard monomials;
                    178:   --   nonstd        current polynomial of quadratic nonstandard monomials.
                    179:
                    180:   -- ON RETURN :
                    181:   --   accu          updated accumulating parameter, accu(k) is filled in;
                    182:   --   cnstd         updated number of quadratic standard monomials;
                    183:   --   cntnonstd     updated number of quadratic nonstandard monomials;
                    184:   --   nonstd        updated polynomial of quadratic nonstandard monomials.
                    185:
                    186:     s : natural;
                    187:
                    188:   begin
                    189:     if k > d
                    190:      then if b < accu
                    191:            then s := Brackets.Is_Standard(b,accu);
                    192:                 if s = 0
                    193:                  then cntstd := cntstd + 1;
                    194:                  else cntnonstd := cntnonstd + 1;
                    195:                       Add(nonstd,Create(b,accu));
                    196:                 end if;
                    197:           end if;
                    198:      else for l in start..n loop
                    199:             accu(k) := l;
                    200:             Enumerate2(n,d,k+1,l+1,b,accu,cntstd,cntnonstd,nonstd);
                    201:           end loop;
                    202:     end if;
                    203:   end Enumerate2;
                    204:
                    205:   procedure Enumerate1 ( n,d,k,start : natural; acc1,acc2 : in out Bracket;
                    206:                          cntstd,cntnonstd : in out natural;
                    207:                          nonstd : in out Bracket_Polynomial ) is
                    208:
                    209:   -- DESCRIPTION :
                    210:   --   Lexicographic enumeration of all brackets, with acc1 < acc2 and with
                    211:   --   a test whether the pair acc1*acc2 forms a Standard monomial.
                    212:   --   Counts the standard and nonstandard monomials and adds every
                    213:   --   nonStandard monomial to the polynomial nonstd.
                    214:
                    215:   begin
                    216:     if k > d
                    217:      then Enumerate2(n,d,1,acc1(1),acc1,acc2,cntstd,cntnonstd,nonstd);
                    218:      else for l in start..n loop
                    219:             acc1(k) := l;
                    220:             Enumerate1(n,d,k+1,l+1,acc1,acc2,cntstd,cntnonstd,nonstd);
                    221:           end loop;
                    222:     end if;
                    223:   end Enumerate1;
                    224:
                    225:   procedure Enumerate3 ( n,d,k,start : in natural; accu : in out Vector;
                    226:                          bp : in out Bracket_Polynomial ) is
                    227:
                    228:   -- DESCRIPTION :
                    229:   --   Lexicographic enumerations of all vectors with d-entries, out
                    230:   --   of a set of n natural numbers.
                    231:
                    232:   -- ON ENTRY :
                    233:   --   n             total number of indices to choose from;
                    234:   --   d             number of indices in the brackets;
                    235:   --   k             current entry in accu that is to be filled;
                    236:   --   start         indices will be taken in between start..n;
                    237:   --   accu          accumulating parameter, filled in upto (k-1)th entry;
                    238:
                    239:   -- ON RETURN :
                    240:   --   accu          filled in upto the kth entry.
                    241:
                    242:   begin
                    243:     if k > d
                    244:      then declare
                    245:             comp : constant Vector := Complement(n,accu);
                    246:             acc0 : Vector(1..d+1);
                    247:             t : Bracket_Term;
                    248:           begin
                    249:           -- put(" accu : "); put(accu); put(" complement : "); put(comp);
                    250:             acc0(1) := 0;
                    251:             acc0(2..d+1) := accu(1..d);
                    252:           --  put(" acc0 : "); put(acc0); new_line;
                    253:             t := Create(acc0,comp);
                    254:             if Sign(accu,comp) > 0
                    255:              then Frontal_Add(bp,t);
                    256:              else Frontal_Min(bp,t);
                    257:             end if;
                    258:             Clear(t);
                    259:           end;
                    260:      else for l in start..n-d+k loop
                    261:             accu(k) := l;
                    262:             Enumerate3(n,d,k+1,l+1,accu,bp);
                    263:           end loop;
                    264:     end if;
                    265:   end Enumerate3;
                    266:
                    267: -- TARGET OPERATIONS :
                    268:
                    269:   function Laplace_Expansion ( n,d : natural ) return Bracket_Polynomial is
                    270:
                    271:     res : Bracket_Polynomial;
                    272:     acc : Vector(1..d);
                    273:
                    274:   begin
                    275:     Enumerate3(n,d,1,1,acc,res);
                    276:     return res;
                    277:   end Laplace_Expansion;
                    278:
                    279:   function Straightening_Syzygy ( b1,b2 : Bracket )
                    280:                                 return Bracket_Polynomial is
                    281:
                    282:     s : constant natural := Is_Standard(b1,b2);
                    283:     bm : Bracket_Monomial;
                    284:     bp : Bracket_Polynomial;
                    285:
                    286:   begin
                    287:     if s = 0
                    288:      then bm := Create(b1);
                    289:           Multiply(bm,b2);
                    290:           bp := Create(bm);
                    291:      else declare
                    292:             d1 : constant natural := b1'last+1;
                    293:             frame : Vector(1..d1);
                    294:             accu : Vector(1..d1-s);
                    295:           begin
                    296:             for i in s..b1'last loop
                    297:               frame(i-s+1) := b1(i);
                    298:             end loop;
                    299:             for i in b2'first..s loop
                    300:               frame(d1-s+i) := b2(i);
                    301:             end loop;
                    302:             frame := Sort(frame);
                    303:             Enumerate(1,1,d1,accu,s,b1,b2,frame,bp);
                    304:           end;
                    305:     end if;
                    306:     return bp;
                    307:   end Straightening_Syzygy;
                    308:
                    309:   function Straightening_Syzygy ( b : Bracket_Monomial )
                    310:                                 return Bracket_Polynomial is
                    311:
                    312:     b1,b2 : Link_to_Bracket;
                    313:     bp : Bracket_Polynomial;
                    314:
                    315:     procedure Get_Bracket ( bb : in Bracket; continue : out boolean ) is
                    316:     begin
                    317:       if b1 = null
                    318:        then b1 := new Bracket'(bb);
                    319:        else b2 := new Bracket'(bb);
                    320:       end if;
                    321:       continue := true;
                    322:     end Get_Bracket;
                    323:     procedure Get_Brackets is new Enumerate_Brackets(Get_Bracket);
                    324:
                    325:   begin
                    326:     Get_Brackets(b);
                    327:     bp := Straightening_Syzygy(b1.all,b2.all);
                    328:     Clear(b1); Clear(b2);
                    329:     return bp;
                    330:   end Straightening_Syzygy;
                    331:
                    332:   function nonStandard_Monomials ( n,d : natural ) return Bracket_Polynomial is
                    333:
                    334:     nonstd : Bracket_Polynomial;
                    335:     b1,b2 : Bracket(1..d);
                    336:     cntstd,cntnonstd : natural := 0;
                    337:
                    338:   begin
                    339:     Enumerate1(n,d,1,1,b1,b2,cntstd,cntnonstd,nonstd);
                    340:     return nonstd;
                    341:   end nonStandard_Monomials;
                    342:
                    343:   procedure Enumerate_Syzygies ( p : in Bracket_Polynomial ) is
                    344:
                    345:     procedure Process_Syzygy ( t : in Bracket_Term; continue : out boolean ) is
                    346:     begin
                    347:       Process(Straightening_Syzygy(t.monom),continue);
                    348:     end Process_Syzygy;
                    349:     procedure Process_Syzygies is new Enumerate_Terms(Process_Syzygy);
                    350:
                    351:   begin
                    352:     Process_Syzygies(p);
                    353:   end Enumerate_Syzygies;
                    354:
                    355:   function Straighten ( b1,b2 : Bracket ) return Bracket_Polynomial is
                    356:
                    357:     bp : Bracket_Polynomial := Straightening_Syzygy(b1,b2);
                    358:
                    359:   begin
                    360:     return bp;
                    361:   end Straighten;
                    362:
                    363:   function Straighten ( b : Bracket_Monomial ) return Bracket_Polynomial is
                    364:
                    365:     bp : Bracket_Polynomial;
                    366:
                    367:   begin
                    368:     return bp;
                    369:   end Straighten;
                    370:
                    371:   function Straighten ( b : Bracket_Term ) return Bracket_Polynomial is
                    372:
                    373:     bp : Bracket_Polynomial;
                    374:
                    375:   begin
                    376:     return bp;
                    377:   end Straighten;
                    378:
                    379:   function Straighten ( b : Bracket_Polynomial ) return Bracket_Polynomial is
                    380:
                    381:     bp : Bracket_Polynomial;
                    382:
                    383:   begin
                    384:     return bp;
                    385:   end Straighten;
                    386:
                    387: end Straightening_Syzygies;

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