Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Dynlift/dynamic_triangulations.adb, Revision 1.1.1.1
1.1 maekawa 1: with Simplices; use Simplices;
2: with Global_Dynamic_Triangulation; use Global_Dynamic_Triangulation;
3: with Integer_Lifting_Utilities; use Integer_Lifting_Utilities;
4: with Dynamic_Lifting_Functions; use Dynamic_Lifting_Functions;
5:
6: package body Dynamic_Triangulations is
7:
8: -- UTILITIES :
9:
10: procedure Initialize
11: ( l : in List; order : in boolean;
12: rest,lifted,lifted_last : in out List;
13: t : in out Triangulation ) is
14:
15: -- DESCRIPTION :
16: -- Performs initialization of the dynamic lifting algorithm.
17:
18: -- ON ENTRY :
19: -- l the list of points to be processed;
20: -- order if true, then the order of the points will be considered;
21: -- lifted eventually points that already have been lifted;
22: -- t triangulation of the lifted points.
23:
24: -- ON RETURN :
25: -- rest rest of point list to be processed,
26: -- if empty, then the problem is degenerate;
27: -- lifted points in the initial simplex if t was empty,
28: -- otherwise left unchanged;
29: -- lifted_last pointer to the last element of lifted;
30: -- t if empty on entry, then it contains an initial simplex,
31: -- if the problem was not degenerate.
32:
33: null_list : List;
34: s : Simplex;
35:
36: begin
37: if Is_Null(t)
38: then Initial_Simplex(l,order,s,rest); -- start from scratch
39: if (s /= Null_Simplex)
40: then Construct(s,t);
41: lifted := Deep_Create(Vertices(s));
42: lifted_last := lifted;
43: while not Is_Null(Tail_Of(lifted_last)) loop
44: lifted_last := Tail_Of(lifted_last);
45: end loop;
46: else rest := null_list; -- degenerate problem
47: end if;
48: else rest := l; -- re-start
49: end if;
50: end Initialize;
51:
52: procedure Next_Point ( l : in out List; order : in boolean;
53: point : out Link_to_Vector ) is
54:
55: -- DESCRIPTION :
56: -- Selects the next point out of the list l.
57:
58: -- ON ENTRY :
59: -- l a nonempty list of points;
60: -- order if true, then the next point in the list will be choosen,
61: -- otherwise, the point will be picked randomly.
62:
63: -- ON RETURN :
64: -- l a list without the point;
65: -- point the choosen point.
66:
67: pt : Link_to_Vector;
68:
69: begin
70: if order
71: then pt := Head_Of(l);
72: else pt := Max_Extreme(l,Head_Of(l)'last,-5,5);
73: Swap_to_Front(l,pt);
74: end if;
75: l := Tail_Of(l);
76: point := pt;
77: end Next_Point;
78:
79: -- BASIC VERSION : WITHOUT OUTPUT GENERICS :
80:
81: procedure Dynamic_Lifting
82: ( l : in List; order,inter : in boolean;
83: maxli : in natural; lifted,lifted_last : in out List;
84: t : in out Triangulation ) is
85:
86: rest,inner : List;
87: pt : Link_to_Vector;
88: nexli : natural := 1;
89:
90: begin
91: Initialize(l,order,rest,lifted,lifted_last,t);
92: -- ITERATE FOR ALL POINTS IN rest :
93: while not Is_Null(rest) loop
94: Next_Point(rest,order,pt);
95: declare
96: point : Link_to_Vector := new Vector(1..pt'last+1);
97: begin
98: point(1..pt'last) := pt.all;
99: point(point'last) := 1; -- try to obtain an optimal lifting value !!
100: if inter and then Is_In(t,point.all)
101: then Clear(point); Construct(pt,inner);
102: else nexli := Lift_to_Place(t,point.all);
103: if (maxli > 0) and then (nexli > maxli)
104: then Flatten(t);
105: nexli := 1;
106: end if;
107: point(point'last) := nexli;
108: Update(t,point);
109: Append(lifted,lifted_last,point);
110: end if;
111: end;
112: end loop;
113: if inter -- lift out the interior points
114: then Constant_Lifting(inner,nexli,lifted,lifted_last);
115: end if;
116: exception
117: when numeric_error -- probably due to a too high lifting
118: => Flatten(t);
119: Dynamic_Lifting(rest,order,inter,maxli,lifted,lifted_last,t);
120: end Dynamic_Lifting;
121:
122: procedure Dynamic_Lifting_with_Flat
123: ( l : in List; order,inter : in boolean;
124: maxli : in natural; lifted,lifted_last : in out List;
125: t : in out Triangulation ) is
126:
127: rest,inner : List;
128: pt : Link_to_Vector;
129: nexli : natural := 1;
130:
131: begin
132: Initialize(l,order,rest,lifted,lifted_last,t);
133: -- ITERATE FOR ALL POINTS IN rest :
134: while not Is_Null(rest) loop
135: Next_Point(rest,order,pt);
136: declare
137: point : Link_to_Vector := new Vector(1..pt'last+1);
138: begin
139: point(1..pt'last) := pt.all;
140: point(point'last) := 1; -- try to obtain an optimal lifting value !!
141: if inter and then Is_In(t,point.all)
142: then Clear(point); Construct(pt,inner);
143: else nexli := Lift_to_Place(t,point.all);
144: if (maxli > 0) and then (nexli > maxli)
145: then Before_Flattening(t,lifted); Flatten(t);
146: nexli := 1;
147: end if;
148: point(point'last) := nexli;
149: Update(t,point);
150: Append(lifted,lifted_last,point);
151: end if;
152: end;
153: end loop;
154: if inter -- lift out the interior points
155: then Constant_Lifting(inner,nexli,lifted,lifted_last);
156: end if;
157: exception
158: when numeric_error -- probably due to a too high lifting
159: => Before_Flattening(t,lifted); Flatten(t);
160: Dynamic_Lifting_with_Flat
161: (rest,order,inter,maxli,lifted,lifted_last,t);
162: end Dynamic_Lifting_with_Flat;
163:
164: procedure Dynamic_Lifting_with_New
165: ( l : in List; order,inter : in boolean;
166: maxli : in natural; lifted,lifted_last : in out List;
167: t : in out Triangulation ) is
168:
169: rest,inner : List;
170: pt : Link_to_Vector;
171: nexli : natural := 1;
172: newt : Triangulation;
173:
174: begin
175: Initialize(l,order,rest,lifted,lifted_last,t);
176: -- ITERATE FOR ALL POINTS IN rest :
177: while not Is_Null(rest) loop
178: Next_Point(rest,order,pt);
179: declare
180: point : Link_to_Vector := new Vector(1..pt'last+1);
181: begin
182: point(1..pt'last) := pt.all;
183: point(point'last) := 1; -- try to obtain an optimal lifting value !!
184: if inter and then Is_In(t,point.all)
185: then Clear(point); Construct(pt,inner);
186: else nexli := Lift_to_Place(t,point.all);
187: if (maxli > 0) and then (nexli > maxli)
188: then Flatten(t);
189: nexli := 1;
190: end if;
191: point(point'last) := nexli;
192: Update(t,point,newt);
193: Process_New_Simplices(newt,point.all);
194: Append(lifted,lifted_last,point);
195: end if;
196: end;
197: end loop;
198: if inter -- lift out the interior points
199: then Constant_Lifting(inner,nexli,lifted,lifted_last);
200: end if;
201: exception
202: when numeric_error -- probably due to a too high lifting
203: => Flatten(t);
204: Dynamic_Lifting_with_New(rest,order,inter,maxli,lifted,lifted_last,t);
205: end Dynamic_Lifting_with_New;
206:
207: procedure Dynamic_Lifting_with_Flat_and_New
208: ( l : in List; order,inter : in boolean;
209: maxli : in natural; lifted,lifted_last : in out List;
210: t : in out Triangulation ) is
211:
212: rest,last,inner : List;
213: pt : Link_to_Vector;
214: nexli : natural := 1;
215: newt : Triangulation;
216:
217: begin
218: Initialize(l,order,rest,lifted,lifted_last,t);
219: -- ITERATE FOR ALL POINTS IN rest :
220: while not Is_Null(rest) loop
221: Next_Point(rest,order,pt);
222: declare
223: point : Link_to_Vector := new Vector(1..pt'last+1);
224: begin
225: point(1..pt'last) := pt.all;
226: point(point'last) := 1; -- try to obtain an optimal lifting value !!
227: if inter and then Is_In(t,point.all)
228: then Clear(point); Construct(pt,inner);
229: else nexli := Lift_to_Place(t,point.all);
230: if (maxli > 0) and then (nexli > maxli)
231: then Before_Flattening(t,lifted); Flatten(t);
232: nexli := 1;
233: end if;
234: point(point'last) := nexli;
235: Update(t,point,newt);
236: Process_New_Simplices(newt,point.all);
237: Append(lifted,lifted_last,point);
238: end if;
239: end;
240: end loop;
241: if inter -- lift out the interior points
242: then Constant_Lifting(inner,nexli,lifted,lifted_last);
243: end if;
244: exception
245: when numeric_error -- probably due to a too high lifting
246: => Before_Flattening(t,lifted); Flatten(t);
247: Dynamic_Lifting_with_Flat_and_New
248: (rest,order,inter,maxli,lifted,lifted_last,t);
249: end Dynamic_Lifting_with_Flat_and_New;
250:
251: end Dynamic_Triangulations;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>