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

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

1.1       maekawa     1: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
                      2: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
                      3: with Standard_Natural_Vectors;
                      4: with Matrix_Indeterminates;
                      5: with Bracket_Polynomials;                use Bracket_Polynomials;
                      6: with Straightening_Syzygies;             use Straightening_Syzygies;
                      7:
                      8: package body Symbolic_Minor_Equations is
                      9:
                     10: -- AUXILIARIES TO Minor_Equations :
                     11:
                     12:   function Substitute ( b,minor : Bracket ) return Bracket is
                     13:
                     14:   -- DESCRIPTION :
                     15:   --   The ith entry in the bracket b is replaced by minor(b(i)).
                     16:
                     17:     res : Bracket(b'range);
                     18:     start : integer;
                     19:
                     20:   begin
                     21:     if b(b'first) = 0
                     22:      then start := b'first+1;         -- bracket is a coefficient bracket
                     23:           res(res'first) := 0;        -- result is also a coefficient bracket
                     24:      else start := b'first;           -- second bracket in expansion
                     25:     end if;
                     26:     for i in start..b'last loop
                     27:       res(i) := minor(b(i));
                     28:     end loop;
                     29:     return res;
                     30:   end Substitute;
                     31:
                     32:   function Substitute ( bm : Bracket_Monomial; minor : Bracket )
                     33:                       return Bracket_Monomial is
                     34:
                     35:   -- DESCRIPTION :
                     36:   --   Substitutes the entries in the brackets according to the minor.
                     37:
                     38:   -- REQUIRED : bm is a quadratic monomial.
                     39:
                     40:     res : Bracket_Monomial;
                     41:     lb : Link_to_Bracket;
                     42:     first : boolean := true;
                     43:
                     44:     procedure Substitute_Bracket ( b : in Bracket; continue : out boolean ) is
                     45:
                     46:       sb : Bracket(b'range) := Substitute(b,minor);
                     47:
                     48:     begin
                     49:       if first
                     50:        then lb := new Bracket'(sb);  -- save to preserve order
                     51:             first := false;
                     52:        else res := sb*lb.all;
                     53:       end if;
                     54:       continue := true;
                     55:     end Substitute_Bracket;
                     56:     procedure Substitute_Brackets is
                     57:       new Enumerate_Brackets(Substitute_Bracket);
                     58:
                     59:   begin
                     60:     Substitute_Brackets(bm);
                     61:     Clear(lb);
                     62:     return res;
                     63:   end Substitute;
                     64:
                     65:   function Substitute ( bt : Bracket_Term; minor : Bracket )
                     66:                       return Bracket_Term is
                     67:
                     68:   -- DESCRIPTION :
                     69:   --   The ith entry in every bracket of the term according to the minor.
                     70:
                     71:     res : Bracket_Term;
                     72:
                     73:   begin
                     74:     res.coeff := bt.coeff;
                     75:     res.monom := Substitute(bt.monom,minor);
                     76:     return res;
                     77:   end Substitute;
                     78:
                     79:   function Substitute ( bp : Bracket_Polynomial; minor : Bracket )
                     80:                       return Bracket_Polynomial is
                     81:
                     82:   -- DESCRIPTION :
                     83:   --   The labels in the brackets of bp are replaced by those in the minor.
                     84:   --   The bracket polynomial represents the Laplace expansion of that minor.
                     85:
                     86:     res : Bracket_Polynomial;
                     87:
                     88:     procedure Substitute_Term ( t : in Bracket_Term; continue : out boolean ) is
                     89:
                     90:       st : Bracket_Term := Substitute(t,minor);
                     91:
                     92:     begin
                     93:       Add(res,st);
                     94:       Clear(st);
                     95:       continue := true;
                     96:     end Substitute_Term;
                     97:     procedure Substitute_Terms is new Enumerate_Terms(Substitute_Term);
                     98:
                     99:   begin
                    100:     Substitute_Terms(bp);
                    101:     return res;
                    102:   end Substitute;
                    103:
                    104: -- AUXILIARIES TO Expanded_Minor :
                    105:
                    106:   function Subtract ( b : Bracket; i : natural ) return Bracket is
                    107:
                    108:   -- DESCRIPTION :
                    109:   --   Returns a smaller bracket with the ith entry removed.
                    110:
                    111:     res : Bracket(b'first..b'last-1);
                    112:
                    113:   begin
                    114:     res(b'first..(i-1)) := b(b'first..(i-1));
                    115:     res(i..res'last) := b((i+1)..b'last);
                    116:     return res;
                    117:   end Subtract;
                    118:
                    119:   function General_Expanded_Minor ( m : Standard_Complex_Poly_Matrices.Matrix;
                    120:                                     b : Bracket ) return Poly is
                    121:
                    122:   -- DESCRIPTION :
                    123:   --   This function treats the case for Expanded_Minor when b'length > 2.
                    124:
                    125:     res : Poly := Null_Poly;
                    126:     sig : integer;
                    127:     submin,acc : Poly;
                    128:
                    129:   begin
                    130:     if b'last mod 2 = 0
                    131:      then sig := -1;
                    132:      else sig := +1;
                    133:     end if;
                    134:     for i in b'range loop
                    135:       if m(b(i),b'last) /= Null_Poly
                    136:        then submin := Expanded_Minor(m,Subtract(b,i));
                    137:             if submin /= Null_Poly
                    138:              then acc := m(b(i),b'last)*submin;
                    139:                   if sig > 0
                    140:                    then Add(res,acc);
                    141:                    else Sub(res,acc);
                    142:                   end if;
                    143:                   Clear(acc);
                    144:             end if;
                    145:             Clear(submin);
                    146:       end if;
                    147:       sig := -sig;
                    148:     end loop;
                    149:     return res;
                    150:   end General_Expanded_Minor;
                    151:
                    152:   procedure Purify ( p : in out Poly ) is
                    153:
                    154:   -- DESCRIPTION :
                    155:   --   Eliminates terms that have coefficients less that 10.0**(-10).
                    156:
                    157:     tol : constant double_float := 10.0**(-10);
                    158:     res : Poly := Null_Poly;
                    159:
                    160:     procedure Scan_Term ( t : in Term; cont : out boolean ) is
                    161:     begin
                    162:       if AbsVal(t.cf) > tol
                    163:        then Add(res,t);
                    164:       end if;
                    165:       cont := true;
                    166:     end Scan_Term;
                    167:     procedure Scan_Terms is new Visiting_Iterator(Scan_Term);
                    168:
                    169:   begin
                    170:     Scan_Terms(p);
                    171:     Clear(p);
                    172:     p := res;
                    173:   end Purify;
                    174:
                    175: -- TARGET ROUTINES :
                    176:
                    177:   function Schubert_Pattern ( n : natural; b1,b2 : Bracket )
                    178:                             return Standard_Complex_Poly_Matrices.Matrix is
                    179:
                    180:     res : Standard_Complex_Poly_Matrices.Matrix(1..n,b1'range);
                    181:     d : constant natural := b1'last;
                    182:
                    183:   begin
                    184:     for i in 1..n loop
                    185:       for j in b1'range loop
                    186:         if ((i < b2(j)) or (i > n+1-b1(b1'last+1-j)))
                    187:          then res(i,j) := Null_Poly;
                    188:          else res(i,j) := Matrix_Indeterminates.Monomial(n,d,i,j);
                    189:         end if;
                    190:       end loop;
                    191:     end loop;
                    192:     return res;
                    193:   end Schubert_Pattern;
                    194:
                    195:   function Localization_Pattern ( n : natural; top,bottom : Bracket )
                    196:                                 return Standard_Complex_Poly_Matrices.Matrix is
                    197:
                    198:     p : constant natural := top'length;
                    199:     res : Standard_Complex_Poly_Matrices.Matrix(1..n,1..p);
                    200:
                    201:   begin
                    202:     for i in res'range(1) loop
                    203:       for j in res'range(2) loop
                    204:         if i < top(j) or i > bottom(j)
                    205:          then res(i,j) := Null_Poly;
                    206:          else res(i,j) := Matrix_Indeterminates.Monomial(n,p,i,j);
                    207:         end if;
                    208:       end loop;
                    209:     end loop;
                    210:     return res;
                    211:   end Localization_Pattern;
                    212:
                    213: -- SYMBOLIC REPRESENTATION OF THE EQUATIONS :
                    214:
                    215:   function Maximal_Minors ( n,m : natural ) return Bracket_Monomial is
                    216:
                    217:     res : Bracket_Monomial;
                    218:     first : boolean := true;
                    219:     accu : Bracket(1..m);
                    220:
                    221:     procedure Enumerate_Brackets ( k,start : natural ) is
                    222:
                    223:     -- DESCRIPTION :
                    224:     --   Enumerate all m-brackets with entries between 1 and n,
                    225:     --   beginning at start, and currently filling in the kth entry.
                    226:
                    227:     begin
                    228:       if k > m
                    229:        then if first
                    230:              then res := Create(accu); first := false;
                    231:              else Multiply(res,accu);
                    232:             end if;
                    233:        else for i in start..n loop
                    234:               accu(k) := i;
                    235:               Enumerate_Brackets(k+1,i+1);
                    236:             end loop;
                    237:       end if;
                    238:     end Enumerate_Brackets;
                    239:
                    240:   begin
                    241:     Enumerate_Brackets(1,1);
                    242:     return res;
                    243:   end Maximal_Minors;
                    244:
                    245:   function Minor_Equations
                    246:              ( m,d : natural; bm : Bracket_Monomial ) return Bracket_System is
                    247:
                    248:     res : Bracket_System(0..Number_of_Brackets(bm));
                    249:     gen : Bracket_Polynomial := Laplace_Expansion(m,d);
                    250:     cnt : natural := 0;
                    251:
                    252:     procedure Substitute_Bracket ( b : in Bracket; continue : out boolean ) is
                    253:     begin
                    254:       cnt := cnt + 1;
                    255:       res(cnt) := Substitute(gen,b);
                    256:       continue := true;
                    257:     end Substitute_Bracket;
                    258:     procedure Substitute_Brackets is
                    259:       new Enumerate_Brackets(Substitute_Bracket);
                    260:
                    261:   begin
                    262:     res(0) := gen;
                    263:     Substitute_Brackets(bm);
                    264:     return res;
                    265:   end Minor_Equations;
                    266:
                    267:   function Expanded_Minor ( m : Standard_Complex_Poly_Matrices.Matrix;
                    268:                             b : Bracket ) return Poly is
                    269:
                    270:     res : Poly := Null_Poly;
                    271:     acc : Poly;
                    272:
                    273:   begin
                    274:     if b'length = 1
                    275:      then Copy(m(b(1),1),res);
                    276:      elsif b'length = 2
                    277:          then if (m(b(1),1) /= Null_Poly) and (m(b(2),2) /= Null_Poly)
                    278:                then res := m(b(1),1)*m(b(2),2);
                    279:               end if;
                    280:               if (m(b(2),1) /= Null_Poly) and (m(b(1),2) /= Null_Poly)
                    281:                then acc := m(b(2),1)*m(b(1),2);
                    282:                     Sub(res,acc);
                    283:                     Clear(acc);
                    284:               end if;
                    285:          else res := General_Expanded_Minor(m,b);
                    286:     end if;
                    287:     Purify(res);
                    288:     return res;
                    289:   end Expanded_Minor;
                    290:
                    291:   function Extend_Zero_Lifting ( p : Poly ) return Poly is
                    292:
                    293:     res : Poly := Null_Poly;
                    294:
                    295:     procedure Extend_Term ( t : in Term; continue : out boolean ) is
                    296:
                    297:       et : Term;
                    298:
                    299:     begin
                    300:       et.dg := new Standard_Natural_Vectors.Vector(t.dg'first..t.dg'last+1);
                    301:       et.dg(t.dg'range) := t.dg.all;
                    302:       et.dg(et.dg'last) := 0;
                    303:       et.cf := t.cf;
                    304:       Add(res,et);
                    305:       Clear(et.dg);
                    306:       continue := true;
                    307:     end Extend_Term;
                    308:     procedure Extend_Terms is new Visiting_Iterator(Extend_Term);
                    309:
                    310:   begin
                    311:     Extend_Terms(p);
                    312:     return res;
                    313:   end Extend_Zero_Lifting;
                    314:
                    315: end Symbolic_Minor_Equations;

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