Annotation of OpenXM_contrib/PHC/Ada/Schubert/bracket_expansions.adb, Revision 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 Bracket_Expansions is
! 5:
! 6: -- AUXILIARIES :
! 7:
! 8: function Create_Term ( n,d,i,j : natural ) return Term is
! 9:
! 10: -- DESCRIPTION :
! 11: -- Returns the term that corresponds with xij.
! 12:
! 13: res : Term;
! 14:
! 15: begin
! 16: res.cf := Create(1.0);
! 17: res.dg := new Standard_Natural_Vectors.Vector'(1..d*n => 0);
! 18: res.dg((i-1)*d + j) := 1;
! 19: return res;
! 20: end Create_Term;
! 21:
! 22: function Create_Localized_Term ( n,d,i,j,k : natural ) return Term is
! 23:
! 24: -- DESCRIPTION :
! 25: -- Creates a term in localized variables:
! 26: -- if i >= k, then xij equals either 1 if i=j, or 0 if i/=j.
! 27: -- If i >= k, then the `dg' of the term on return is null.
! 28:
! 29: res : Term;
! 30:
! 31: begin
! 32: if i < k
! 33: then res.cf := Create(1.0);
! 34: res.dg := new Standard_Natural_Vectors.Vector'(1..d*(n-d) => 0);
! 35: res.dg((i-1)*d + j) := 1;
! 36: else if i = j+k-1
! 37: then res.cf := Create(1.0);
! 38: else res.cf := Create(0.0);
! 39: end if;
! 40: return res;
! 41: end if;
! 42: return res;
! 43: end Create_Localized_Term;
! 44:
! 45: function Create_Term ( loc,n,d,i,j : natural ) return Term is
! 46:
! 47: -- DESCRIPTION :
! 48: -- Returns the term that corresponds with xij, with respect to
! 49: -- the localization information in loc, which is 0,1, or 2.
! 50:
! 51: res : Term;
! 52:
! 53: begin
! 54: if loc = 0
! 55: then res.cf := Create(0.0);
! 56: else res.cf := Create(1.0);
! 57: end if;
! 58: res.dg := new Standard_Natural_Vectors.Vector'(1..d*n => 0);
! 59: if loc = 2
! 60: then res.dg((i-1)*d + j) := 1;
! 61: end if;
! 62: return res;
! 63: end Create_Term;
! 64:
! 65: -- TARGET ROUTINES :
! 66:
! 67: function Expand2 ( n,d : natural; b : Bracket ) return Poly is
! 68:
! 69: -- DESCRIPTION :
! 70: -- Does the expansion in the two-dimensional case.
! 71:
! 72: res,subtmp : Poly;
! 73: b11 : Term := Create_Term(n,d,b(1),1);
! 74: b12 : Term := Create_Term(n,d,b(1),2);
! 75: b21 : Term := Create_Term(n,d,b(2),1);
! 76: b22 : Term := Create_Term(n,d,b(2),2);
! 77: d1 : Poly := Create(b11);
! 78: d2 : Poly := Create(b21);
! 79:
! 80: begin -- res := b11*b22 - b21*b12;
! 81: res := b22*d1;
! 82: subtmp := b12*d2;
! 83: Sub(res,subtmp);
! 84: Clear(subtmp);
! 85: Clear(b22); Clear(b12);
! 86: Clear(b11); Clear(b21);
! 87: Clear(d1); Clear(d2);
! 88: return res;
! 89: end Expand2;
! 90:
! 91: function Expand ( n,d : natural; b : Bracket ) return Poly is
! 92:
! 93: res : Poly;
! 94:
! 95: begin
! 96: if b'last = 2
! 97: then res := Expand2(n,d,b);
! 98: else res := Null_Poly;
! 99: declare
! 100: sig : integer := +1;
! 101: b1 : Bracket(1..b'last-1);
! 102: begin
! 103: b1(1..b'last-1) := b(1..b'last-1);
! 104: if b'last mod 2 = 0
! 105: then sig := -1;
! 106: end if;
! 107: for i in b'range loop
! 108: declare
! 109: xt : Term := Create_Term(n,d,b(i),b'last);
! 110: expb1,xtexpb1 : Poly;
! 111: begin
! 112: b1(1..i-1) := b(1..i-1);
! 113: b1(i..b1'last) := b(i+1..b'last);
! 114: expb1 := Expand(n,d,b1);
! 115: xtexpb1 := xt*expb1;
! 116: if sig > 0
! 117: then Add(res,xtexpb1);
! 118: else Sub(res,xtexpb1);
! 119: end if;
! 120: sig := -sig;
! 121: Clear(expb1); Clear(xt); Clear(xtexpb1);
! 122: end;
! 123: end loop;
! 124: end;
! 125: end if;
! 126: return res;
! 127: end Expand;
! 128:
! 129: function Expand ( n,d : natural; b : Bracket_Monomial ) return Poly is
! 130:
! 131: res : Poly := Null_Poly;
! 132: fst : boolean := true;
! 133:
! 134: procedure Expand_Bracket ( bb : in Bracket; continue : out boolean ) is
! 135:
! 136: expbb : Poly;
! 137:
! 138: begin
! 139: if fst
! 140: then res := Expand(n,d,bb);
! 141: fst := false;
! 142: else expbb := Expand(n,d,bb);
! 143: Mul(res,expbb);
! 144: Clear(expbb);
! 145: end if;
! 146: continue := true;
! 147: end Expand_Bracket;
! 148: procedure Expand_Brackets is new Enumerate_Brackets(Expand_Bracket);
! 149:
! 150: begin
! 151: Expand_Brackets(b);
! 152: return res;
! 153: end Expand;
! 154:
! 155: function Expand ( n,d : natural; b : Bracket_Term ) return Poly is
! 156:
! 157: res : Poly := Expand(n,d,b.monom);
! 158:
! 159: begin
! 160: Mul(res,b.coeff);
! 161: return res;
! 162: end Expand;
! 163:
! 164: function Expand ( n,d : natural; b : Bracket_Polynomial ) return Poly is
! 165:
! 166: res : Poly := Null_Poly;
! 167:
! 168: procedure Expand_Term ( t : in Bracket_Term; continue : out boolean ) is
! 169:
! 170: expt : Poly := Expand(n,d,t);
! 171:
! 172: begin
! 173: Add(res,expt);
! 174: Clear(expt);
! 175: continue := true;
! 176: end Expand_Term;
! 177: procedure Expand_Terms is new Enumerate_Terms(Expand_Term);
! 178:
! 179: begin
! 180: Expand_Terms(b);
! 181: return res;
! 182: end Expand;
! 183:
! 184: function Localized_Expand2
! 185: ( n,d : natural; b : Bracket; k : natural ) return Poly is
! 186:
! 187: -- DESCRIPTION :
! 188: -- Computes the localized expansion for two dimensions.
! 189: -- Exploits the fact that b(1) < b(2).
! 190:
! 191: res : Poly;
! 192: b11 : Term := Create_Localized_Term(n,d,b(1),1,k);
! 193: b12 : Term := Create_Localized_Term(n,d,b(1),2,k);
! 194: b21 : Term := Create_Localized_Term(n,d,b(2),1,k);
! 195: b22 : Term := Create_Localized_Term(n,d,b(2),2,k);
! 196:
! 197: begin
! 198: if b(2) < k
! 199: then declare
! 200: subtmp : Poly;
! 201: d1 : Poly := Create(b11);
! 202: d2 : Poly := Create(b21);
! 203: begin -- res := b11*b22 - b21*b12;
! 204: res := b22*d1;
! 205: subtmp := b12*d2;
! 206: Sub(res,subtmp);
! 207: Clear(subtmp);
! 208: Clear(b22); Clear(b12);
! 209: Clear(b11); Clear(b21);
! 210: Clear(d1); Clear(d2);
! 211: end;
! 212: else if b(1) < k
! 213: then b11.cf := b11.cf*b22.cf;
! 214: b12.cf := b12.cf*b21.cf;
! 215: res := Create(b11);
! 216: Sub(res,b12);
! 217: Clear(b11); Clear(b12);
! 218: else declare
! 219: rt : Term;
! 220: dd : constant natural := d*(n-d);
! 221: begin
! 222: rt.cf := b11.cf*b22.cf - b21.cf*b12.cf;
! 223: rt.dg := new Standard_Natural_Vectors.Vector'(1..dd => 0);
! 224: res := Create(rt);
! 225: end;
! 226: end if;
! 227: end if;
! 228: return res;
! 229: end Localized_Expand2;
! 230:
! 231: function Localized_Expand ( n,d : natural; b : Bracket ) return Poly is
! 232:
! 233: res : Poly;
! 234: k : constant natural := n-d+1;
! 235:
! 236: begin
! 237: if b'last = 2
! 238: then res := Localized_Expand2(n,d,b,k);
! 239: else res := Null_Poly;
! 240: declare
! 241: sig : integer := +1;
! 242: b1 : Bracket(1..b'last-1);
! 243: begin
! 244: b1(1..b'last-1) := b(1..b'last-1);
! 245: if b'last mod 2 = 0
! 246: then sig := -1;
! 247: end if;
! 248: for i in b'range loop
! 249: declare
! 250: xt : Term := Create_Localized_Term(n,d,b(i),b'last,k);
! 251: expb1,xtexpb1 : Poly;
! 252: begin
! 253: if xt.cf /= Create(0.0)
! 254: then b1(1..i-1) := b(1..i-1);
! 255: b1(i..b1'last) := b(i+1..b'last);
! 256: expb1 := Localized_Expand(n,d,b1);
! 257: xtexpb1 := xt*expb1;
! 258: if sig > 0
! 259: then Add(res,xtexpb1);
! 260: else Sub(res,xtexpb1);
! 261: end if;
! 262: Clear(expb1); Clear(xt); Clear(xtexpb1);
! 263: end if;
! 264: sig := -sig;
! 265: end;
! 266: end loop;
! 267: end;
! 268: end if;
! 269: return res;
! 270: end Localized_Expand;
! 271:
! 272: function Localization_Map ( n,d : natural ) return Matrix is
! 273:
! 274: res : Matrix(1..n,1..d);
! 275: row,col : natural;
! 276:
! 277: begin
! 278: for i in 1..n loop -- initialization
! 279: for j in 1..d loop
! 280: res(i,j) := -1; -- means empty space
! 281: end loop;
! 282: end loop;
! 283: col := 0;
! 284: for i in 1..n loop -- one free element in every row
! 285: col := col+1;
! 286: if col > d
! 287: then col := 1;
! 288: end if;
! 289: res(i,col) := 2;
! 290: end loop;
! 291: row := 0;
! 292: for j in 1..d loop -- one 1 in every column
! 293: loop
! 294: row := row+1;
! 295: if row > n
! 296: then row := 1;
! 297: end if;
! 298: exit when (res(row,j) = -1); -- empty space found
! 299: end loop;
! 300: res(row,j) := 1;
! 301: end loop;
! 302: for j in 1..d loop -- fill in d-1 zeros in every column
! 303: for i in 1..(d-1) loop
! 304: row := 0;
! 305: loop
! 306: row := row+1;
! 307: if row > n
! 308: then row := 1;
! 309: end if;
! 310: exit when (res(row,j) = -1); -- empty space found
! 311: end loop;
! 312: res(row,j) := 0;
! 313: end loop;
! 314: end loop;
! 315: for i in 1..n loop -- fill rest with free elements
! 316: for j in 1..d loop
! 317: if res(i,j) = -1
! 318: then res(i,j) := 2;
! 319: end if;
! 320: end loop;
! 321: end loop;
! 322: return res;
! 323: end Localization_Map;
! 324:
! 325: function Expand2 ( locmap : Matrix; b : Bracket ) return Poly is
! 326:
! 327: -- DESCRIPTION :
! 328: -- Expands a 2-by-2 minor of the matrix, selecting the rows with
! 329: -- entries in the 2-bracket b, respecting the localization map.
! 330:
! 331: res,subtmp : Poly;
! 332: n : constant natural := locmap'length(1);
! 333: d : constant natural := locmap'length(2);
! 334: b11 : Term := Create_Term(locmap(b(1),1),n,d,b(1),1);
! 335: b12 : Term := Create_Term(locmap(b(1),2),n,d,b(1),2);
! 336: b21 : Term := Create_Term(locmap(b(2),1),n,d,b(2),1);
! 337: b22 : Term := Create_Term(locmap(b(2),2),n,d,b(2),2);
! 338: d1 : Poly := Create(b11);
! 339: d2 : Poly := Create(b21);
! 340:
! 341: begin -- res := b11*b22 - b21*b12;
! 342: res := b22*d1;
! 343: subtmp := b12*d2;
! 344: Sub(res,subtmp);
! 345: Clear(subtmp);
! 346: Clear(b22); Clear(b12);
! 347: Clear(b11); Clear(b21);
! 348: Clear(d1); Clear(d2);
! 349: return res;
! 350: end Expand2;
! 351:
! 352: function Expand ( locmap : Matrix; b : Bracket ) return Poly is
! 353:
! 354: -- DESCRIPTION :
! 355: -- Expands a d-by-d minor of the matrix, selecting the rows with
! 356: -- entries in b, respecting the localization map.
! 357: -- The expansion starts at the last column and proceeds recursively.
! 358:
! 359: res : Poly;
! 360: n : constant natural := locmap'length(1);
! 361: d : constant natural := locmap'length(2);
! 362:
! 363: begin
! 364: if b'last = 2
! 365: then res := Expand2(locmap,b);
! 366: else res := Null_Poly;
! 367: declare
! 368: sig : integer := +1;
! 369: b1 : Bracket(1..b'last-1);
! 370: begin
! 371: b1(1..b'last-1) := b(1..b'last-1);
! 372: if b'last mod 2 = 0
! 373: then sig := -1;
! 374: end if;
! 375: for i in b'range loop
! 376: declare
! 377: xt : Term := Create_Term(locmap(b(i),b'last),n,d,b(i),b'last);
! 378: expb1,xtexpb1 : Poly;
! 379: begin
! 380: if xt.cf /= Create(0.0)
! 381: then b1(1..i-1) := b(1..i-1);
! 382: b1(i..b1'last) := b(i+1..b'last);
! 383: expb1 := Expand(locmap,b1);
! 384: xtexpb1 := xt*expb1;
! 385: if sig > 0
! 386: then Add(res,xtexpb1);
! 387: else Sub(res,xtexpb1);
! 388: end if;
! 389: Clear(expb1); Clear(xtexpb1);
! 390: end if;
! 391: Clear(xt);
! 392: end;
! 393: sig := -sig;
! 394: end loop;
! 395: end;
! 396: end if;
! 397: return res;
! 398: end Expand;
! 399:
! 400: function Reduce_Variables
! 401: ( locmap : Matrix; dg : Standard_Natural_Vectors.Vector )
! 402: return Standard_Natural_Vectors.Vector is
! 403:
! 404: -- DESCRIPTION :
! 405: -- Removes the #variables in the degrees vectors, removing all variables
! 406: -- that correspond to zeros in the localization map.
! 407:
! 408: res : Standard_Natural_Vectors.Vector(dg'range) := dg;
! 409: cnt : natural := res'last;
! 410: d : constant natural := locmap'length(2);
! 411:
! 412: begin
! 413: for i in reverse locmap'range(1) loop
! 414: for j in reverse locmap'range(2) loop
! 415: if locmap(i,j) /= 2
! 416: then cnt := cnt - 1;
! 417: for k in ((i-1)*d+j)..cnt loop
! 418: res(k) := res(k+1);
! 419: end loop;
! 420: end if;
! 421: end loop;
! 422: end loop;
! 423: return res(res'first..cnt);
! 424: end Reduce_Variables;
! 425:
! 426: function Reduce_Variables ( locmap : Matrix; t : Term ) return Term is
! 427:
! 428: -- DESCRIPTION :
! 429: -- Reduces the #variables in the term, removing all variables that
! 430: -- correspond to zeros in the localization map.
! 431:
! 432: res : Term;
! 433:
! 434: begin
! 435: res.cf := t.cf;
! 436: res.dg := new Standard_Natural_Vectors.Vector'
! 437: (Reduce_Variables(locmap,t.dg.all));
! 438: return res;
! 439: end Reduce_Variables;
! 440:
! 441: procedure Reduce_Variables ( locmap : in Matrix; p : in out Poly ) is
! 442:
! 443: rp : Poly := Null_Poly;
! 444:
! 445: procedure Reduce_Term ( t : in Term; continue : out boolean ) is
! 446:
! 447: rt : Term := Reduce_Variables(locmap,t);
! 448:
! 449: begin
! 450: Add(rp,rt);
! 451: continue := true;
! 452: end Reduce_Term;
! 453: procedure Reduce_Terms is new Visiting_Iterator(Reduce_Term);
! 454:
! 455: begin
! 456: Reduce_Terms(p);
! 457: Clear(p);
! 458: p := rp;
! 459: end Reduce_Variables;
! 460:
! 461: end Bracket_Expansions;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>