Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Dynlift/cayley_embedding.adb, Revision 1.1
1.1 ! maekawa 1: with Standard_Integer_VecVecs; use Standard_Integer_VecVecs;
! 2:
! 3: package body Cayley_Embedding is
! 4:
! 5: -- AUXILIARIES :
! 6:
! 7: function Is_Good_Point
! 8: ( cnt,n : natural; pt : Link_to_Vector ) return boolean is
! 9:
! 10: -- DESCRIPTION :
! 11: -- Returns true if the point pt is a point of the type indicated
! 12: -- by the parameter cnt, i.e. whether it belongs to the polytope
! 13: -- placed on the vertex with number cnt.
! 14:
! 15: goodpoint : boolean;
! 16:
! 17: begin
! 18: if cnt = 0
! 19: then goodpoint := true;
! 20: for l in pt'first..pt'last-n-1 loop
! 21: if pt(l) /= 0
! 22: then goodpoint := false;
! 23: end if;
! 24: exit when not goodpoint;
! 25: end loop;
! 26: else goodpoint := (pt(cnt) = 1);
! 27: end if;
! 28: return goodpoint;
! 29: end Is_Good_Point;
! 30:
! 31: procedure Project ( n : natural; v : in out Link_to_Vector ) is
! 32:
! 33: -- DESCRIPTION :
! 34: -- After application, v points to a vector of length n+1.
! 35:
! 36: newv : Link_to_Vector;
! 37:
! 38: begin
! 39: newv := new Vector(1..n+1);
! 40: newv(1..n+1) := v(v'last-n..v'last);
! 41: Clear(v);
! 42: v := newv;
! 43: end Project;
! 44:
! 45: -- TARGET ROUTINES :
! 46:
! 47: function Embedding_Before_Lifting
! 48: ( supports : Array_of_Lists ) return List is
! 49:
! 50: tmp,res,res_last : List;
! 51: r1 : constant natural := supports'length-1;
! 52: pt : Link_to_Vector;
! 53: cnt : natural := 0;
! 54:
! 55: begin
! 56: for k in supports'range loop
! 57: tmp := supports(k);
! 58: while not Is_Null(tmp) loop
! 59: pt := Head_Of(tmp);
! 60: declare
! 61: npt : Vector(pt'first..pt'last+r1);
! 62: begin
! 63: npt(npt'last-pt'length+1..npt'last) := pt.all;
! 64: npt(npt'first..npt'first+r1-1) := (npt'first..npt'first+r1-1 => 0);
! 65: if cnt > 0
! 66: then npt(cnt) := 1;
! 67: end if;
! 68: Append(res,res_last,npt);
! 69: end;
! 70: tmp := Tail_Of(tmp);
! 71: end loop;
! 72: cnt := cnt + 1;
! 73: end loop;
! 74: return res;
! 75: end Embedding_Before_Lifting;
! 76:
! 77: function Extract ( vtp,n : natural; pts : VecVec ) return List is
! 78:
! 79: res,res_last : List;
! 80:
! 81: begin
! 82: for k in pts'range loop
! 83: if Is_Good_Point(vtp,n,pts(k))
! 84: then Append(res,res_last,pts(k).all);
! 85: end if;
! 86: end loop;
! 87: return res;
! 88: end Extract;
! 89:
! 90: function Extract ( vtp,n : natural; pts : List ) return List is
! 91:
! 92: -- DESCRIPTION :
! 93: -- Extracts the points out of the list that are of the type
! 94: -- indicated by vtp.
! 95:
! 96: tmp,res,res_last : List;
! 97: pt : Link_to_Vector;
! 98:
! 99: begin
! 100: tmp := pts;
! 101: while not Is_Null(tmp) loop
! 102: pt := Head_Of(tmp);
! 103: if Is_Good_Point(vtp,n,pt)
! 104: then Append(res,res_last,pt.all);
! 105: end if;
! 106: tmp := Tail_Of(tmp);
! 107: end loop;
! 108: return res;
! 109: end Extract;
! 110:
! 111: function Extract_Mixed_Cell
! 112: ( n : natural; mix : Vector; s : Simplex ) return Mixed_Cell is
! 113:
! 114: res : Mixed_Cell;
! 115: work : Array_of_Lists(mix'range);
! 116: cnt : natural := 0;
! 117: iscell : boolean;
! 118: pts : constant VecVec := Vertices(s);
! 119:
! 120: begin
! 121: for k in mix'range loop
! 122: work(k) := Extract(cnt,n,pts);
! 123: iscell := (Length_Of(work(k)) = mix(k)+1);
! 124: exit when not iscell;
! 125: cnt := cnt + 1;
! 126: end loop;
! 127: if iscell
! 128: then res.pts := new Array_of_Lists'(work);
! 129: res.nor := new vector'(Normal(s));
! 130: else Deep_Clear(work);
! 131: end if;
! 132: return res;
! 133: end Extract_Mixed_Cell;
! 134:
! 135: function Extract_Mixed_Cells
! 136: ( n : natural; mix : Vector; t : Triangulation )
! 137: return Mixed_Subdivision is
! 138:
! 139: res,res_last : Mixed_Subdivision;
! 140: s : Simplex;
! 141: tmp : Triangulation;
! 142:
! 143: begin
! 144: tmp := t;
! 145: while not Is_Null(tmp) loop
! 146: s := Head_Of(tmp);
! 147: declare
! 148: mic : Mixed_Cell := Extract_Mixed_Cell(n,mix,s);
! 149: begin
! 150: if mic.nor /= null
! 151: then Append(res,res_last,mic);
! 152: end if;
! 153: end;
! 154: tmp := Tail_Of(tmp);
! 155: end loop;
! 156: return res;
! 157: end Extract_Mixed_Cells;
! 158:
! 159: function Extract_non_Flat_Mixed_Cells
! 160: ( n : natural; mix : Vector; t : Triangulation )
! 161: return Mixed_Subdivision is
! 162:
! 163: res,res_last : Mixed_Subdivision;
! 164: s : Simplex;
! 165: tmp : Triangulation;
! 166:
! 167: begin
! 168: tmp := t;
! 169: while not Is_Null(tmp) loop
! 170: s := Head_Of(tmp);
! 171: exit when Is_Flat(s);
! 172: declare
! 173: mic : Mixed_Cell := Extract_Mixed_Cell(n,mix,s);
! 174: begin
! 175: if mic.nor /= null
! 176: then Append(res,res_last,mic);
! 177: end if;
! 178: end;
! 179: tmp := Tail_Of(tmp);
! 180: end loop;
! 181: return res;
! 182: end Extract_non_Flat_Mixed_Cells;
! 183:
! 184: procedure Deflate ( n : natural; l : in out List ) is
! 185:
! 186: tmp : List := l;
! 187:
! 188: begin
! 189: while not Is_Null(tmp) loop
! 190: declare
! 191: pt : Link_to_Vector := Head_Of(tmp);
! 192: begin
! 193: Project(n,pt);
! 194: Set_Head(tmp,pt);
! 195: end;
! 196: tmp := Tail_Of(tmp);
! 197: end loop;
! 198: end Deflate;
! 199:
! 200: procedure Deflate ( n : natural; mic : in out Mixed_Cell ) is
! 201: begin
! 202: Project(n,mic.nor);
! 203: for k in mic.pts'range loop
! 204: Deflate(n,mic.pts(k));
! 205: end loop;
! 206: end Deflate;
! 207:
! 208: procedure Deflate ( n : natural; mixsub : in out Mixed_Subdivision ) is
! 209:
! 210: tmp : Mixed_Subdivision := mixsub;
! 211:
! 212: begin
! 213: while not Is_Null(tmp) loop
! 214: declare
! 215: mic : Mixed_Cell := Head_Of(tmp);
! 216: begin
! 217: Deflate(n,mic);
! 218: Set_Head(tmp,mic);
! 219: end;
! 220: tmp := Tail_Of(tmp);
! 221: end loop;
! 222: end Deflate;
! 223:
! 224: end Cayley_Embedding;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>