Annotation of OpenXM_contrib/PHC/Ada/Schubert/numeric_minor_equations.adb, Revision 1.1
1.1 ! maekawa 1: with Standard_Floating_Numbers; use Standard_Floating_Numbers;
! 2: with Standard_Natural_Vectors;
! 3: with Standard_Complex_Poly_Functions; use Standard_Complex_Poly_Functions;
! 4: with Standard_Complex_Poly_SysFun; use Standard_Complex_Poly_SysFun;
! 5: with Brackets; use Brackets;
! 6: with Plane_Representations; use Plane_Representations;
! 7: with Evaluated_Minors; use Evaluated_Minors;
! 8: with Symbolic_Minor_Equations; use Symbolic_Minor_Equations;
! 9:
! 10: package body Numeric_Minor_Equations is
! 11:
! 12: tol : constant double_float := 10.0**(-10);
! 13:
! 14: -- EXPANDING ACCORDING A BRACKET MONOMIAL :
! 15:
! 16: function Expanded_Minors
! 17: ( cffmat : Standard_Floating_Matrices.Matrix;
! 18: polmat : Standard_Complex_Poly_Matrices.Matrix;
! 19: bm : Bracket_Monomial ) return Poly is
! 20:
! 21: res : Poly := Null_Poly;
! 22: first : boolean := true;
! 23:
! 24: procedure Visit_Bracket ( b : in Bracket; continue : out boolean ) is
! 25:
! 26: factor : double_float;
! 27: minor : Poly;
! 28:
! 29: begin
! 30: if first
! 31: then declare
! 32: bb : Bracket(b'first..b'last-1) := b(b'first+1..b'last);
! 33: begin
! 34: factor := Determinant(cffmat,bb);
! 35: end;
! 36: first := false;
! 37: else minor := Expanded_Minor(polmat,b);
! 38: if (minor /= Null_Poly) and (abs(factor) > tol)
! 39: then Mul(minor,Create(factor));
! 40: Add(res,minor);
! 41: end if;
! 42: Clear(minor);
! 43: end if;
! 44: continue := true;
! 45: end Visit_Bracket;
! 46: procedure Visit_Brackets is new Enumerate_Brackets(Visit_Bracket);
! 47:
! 48: begin
! 49: Visit_Brackets(bm);
! 50: return res;
! 51: end Expanded_Minors;
! 52:
! 53: function Expanded_Minors
! 54: ( cffmat : Standard_Complex_Matrices.Matrix;
! 55: polmat : Standard_Complex_Poly_Matrices.Matrix;
! 56: bm : Bracket_Monomial ) return Poly is
! 57:
! 58: res : Poly := Null_Poly;
! 59: first : boolean := true;
! 60: factor : Complex_Number;
! 61:
! 62: procedure Visit_Bracket ( b : in Bracket; continue : out boolean ) is
! 63:
! 64: minor : Poly;
! 65:
! 66: begin
! 67: if first
! 68: then declare
! 69: bb : Bracket(b'first..b'last-1) := b(b'first+1..b'last);
! 70: begin
! 71: factor := Determinant(cffmat,bb);
! 72: end;
! 73: first := false;
! 74: else minor := Expanded_Minor(polmat,b);
! 75: if (minor /= Null_Poly) and (AbsVal(factor) > tol)
! 76: then Mul(minor,factor);
! 77: Add(res,minor);
! 78: end if;
! 79: Clear(minor);
! 80: end if;
! 81: continue := true;
! 82: end Visit_Bracket;
! 83: procedure Visit_Brackets is new Enumerate_Brackets(Visit_Bracket);
! 84:
! 85: begin
! 86: Visit_Brackets(bm);
! 87: return res;
! 88: end Expanded_Minors;
! 89:
! 90: function Expanded_Minors
! 91: ( cntmat,polmat : Standard_Complex_Poly_Matrices.Matrix;
! 92: bm : Bracket_Monomial ) return Poly is
! 93:
! 94: res : Poly := Null_Poly;
! 95: first : boolean := true;
! 96: factor : Poly;
! 97:
! 98: procedure Visit_Bracket ( b : in Bracket; continue : out boolean ) is
! 99:
! 100: minor : Poly;
! 101:
! 102: begin
! 103: if first
! 104: then declare
! 105: bb : Bracket(b'first..b'last-1) := b(b'first+1..b'last);
! 106: begin
! 107: factor := Expanded_Minor(cntmat,bb);
! 108: end;
! 109: first := false;
! 110: else minor := Expanded_Minor(polmat,b);
! 111: if (minor /= Null_Poly) and (factor /= Null_Poly)
! 112: then Mul(minor,factor);
! 113: Add(res,minor);
! 114: end if;
! 115: Clear(factor); Clear(minor);
! 116: end if;
! 117: continue := true;
! 118: end Visit_Bracket;
! 119: procedure Visit_Brackets is new Enumerate_Brackets(Visit_Bracket);
! 120:
! 121: begin
! 122: Visit_Brackets(bm);
! 123: return res;
! 124: end Expanded_Minors;
! 125:
! 126: function Lifted_Expanded_Minors
! 127: ( cntmat,polmat : Standard_Complex_Poly_Matrices.Matrix;
! 128: bm : Bracket_Monomial ) return Poly is
! 129:
! 130: res : Poly := Null_Poly;
! 131: first : boolean := true;
! 132: factor : Poly;
! 133:
! 134: procedure Visit_Bracket ( b : in Bracket; continue : out boolean ) is
! 135:
! 136: minor,extmin : Poly;
! 137:
! 138: begin
! 139: if first
! 140: then declare
! 141: bb : Bracket(b'first..b'last-1) := b(b'first+1..b'last);
! 142: begin
! 143: factor := Expanded_Minor(cntmat,bb);
! 144: end;
! 145: first := false;
! 146: else minor := Expanded_Minor(polmat,b);
! 147: if (minor /= Null_Poly) and (factor /= Null_Poly)
! 148: then extmin := Extend_Zero_Lifting(minor);
! 149: Mul(extmin,factor);
! 150: Add(res,extmin);
! 151: end if;
! 152: Clear(factor); Clear(minor); Clear(extmin);
! 153: end if;
! 154: continue := true;
! 155: end Visit_Bracket;
! 156: procedure Visit_Brackets is new Enumerate_Brackets(Visit_Bracket);
! 157:
! 158: begin
! 159: Visit_Brackets(bm);
! 160: return res;
! 161: end Lifted_Expanded_Minors;
! 162:
! 163: -- EXPANDING ACCORDING A BRACKET POLYNOMIAL :
! 164:
! 165: function Expanded_Minors
! 166: ( cffmat : Standard_Floating_Matrices.Matrix;
! 167: polmat : Standard_Complex_Poly_Matrices.Matrix;
! 168: bp : Bracket_Polynomial ) return Poly is
! 169:
! 170: res : Poly := Null_Poly;
! 171:
! 172: procedure Visit_Term ( t : in Bracket_Term; continue : out boolean ) is
! 173:
! 174: minor : Poly := Expanded_Minors(cffmat,polmat,t.monom);
! 175:
! 176: begin
! 177: if REAL_PART(t.coeff) > 0.0
! 178: then Add(res,minor);
! 179: else Sub(res,minor);
! 180: end if;
! 181: Clear(minor);
! 182: continue := true;
! 183: end Visit_Term;
! 184: procedure Visit_Terms is new Enumerate_Terms(Visit_Term);
! 185:
! 186: begin
! 187: Visit_Terms(bp);
! 188: return res;
! 189: end Expanded_Minors;
! 190:
! 191: function Expanded_Minors
! 192: ( cffmat : Standard_Complex_Matrices.Matrix;
! 193: polmat : Standard_Complex_Poly_Matrices.Matrix;
! 194: bp : Bracket_Polynomial ) return Poly is
! 195:
! 196: res : Poly := Null_Poly;
! 197:
! 198: procedure Visit_Term ( t : in Bracket_Term; continue : out boolean ) is
! 199:
! 200: minor : Poly := Expanded_Minors(cffmat,polmat,t.monom);
! 201:
! 202: begin
! 203: if REAL_PART(t.coeff) > 0.0
! 204: then Add(res,minor);
! 205: else Sub(res,minor);
! 206: end if;
! 207: Clear(minor);
! 208: continue := true;
! 209: end Visit_Term;
! 210: procedure Visit_Terms is new Enumerate_Terms(Visit_Term);
! 211:
! 212: begin
! 213: Visit_Terms(bp);
! 214: return res;
! 215: end Expanded_Minors;
! 216:
! 217: function Expanded_Minors
! 218: ( cntmat,polmat : Standard_Complex_Poly_Matrices.Matrix;
! 219: bp : Bracket_Polynomial ) return Poly is
! 220:
! 221: res : Poly := Null_Poly;
! 222:
! 223: procedure Visit_Term ( t : in Bracket_Term; continue : out boolean ) is
! 224:
! 225: minor : Poly := Expanded_Minors(cntmat,polmat,t.monom);
! 226:
! 227: begin
! 228: if REAL_PART(t.coeff) > 0.0
! 229: then Add(res,minor);
! 230: else Sub(res,minor);
! 231: end if;
! 232: Clear(minor);
! 233: continue := true;
! 234: end Visit_Term;
! 235: procedure Visit_Terms is new Enumerate_Terms(Visit_Term);
! 236:
! 237: begin
! 238: Visit_Terms(bp);
! 239: return res;
! 240: end Expanded_Minors;
! 241:
! 242: function Lifted_Expanded_Minors
! 243: ( cntmat,polmat : Standard_Complex_Poly_Matrices.Matrix;
! 244: bp : Bracket_Polynomial ) return Poly is
! 245:
! 246: res : Poly := Null_Poly;
! 247:
! 248: procedure Visit_Term ( t : in Bracket_Term; continue : out boolean ) is
! 249:
! 250: minor : Poly := Lifted_Expanded_Minors(cntmat,polmat,t.monom);
! 251:
! 252: begin
! 253: if REAL_PART(t.coeff) > 0.0
! 254: then Add(res,minor);
! 255: else Sub(res,minor);
! 256: end if;
! 257: Clear(minor);
! 258: continue := true;
! 259: end Visit_Term;
! 260: procedure Visit_Terms is new Enumerate_Terms(Visit_Term);
! 261:
! 262: begin
! 263: Visit_Terms(bp);
! 264: return res;
! 265: end Lifted_Expanded_Minors;
! 266:
! 267: -- EXPANDING TO CONSTRUCT POLYNOMIAL SYSTEMS :
! 268:
! 269: function Expanded_Minors
! 270: ( cffmat : Standard_Floating_Matrices.Matrix;
! 271: polmat : Standard_Complex_Poly_Matrices.Matrix;
! 272: bs : Bracket_System ) return Poly_Sys is
! 273:
! 274: res : Poly_Sys(bs'first+1..bs'last);
! 275:
! 276: begin
! 277: for i in res'range loop
! 278: res(i) := Expanded_Minors(cffmat,polmat,bs(i));
! 279: end loop;
! 280: return res;
! 281: end Expanded_Minors;
! 282:
! 283: function Expanded_Minors
! 284: ( cffmat : Standard_Complex_Matrices.Matrix;
! 285: polmat : Standard_Complex_Poly_Matrices.Matrix;
! 286: bs : Bracket_System ) return Poly_Sys is
! 287:
! 288: res : Poly_Sys(bs'first+1..bs'last);
! 289:
! 290: begin
! 291: for i in res'range loop
! 292: res(i) := Expanded_Minors(cffmat,polmat,bs(i));
! 293: end loop;
! 294: return res;
! 295: end Expanded_Minors;
! 296:
! 297: function Expanded_Minors
! 298: ( cntmat,polmat : Standard_Complex_Poly_Matrices.Matrix;
! 299: bs : Bracket_System ) return Poly_Sys is
! 300:
! 301: res : Poly_Sys(bs'first+1..bs'last);
! 302:
! 303: begin
! 304: for i in res'range loop
! 305: res(i) := Expanded_Minors(cntmat,polmat,bs(i));
! 306: end loop;
! 307: return res;
! 308: end Expanded_Minors;
! 309:
! 310: function Lifted_Expanded_Minors
! 311: ( cntmat,polmat : Standard_Complex_Poly_Matrices.Matrix;
! 312: bs : Bracket_System ) return Poly_Sys is
! 313:
! 314: res : Poly_Sys(bs'first+1..bs'last);
! 315:
! 316: begin
! 317: for i in res'range loop
! 318: res(i) := Lifted_Expanded_Minors(cntmat,polmat,bs(i));
! 319: end loop;
! 320: return res;
! 321: end Lifted_Expanded_Minors;
! 322:
! 323: function Evaluate ( p : Poly; x : Standard_Complex_Matrices.Matrix )
! 324: return Complex_Number is
! 325:
! 326: xv : constant Standard_Complex_Vectors.Vector := Vector_Rep(x);
! 327:
! 328: begin
! 329: return Eval(p,xv);
! 330: end Evaluate;
! 331:
! 332: function Evaluate ( p : Poly_Sys; x : Standard_Complex_Matrices.Matrix )
! 333: return Standard_Complex_Vectors.Vector is
! 334:
! 335: xv : constant Standard_Complex_Vectors.Vector := Vector_Rep(x);
! 336:
! 337: begin
! 338: return Eval(p,xv);
! 339: end Evaluate;
! 340:
! 341: procedure Embed ( t : in out Term ) is
! 342:
! 343: dg : Degrees
! 344: := new Standard_Natural_Vectors.Vector(t.dg'first..t.dg'last+1);
! 345:
! 346: begin
! 347: dg(t.dg'range) := t.dg.all;
! 348: dg(dg'last) := 0;
! 349: Clear(t.dg);
! 350: t.dg := dg;
! 351: end Embed;
! 352:
! 353: function Embed ( t : Term ) return Term is
! 354:
! 355: res : Term;
! 356:
! 357: begin
! 358: res.dg := new Standard_Natural_Vectors.Vector(t.dg'first..t.dg'last+1);
! 359: res.dg(t.dg'range) := t.dg.all;
! 360: res.dg(res.dg'last) := 0;
! 361: res.cf := t.cf;
! 362: return res;
! 363: end Embed;
! 364:
! 365: procedure Embed ( p : in out Poly ) is
! 366:
! 367: res : Poly := Null_Poly;
! 368:
! 369: procedure Embed_Term ( t : in Term; continue : out boolean ) is
! 370:
! 371: et : Term := Embed(t);
! 372:
! 373: begin
! 374: Add(res,et);
! 375: Clear(et);
! 376: continue := true;
! 377: end Embed_Term;
! 378: procedure Embed_Terms is new Visiting_Iterator(Embed_Term);
! 379:
! 380: begin
! 381: Embed_Terms(p);
! 382: Clear(p);
! 383: p := res;
! 384: end Embed;
! 385:
! 386: procedure Embed ( p : in out Poly_Sys ) is
! 387: begin
! 388: for i in p'range loop
! 389: Embed(p(i));
! 390: end loop;
! 391: end Embed;
! 392:
! 393: procedure Embed ( m : in out Standard_Complex_Poly_Matrices.Matrix ) is
! 394: begin
! 395: for i in m'range(1) loop
! 396: for j in m'range(2) loop
! 397: if m(i,j) /= Null_Poly
! 398: then Embed(m(i,j));
! 399: end if;
! 400: end loop;
! 401: end loop;
! 402: end Embed;
! 403:
! 404: function Linear_Homotopy ( target,start : Poly ) return Poly is
! 405:
! 406: res : Poly := Null_Poly;
! 407:
! 408: procedure Embed_Target_Term ( t : in Term; continue : out boolean ) is
! 409:
! 410: et : Term := Embed(t);
! 411:
! 412: begin
! 413: et.dg(et.dg'last) := 1;
! 414: Add(res,et);
! 415: Clear(et);
! 416: continue := true;
! 417: end Embed_Target_Term;
! 418: procedure Embed_Target_Terms is new Visiting_Iterator(Embed_Target_Term);
! 419:
! 420: procedure Embed_Start_Term ( t : in Term; continue : out boolean ) is
! 421:
! 422: et : Term := Embed(t);
! 423:
! 424: begin
! 425: Add(res,et);
! 426: et.dg(et.dg'last) := 1;
! 427: Sub(res,et);
! 428: Clear(et);
! 429: continue := true;
! 430: end Embed_Start_Term;
! 431: procedure Embed_Start_Terms is new Visiting_Iterator(Embed_Start_Term);
! 432:
! 433: begin
! 434: Embed_Target_Terms(target);
! 435: Embed_Start_Terms(start);
! 436: return res;
! 437: end Linear_Homotopy;
! 438:
! 439: function Linear_Interpolation
! 440: ( target,start : Poly; k : natural ) return Poly is
! 441:
! 442: res : Poly := Null_Poly;
! 443:
! 444: procedure Embed_Target_Term ( t : in Term; continue : out boolean ) is
! 445:
! 446: et : Term;
! 447:
! 448: begin
! 449: Copy(t,et);
! 450: et.dg(k) := et.dg(k) + 1; -- multiply with t
! 451: Add(res,et);
! 452: Clear(et);
! 453: continue := true;
! 454: end Embed_Target_Term;
! 455: procedure Embed_Target_Terms is new Visiting_Iterator(Embed_Target_Term);
! 456:
! 457: procedure Embed_Start_Term ( t : in Term; continue : out boolean ) is
! 458:
! 459: et : Term;
! 460:
! 461: begin
! 462: Copy(t,et);
! 463: Add(res,et); -- res := res + et
! 464: et.dg(k) := et.dg(k) + 1; -- multiply with t
! 465: Sub(res,et); -- res := res + et - t*et
! 466: Clear(et);
! 467: continue := true;
! 468: end Embed_Start_Term;
! 469: procedure Embed_Start_Terms is new Visiting_Iterator(Embed_Start_Term);
! 470:
! 471: begin
! 472: Embed_Target_Terms(target);
! 473: Embed_Start_Terms(start);
! 474: return res;
! 475: end Linear_Interpolation;
! 476:
! 477: procedure Divide_Common_Factor ( p : in out Poly; k : in natural ) is
! 478:
! 479: first : boolean := true;
! 480: min : natural;
! 481:
! 482: procedure Min_Power ( t : in Term; continue : out boolean ) is
! 483: begin
! 484: if first
! 485: then first := false;
! 486: min := t.dg(k); -- initialize minimal power
! 487: else if t.dg(k) < min
! 488: then min := t.dg(k);
! 489: end if;
! 490: end if;
! 491: continue := true;
! 492: end Min_Power;
! 493: procedure Find_Min_Power is new Visiting_Iterator(Min_Power);
! 494:
! 495: procedure Divide ( t : in out Term; continue : out boolean ) is
! 496: begin
! 497: t.dg(k) := t.dg(k) - min;
! 498: continue := true;
! 499: end Divide;
! 500: procedure Divide_Min_Power is new Changing_Iterator(Divide);
! 501:
! 502: begin
! 503: Find_Min_Power(p);
! 504: if min > 0
! 505: then Divide_Min_Power(p);
! 506: end if;
! 507: end Divide_Common_Factor;
! 508:
! 509: end Numeric_Minor_Equations;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>