with Graded_Lexicographic_Order; use Graded_Lexicographic_Order;
package body Integer_Support_Functions is
function Maximal_Support ( l : List; v : Vector ) return integer is
sp,max : integer;
tmp : List;
begin
if not Is_Null(l)
then max := Head_Of(l).all*v;
tmp := Tail_Of(l);
while not Is_Null(tmp) loop
sp := Head_Of(tmp).all*v;
if sp > max
then max := sp;
end if;
tmp := Tail_Of(tmp);
end loop;
return max;
else return 0;
end if;
end Maximal_Support;
function Minimal_Support ( l : List; v : Vector ) return integer is
sp,min : integer;
tmp : List;
begin
if not Is_Null(l)
then min := Head_Of(l).all*v;
tmp := Tail_Of(l);
while not Is_Null(tmp) loop
sp := Head_Of(tmp).all*v;
if sp < min
then min := sp;
end if;
tmp := Tail_Of(tmp);
end loop;
return min;
else return 0;
end if;
end Minimal_Support;
procedure Min_Max ( l : in List; k : in integer;
min,max : in out integer ) is
tmp : List;
v : Link_to_Vector;
begin
if not Is_Null(l)
then tmp := l;
v := Head_Of(tmp);
min := v(k); max := min;
tmp := Tail_Of(tmp);
while not Is_Null(tmp) loop
v := Head_Of(tmp);
if v(k) < min
then min := v(k);
elsif v(k) > max
then max := v(k);
end if;
tmp := Tail_Of(tmp);
end loop;
end if;
end Min_Max;
function Graded_Max ( l : List ) return Link_to_Vector is
res : Link_to_Vector := new Vector'(Head_Of(l).all);
tmp : List := Tail_Of(l);
ele : Link_to_Vector;
begin
while not Is_Null(tmp) loop
ele := Head_Of(tmp);
if ele > res
then res.all := ele.all;
end if;
tmp := Tail_Of(tmp);
end loop;
return res;
end Graded_Max;
function Face ( l : List; v : Vector; m : integer ) return List is
res,tmp,res_last : List;
d : Vector(v'range);
begin
tmp := l;
while not Is_Null(tmp) loop
d := Head_Of(tmp).all;
if d*v = m
then Append(res,res_last,d);
end if;
tmp := Tail_Of(tmp);
end loop;
return res;
end Face;
function Inner_Face ( l : List; v : Vector ) return List is
begin
return Face(l,v,Minimal_Support(l,v));
end Inner_Face;
function Outer_Face ( l : List; v : Vector ) return List is
begin
return Face(l,v,Maximal_Support(l,v));
end Outer_Face;
end Integer_Support_Functions;