Annotation of OpenXM_contrib/PHC/Ada/Homotopy/homogenization.adb, Revision 1.1.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_Random_Numbers; use Standard_Random_Numbers;
4: with Standard_Natural_Vectors; use Standard_Natural_Vectors;
5:
6: package body Homogenization is
7:
8: function Homogeneous_Part ( p : Poly ) return Poly is
9:
10: res : Poly := Null_Poly;
11: d : integer := Degree(p);
12:
13: procedure Homogeneous_Term ( t : in Term; continue : out boolean ) is
14: begin
15: if Sum(t.dg) = d
16: then Add(res,t);
17: continue := true;
18: else continue := false;
19: end if;
20: end Homogeneous_Term;
21: procedure Homogeneous_Terms is new Visiting_Iterator(Homogeneous_Term);
22:
23: begin
24: Homogeneous_Terms(p);
25: return res;
26: end Homogeneous_Part;
27:
28: function Homogeneous_Part ( p : Poly_Sys ) return Poly_Sys is
29:
30: res : Poly_Sys(p'range);
31:
32: begin
33: for i in p'range loop
34: res(i) := Homogeneous_Part(p(i));
35: end loop;
36: return res;
37: end Homogeneous_Part;
38:
39: function Real_Random_Hyperplane ( n : natural ) return Poly is
40:
41: res : Poly;
42: t : Term;
43:
44: begin
45: t.dg := new Standard_Natural_Vectors.Vector'(1..n => 0);
46: t.cf := Create(Random);
47: res := Create(t);
48: Standard_Natural_Vectors.Clear
49: (Standard_Natural_Vectors.Link_to_Vector(t.dg));
50: for i in 1..n loop
51: t.dg := new Standard_Natural_Vectors.Vector'(1..n => 0);
52: t.dg(i) := 1;
53: t.cf := Create(Random);
54: Add(res,t);
55: Standard_Natural_Vectors.Clear
56: (Standard_Natural_Vectors.Link_to_Vector(t.dg));
57: end loop;
58: return res;
59: end Real_Random_Hyperplane;
60:
61: function Complex_Random_Hyperplane ( n : natural ) return Poly is
62:
63: res : Poly;
64: t : Term;
65:
66: begin
67: t.dg := new Standard_Natural_Vectors.Vector'(1..n => 0);
68: t.cf := Random;
69: res := Create(t);
70: Standard_Natural_Vectors.Clear
71: (Standard_Natural_Vectors.Link_to_Vector(t.dg));
72: for i in 1..n loop
73: t.dg := new Standard_Natural_Vectors.Vector'(1..n => 0);
74: t.dg(i) := 1;
75: t.cf := Random;
76: Add(res,t);
77: Standard_Natural_Vectors.Clear
78: (Standard_Natural_Vectors.Link_to_Vector(t.dg));
79: end loop;
80: return res;
81: end Complex_Random_Hyperplane;
82:
83: function Standard_Hyperplane ( n,i : natural ) return Poly is
84:
85: -- DESCRIPTION : Returns x_i - 1.
86:
87: res : Poly;
88: t : Term;
89:
90: begin
91: t.dg := new Standard_Natural_Vectors.Vector'(1..n => 0);
92: t.cf := Create(-1.0);
93: res := Create(t);
94: Standard_Natural_Vectors.Clear
95: (Standard_Natural_Vectors.Link_to_Vector(t.dg));
96: t.dg := new Standard_Natural_Vectors.Vector'(1..n => 0);
97: t.dg(i) := 1;
98: t.cf := Create(1.0);
99: Add(res,t);
100: Standard_Natural_Vectors.Clear
101: (Standard_Natural_Vectors.Link_to_Vector(t.dg));
102: return res;
103: end Standard_Hyperplane;
104:
105: procedure Construct_Real_Random_Hyperplanes
106: ( s : in out Poly_Sys; m : natural ) is
107:
108: -- DESCRIPTION :
109: -- the polynomial system s will be filled with polynomials in m unknowns,
110: -- with real coefficients.
111:
112: begin
113: for i in s'range loop
114: Clear(s(i));
115: s(i) := Real_Random_Hyperplane(m);
116: end loop;
117: end Construct_Real_Random_Hyperplanes;
118:
119: procedure Construct_Complex_Random_Hyperplanes
120: ( s : in out Poly_Sys; m : natural ) is
121:
122: -- DESCRIPTION :
123: -- The polynomial system s will be filled with polynomials in m unknowns,
124: -- with complex coefficients.
125:
126: begin
127: for i in s'range loop
128: Clear(s(i));
129: s(i) := Complex_Random_Hyperplane(m);
130: end loop;
131: end Construct_Complex_Random_Hyperplanes;
132:
133: procedure Construct_Standard_Hyperplanes ( s : in out Poly_Sys ) is
134:
135: -- DESCRIPTION :
136: -- for i in s'range : s(i) := x_i - 1.
137:
138: n : natural := s'length;
139:
140: begin
141: for i in s'range loop
142: Clear(s(i));
143: s(i) := Standard_Hyperplane(n,i);
144: end loop;
145: end Construct_Standard_Hyperplanes;
146:
147: procedure Enlarge_Before ( p : in out Poly; m : in natural ) is
148:
149: -- DESCRIPTION :
150: -- To each term t of p, m additional zero entries will be inserted to t.dg
151:
152: procedure Enlarge_Term ( t : in out Term; continue : out boolean ) is
153:
154: d : Degrees := new Standard_Natural_Vectors.Vector(1..(t.dg'last+m));
155:
156: begin
157: for i in 1..m loop
158: d(i) := 0;
159: end loop;
160: for i in t.dg'range loop
161: d(i+m) := t.dg(i);
162: end loop;
163: Standard_Natural_Vectors.Clear
164: (Standard_Natural_Vectors.Link_to_Vector(t.dg));
165: t.dg := d;
166: continue := true;
167: end Enlarge_Term;
168: procedure Enlarge_Terms is new Changing_Iterator(Enlarge_Term);
169:
170: begin
171: Enlarge_Terms(p);
172: end Enlarge_Before;
173:
174: procedure Enlarge_After ( p : in out Poly; m : in natural ) is
175:
176: -- DESCRIPTION :
177: -- To each term t of p, m additional zero entries will be added to t.dg
178:
179: procedure Enlarge_Term ( t : in out Term; continue : out boolean ) is
180:
181: d : Degrees := new Standard_Natural_Vectors.Vector(1..(t.dg'last+m));
182:
183: begin
184: for i in t.dg'range loop
185: d(i) := t.dg(i);
186: end loop;
187: for i in (t.dg'last+1)..m loop
188: d(i) := 0;
189: end loop;
190: Standard_Natural_Vectors.Clear
191: (Standard_Natural_Vectors.Link_to_Vector(t.dg));
192: t.dg := d;
193: continue := true;
194: end Enlarge_Term;
195: procedure Enlarge_Terms is new Changing_Iterator(Enlarge_Term);
196:
197: begin
198: Enlarge_Terms(p);
199: end Enlarge_After;
200:
201: function Add_Equations ( s1 : Poly_Sys; s2 : Poly_Sys ) return Poly_Sys is
202:
203: n1 : natural := s1'last - s1'first + 1;
204: n2 : natural := s2'last - s2'first + 1;
205: res : Poly_Sys(1..(n1+n2));
206: m : natural;
207:
208: begin
209: for i in 1..n1 loop
210: Copy(s1(i),res(i));
211: m := Number_Of_Unknowns(res(i));
212: if m < (n1+n2)
213: then m := n1 + n2 - m;
214: Enlarge_After(res(i),m);
215: end if;
216: end loop;
217: for i in 1..n2 loop
218: Copy(s2(i),res(n1+i));
219: m := Number_Of_Unknowns(res(n1+i));
220: if m < (n1+n2)
221: then m := n1 + n2 - m;
222: Enlarge_Before(res(n1+i),m);
223: end if;
224: end loop;
225: return res;
226: end Add_Equations;
227:
228: function Add_Equation ( s : Poly_Sys; p : Poly ) return Poly_Sys is
229:
230: n : natural := s'last - s'first + 1;
231: m : natural;
232: res : Poly_Sys(1..(n+1));
233:
234: begin
235: for i in 1..n loop
236: Copy(s(i),res(i));
237: m := Number_Of_Unknowns(res(i));
238: if m < n+1
239: then m := n + 1 - m;
240: Enlarge_After(res(i),m);
241: end if;
242: end loop;
243: m := Number_Of_Unknowns(p);
244: if m < (n+1)
245: then m := n + 1 - m;
246: Enlarge_Before(res(n+1),m);
247: end if;
248: return res;
249: end Add_Equation;
250:
251: function Add_Random_Hyperplanes
252: ( s : Poly_Sys; m : natural; re : boolean ) return Poly_Sys is
253:
254: s2 : Poly_Sys(1..m);
255: n : natural := s'last - s'first + 1;
256: res : Poly_Sys(1..(m+n));
257:
258: begin
259: if re
260: then Construct_Real_Random_Hyperplanes(s2,m+n);
261: else Construct_Complex_Random_Hyperplanes(s2,m+n);
262: end if;
263: res := Add_Equations(s,s2);
264: Clear(s2);
265: return res;
266: end Add_Random_Hyperplanes;
267:
268: function Add_Standard_Hyperplanes
269: ( s : Poly_Sys; m : natural ) return Poly_Sys is
270:
271: n : natural := s'length;
272: res : Poly_Sys(1..(n+m));
273: s2 : Poly_Sys(1..m);
274:
275: begin
276: Construct_Standard_Hyperplanes(s2);
277: res := Add_Equations(s,s2);
278: Clear(s2);
279: return res;
280: end Add_Standard_Hyperplanes;
281:
282: end Homogenization;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>