Annotation of OpenXM_contrib/PHC/Ada/Schubert/determinantal_systems.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 Standard_Complex_Polynomials; use Standard_Complex_Polynomials;
! 5: with Bracket_Monomials; use Bracket_Monomials;
! 6: with Bracket_Systems; use Bracket_Systems;
! 7: with Evaluated_Minors; use Evaluated_Minors;
! 8: with Symbolic_Minor_Equations; use Symbolic_Minor_Equations;
! 9: with Numeric_Minor_Equations; use Numeric_Minor_Equations;
! 10:
! 11: package body Determinantal_Systems is
! 12:
! 13: -- AUXILIARY TO EVALUATION OF MAXIMAL MINORS :
! 14:
! 15: function Number_of_Maximal_Minors ( nrows,ncols : natural ) return natural is
! 16:
! 17: -- DESCRIPTION :
! 18: -- Returns the number of maximal minors of a matrix with nrows and ncols.
! 19:
! 20: -- REQUIRED : nrows > ncols.
! 21:
! 22: begin
! 23: if ncols = 1
! 24: then return nrows;
! 25: else return Number_of_Maximal_Minors(nrows-1,ncols-1)*nrows/ncols;
! 26: end if;
! 27: end Number_of_Maximal_Minors;
! 28:
! 29: -- LOCALIZATION MAPS :
! 30:
! 31: function Localize ( locmap : Standard_Natural_Matrices.Matrix;
! 32: t : Term ) return Term is
! 33:
! 34: -- DESCRIPTION :
! 35: -- Applies the localization map to the term, eliminating those xij's
! 36: -- xij for which the corresponding entry in locmap is either 0 or 1.
! 37:
! 38: -- NOTE :
! 39: -- This localization assumes that t.dg(k) = 0 with k for which the
! 40: -- corresponding (i,j) with locmap(i,j) = 0.
! 41:
! 42: res : Term;
! 43: ndg : Standard_Natural_Vectors.Vector(t.dg'range);
! 44: cnt : natural := t.dg'first-1;
! 45: ind : natural := cnt;
! 46:
! 47: begin
! 48: for i in locmap'range(1) loop -- lexicographic order of variables
! 49: for j in locmap'range(2) loop
! 50: ind := ind+1;
! 51: if locmap(i,j) = 2
! 52: then cnt := cnt + 1;
! 53: ndg(cnt) := t.dg(ind);
! 54: end if;
! 55: end loop;
! 56: end loop;
! 57: for i in ind+1..t.dg'last loop -- leave the lifting !
! 58: cnt := cnt+1;
! 59: ndg(cnt) := t.dg(i);
! 60: end loop;
! 61: res.cf := t.cf;
! 62: res.dg := new Standard_Natural_Vectors.Vector'(ndg(1..cnt));
! 63: return res;
! 64: end Localize;
! 65:
! 66: function Localize ( locmap : Standard_Natural_Matrices.Matrix;
! 67: p : Poly ) return Poly is
! 68:
! 69: -- DESCRIPTION :
! 70: -- Applies the localization map to the polynomial, eliminating
! 71: -- those xij's for which locmap(i,j) is either 0 or 1.
! 72:
! 73: res : Poly := Null_Poly;
! 74:
! 75: procedure Localize_Term ( t : in Term; continue : out boolean ) is
! 76:
! 77: lt : Term := Localize(locmap,t);
! 78:
! 79: begin
! 80: Add(res,lt);
! 81: Clear(lt.dg);
! 82: continue := true;
! 83: end Localize_Term;
! 84: procedure Localize_Terms is new Visiting_Iterator(Localize_Term);
! 85:
! 86: begin
! 87: Localize_Terms(p);
! 88: return res;
! 89: end Localize;
! 90:
! 91: -- TARGET ROUTINES :
! 92:
! 93: function Standard_Coordinate_Frame
! 94: ( x : Standard_Complex_Poly_Matrices.Matrix;
! 95: plane : Standard_Complex_Matrices.Matrix )
! 96: return Standard_Natural_Matrices.Matrix is
! 97:
! 98: res : Standard_Natural_Matrices.Matrix(x'range(1),x'range(2));
! 99: tol : constant double_float := 10.0**(-10);
! 100: first : boolean;
! 101:
! 102: begin
! 103: for j in res'range(2) loop
! 104: first := true;
! 105: for i in res'range(1) loop
! 106: if x(i,j) = Null_Poly
! 107: then res(i,j) := 0;
! 108: elsif (first and (AbsVal(plane(i,j)) > tol))
! 109: then res(i,j) := 1; first := false;
! 110: else res(i,j) := 2;
! 111: end if;
! 112: end loop;
! 113: end loop;
! 114: return res;
! 115: end Standard_Coordinate_Frame;
! 116:
! 117: function Maximal_Coordinate_Frame
! 118: ( x : Standard_Complex_Poly_Matrices.Matrix;
! 119: plane : Standard_Complex_Matrices.Matrix )
! 120: return Standard_Natural_Matrices.Matrix is
! 121:
! 122: res : Standard_Natural_Matrices.Matrix(x'range(1),x'range(2));
! 123: max,tmp : double_float;
! 124: ind : natural;
! 125:
! 126: begin
! 127: for j in res'range(2) loop
! 128: for i in res'range(1) loop
! 129: if x(i,j) = Null_Poly
! 130: then res(i,j) := 0;
! 131: else res(i,j) := 2;
! 132: end if;
! 133: end loop;
! 134: max := 0.0; ind := 0;
! 135: for i in res'range(1) loop
! 136: tmp := AbsVal(plane(i,j));
! 137: if tmp > max
! 138: then max := tmp; ind := i;
! 139: end if;
! 140: end loop;
! 141: res(ind,j) := 1;
! 142: end loop;
! 143: return res;
! 144: end Maximal_Coordinate_Frame;
! 145:
! 146: function Localize ( locmap : Standard_Natural_Matrices.Matrix;
! 147: p : Poly_Sys ) return Poly_Sys is
! 148:
! 149: res : Poly_Sys(p'range);
! 150:
! 151: begin
! 152: for i in p'range loop
! 153: res(i) := Localize(locmap,p(i));
! 154: end loop;
! 155: return res;
! 156: end Localize;
! 157:
! 158: -- CONSTRUCT THE POLYNOMIAL EQUATIONS :
! 159:
! 160: function Polynomial_Equations
! 161: ( l : Standard_Complex_Matrices.Matrix;
! 162: x : Standard_Complex_Poly_Matrices.Matrix ) return Poly_Sys is
! 163:
! 164: n : constant natural := x'length(1);
! 165: p : constant natural := x'length(2);
! 166: kd : constant natural := p + l'length(2);
! 167: bm : Bracket_Monomial := Maximal_Minors(n,kd);
! 168: bs : Bracket_System(0..Number_of_Brackets(bm))
! 169: := Minor_Equations(kd,kd-p,bm);
! 170: res : Poly_Sys(bs'first+1..bs'last) := Expanded_Minors(l,x,bs);
! 171:
! 172: begin
! 173: Clear(bm); Clear(bs);
! 174: return res;
! 175: end Polynomial_Equations;
! 176:
! 177: procedure Concat ( l : in out Link_to_Poly_Sys; p : Poly_Sys ) is
! 178: begin
! 179: if l = null
! 180: then declare
! 181: newsys : Poly_Sys(p'range);
! 182: cnt : natural := p'first-1;
! 183: begin
! 184: for i in p'range loop
! 185: if p(i) /= Null_Poly
! 186: then cnt := cnt+1;
! 187: newsys(cnt) := p(i);
! 188: end if;
! 189: end loop;
! 190: l := new Poly_Sys'(newsys(p'first..cnt));
! 191: end;
! 192: else declare
! 193: newsys : Poly_Sys(l'first..l'last+p'length);
! 194: ind : natural := l'last;
! 195: begin
! 196: newsys(l'range) := l(l'range);
! 197: for i in p'range loop
! 198: if p(i) /= Null_Poly
! 199: then ind := ind+1;
! 200: newsys(ind) := p(i);
! 201: end if;
! 202: end loop;
! 203: l := new Poly_Sys'(newsys(l'first..ind));
! 204: end;
! 205: end if;
! 206: end Concat;
! 207:
! 208: function Polynomial_Equations
! 209: ( l : Standard_Complex_VecMats.VecMat;
! 210: x : Standard_Complex_Poly_Matrices.Matrix ) return Poly_Sys is
! 211:
! 212: n : constant natural := x'length(1);
! 213: p : constant natural := x'length(2);
! 214: kd : constant natural := p + l(l'first)'length(2);
! 215: bm : Bracket_Monomial := Maximal_Minors(n,kd);
! 216: bs : Bracket_System(0..Number_of_Brackets(bm))
! 217: := Minor_Equations(kd,kd-p,bm);
! 218: nb : constant natural := l'length;
! 219: res : Poly_Sys(bs'first+1..nb*bs'last);
! 220: cnt : natural := bs'first;
! 221:
! 222: begin
! 223: for i in 1..nb loop
! 224: declare
! 225: sys : constant Poly_Sys := Expanded_Minors(l(i).all,x,bs);
! 226: begin
! 227: for j in sys'range loop
! 228: cnt := cnt + 1;
! 229: res(cnt) := sys(j);
! 230: end loop;
! 231: end;
! 232: end loop;
! 233: Clear(bm); Clear(bs);
! 234: return res;
! 235: end Polynomial_Equations;
! 236:
! 237: -- EVALUATORS AND DIFFERENTIATORS :
! 238:
! 239: function Eval ( l,x : Standard_Complex_Matrices.Matrix )
! 240: return Complex_Number is
! 241:
! 242: wrk : Standard_Complex_Matrices.Matrix(x'range(1),x'range(1));
! 243:
! 244: begin
! 245: for j in l'range(2) loop
! 246: for i in l'range(1) loop
! 247: wrk(i,j) := l(i,j);
! 248: end loop;
! 249: end loop;
! 250: for j in x'range(2) loop
! 251: for i in x'range(1) loop
! 252: wrk(i,l'last(2)+j) := x(i,j);
! 253: end loop;
! 254: end loop;
! 255: return Determinant(wrk);
! 256: end Eval;
! 257:
! 258: function Eval ( l,x : Standard_Complex_Matrices.Matrix ) return Vector is
! 259:
! 260: n : constant natural := l'length(2) + x'length(2);
! 261: dim : constant natural := Number_of_Maximal_Minors(l'length(1),n);
! 262: res : Standard_Complex_Vectors.Vector(1..dim);
! 263: -- := (1..dim => Create(0.0));
! 264: cnt : natural := 0;
! 265: rws : Standard_Natural_Vectors.Vector(1..n);
! 266: wrk : Standard_Complex_Matrices.Matrix(1..n,1..n);
! 267:
! 268: procedure Choose_next_Row ( k,start : in natural ) is
! 269:
! 270: -- DESCRIPTION :
! 271: -- Chooses next k-th row within the range start..l'last(1), if k <= n.
! 272: -- If k > n, then the minor defined by the current row selection
! 273: -- is computed and added to the result.
! 274:
! 275: begin
! 276: if k > n
! 277: then for j in l'range(2) loop -- select rows
! 278: for i in 1..n loop
! 279: wrk(i,j) := l(rws(i),j);
! 280: end loop;
! 281: end loop;
! 282: for j in x'range(2) loop
! 283: for i in 1..n loop
! 284: wrk(i,l'last(2)+j) := x(rws(i),j);
! 285: end loop;
! 286: end loop;
! 287: cnt := cnt + 1;
! 288: res(cnt) := Determinant(wrk);
! 289: else for i in start..l'last(1) loop
! 290: rws(k) := i;
! 291: Choose_next_Row(k+1,i+1);
! 292: end loop;
! 293: end if;
! 294: end Choose_next_Row;
! 295:
! 296: begin
! 297: Choose_next_Row(1,1);
! 298: return res;
! 299: end Eval;
! 300:
! 301: function Minor ( l,x : Standard_Complex_Matrices.Matrix; row,col : natural )
! 302: return Complex_Number is
! 303:
! 304: -- DESCRIPTION :
! 305: -- Returns the minor [l|x] with row and column removed and with
! 306: -- the appropriate sign.
! 307:
! 308: wrk : Standard_Complex_Matrices.Matrix
! 309: (x'first(1)..x'last(1)-1,x'first(1)..x'last(1)-1);
! 310: ind : natural;
! 311:
! 312: begin
! 313: for j in l'range(2) loop
! 314: for i in l'range(1) loop
! 315: if i < row
! 316: then wrk(i,j) := l(i,j);
! 317: elsif i > row
! 318: then wrk(i-1,j) := l(i,j);
! 319: end if;
! 320: end loop;
! 321: end loop;
! 322: for j in x'range(2) loop
! 323: if j < col
! 324: then ind := l'last(2) + j;
! 325: elsif j > col
! 326: then ind := l'last(2) + j - 1;
! 327: end if;
! 328: if j /= col
! 329: then for i in x'range(1) loop
! 330: if i < row
! 331: then wrk(i,ind) := x(i,j);
! 332: elsif i > row
! 333: then wrk(i-1,ind) := x(i,j);
! 334: end if;
! 335: end loop;
! 336: end if;
! 337: end loop;
! 338: if (row + l'last(2) + col) mod 2 = 0
! 339: then return Determinant(wrk);
! 340: else return -Determinant(wrk);
! 341: end if;
! 342: end Minor;
! 343:
! 344: function Diff ( l,x : Standard_Complex_Matrices.Matrix; i : natural )
! 345: return Complex_Number is
! 346:
! 347: p : constant natural := x'length(2);
! 348: row,col : natural;
! 349:
! 350: begin
! 351: row := i/p + 1;
! 352: col := i mod p;
! 353: if col = 0
! 354: then col := p;
! 355: row := row - 1;
! 356: end if;
! 357: return Minor(l,x,row,col);
! 358: end Diff;
! 359:
! 360: function Diff ( l,x : Standard_Complex_Matrices.Matrix;
! 361: locmap : Standard_Natural_Matrices.Matrix; i : natural )
! 362: return Complex_Number is
! 363:
! 364: row,col : natural;
! 365: cnt : natural := 0;
! 366:
! 367: begin
! 368: for k1 in locmap'range(1) loop
! 369: for k2 in locmap'range(2) loop
! 370: if locmap(k1,k2) = 2
! 371: then cnt := cnt+1;
! 372: if cnt = i
! 373: then row := k1;
! 374: col := k2;
! 375: end if;
! 376: end if;
! 377: exit when (cnt = i);
! 378: end loop;
! 379: exit when (cnt = i);
! 380: end loop;
! 381: return Minor(l,x,row,col);
! 382: end Diff;
! 383:
! 384: function Eval ( l : Standard_Complex_VecMats.VecMat;
! 385: x : Standard_Complex_Matrices.Matrix )
! 386: return Standard_Complex_Vectors.Vector is
! 387:
! 388: res : Standard_Complex_Vectors.Vector(l'range);
! 389:
! 390: begin
! 391: for i in l'range loop
! 392: res(i) := Eval(l(i).all,x);
! 393: end loop;
! 394: return res;
! 395: end Eval;
! 396:
! 397: function Diff ( l : Standard_Complex_VecMats.VecMat;
! 398: x : Standard_Complex_Matrices.Matrix )
! 399: return Standard_Complex_Matrices.Matrix is
! 400:
! 401: res : Standard_Complex_Matrices.Matrix(l'range,1..x'last(1)*x'last(2));
! 402:
! 403: begin
! 404: for i in res'range(1) loop
! 405: for j in res'range(2) loop
! 406: res(i,j) := Diff(l(i).all,x,j);
! 407: end loop;
! 408: end loop;
! 409: return res;
! 410: end Diff;
! 411:
! 412: function Old_Diff ( l : Standard_Complex_VecMats.VecMat;
! 413: x : Standard_Complex_Matrices.Matrix; nvars : natural;
! 414: locmap : Standard_Natural_Matrices.Matrix )
! 415: return Standard_Complex_Matrices.Matrix is
! 416:
! 417: res : Standard_Complex_Matrices.Matrix(l'range,1..nvars);
! 418:
! 419: begin
! 420: for i in res'range(1) loop
! 421: for j in res'range(2) loop
! 422: res(i,j) := Diff(l(i).all,x,locmap,j);
! 423: end loop;
! 424: end loop;
! 425: return res;
! 426: end Old_Diff;
! 427:
! 428: function Diff ( l : Standard_Complex_VecMats.VecMat;
! 429: x : Standard_Complex_Matrices.Matrix; nvars : natural;
! 430: locmap : Standard_Natural_Matrices.Matrix )
! 431: return Standard_Complex_Matrices.Matrix is
! 432:
! 433: -- NOTE :
! 434: -- This Diff is organized according to the localization map,
! 435: -- to avoid multiple searches.
! 436:
! 437: res : Standard_Complex_Matrices.Matrix(l'range,1..nvars);
! 438: ind : natural := 0;
! 439:
! 440: begin
! 441: for i in locmap'range loop
! 442: for j in locmap'range loop
! 443: if locmap(i,j) = 2
! 444: then ind := ind+1;
! 445: for k in l'range loop
! 446: res(k,ind) := Minor(l(k).all,x,i,j);
! 447: end loop;
! 448: end if;
! 449: end loop;
! 450: end loop;
! 451: return res;
! 452: end Diff;
! 453:
! 454: end Determinantal_Systems;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>