Annotation of OpenXM_contrib/PHC/Ada/Schubert/sagbi_homotopies.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; use Standard_Natural_Vectors;
! 4: with Standard_Complex_Poly_Functions; use Standard_Complex_Poly_Functions;
! 5: with Brackets; use Brackets;
! 6: with Bracket_Monomials; use Bracket_Monomials;
! 7: with Bracket_Polynomials; use Bracket_Polynomials;
! 8: with Straightening_Syzygies; use Straightening_Syzygies;
! 9: with Bracket_Expansions; use Bracket_Expansions;
! 10: with Evaluated_Minors; use Evaluated_Minors;
! 11:
! 12: package body SAGBI_Homotopies is
! 13:
! 14: function Coordinatize_Hexadecimal ( b : Bracket ) return natural is
! 15:
! 16: -- DESCRIPTION :
! 17: -- Returns the hexadecimal expansion of the entries in the bracket.
! 18:
! 19: res : natural := 0;
! 20:
! 21: begin
! 22: for i in b'range loop
! 23: res := res*16 + b(i);
! 24: end loop;
! 25: return res;
! 26: end Coordinatize_Hexadecimal;
! 27:
! 28: function Unsigned ( i : integer ) return natural is
! 29:
! 30: -- DESCRIPTION :
! 31: -- Returns the unsigned integer.
! 32:
! 33: n : natural;
! 34:
! 35: begin
! 36: if i < 0
! 37: then n := -i;
! 38: else n := i;
! 39: end if;
! 40: return n;
! 41: end Unsigned;
! 42:
! 43: function Bracketize_Hexadecimal ( n,d : natural ) return Bracket is
! 44:
! 45: -- DESCRIPTION :
! 46: -- Returns the d-bracket from the hexadecimal expansion n.
! 47:
! 48: res : Bracket(1..d);
! 49: nn : natural := n;
! 50:
! 51: begin
! 52: for i in reverse 1..d loop
! 53: res(i) := nn mod 16;
! 54: nn := nn/16;
! 55: end loop;
! 56: return res;
! 57: end Bracketize_Hexadecimal;
! 58:
! 59: function Coordinatize ( p : Bracket_Polynomial ) return Bracket_Polynomial is
! 60:
! 61: -- DESCRIPTION :
! 62: -- Replaces the first bracket in every monomial by the decimal expansion.
! 63:
! 64: res : Bracket_Polynomial;
! 65:
! 66: procedure Coordinatize_Term ( t : in Bracket_Term; cont1 : out boolean ) is
! 67:
! 68: first,second : boolean;
! 69: bm : Bracket_Monomial;
! 70: bt : Bracket_Term;
! 71:
! 72: procedure Coordinatize_Bracket ( b : in Bracket; cont2 : out boolean ) is
! 73: begin
! 74: if first
! 75: then bt.coeff := Create(double_float(Coordinatize_Hexadecimal(b)));
! 76: first := false;
! 77: second := true;
! 78: elsif second
! 79: then bm := Create(b);
! 80: else Multiply(bm,b);
! 81: end if;
! 82: cont2 := true;
! 83: end Coordinatize_Bracket;
! 84: procedure Coordinatize_Brackets is
! 85: new Enumerate_Brackets(Coordinatize_Bracket);
! 86:
! 87: begin
! 88: first := true; second := false;
! 89: Coordinatize_Brackets(t.monom);
! 90: bt.monom := bm;
! 91: if REAL_PART(t.coeff) < 0.0
! 92: then Min(res,bt);
! 93: else Add(res,bt);
! 94: end if;
! 95: cont1 := true;
! 96: end Coordinatize_Term;
! 97: procedure Coordinatize_Terms is new Enumerate_Terms(Coordinatize_Term);
! 98:
! 99: begin
! 100: Coordinatize_Terms(p);
! 101: return res;
! 102: end Coordinatize;
! 103:
! 104: procedure Divide ( p : in out Poly; w : in natural ) is
! 105:
! 106: -- DESCRIPTION :
! 107: -- Divides the polynomial by t^w.
! 108:
! 109: procedure Divide_Term ( t : in out Term; continue : out boolean ) is
! 110: begin
! 111: t.dg(t.dg'last) := t.dg(t.dg'last) - w;
! 112: continue := true;
! 113: end Divide_Term;
! 114: procedure Divide_Terms is new Changing_Iterator(Divide_Term);
! 115:
! 116: begin
! 117: Divide_Terms(p);
! 118: end Divide;
! 119:
! 120: function Weight ( e : Standard_Natural_Vectors.Vector; n,d : natural )
! 121: return natural is
! 122:
! 123: -- DESCRIPTION :
! 124: -- Returns the weight of the exponent vector for the localization that
! 125: -- takes the d-by-d identitity matrix in the lower-right of the d-plane.
! 126: -- The lifting recipe is xij*t^((i-1)*(d-j)).
! 127:
! 128: res : natural := 0;
! 129: jmp,ind : natural;
! 130:
! 131: begin
! 132: for j in 1..d loop
! 133: jmp := d-j;
! 134: for i in 1..n-d loop
! 135: ind := (i-1)*d + j;
! 136: if e(ind) > 0
! 137: then res := res + (i-1)*jmp;
! 138: end if;
! 139: end loop;
! 140: end loop;
! 141: return res;
! 142: end Weight;
! 143:
! 144: function Weight ( locmap : Standard_Natural_Matrices.Matrix;
! 145: e : Standard_Natural_Vectors.Vector ) return natural is
! 146:
! 147: -- DESCRIPTION :
! 148: -- Returns the weight of the exponent vector as xij*t^((i-1)*(d-j))
! 149: -- for the localization pattern in locmap.
! 150:
! 151: res : natural := 0;
! 152: d : constant natural := locmap'length(2);
! 153: jmp,ind : natural;
! 154:
! 155: begin
! 156: ind := 0;
! 157: for i in locmap'range(1) loop
! 158: for j in locmap'range(2) loop
! 159: jmp := d-j;
! 160: if locmap(i,j) = 2
! 161: then ind := ind+1;
! 162: if e(ind) > 0
! 163: then res := res + (i-1)*jmp;
! 164: end if;
! 165: end if;
! 166: end loop;
! 167: end loop;
! 168: return res;
! 169: end Weight;
! 170:
! 171: function Lift ( p : Poly; n,d : natural ) return Poly is
! 172:
! 173: -- DESCRIPTION :
! 174: -- Returns the lifted polynomial, where the xij is lifted according
! 175: -- to xij*t^((i-1)*(d-j)). The lowest powers of t are divided out.
! 176: -- The d-by-d identity matrix is the lower-right of the d-plane.
! 177:
! 178: res : Poly := Null_Poly;
! 179: first : boolean := true;
! 180: minwei : natural;
! 181:
! 182: procedure Lift_Term ( t : in Term; continue : out boolean ) is
! 183:
! 184: tt : Term;
! 185: wei : natural;
! 186:
! 187: begin
! 188: tt.cf := t.cf;
! 189: tt.dg := new Standard_Natural_Vectors.Vector(1..t.dg'last+1);
! 190: tt.dg(t.dg'range) := t.dg.all;
! 191: wei := Weight(t.dg.all,n,d);
! 192: tt.dg(tt.dg'last) := wei;
! 193: Add(res,tt);
! 194: Clear(tt.dg);
! 195: if first
! 196: then minwei := wei;
! 197: first := false;
! 198: elsif wei < minwei
! 199: then minwei := wei;
! 200: end if;
! 201: continue := true;
! 202: end Lift_Term;
! 203: procedure Lift_Terms is new Visiting_Iterator(Lift_Term);
! 204:
! 205: begin
! 206: Lift_Terms(p);
! 207: if minwei /= 0
! 208: then Divide(res,minwei);
! 209: end if;
! 210: return res;
! 211: end Lift;
! 212:
! 213: function Lift ( locmap : Standard_Natural_Matrices.Matrix; p : Poly )
! 214: return Poly is
! 215:
! 216: -- DESCRIPTION :
! 217: -- Lifts p as to xij*t^((i-1)*(d-j)) and divides by the lowest powers
! 218: -- of t, respecting the localization pattern in locmap.
! 219:
! 220: res : Poly := Null_Poly;
! 221: first : boolean := true;
! 222: minwei : natural;
! 223:
! 224: procedure Lift_Term ( t : in Term; continue : out boolean ) is
! 225:
! 226: tt : Term;
! 227: wei : natural;
! 228:
! 229: begin
! 230: tt.cf := t.cf;
! 231: tt.dg := new Standard_Natural_Vectors.Vector(1..t.dg'last+1);
! 232: tt.dg(t.dg'range) := t.dg.all;
! 233: wei := Weight(locmap,t.dg.all);
! 234: tt.dg(tt.dg'last) := wei;
! 235: Add(res,tt);
! 236: Clear(tt.dg);
! 237: if first
! 238: then minwei := wei;
! 239: first := false;
! 240: elsif wei < minwei
! 241: then minwei := wei;
! 242: end if;
! 243: continue := true;
! 244: end Lift_Term;
! 245: procedure Lift_Terms is new Visiting_Iterator(Lift_Term);
! 246:
! 247: begin
! 248: Lift_Terms(p);
! 249: if minwei /= 0
! 250: then Divide(res,minwei);
! 251: end if;
! 252: return res;
! 253: end Lift;
! 254:
! 255: -- TARGET ROUTINES :
! 256:
! 257: function Lifted_Localized_Laplace_Expansion ( n,d : natural ) return Poly is
! 258:
! 259: res : Poly := Null_Poly;
! 260: p : Bracket_Polynomial := Laplace_Expansion(n,n-d);
! 261:
! 262: procedure Visit_Term ( t : in Bracket_Term; continue : out boolean ) is
! 263:
! 264: first : boolean := true;
! 265: cf : integer;
! 266:
! 267: procedure Visit_Bracket ( b : in Bracket; cont : out boolean ) is
! 268:
! 269: pb,lp : Poly;
! 270:
! 271: begin
! 272: if first
! 273: then cf := Coordinatize_Hexadecimal(b);
! 274: first := false;
! 275: else pb := Localized_Expand(n,d,b);
! 276: lp := Lift(pb,n,d); Clear(pb);
! 277: Mul(lp,Create(double_float(cf)));
! 278: Add(res,lp);
! 279: Clear(lp);
! 280: end if;
! 281: cont := true;
! 282: end Visit_Bracket;
! 283: procedure Visit_Brackets is new Enumerate_Brackets(Visit_Bracket);
! 284:
! 285: begin
! 286: Visit_Brackets(t.monom);
! 287: continue := true;
! 288: end Visit_Term;
! 289: procedure Visit_Terms is new Enumerate_Terms(Visit_Term);
! 290:
! 291: begin
! 292: Visit_Terms(p);
! 293: return res;
! 294: end Lifted_Localized_Laplace_Expansion;
! 295:
! 296: function Lifted_Localized_Laplace_Expansion
! 297: ( locmap : Standard_Natural_Matrices.Matrix ) return Poly is
! 298:
! 299: res : Poly := Null_Poly;
! 300: n : constant natural := locmap'length(1);
! 301: d : constant natural := locmap'length(2);
! 302: p : Bracket_Polynomial := Laplace_Expansion(n,n-d);
! 303:
! 304: procedure Visit_Term ( t : in Bracket_Term; continue : out boolean ) is
! 305:
! 306: first : boolean := true;
! 307: cf : integer;
! 308:
! 309: procedure Visit_Bracket ( b : in Bracket; cont : out boolean ) is
! 310:
! 311: pb,lp : Poly;
! 312:
! 313: begin
! 314: if first
! 315: then cf := Coordinatize_Hexadecimal(b);
! 316: first := false;
! 317: else pb := Expand(locmap,b);
! 318: Reduce_Variables(locmap,pb);
! 319: lp := Lift(locmap,pb); Clear(pb);
! 320: Mul(lp,Create(double_float(cf)));
! 321: Add(res,lp);
! 322: Clear(lp);
! 323: end if;
! 324: cont := true;
! 325: end Visit_Bracket;
! 326: procedure Visit_Brackets is new Enumerate_Brackets(Visit_Bracket);
! 327:
! 328: begin
! 329: Visit_Brackets(t.monom);
! 330: continue := true;
! 331: end Visit_Term;
! 332: procedure Visit_Terms is new Enumerate_Terms(Visit_Term);
! 333:
! 334: begin
! 335: Visit_Terms(p);
! 336: return res;
! 337: end Lifted_Localized_Laplace_Expansion;
! 338:
! 339: function Intersection_Coefficients
! 340: ( m : Standard_Floating_Matrices.Matrix;
! 341: c : Standard_Complex_Vectors.Vector )
! 342: return Standard_Complex_Vectors.Vector is
! 343:
! 344: res : Standard_Complex_Vectors.Vector(c'range);
! 345: nmd : constant natural := m'last(2);
! 346: ind : integer;
! 347: b : Bracket(1..nmd);
! 348:
! 349: begin
! 350: for i in c'range loop
! 351: ind := integer(REAL_PART(c(i)));
! 352: b := Bracketize_Hexadecimal(Unsigned(ind),nmd);
! 353: if ind > 0
! 354: then res(i) := Create(Determinant(m,b));
! 355: else res(i) := Create(-Determinant(m,b));
! 356: end if;
! 357: end loop;
! 358: return res;
! 359: end Intersection_Coefficients;
! 360:
! 361: function Intersection_Coefficients
! 362: ( m : Standard_Complex_Matrices.Matrix;
! 363: c : Standard_Complex_Vectors.Vector )
! 364: return Standard_Complex_Vectors.Vector is
! 365:
! 366: res : Standard_Complex_Vectors.Vector(c'range);
! 367: nmd : constant natural := m'last(2);
! 368: ind : integer;
! 369: b : Bracket(1..nmd);
! 370:
! 371: begin
! 372: for i in c'range loop
! 373: ind := integer(REAL_PART(c(i)));
! 374: b := Bracketize_Hexadecimal(Unsigned(ind),nmd);
! 375: if ind > 0
! 376: then res(i) := Determinant(m,b);
! 377: else res(i) := -Determinant(m,b);
! 378: end if;
! 379: end loop;
! 380: return res;
! 381: end Intersection_Coefficients;
! 382:
! 383: function Intersection_Condition
! 384: ( m : Standard_Floating_Matrices.Matrix; p : Poly ) return Poly is
! 385:
! 386: res : Poly := Null_Poly;
! 387: nmd : constant natural := m'last(2);
! 388:
! 389: procedure Visit_Term ( t : in Term; continue : out boolean ) is
! 390:
! 391: c : integer := integer(REAL_PART(t.cf));
! 392: b : Bracket(1..nmd) := Bracketize_Hexadecimal(Unsigned(c),nmd);
! 393: det : double_float := Determinant(m,b);
! 394: rt : Term;
! 395:
! 396: begin
! 397: if c > 0
! 398: then rt.cf := Create(det);
! 399: else rt.cf := Create(-det);
! 400: end if;
! 401: rt.dg := t.dg;
! 402: Add(res,rt);
! 403: continue := true;
! 404: end Visit_Term;
! 405: procedure Visit_Terms is new Visiting_Iterator(Visit_Term);
! 406:
! 407: begin
! 408: Visit_Terms(p);
! 409: return res;
! 410: end Intersection_Condition;
! 411:
! 412: function Intersection_Condition
! 413: ( m : Standard_Complex_Matrices.Matrix; p : Poly ) return Poly is
! 414:
! 415: res : Poly := Null_Poly;
! 416: nmd : constant natural := m'last(2);
! 417:
! 418: procedure Visit_Term ( t : in Term; continue : out boolean ) is
! 419:
! 420: c : integer := integer(REAL_PART(t.cf));
! 421: b : Bracket(1..nmd) := Bracketize_Hexadecimal(Unsigned(c),nmd);
! 422: det : Complex_Number := Determinant(m,b);
! 423: rt : Term;
! 424:
! 425: begin
! 426: if c > 0
! 427: then rt.cf := det;
! 428: else rt.cf := -det;
! 429: end if;
! 430: rt.dg := t.dg;
! 431: Add(res,rt);
! 432: continue := true;
! 433: end Visit_Term;
! 434: procedure Visit_Terms is new Visiting_Iterator(Visit_Term);
! 435:
! 436: begin
! 437: Visit_Terms(p);
! 438: return res;
! 439: end Intersection_Condition;
! 440:
! 441: end SAGBI_Homotopies;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>