Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Dynlift/simplices.ads, Revision 1.1.1.1
1.1 maekawa 1: with Standard_Integer_Vectors; use Standard_Integer_Vectors;
2: with Standard_Integer_VecVecs; use Standard_Integer_VecVecs;
3:
4: package Simplices is
5:
6: -- DESCRIPTION :
7: -- The simplices are facets on the lower hull of a lifted polytope
8: -- spanned by standard integer vectors.
9:
10: -- DATA STRUCTURE :
11:
12: type Simplex is private;
13: Null_Simplex : constant Simplex; -- empty simplex
14:
15: -- CREATORS :
16:
17: function Create ( x : VecVec ) return Simplex;
18:
19: -- DESCRIPTION :
20: -- Given the vertices, the simplex will be created.
21:
22: procedure Update ( s : in out Simplex; x : in Link_to_Vector;
23: k : in natural );
24:
25: -- DESCRIPTION :
26: -- Creates a neighboring simplex by pivoting the kth point in the
27: -- simplex by the given point x.
28:
29: procedure Update ( s : in out Simplex; x : in Link_to_Vector;
30: pos : in Vector );
31:
32: -- DESCRIPTION :
33: -- Creates neighboring simplices by pivoting the points in the
34: -- simplex by the given point x.
35:
36: -- ON ENTRY :
37: -- s simplex, volume(s) > 0;
38: -- x a certain point to be considered for update;
39: -- pos the position vector of x.
40:
41: -- ON RETURN :
42: -- s updated, so that the neighbors of s contain the new
43: -- simplices.
44:
45: procedure Update_One ( s : in out Simplex; x : in Link_to_Vector;
46: pos : in Vector );
47: procedure Update_One ( s : in out Simplex; x : in Link_to_Vector;
48: pos : in Vector; news : out Simplex );
49:
50:
51: -- DESCRIPTION :
52: -- Creates at most one new simplex that contains x.
53: -- It will be assumed that there are no internal points, so no more
54: -- than one new simplex will be constructed. When x already belongs
55: -- to s or to one of its neighbor, then nothing will be done.
56: -- The specifications of s,x and pos are the same as the other
57: -- Update operation, except for the new parameter news wich returns
58: -- the new simplex that contains x.
59:
60: generic
61: with procedure Process ( news : in Simplex; cont : out boolean );
62: procedure Update_All ( s : in out Simplex; x : in Link_to_Vector;
63: pos : in Vector; ancestor : in Simplex );
64:
65: -- DESCRIPTION :
66: -- Computes all new simplices that can be derived from the initial
67: -- simplex s and the new point x.
68: -- The ancestor simplex prevents the walk from turning back.
69:
70: procedure Connect ( s1,s2 : in out Simplex );
71:
72: -- DESCRIPTION :
73: -- Computes the intersection of the two simplices.
74: -- If they are neighbors to each other, then the appropriate
75: -- connections will be made.
76:
77: procedure Flatten ( s : in out Simplex );
78:
79: -- DESCRIPTION :
80: -- All lifting values will become zero and the inner normal changes
81: -- into (0,0,..,0,1).
82:
83: -- SELECTORS :
84:
85: function Dimension ( s : Simplex ) return natural;
86:
87: -- DESCRIPTION :
88: -- Returns the number of points in the simplex.
89:
90: function Normal ( s : Simplex ) return Vector;
91:
92: -- DESCRIPTION :
93: -- Returns the normal to the given simplex.
94:
95: function Is_Flat ( s : Simplex ) return boolean;
96:
97: -- DESCRIPTION :
98: -- Returns true if all components of the normal equal zero,
99: -- except the last one, which must be equal to one.
100: -- Returns false otherwise.
101:
102: function Vertices ( s : Simplex ) return VecVec;
103:
104: -- DESCRIPTION :
105: -- Returns the vertices that span the simplex.
106:
107: function Vertex ( s : Simplex; k : natural ) return Vector;
108:
109: -- DESCRIPTION :
110: -- Returns the kth vector that spans the simplex.
111:
112: function Is_Vertex ( s : Simplex; x : Vector ) return boolean;
113:
114: -- DESCRIPTION :
115: -- Returns true if x is one of the vertices that spans the simplex.
116:
117: function Equal ( s1,s2 : Simplex ) return boolean;
118:
119: -- DESCRIPTION :
120: -- returns true if the representations of both simplices are the same.
121:
122: function Index ( s : Simplex; x : Vector ) return natural;
123:
124: -- DESCRIPTION :
125: -- k := Index(s,x);
126: -- if k = 0 then Is_Vertex(s,x) = false,
127: -- else Neighbor(s,k) is the neighboring simplex of s by pivoting x.
128:
129: function Neighbor ( s : Simplex; k : natural ) return Simplex;
130: function Neighbor ( s : Simplex; k : natural; pos : Vector ) return Simplex;
131:
132: -- DESCRIPTION :
133: -- Returns the neighbor of the kth point of the given simplex.
134: -- If the position vector is supplied, then it will only return
135: -- a non-empty simplex if that is allowed by the position.
136:
137: function Position ( s : Simplex; x : Vector ) return Vector;
138:
139: -- DESCRIPTION :
140: -- Computes the position of the given vector w.r.t. that simplex,
141: -- i.e., if l = Position(pt,s), then sum of l(i)*s(i) + l(l'last)*pt = 0,
142: -- where s(i) = ith point that spans the simplex, and the sum
143: -- of all entries in l equals 1.
144:
145: function Is_In ( s : Simplex; x : Vector ) return boolean;
146: function Is_In ( s : Simplex; x,pos : Vector ) return boolean;
147: function Is_In_All ( s : Simplex; x : Vector ) return boolean;
148: function Is_In_All ( s : Simplex; x : Vector ) return Simplex;
149: function Is_In_All ( s : Simplex; x,pos : Vector ) return boolean;
150: function Is_In_All ( s : Simplex; x,pos : Vector ) return Simplex;
151:
152: -- DESCRIPTION :
153: -- Returns true if the point x is contained in the convex hull of s.
154: -- The function runs more efficiently if the position vector is
155: -- already available, otherwise it will be computed.
156: -- With Is_In_All, also all neighbors of the given simplex are checked.
157: -- Is_In_All(s,x) returns true if x is contained in s or in one of its
158: -- neigbors, or in one of the neighbors of the neigbors...
159: -- Either the simplex which contains x or the empty simplex is returned.
160:
161: generic
162:
163: with procedure Process_Neighbor
164: ( nei : in out Simplex; k : in natural;
165: continue : out boolean );
166:
167: procedure Neighbors ( s : in out Simplex; x : in Vector );
168:
169: -- DESCRIPTION :
170: -- Computes all neighbors (and neighbors of ...) of the simplex s,
171: -- that lie closest to x, i.e. with no other simplices in between.
172: -- This procedure implements a walk from the simplex s to
173: -- a given point x.
174: -- As the parameters are of type 'in out', simplices are
175: -- allowed to be updated.
176:
177: -- To the user defined procedure Process_Neighbor the following
178: -- information is passed:
179:
180: -- ON ENTRY :
181: -- nei a neighboring simplex close to x;
182: -- k index for point in nei that can be replaced by s.
183:
184: -- ON RETURN :
185: -- nei updated simplex;
186: -- continue if true then more neighboring simplices may be delivered;
187: -- if false then the iteration will stop.
188:
189: function Volume ( s : Simplex ) return natural;
190:
191: -- DESCRIPTION :
192: -- Returns n! times the volume of the simplex.
193:
194: -- DESTRUCTORS :
195:
196: procedure Destroy_Neighbor ( s : in out Simplex; k : in natural );
197: procedure Destroy_Neighbors ( s : in out Simplex );
198:
199: -- DESCRIPTION :
200: -- Sets the kth neighbor of the simplex to the empty simplex.
201: -- If k is not specified, then all neighbors will be set to empty.
202:
203: procedure Clear_Neighbor ( s : in out Simplex; k : in natural );
204: procedure Clear_Neighbors ( s : in out Simplex );
205:
206: -- DESCRIPTION :
207: -- Clears the kth neighbor of the simplex s.
208: -- If k is not specified, then all neighbors will be cleared.
209:
210: procedure Clear ( s : in out Simplex );
211:
212: -- DESCRIPTION :
213: -- Makes the allocated memory space available.
214:
215: private
216:
217: type Simplex_Rep ( n : natural );
218: type Simplex is access Simplex_Rep;
219: Null_Simplex : constant Simplex := null;
220:
221: end Simplices;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>