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