with Lists_of_Integer_Vectors; use Lists_of_Integer_Vectors; with Simplices; use Simplices; with Dynamic_Triangulations; use Dynamic_Triangulations; with Cayley_Embedding; use Cayley_Embedding; with Flatten_Mixed_Subdivisions; use Flatten_Mixed_Subdivisions; package body Cayley_Trick is -- UTILITIES : function Extract ( n : natural; mix : Vector; lifted : in List ) return Array_of_Lists is -- DESCRIPTION : -- Extracts from the list of lifted points to compute the Cayley -- triangulation, the tuple of lifted points. res : Array_of_Lists(mix'range); begin for k in res'range loop res(k) := Extract(k-1,n,lifted); Deflate(n,res(k)); end loop; return res; end Extract; procedure Extract ( n : in natural; mix : in Vector; t : in Triangulation; liftedt : in List; mixsub : out Mixed_Subdivision; lifted : out Array_of_Lists ) is -- DESCRIPTION : -- Extracts the useful information from the Cayley polytope. res : Mixed_Subdivision; begin lifted := Extract(n,mix,liftedt); res := Extract_Mixed_Cells(n,mix,t); Deflate(n,res); mixsub := res; end Extract; procedure Extract_and_Clear ( n : in natural; mix : in Vector; t : in out Triangulation; liftedt : in out List; lent : out natural; mixsub : out Mixed_Subdivision; lifted : out Array_of_Lists ) is -- DESCRIPTION : -- Extracts the useful information from the Cayley polytope. -- All intermediate data structures will be cleared. begin lent := Length_Of(t); Extract(n,mix,t,liftedt,mixsub,lifted); Clear(t); Clear(liftedt); end Extract_and_Clear; -- BASIC VERSION : procedure Dynamic_Cayley ( n : in natural; mix : in Vector; supports : in Array_of_Lists; order,inter : in boolean; maxli : in natural; lifted : out Array_of_Lists; mixsub : out Mixed_Subdivision; numtri : out natural ) is tmpsub,lastcells : Mixed_Subdivision; l,liftedl,liftedl_last : list; t : Triangulation; procedure Col_Flat ( nt : in Triangulation; l : List ) is -- DESCRIPTION : -- Updates the subdivision mixsub with the flattened cells. -- The triangulation on entry contains the whole triangulation, -- not just the new cells. cells : Mixed_Subdivision; begin if Is_Null(tmpsub) then cells := Extract_Mixed_Cells(n,mix,nt); Deflate(n,cells); else cells := Extract_non_Flat_Mixed_Cells(n,mix,nt); Deflate(n,cells); Construct(Head_Of(tmpsub),cells); end if; Flatten(cells); tmpsub := cells; end Col_Flat; procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_Flat(Col_Flat); begin l := Embedding_before_Lifting(supports); C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t); if Is_Null(tmpsub) then Extract_and_Clear(n,mix,t,liftedl,numtri,mixsub,lifted); else lastcells := Extract_non_Flat_Mixed_Cells(n,mix,t); Deflate(n,lastcells); Construct(Head_Of(tmpsub),lastcells); mixsub := lastcells; lifted := Extract(n,mix,liftedl); numtri := Length_Of(t); end if; end Dynamic_Cayley; procedure Dynamic_Cayley ( n : in natural; mix : in Vector; supports : in Array_of_Lists; order,inter : in boolean; maxli : in natural; lifted : out Array_of_Lists; t : in out Triangulation ) is l,liftedl,liftedl_last : list; begin l := Embedding_before_Lifting(supports); Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t); lifted := Extract(n,mix,liftedl); Clear(liftedl); end Dynamic_Cayley; -- EXTENDED VERSIONS : procedure Dynamic_Cayley_with_Flat ( n : in natural; mix : in Vector; supports : in Array_of_Lists; order,inter : in boolean; maxli : in natural; lifted : out Array_of_Lists; mixsub : out Mixed_Subdivision; numtri : out natural ) is l,liftedl,liftedl_last : list; t : Triangulation; tmpsub,lastcells : Mixed_Subdivision; procedure Bef_Flat ( tt : in Triangulation; lft : in List ) is cells,cells1 : Mixed_Subdivision; lftpts : Array_of_Lists(mix'range); begin Extract(n,mix,tt,lft,cells,lftpts); Before_Flattening(cells,lftpts); if Is_Null(tmpsub) then cells := Extract_Mixed_Cells(n,mix,tt); Deflate(n,cells); else cells := Extract_non_Flat_Mixed_Cells(n,mix,tt); Deflate(n,cells); Construct(Head_Of(tmpsub),cells); end if; Flatten(cells); tmpsub := cells; end Bef_Flat; procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_Flat (Bef_Flat); begin l := Embedding_before_Lifting(supports); C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t); if Is_Null(tmpsub) then Extract_and_Clear(n,mix,t,liftedl,numtri,mixsub,lifted); else lastcells := Extract_non_Flat_Mixed_Cells(n,mix,t); Deflate(n,lastcells); Construct(Head_Of(tmpsub),lastcells); mixsub := lastcells; lifted := Extract(n,mix,liftedl); numtri := Length_Of(t); end if; end Dynamic_Cayley_with_Flat; procedure Dynamic_Cayley_with_Flatt ( n : in natural; mix : in Vector; supports : in Array_of_Lists; order,inter : in boolean; maxli : in natural; lifted : out Array_of_Lists; t : in out Triangulation ) is l,liftedl,liftedl_last : list; procedure Bef_Flat ( tt : in Triangulation; lft : in List ) is cells : Mixed_Subdivision; lftpts : Array_of_Lists(supports'range); begin Extract(n,mix,tt,lft,cells,lftpts); Before_Flattening(cells,lftpts); end Bef_Flat; procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_Flat (Bef_Flat); begin l := Embedding_before_Lifting(supports); C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t); lifted := Extract(n,mix,liftedl); Clear(liftedl); end Dynamic_Cayley_with_Flatt; procedure Dynamic_Cayley_with_New ( n : in natural; mix : in Vector; supports : in Array_of_Lists; order,inter : in boolean; maxli : in natural; lifted : out Array_of_Lists; mixsub : out Mixed_Subdivision; numtri : out natural ) is l,liftedl,liftedl_last : list; t : Triangulation; tmpsub,lastcells : Mixed_Subdivision; procedure Col_Flat ( nt : in Triangulation; l : List ) is -- DESCRIPTION : -- Updates the subdivision mixsub with the flattened cells. -- The triangulation on entry contains the whole triangulation, -- not just the new cells. cells : Mixed_Subdivision; begin if Is_Null(tmpsub) then cells := Extract_Mixed_Cells(n,mix,nt); Deflate(n,cells); else cells := Extract_non_Flat_Mixed_Cells(n,mix,nt); Deflate(n,cells); Construct(Head_Of(tmpsub),cells); end if; Flatten(cells); tmpsub := cells; end Col_Flat; procedure New_Cell ( tt : in Triangulation; pt : in vector ) is cells : Mixed_Subdivision := Extract_Mixed_Cells(n,mix,tt); index : natural := 1; begin Deflate(n,cells); for i in 1..mix'last-1 loop if pt(i+n) /= 0 then index := i+1; end if; exit when index > 1; end loop; Process_New_Cells(cells,index,pt); end New_Cell; procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_Flat_and_New (Before_Flattening => Col_Flat, Process_New_Simplices => New_Cell); begin l := Embedding_before_Lifting(supports); C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t); if Is_Null(tmpsub) then Extract_and_Clear(n,mix,t,liftedl,numtri,mixsub,lifted); else lastcells := Extract_non_Flat_Mixed_Cells(n,mix,t); Deflate(n,lastcells); Construct(Head_Of(tmpsub),lastcells); mixsub := lastcells; lifted := Extract(n,mix,liftedl); numtri := Length_Of(t); end if; end Dynamic_Cayley_with_New; procedure Dynamic_Cayley_with_Newt ( n : in natural; mix : in Vector; supports : in Array_of_Lists; order,inter : in boolean; maxli : in natural; lifted : out Array_of_Lists; t : in out Triangulation ) is l,liftedl,liftedl_last : list; procedure New_Cell ( tt : in Triangulation; pt : in vector ) is cells : Mixed_Subdivision := Extract_Mixed_Cells(n,mix,tt); index : natural := 1; begin Deflate(n,cells); for i in 1..mix'last-1 loop if pt(i+n) /= 0 then index := i+1; end if; exit when index > 1; end loop; Process_New_Cells(cells,index,pt); end New_Cell; procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_New(New_Cell); begin l := Embedding_before_Lifting(supports); C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t); lifted := Extract(n,mix,liftedl); Clear(liftedl); end Dynamic_Cayley_with_Newt; procedure Dynamic_Cayley_with_Flat_and_New ( n : in natural; mix : in Vector; supports : in Array_of_Lists; order,inter : in boolean; maxli : in natural; lifted : out Array_of_Lists; mixsub : out Mixed_Subdivision; numtri : out natural ) is l,liftedl,liftedl_last : list; t : Triangulation; tmpsub,lastcells : Mixed_Subdivision; procedure Bef_Flat ( tt : in Triangulation; lft : in List ) is cells,cells1 : Mixed_Subdivision; lftpts : Array_of_Lists(mix'range); begin Extract(n,mix,tt,lft,cells,lftpts); Before_Flattening(cells,lftpts); if Is_Null(tmpsub) then cells := Extract_Mixed_Cells(n,mix,tt); Deflate(n,cells); else cells := Extract_non_Flat_Mixed_Cells(n,mix,tt); Deflate(n,cells); Construct(Head_Of(tmpsub),cells); end if; Flatten(cells); tmpsub := cells; end Bef_Flat; procedure New_Cell ( tt : in Triangulation; pt : in vector ) is cells : Mixed_Subdivision := Extract_Mixed_Cells(n,mix,tt); index : natural := 1; begin Deflate(n,cells); for i in 1..mix'last-1 loop if pt(i+n) /= 0 then index := i+1; end if; exit when index > 1; end loop; Process_New_Cells(cells,index,pt); end New_Cell; procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_Flat_and_New (Before_Flattening => Bef_Flat, Process_New_Simplices => New_Cell); begin l := Embedding_before_Lifting(supports); C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t); if Is_Null(tmpsub) then Extract_and_Clear(n,mix,t,liftedl,numtri,mixsub,lifted); else lastcells := Extract_non_Flat_Mixed_Cells(n,mix,t); Deflate(n,lastcells); Construct(Head_Of(tmpsub),lastcells); mixsub := lastcells; numtri := Length_Of(t); end if; end Dynamic_Cayley_with_Flat_and_New; procedure Dynamic_Cayley_with_Flat_and_Newt ( n : in natural; mix : in Vector; supports : in Array_of_Lists; order,inter : in boolean; maxli : in natural; lifted : out Array_of_Lists; t : in out Triangulation ) is l,liftedl,liftedl_last : list; procedure Bef_Flat ( tt : in Triangulation; lft : in List ) is cells : Mixed_Subdivision; lftpts : Array_of_Lists(supports'range); begin Extract(n,mix,tt,lft,cells,lftpts); Before_Flattening(cells,lftpts); end Bef_Flat; procedure New_Cell ( tt : in Triangulation; pt : in vector ) is cells : Mixed_Subdivision := Extract_Mixed_Cells(n,mix,tt); index : natural := 1; begin Deflate(n,cells); for i in 1..mix'last-1 loop if pt(i+n) /= 0 then index := i+1; end if; exit when index > 1; end loop; Process_New_Cells(cells,index,pt); end New_Cell; procedure C_Dynamic_Lifting is new Dynamic_Lifting_with_Flat_and_New (Before_Flattening => Bef_Flat, Process_New_Simplices => New_Cell); begin l := Embedding_before_Lifting(supports); C_Dynamic_Lifting(l,order,inter,maxli,liftedl,liftedl_last,t); lifted := Extract(n,mix,liftedl); Clear(liftedl); end Dynamic_Cayley_with_Flat_and_Newt; end Cayley_Trick;