Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Dynlift/dynamic_triangulations.adb, Revision 1.1
1.1 ! maekawa 1: with Simplices; use Simplices;
! 2: with Global_Dynamic_Triangulation; use Global_Dynamic_Triangulation;
! 3: with Integer_Lifting_Utilities; use Integer_Lifting_Utilities;
! 4: with Dynamic_Lifting_Functions; use Dynamic_Lifting_Functions;
! 5:
! 6: package body Dynamic_Triangulations is
! 7:
! 8: -- UTILITIES :
! 9:
! 10: procedure Initialize
! 11: ( l : in List; order : in boolean;
! 12: rest,lifted,lifted_last : in out List;
! 13: t : in out Triangulation ) is
! 14:
! 15: -- DESCRIPTION :
! 16: -- Performs initialization of the dynamic lifting algorithm.
! 17:
! 18: -- ON ENTRY :
! 19: -- l the list of points to be processed;
! 20: -- order if true, then the order of the points will be considered;
! 21: -- lifted eventually points that already have been lifted;
! 22: -- t triangulation of the lifted points.
! 23:
! 24: -- ON RETURN :
! 25: -- rest rest of point list to be processed,
! 26: -- if empty, then the problem is degenerate;
! 27: -- lifted points in the initial simplex if t was empty,
! 28: -- otherwise left unchanged;
! 29: -- lifted_last pointer to the last element of lifted;
! 30: -- t if empty on entry, then it contains an initial simplex,
! 31: -- if the problem was not degenerate.
! 32:
! 33: null_list : List;
! 34: s : Simplex;
! 35:
! 36: begin
! 37: if Is_Null(t)
! 38: then Initial_Simplex(l,order,s,rest); -- start from scratch
! 39: if (s /= Null_Simplex)
! 40: then Construct(s,t);
! 41: lifted := Deep_Create(Vertices(s));
! 42: lifted_last := lifted;
! 43: while not Is_Null(Tail_Of(lifted_last)) loop
! 44: lifted_last := Tail_Of(lifted_last);
! 45: end loop;
! 46: else rest := null_list; -- degenerate problem
! 47: end if;
! 48: else rest := l; -- re-start
! 49: end if;
! 50: end Initialize;
! 51:
! 52: procedure Next_Point ( l : in out List; order : in boolean;
! 53: point : out Link_to_Vector ) is
! 54:
! 55: -- DESCRIPTION :
! 56: -- Selects the next point out of the list l.
! 57:
! 58: -- ON ENTRY :
! 59: -- l a nonempty list of points;
! 60: -- order if true, then the next point in the list will be choosen,
! 61: -- otherwise, the point will be picked randomly.
! 62:
! 63: -- ON RETURN :
! 64: -- l a list without the point;
! 65: -- point the choosen point.
! 66:
! 67: pt : Link_to_Vector;
! 68:
! 69: begin
! 70: if order
! 71: then pt := Head_Of(l);
! 72: else pt := Max_Extreme(l,Head_Of(l)'last,-5,5);
! 73: Swap_to_Front(l,pt);
! 74: end if;
! 75: l := Tail_Of(l);
! 76: point := pt;
! 77: end Next_Point;
! 78:
! 79: -- BASIC VERSION : WITHOUT OUTPUT GENERICS :
! 80:
! 81: procedure Dynamic_Lifting
! 82: ( l : in List; order,inter : in boolean;
! 83: maxli : in natural; lifted,lifted_last : in out List;
! 84: t : in out Triangulation ) is
! 85:
! 86: rest,inner : List;
! 87: pt : Link_to_Vector;
! 88: nexli : natural := 1;
! 89:
! 90: begin
! 91: Initialize(l,order,rest,lifted,lifted_last,t);
! 92: -- ITERATE FOR ALL POINTS IN rest :
! 93: while not Is_Null(rest) loop
! 94: Next_Point(rest,order,pt);
! 95: declare
! 96: point : Link_to_Vector := new Vector(1..pt'last+1);
! 97: begin
! 98: point(1..pt'last) := pt.all;
! 99: point(point'last) := 1; -- try to obtain an optimal lifting value !!
! 100: if inter and then Is_In(t,point.all)
! 101: then Clear(point); Construct(pt,inner);
! 102: else nexli := Lift_to_Place(t,point.all);
! 103: if (maxli > 0) and then (nexli > maxli)
! 104: then Flatten(t);
! 105: nexli := 1;
! 106: end if;
! 107: point(point'last) := nexli;
! 108: Update(t,point);
! 109: Append(lifted,lifted_last,point);
! 110: end if;
! 111: end;
! 112: end loop;
! 113: if inter -- lift out the interior points
! 114: then Constant_Lifting(inner,nexli,lifted,lifted_last);
! 115: end if;
! 116: exception
! 117: when numeric_error -- probably due to a too high lifting
! 118: => Flatten(t);
! 119: Dynamic_Lifting(rest,order,inter,maxli,lifted,lifted_last,t);
! 120: end Dynamic_Lifting;
! 121:
! 122: procedure Dynamic_Lifting_with_Flat
! 123: ( l : in List; order,inter : in boolean;
! 124: maxli : in natural; lifted,lifted_last : in out List;
! 125: t : in out Triangulation ) is
! 126:
! 127: rest,inner : List;
! 128: pt : Link_to_Vector;
! 129: nexli : natural := 1;
! 130:
! 131: begin
! 132: Initialize(l,order,rest,lifted,lifted_last,t);
! 133: -- ITERATE FOR ALL POINTS IN rest :
! 134: while not Is_Null(rest) loop
! 135: Next_Point(rest,order,pt);
! 136: declare
! 137: point : Link_to_Vector := new Vector(1..pt'last+1);
! 138: begin
! 139: point(1..pt'last) := pt.all;
! 140: point(point'last) := 1; -- try to obtain an optimal lifting value !!
! 141: if inter and then Is_In(t,point.all)
! 142: then Clear(point); Construct(pt,inner);
! 143: else nexli := Lift_to_Place(t,point.all);
! 144: if (maxli > 0) and then (nexli > maxli)
! 145: then Before_Flattening(t,lifted); Flatten(t);
! 146: nexli := 1;
! 147: end if;
! 148: point(point'last) := nexli;
! 149: Update(t,point);
! 150: Append(lifted,lifted_last,point);
! 151: end if;
! 152: end;
! 153: end loop;
! 154: if inter -- lift out the interior points
! 155: then Constant_Lifting(inner,nexli,lifted,lifted_last);
! 156: end if;
! 157: exception
! 158: when numeric_error -- probably due to a too high lifting
! 159: => Before_Flattening(t,lifted); Flatten(t);
! 160: Dynamic_Lifting_with_Flat
! 161: (rest,order,inter,maxli,lifted,lifted_last,t);
! 162: end Dynamic_Lifting_with_Flat;
! 163:
! 164: procedure Dynamic_Lifting_with_New
! 165: ( l : in List; order,inter : in boolean;
! 166: maxli : in natural; lifted,lifted_last : in out List;
! 167: t : in out Triangulation ) is
! 168:
! 169: rest,inner : List;
! 170: pt : Link_to_Vector;
! 171: nexli : natural := 1;
! 172: newt : Triangulation;
! 173:
! 174: begin
! 175: Initialize(l,order,rest,lifted,lifted_last,t);
! 176: -- ITERATE FOR ALL POINTS IN rest :
! 177: while not Is_Null(rest) loop
! 178: Next_Point(rest,order,pt);
! 179: declare
! 180: point : Link_to_Vector := new Vector(1..pt'last+1);
! 181: begin
! 182: point(1..pt'last) := pt.all;
! 183: point(point'last) := 1; -- try to obtain an optimal lifting value !!
! 184: if inter and then Is_In(t,point.all)
! 185: then Clear(point); Construct(pt,inner);
! 186: else nexli := Lift_to_Place(t,point.all);
! 187: if (maxli > 0) and then (nexli > maxli)
! 188: then Flatten(t);
! 189: nexli := 1;
! 190: end if;
! 191: point(point'last) := nexli;
! 192: Update(t,point,newt);
! 193: Process_New_Simplices(newt,point.all);
! 194: Append(lifted,lifted_last,point);
! 195: end if;
! 196: end;
! 197: end loop;
! 198: if inter -- lift out the interior points
! 199: then Constant_Lifting(inner,nexli,lifted,lifted_last);
! 200: end if;
! 201: exception
! 202: when numeric_error -- probably due to a too high lifting
! 203: => Flatten(t);
! 204: Dynamic_Lifting_with_New(rest,order,inter,maxli,lifted,lifted_last,t);
! 205: end Dynamic_Lifting_with_New;
! 206:
! 207: procedure Dynamic_Lifting_with_Flat_and_New
! 208: ( l : in List; order,inter : in boolean;
! 209: maxli : in natural; lifted,lifted_last : in out List;
! 210: t : in out Triangulation ) is
! 211:
! 212: rest,last,inner : List;
! 213: pt : Link_to_Vector;
! 214: nexli : natural := 1;
! 215: newt : Triangulation;
! 216:
! 217: begin
! 218: Initialize(l,order,rest,lifted,lifted_last,t);
! 219: -- ITERATE FOR ALL POINTS IN rest :
! 220: while not Is_Null(rest) loop
! 221: Next_Point(rest,order,pt);
! 222: declare
! 223: point : Link_to_Vector := new Vector(1..pt'last+1);
! 224: begin
! 225: point(1..pt'last) := pt.all;
! 226: point(point'last) := 1; -- try to obtain an optimal lifting value !!
! 227: if inter and then Is_In(t,point.all)
! 228: then Clear(point); Construct(pt,inner);
! 229: else nexli := Lift_to_Place(t,point.all);
! 230: if (maxli > 0) and then (nexli > maxli)
! 231: then Before_Flattening(t,lifted); Flatten(t);
! 232: nexli := 1;
! 233: end if;
! 234: point(point'last) := nexli;
! 235: Update(t,point,newt);
! 236: Process_New_Simplices(newt,point.all);
! 237: Append(lifted,lifted_last,point);
! 238: end if;
! 239: end;
! 240: end loop;
! 241: if inter -- lift out the interior points
! 242: then Constant_Lifting(inner,nexli,lifted,lifted_last);
! 243: end if;
! 244: exception
! 245: when numeric_error -- probably due to a too high lifting
! 246: => Before_Flattening(t,lifted); Flatten(t);
! 247: Dynamic_Lifting_with_Flat_and_New
! 248: (rest,order,inter,maxli,lifted,lifted_last,t);
! 249: end Dynamic_Lifting_with_Flat_and_New;
! 250:
! 251: end Dynamic_Triangulations;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>