with Integer_Face_Enumerators; use Integer_Face_Enumerators; package body Enumerate_Faces_of_Polytope is -- UTILITIES : function Is_In ( i : natural; v : Vector ) return boolean is begin for j in v'range loop if v(j) = i then return true; end if; end loop; return false; end Is_In; -- TARGET ROUTINES : procedure Enumerate_Faces_in_List ( l : in List; point : in Link_to_Vector; k : in natural ) is verpts : constant VecVec := Shallow_Create(l); face : VecVec(0..k); procedure Enumerate_Vertices ( l,start : in natural ) is -- DESCRIPTION : -- Already l vectors have been choosen out of verpts and -- are in face(0..l). In indices(0..l) the position of the -- ith face in the vector of vertices is given by indices(i). -- The parameter start indices from which vertex on, the -- enumeration has to start. -- In this way, the faces are enumerated in lexicographic order. begin if l >= k then Process(face); elsif (verpts'last-start+1) >= k-l then for j in start..verpts'last loop face(l+1) := verpts(j); Enumerate_Vertices(l+1,j+1); end loop; end if; end Enumerate_Vertices; begin face(0) := point; Enumerate_Vertices(0,verpts'first); end Enumerate_Faces_in_List; procedure Enumerate_Lower_Faces_in_List ( l : in List; point : in Link_to_Vector; k : in natural ) is verpts : VecVec(1..Length_Of(l)+1); face : VecVec(0..k); begin verpts(1) := point; verpts(2..verpts'last) := Shallow_Create(l); face(0) := point; if k = 1 then declare procedure Low_Edge ( i,j : in integer; cont : out boolean ) is begin if i = 1 then face(1) := verpts(j); Process(face); cont := true; else cont := false; end if; end Low_Edge; procedure Enum_Low_Edges is new Enumerate_Lower_Edges(Low_Edge); begin Enum_Low_Edges(verpts); end; else declare procedure Low_Face ( f : in Vector; cont : out boolean ) is begin if f(f'first) = 1 then for i in 1..f'last loop face(i) := verpts(f(i)); end loop; Process(face); cont := true; else cont := false; end if; end Low_Face; procedure Enum_Low_Faces is new Enumerate_Lower_Faces(Low_Face); begin Enum_Low_Faces(k,verpts); end; end if; end Enumerate_Lower_Faces_in_List; procedure Enumerate_Faces_in_Simplex ( s : in Simplex; point : in Link_to_Vector; k : in natural ) is verpts : constant VecVec := Vertices(s); face : VecVec(0..k); indices : Vector(0..k); procedure Enumerate_Vertices ( l,start : in natural ) is -- DESCRIPTION : -- Already l vectors have been choosen out of verpts and -- are in face(0..l). In indices(0..l) the position of the -- ith face in the vector of vertices is given by indices(i). -- The parameter start indices from which vertex on, the -- enumeration has to start. -- In this way, the faces are enumerated in lexicographic order. begin if l >= k then Process(face); elsif (verpts'last-start+1) >= k-l then for j in start..verpts'last loop if not Is_In(j,indices(0..l)) then indices(l+1) := j; face(l+1) := verpts(j); Enumerate_Vertices(l+1,j+1); end if; end loop; end if; end Enumerate_Vertices; begin -- SEARCH FOR THE INDEX OF THE POINT : indices(0) := verpts'first - 1; for i in verpts'range loop if verpts(i).all = point.all then indices(0) := i; end if; exit when indices(0) >= verpts'first; end loop; -- ENUMERATE ALL OTHER k CHOICES OF POINTS : if indices(0) >= verpts'first then face(0) := point; Enumerate_Vertices(0,verpts'first); end if; end Enumerate_Faces_in_Simplex; procedure Enumerate_Lower_Faces_in_Simplex ( s : in Simplex; point : in Link_to_Vector; k : in natural ) is verpts : constant VecVec := Vertices(s); face : VecVec(0..k); indices : Vector(0..k); begin null; end Enumerate_Lower_Faces_in_Simplex; procedure Enumerate_Faces_in_Triangulation ( t : in Triangulation; point : in Link_to_Vector; k : in natural ) is verpts : constant VecVec := Vertices(t,point.all); face : VecVec(0..k); indices : Vector(0..k); procedure Enumerate_Vertices ( l,start : in natural ) is -- DESCRIPTION : -- Already l vectors have been choosen out of verpts and -- are in face(0..l). In indices(0..l) the position of the -- ith face in the vector of vertices is given by indices(i). -- The parameter start indices from which vertex on, the -- enumeration has to start. -- In this way, the faces are enumerated in lexicographic order. begin if l >= k then Process(face); elsif (verpts'last-start+1) >= k-l then for j in start..verpts'last loop if not Is_In(j,indices(0..l)) then indices(l+1) := j; face(l+1) := verpts(j); Enumerate_Vertices(l+1,j+1); end if; end loop; end if; end Enumerate_Vertices; begin -- SEARCH FOR THE INDEX OF THE POINT : indices(0) := verpts'first - 1; for i in verpts'range loop if verpts(i).all = point.all then indices(0) := i; end if; exit when indices(0) >= verpts'first; end loop; -- ENUMERATE ALL OTHER k CHOICES OF POINTS : if indices(0) >= verpts'first then face(0) := point; Enumerate_Vertices(0,verpts'first); end if; end Enumerate_Faces_in_Triangulation; procedure Enumerate_Lower_Faces_in_Triangulation ( t : in Triangulation; point : in Link_to_Vector; k : in natural ) is verpts : constant VecVec := Vertices(t,point.all); face : VecVec(0..k); indices : Vector(0..k); begin null; end Enumerate_Lower_Faces_in_Triangulation; end Enumerate_Faces_of_Polytope;