Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Stalift/integer_lifting_utilities.adb, Revision 1.1.1.1
1.1 maekawa 1: with Integer_Vectors_Utilities; use Integer_Vectors_Utilities;
2: -- with Power_Lists; use Power_Lists;
3:
4: package body Integer_Lifting_Utilities is
5:
6: function Adaptive_Lifting ( l : Array_of_Lists ) return Vector is
7:
8: res : Vector(l'range);
9: fac : constant natural := 3; -- multiplication factor
10: max : constant natural := 23; -- upper bound for lifting
11:
12: begin
13: for i in l'range loop
14: res(i) := fac*Length_Of(l(i));
15: if res(i) > max
16: then res(i) := max;
17: end if;
18: end loop;
19: return res;
20: end Adaptive_Lifting;
21:
22: -- function Select_Subsystem ( p : Laur_Sys; mix : Vector; mic : Mixed_Cell )
23: -- return Laur_Sys is
24: --
25: -- res : Laur_Sys(p'range);
26: -- cnt : natural := 0;
27: --
28: -- begin
29: -- for k in mix'range loop
30: -- for l in 1..mix(k) loop
31: -- cnt := cnt + 1;
32: -- res(cnt) := Select_Terms(p(cnt),mic.pts(k));
33: -- end loop;
34: -- end loop;
35: -- return res;
36: -- end Select_Subsystem;
37:
38: function Perform_Lifting ( n : natural; l : List; p : Poly ) return Poly is
39:
40: res : Poly := Null_Poly;
41: tmp : List := l;
42:
43: begin
44: while not Is_Null(tmp) loop
45: declare
46: d : Link_to_Vector := Head_Of(tmp);
47: dr : Link_to_Vector := Reduce(d,n+1);
48: t : Term;
49: begin
50: t.cf := Coeff(p,Degrees(dr));
51: t.dg := Degrees(d);
52: Add(res,t);
53: Clear(dr);
54: end;
55: tmp := Tail_Of(tmp);
56: end loop;
57: return res;
58: end Perform_Lifting;
59:
60: function Perform_Lifting
61: ( n : natural; mix : Vector; lifted : Array_of_Lists;
62: p : Laur_Sys ) return Laur_Sys is
63:
64: res : Laur_Sys(p'range);
65: cnt : natural := 1;
66:
67: begin
68: for k in mix'range loop
69: for l in 1..mix(k) loop
70: res(cnt) := Perform_Lifting(n,lifted(k),p(cnt));
71: cnt := cnt+1;
72: end loop;
73: end loop;
74: return res;
75: end Perform_Lifting;
76:
77: function Copy_Lifting ( lifted : List; pt : Link_to_Vector )
78: return Link_to_Vector is
79:
80: -- DESCRIPTION :
81: -- Searches the correspoinding point in the list lifted and returns
82: -- the lifted point. If the corresponding point has not been found,
83: -- then the original point pt will be returned.
84:
85: tmp : List := lifted;
86: lpt,res : Link_to_Vector;
87:
88: begin
89: while not Is_Null(tmp) loop
90: lpt := Head_Of(tmp);
91: if Equal(lpt(pt'range),pt.all)
92: then res := new Standard_Integer_Vectors.Vector'(lpt.all);
93: return res;
94: else tmp := Tail_Of(tmp);
95: end if;
96: end loop;
97: return pt;
98: end Copy_Lifting;
99:
100: function Copy_Lifting ( lifted,pts : List ) return List is
101:
102: -- DESCRIPTION :
103: -- Copies the lifting on the points lifted to the points in pts,
104: -- i.e., each point in pts will get the same lifting as the corresponding
105: -- lifted point in the list lifted.
106:
107: res : List;
108: tmp : List := pts;
109:
110: begin
111: while not Is_Null(tmp) loop
112: Construct(Copy_Lifting(lifted,Head_Of(tmp)),res);
113: tmp := Tail_Of(tmp);
114: end loop;
115: return res;
116: end Copy_Lifting;
117:
118: procedure Search_Lifting ( l : in List; pt : in Vector;
119: found : out boolean; lif : out integer ) is
120:
121: tmp : List := l;
122: lpt : Link_to_Vector;
123:
124: begin
125: found := false;
126: while not Is_Null(tmp) loop
127: lpt := Head_Of(tmp);
128: if Equal(lpt(pt'range),pt)
129: then found := true;
130: lif := lpt(lpt'last);
131: exit;
132: else tmp := Tail_Of(tmp);
133: end if;
134: end loop;
135: end Search_Lifting;
136:
137: function Search_and_Lift ( l : List; pt : Vector ) return Vector is
138:
139: tmp : List := l;
140: lpt : Link_to_Vector;
141:
142: begin
143: while not Is_Null(tmp) loop
144: lpt := Head_Of(tmp);
145: if Equal(lpt(pt'range),pt)
146: then return lpt.all;
147: else tmp := Tail_Of(tmp);
148: end if;
149: end loop;
150: return pt;
151: end Search_and_Lift;
152:
153: function Search_and_Lift ( mic : Mixed_Cell; k : natural; pt : Vector )
154: return Vector is
155: begin
156: return Search_and_Lift(mic.pts(k),pt);
157: end Search_and_Lift;
158:
159: function Induced_Lifting ( mixsub : Mixed_Subdivision; k : natural;
160: pt : Vector ) return Vector is
161:
162: tmp : Mixed_Subdivision := mixsub;
163: res : Vector(pt'first..pt'last+1);
164:
165: begin
166: while not Is_Null(tmp) loop
167: declare
168: mic : Mixed_Cell := Head_Of(tmp);
169: lpt : constant Vector := Search_and_Lift(mic,k,pt);
170: begin
171: if lpt'length = pt'length+1
172: then return lpt;
173: else tmp := Tail_Of(tmp);
174: end if;
175: end;
176: end loop;
177: res(pt'range) := pt;
178: res(res'last) := 1;
179: res(res'last) := Conservative_Lifting(mixsub,k,res);
180: return res;
181: end Induced_Lifting;
182:
183: function Induced_Lifting
184: ( n : natural; mix : Vector; points : Array_of_Lists;
185: mixsub : Mixed_Subdivision ) return Array_of_Lists is
186:
187: res,res_last : Array_of_Lists(mix'range);
188: cnt : natural := 1;
189: tmp : List;
190:
191: begin
192: for k in mix'range loop
193: res_last(k) := res(k);
194: tmp := points(cnt);
195: while not Is_Null(tmp) loop
196: declare
197: pt : Link_to_Vector := Head_Of(tmp);
198: lpt : constant Vector := Induced_Lifting(mixsub,k,pt.all);
199: begin
200: Append(res(k),res_last(k),lpt);
201: end;
202: tmp := Tail_Of(tmp);
203: end loop;
204: cnt := cnt + mix(k);
205: end loop;
206: return res;
207: end Induced_Lifting;
208:
209: procedure Constant_Lifting
210: ( l : in List; liftval : in natural;
211: lifted,lifted_last : in out List ) is
212:
213: tmp : List := l;
214: pt : Link_to_Vector;
215:
216: begin
217: while not Is_Null(tmp) loop
218: pt := Head_Of(tmp);
219: declare
220: lpt : Link_to_Vector := new Vector(pt'first..pt'last+1);
221: begin
222: lpt(pt'range) := pt.all;
223: lpt(lpt'last) := liftval;
224: Append(lifted,lifted_last,lpt);
225: end;
226: tmp := Tail_Of(tmp);
227: end loop;
228: end Constant_Lifting;
229:
230: procedure Constant_Lifting
231: ( al : in Array_of_Lists; liftval : in natural;
232: lifted,lifted_last : in out Array_of_Lists ) is
233: begin
234: for i in al'range loop
235: Constant_Lifting(al(i),liftval,lifted(i),lifted_last(i));
236: end loop;
237: end Constant_Lifting;
238:
239: function Conservative_Lifting
240: ( mic : Mixed_Cell; k : natural; point : Vector )
241: return integer is
242:
243: sp : integer := mic.nor*Head_Of(mic.pts(k));
244: spp : integer := mic.nor.all*point;
245: res : integer;
246:
247: begin
248: if sp < spp
249: then return point(point'last);
250: else if mic.nor(mic.nor'last) = 0
251: then res := point(point'last);
252: else spp := spp - point(point'last)*mic.nor(mic.nor'last);
253: res := (sp - spp)/mic.nor(mic.nor'last) + 1;
254: end if;
255: return res;
256: end if;
257: end Conservative_Lifting;
258:
259: function Conservative_Lifting ( mixsub : Mixed_Subdivision; k : natural;
260: point : Vector ) return integer is
261:
262: tmp : Mixed_Subdivision := mixsub;
263: pt : Vector(point'range) := point;
264: res : integer;
265:
266: begin
267: while not Is_Null(tmp) loop
268: pt(pt'last) := Conservative_Lifting(Head_Of(tmp),k,pt);
269: tmp := Tail_Of(tmp);
270: end loop;
271: res := pt(pt'last);
272: Clear(pt);
273: return res;
274: end Conservative_Lifting;
275:
276: function Lower_Lifting ( mic : Mixed_Cell; k : natural; point : Vector )
277: return integer is
278: begin
279: if Is_In(mic.pts(k),point)
280: then return 0;
281: else declare
282: pt : Vector(point'range) := point;
283: begin
284: pt(pt'last) := 0;
285: return Conservative_Lifting(mic,k,pt);
286: end;
287: end if;
288: end Lower_Lifting;
289:
290: function Lower_Lifting ( mixsub : Mixed_Subdivision; k : natural;
291: point : Vector ) return integer is
292:
293: lif : integer := point(point'last);
294: tmp : Mixed_Subdivision := mixsub;
295: max : integer := 0;
296:
297: begin
298: while not Is_Null(tmp) loop
299: lif := Lower_Lifting(Head_Of(tmp),k,point);
300: if lif > max
301: then max := lif;
302: end if;
303: exit when max = point(point'last);
304: tmp := Tail_Of(tmp);
305: end loop;
306: return max;
307: end Lower_Lifting;
308:
309: end Integer_Lifting_Utilities;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>