Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Stalift/normal_cone_intersections.adb, Revision 1.1.1.1
1.1 maekawa 1: with Inner_Normal_Cones; use Inner_Normal_Cones;
2:
3: package body Normal_Cone_Intersections is
4:
5: -- AUXILIARY :
6:
7: function Get ( l : List; i : natural ) return Vector is
8:
9: -- DESCRIPTION :
10: -- Returns the ith point vector in the list.
11:
12: tmp : List := l;
13: cnt : natural := 0;
14: nll : Vector(0..0) := (0..0 => 0);
15:
16: begin
17: while not Is_Null(tmp) loop
18: cnt := cnt + 1;
19: if cnt = i
20: then return Head_Of(tmp).all;
21: end if;
22: tmp := Tail_Of(tmp);
23: end loop;
24: return nll;
25: end Get;
26:
27: -- CONSTRUCTORS :
28:
29: function Number_of_Cones ( l : Array_of_Lists; i : natural )
30: return natural is
31:
32: res : natural := 0;
33:
34: begin
35: for j in l'range loop
36: if j /= i
37: then res := res + Length_Of(l(j));
38: end if;
39: end loop;
40: return res;
41: end Number_of_Cones;
42:
43: function Lengths ( l : Array_of_Lists; i : natural ) return Vector is
44:
45: res : Vector(l'range);
46:
47: begin
48: res(res'first) := 1;
49: for j in l'first..(i-1) loop
50: res(j+1) := res(j) + Length_Of(l(j));
51: end loop;
52: for j in (i+1)..l'last loop
53: res(j) := res(j-1) + Length_Of(l(j));
54: end loop;
55: return res;
56: end Lengths;
57:
58: function Create ( l : Array_of_Lists; g : List; i : natural )
59: return Intersection_Matrix is
60:
61: n : constant natural := l'length - 1;
62: m : constant natural := Length_Of(g);
63: ll : constant Vector := Lengths(l,i);
64: nc : constant natural := ll(ll'last)-1;
65: res : Intersection_Matrix(n,m,nc);
66:
67: begin
68: res.sv := ll(ll'first..ll'last-1);
69: for j in l'range loop
70: if j /= i
71: then
72: declare
73: ind : natural := j;
74: tmpl : List := l(j);
75: cntl : natural := 0;
76: begin
77: if ind > i
78: then ind := ind - 1;
79: end if;
80: while not Is_Null(tmpl) loop
81: declare
82: cone : constant Matrix
83: := Inner_Normal_Cone(l(j),Head_Of(tmpl).all);
84: tmpg : List := g;
85: cntg,sum : natural := 0;
86: begin
87: -- put_line("The inequalities of the normal cone : "); put(cone);
88: while not Is_Null(tmpg) loop
89: cntg := cntg + 1;
90: -- put(" "); put(Head_Of(tmpg).all);
91: if Satisfies(cone,Head_Of(tmpg).all)
92: then res.im(cntg,res.sv(ind)+cntl) := 1; sum := sum + 1;
93: -- put_line(" satisfies.");
94: else res.im(cntg,res.sv(ind)+cntl) := 0;
95: -- put_line(" does not satisfy.");
96: end if;
97: tmpg := Tail_Of(tmpg);
98: end loop;
99: res.im(0,res.sv(ind)+cntl) := sum;
100: end;
101: tmpl := Tail_Of(tmpl);
102: cntl := cntl + 1;
103: end loop;
104: end;
105: end if;
106: end loop;
107: return res;
108: end Create;
109:
110: -- ELEMENTARY SELECTORS :
111:
112: function Is_In ( ima : Intersection_Matrix; i,j,k : natural )
113: return boolean is
114: begin
115: if ima.im(i,ima.sv(j)+k-1) = 1
116: then return true;
117: else return false;
118: end if;
119: end Is_In;
120:
121: function Maximal_Column ( ima : Intersection_Matrix ) return natural is
122:
123: res : natural := ima.im'first(2);
124: max : natural := ima.im(0,ima.im'first(2));
125:
126: begin
127: for j in ima.im'first(2)+1..ima.im'last(2) loop
128: if ima.im(0,j) > max
129: then max := ima.im(0,j); res := j;
130: end if;
131: end loop;
132: return res;
133: end Maximal_Column;
134:
135: function Component ( ima : Intersection_Matrix; column : natural )
136: return natural is
137: begin
138: for i in ima.sv'range loop
139: if ima.sv(i) > column
140: then return i-1;
141: end if;
142: end loop;
143: return ima.sv'last;
144: end Component;
145:
146: function Length ( ima : Intersection_Matrix; i : natural ) return natural is
147: begin
148: if i < ima.sv'last
149: then return (ima.sv(i+1) - ima.sv(i));
150: else return (ima.im'last(2) - ima.sv(i) + 1);
151: end if;
152: end Length;
153:
154: function Row_Sum ( ima : Intersection_Matrix; i,j : natural )
155: return natural is
156:
157: res : natural := 0;
158: lst : natural;
159:
160: begin
161: if j < ima.sv'last
162: then lst := ima.sv(j+1)-1;
163: else lst := ima.im'last(2);
164: end if;
165: for k in ima.sv(j)..lst loop
166: res := res + ima.im(i,k);
167: end loop;
168: return res;
169: end Row_Sum;
170:
171: -- ENUMERATING COMPLEMENTARY COLUMNS :
172:
173: procedure Complementary_Columns ( ima : in Intersection_Matrix ) is
174:
175: acc : Standard_Integer_Vectors.Vector(ima.sv'range) := (ima.sv'range => 0);
176: -- acc(j) = 0 if no cone from jth component has been chosen yet,
177: -- = k if kth cone from jth component is selected.
178:
179: continue : boolean := true;
180:
181: function Is_In ( acc : in Vector; i : in natural ) return boolean is
182:
183: -- DESCRIPTION :
184: -- Returns true if the ith generator already belongs to one of the
185: -- chosen cones in acc.
186:
187: begin
188: for j in acc'range loop -- enumerate the components
189: if acc(j) /= 0 -- acc(j) = cone selected
190: then if Is_In(ima,i,j,acc(j)) -- is in selected cone ?
191: then return true;
192: end if;
193: end if;
194: end loop;
195: return false;
196: end Is_In;
197:
198: procedure Select_Columns ( i : in natural ) is
199:
200: -- DESCRIPTION :
201: -- Selects all columns such that the ith generator belongs to the
202: -- collection of columns.
203:
204: lst : natural;
205:
206: begin
207: if i > ima.im'last(1)
208: then Process(acc,continue);
209: else if Is_In(acc,i)
210: then Select_Columns(i+1);
211: else for j in acc'range loop
212: if acc(j) = 0
213: then if j < ima.sv'last
214: then lst := ima.sv(j+1)-1;
215: else lst := ima.im'last(2);
216: end if;
217: for k in ima.sv(j)..lst loop
218: if ima.im(i,k) = 1
219: then acc(j) := k-ima.sv(j)+1;
220: Select_Columns(i+1);
221: acc(j) := 0;
222: end if;
223: exit when not continue;
224: end loop;
225: end if;
226: exit when not continue;
227: end loop;
228: end if;
229: end if;
230: end Select_Columns;
231:
232: begin
233: Select_Columns(1);
234: end Complementary_Columns;
235:
236: function Partition ( ima : Intersection_Matrix; cols : Vector; g : List )
237: return Array_of_Lists is
238:
239: res,res_last : Array_of_Lists(cols'range);
240: tmp : List := g;
241:
242: procedure Search_and_Update ( v : in Vector; i : in natural ) is
243:
244: -- DESCRIPTION :
245: -- Given the ith generator v from the list g, this procedures searches
246: -- for the first cone that contains it and updates the partition.
247:
248: found : boolean := false;
249:
250: begin
251: for j in cols'range loop
252: if (cols(j) /= 0) and then Is_In(ima,i,j,cols(j))
253: then found := true;
254: Append(res(j),res_last(j),v);
255: end if;
256: exit when found;
257: end loop;
258: end Search_and_Update;
259:
260: begin
261: for i in ima.im'first(1)+1..ima.im'last(1) loop
262: Search_and_Update(Head_Of(tmp).all,i);
263: tmp := Tail_Of(tmp);
264: end loop;
265: return res;
266: end Partition;
267:
268: function Partition_in_Union ( partg,points : Array_of_Lists; i : natural;
269: cols : Vector ) return boolean is
270:
271: -- ALGORITHM : lexicographic enumeration of all couples of lists in partg,
272: -- with each time a check whether it belongs to the union of
273: -- the normal cones as given by the set of complementary columns.
274:
275: function Index ( j : natural ) return natural is
276: begin
277: if j < i
278: then return j;
279: else return j+1;
280: end if;
281: end Index;
282:
283: begin
284: for k1 in partg'range loop
285: if not Is_Null(partg(k1))
286: then
287: for k2 in (k1+1)..partg'last loop
288: if not Is_Null(partg(k2))
289: then
290: declare
291: ind1 : constant natural := Index(k1);
292: ind2 : constant natural := Index(k2);
293: x1 : constant Vector := Get(points(ind1),cols(k1));
294: x2 : constant Vector := Get(points(ind2),cols(k2));
295: ic1 : constant Matrix := Inner_Normal_Cone(points(ind1),x1);
296: ic2 : constant Matrix := Inner_Normal_Cone(points(ind2),x2);
297: begin
298: if not In_Union(partg(k1),partg(k2),ic1,ic2)
299: then return false;
300: end if;
301: end;
302: end if;
303: end loop;
304: end if;
305: end loop;
306: return true;
307: end Partition_in_Union;
308:
309: function Contained_in_Union
310: ( l : Array_of_Lists; i : natural; g : List;
311: ima : Intersection_Matrix; cols : Vector ) return boolean is
312:
313: p : Array_of_Lists(cols'range) := Partition(ima,cols,g);
314: res : boolean := Partition_in_Union(p,l,i,cols);
315:
316: begin
317: Deep_Clear(p);
318: return res;
319: end Contained_in_Union;
320:
321: -- FINAL TARGET ROUTINE :
322:
323: function Contained_in_Union
324: ( l : Array_of_Lists; i : natural; g : List;
325: ima : Intersection_Matrix ) return boolean is
326:
327: res : boolean := false;
328: continue : boolean := true;
329:
330: procedure Examin_Selection ( cols : in Vector; continue : out boolean ) is
331: begin
332: res := Contained_in_Union(l,i,g,ima,cols);
333: continue := not res;
334: end Examin_Selection;
335: procedure Enumerate_Complementary_Columns is
336: new Complementary_Columns(Examin_Selection);
337:
338: begin
339: Enumerate_Complementary_Columns(ima);
340: return res;
341: end Contained_in_Union;
342:
343: end Normal_Cone_Intersections;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>