Annotation of OpenXM_contrib/PHC/Ada/Schubert/numeric_minor_equations.adb, Revision 1.1.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>