Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Dynlift/dynamic_lifting_functions.adb, Revision 1.1
1.1 ! maekawa 1: package body Dynamic_Lifting_Functions is
! 2:
! 3: function Lift_to_Place ( s : Simplex; x : Vector ) return integer is
! 4:
! 5: nor : constant Vector := Normal(s);
! 6: ips : integer := nor*Vertex(s,1);
! 7: ipx : integer := nor*x;
! 8:
! 9: begin
! 10: if ips < ipx
! 11: then return x(x'last);
! 12: else ipx := ipx - x(x'last)*nor(nor'last);
! 13: return ((ips - ipx)/nor(nor'last) + 1);
! 14: end if;
! 15: end Lift_to_Place;
! 16:
! 17: function Lift_to_Place ( t : Triangulation; x : Vector ) return integer is
! 18:
! 19: tmp : Triangulation := t;
! 20: wrk : Vector(x'range) := x;
! 21:
! 22: begin
! 23: while not Is_Null(tmp) loop
! 24: wrk(wrk'last) := Lift_to_Place(Head_Of(tmp),wrk);
! 25: tmp := Tail_Of(tmp);
! 26: end loop;
! 27: return wrk(wrk'last);
! 28: end Lift_to_Place;
! 29:
! 30: function Lift_to_Pull ( s : Simplex; x : Vector ) return integer is
! 31:
! 32: nor : constant Vector := Normal(s);
! 33: ips : integer := nor*Vertex(s,1);
! 34: ipx : integer := nor*x;
! 35:
! 36: begin
! 37: if ipx < ips
! 38: then return x(x'last);
! 39: else ipx := ipx - x(x'last)*nor(nor'last);
! 40: return ((ips - ipx)/nor(nor'last) - 1);
! 41: end if;
! 42: end Lift_to_Pull;
! 43:
! 44: function Lift_to_Pull ( t : Triangulation; x : Vector ) return integer is
! 45:
! 46: tmp : Triangulation := t;
! 47: wrk : Vector(x'range) := x;
! 48:
! 49: begin
! 50: while not Is_Null(tmp) loop
! 51: wrk(wrk'last) := Lift_to_Pull(Head_Of(tmp),wrk);
! 52: tmp := Tail_Of(tmp);
! 53: end loop;
! 54: return wrk(wrk'last);
! 55: end Lift_to_Pull;
! 56:
! 57: function Degenerate ( t : Triangulation; x : Vector ) return boolean is
! 58:
! 59: tmp : Triangulation := t;
! 60: s : Simplex;
! 61:
! 62: begin
! 63: while not Is_Null(tmp) loop
! 64: s := Head_Of(tmp);
! 65: declare
! 66: nor : constant Vector := Normal(s);
! 67: apt : constant Vector := Vertex(s,1);
! 68: ipx : constant integer := x*nor;
! 69: begin
! 70: if apt*nor = ipx
! 71: then return true;
! 72: end if;
! 73: end;
! 74: tmp := Tail_Of(tmp);
! 75: end loop;
! 76: return false;
! 77: end Degenerate;
! 78:
! 79: function Lift_to_Pull ( t1,t2 : Triangulation; x : Vector ) return integer is
! 80:
! 81: wrk : Vector(x'range) := x;
! 82:
! 83: begin
! 84: wrk(wrk'last) := Lift_to_Pull(t1,x);
! 85: while Degenerate(t2,wrk) loop -- pull the lifting further down
! 86: wrk(wrk'last) := wrk(wrk'last) - 1;
! 87: end loop;
! 88: return wrk(wrk'last);
! 89: end Lift_to_Pull;
! 90:
! 91: end Dynamic_Lifting_Functions;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>