File: [local] / OpenXM_contrib / PHC / Ada / Root_Counts / Stalift / floating_lifting_functions.adb (download)
Revision 1.1.1.1 (vendor branch), Sun Oct 29 17:45:30 2000 UTC (23 years, 10 months ago) by maekawa
Branch: PHC, MAIN
CVS Tags: v2, maekawa-ipv6, RELEASE_1_2_3, RELEASE_1_2_2_KNOPPIX_b, RELEASE_1_2_2_KNOPPIX, RELEASE_1_2_2, RELEASE_1_2_1, HEAD Changes since 1.1: +0 -0
lines
Import the second public release of PHCpack.
OKed by Jan Verschelde.
|
with Standard_Random_Numbers; use Standard_Random_Numbers;
with Standard_Complex_Numbers; use Standard_Complex_Numbers;
with Standard_Complex_Vectors;
with Standard_Floating_VecVecs; use Standard_Floating_VecVecs;
package body Floating_Lifting_Functions is
-- AUXILIARIES :
function Flt2Cmplx ( x : Standard_Floating_Vectors.Vector )
return Standard_Complex_Vectors.Vector is
-- DESCRIPTION :
-- Returns a vector with complex entries.
res : Standard_Complex_Vectors.Vector(x'range);
begin
for i in x'range loop
res(i) := Create(x(i));
end loop;
return res;
end Flt2Cmplx;
-- RANDOM FLOATING-POINT LIFTING :
function Random_Lift ( lflow,lfupp : double_float ) return double_float is
res : double_float := random; -- in [-1,1]
begin
res := ((1.0+res)/2.0)*lflow + ((1.0-res)/2.0)*lfupp; -- in [lflow,lfupp]
return res;
end Random_Lift;
function Random_Lift ( v : Vector; lflow,lfupp : double_float )
return Vector is
res : Vector(v'first..v'last+1);
begin
res(v'range) := v;
res(res'last) := Random_Lift(lflow,lfupp);
return res;
end Random_Lift;
function Random_Lift ( l : List; lflow,lfupp : double_float ) return List is
res,res_last : List;
tmp : List := l;
begin
while not Is_Null(tmp) loop
Append(res,res_last,Random_Lift(Head_Of(tmp).all,lflow,lfupp));
tmp := Tail_Of(tmp);
end loop;
return res;
end Random_Lift;
function Random_Lift ( l : Arrays_of_Floating_Vector_Lists.Array_of_Lists;
lflow,lfupp : Vector )
return Arrays_of_Floating_Vector_Lists.Array_of_Lists is
res : Arrays_of_Floating_Vector_Lists.Array_of_Lists(l'range);
begin
for i in res'range loop
res(i) := Random_Lift(l(i),lflow(i),lfupp(i));
end loop;
return res;
end Random_Lift;
-- LINEAR LIFTING FUNCTIONS :
function Linear_Lift ( x,v : Vector ) return Vector is
res : Vector(x'first..x'last+1);
begin
res(x'range) := x;
res(res'last) := x*v;
return res;
end Linear_Lift;
function Linear_Lift ( f : Face; v : Vector ) return Face is
res : Face := new VecVec(f'range);
begin
for i in res'range loop
res(i) := new Standard_Floating_Vectors.Vector'(Linear_Lift(f(i).all,v));
end loop;
return res;
end Linear_Lift;
function Linear_Lift ( l : List; v : Vector ) return List is
-- DESCRIPTION :
-- Returns a linearly lifted list of points.
res,res_last : List;
tmp : List := l;
begin
while not Is_Null(tmp) loop
Append(res,res_last,Linear_Lift(Head_Of(tmp).all,v));
tmp := Tail_Of(tmp);
end loop;
return res;
end Linear_Lift;
function Linear_Lift ( f : Faces; v : Vector ) return Faces is
res,res_last : Faces;
tmp : Faces := f;
begin
while not Is_Null(tmp) loop
Append(res,res_last,Linear_Lift(Head_Of(tmp),v));
tmp := Tail_Of(tmp);
end loop;
return res;
end Linear_Lift;
-- RANDOM FLOATING-POINT LINEAR LIFTING :
function Random ( n : natural; lflow,lfupp : double_float ) return Vector is
res : Vector(1..n);
begin
for i in res'range loop
res(i) := Random_Lift(lflow,lfupp);
end loop;
return res;
end Random;
-- POLYNOMIAL LIFTING FUNCTIONS :
function Polynomial_Lift ( lf : Poly; x : Vector ) return Vector is
res : Vector(x'first..x'last+1);
begin
res(x'range) := x;
res(res'last) := REAL_PART(Eval(lf,Flt2Cmplx(x)));
return res;
end Polynomial_Lift;
function Polynomial_Lift ( lf : Eval_Poly; x : Vector ) return Vector is
res : Vector(x'first..x'last+1);
begin
res(x'range) := x;
res(res'last) := REAL_PART(Eval(lf,Flt2Cmplx(x)));
return res;
end Polynomial_Lift;
function Polynomial_Lift ( lf : Poly; l : List ) return List is
res,res_last,tmp : List;
begin
tmp := l;
while not Is_Null(tmp) loop
Append(res,res_last,Polynomial_Lift(lf,Head_Of(tmp).all));
tmp := Tail_Of(tmp);
end loop;
return res;
end Polynomial_Lift;
function Polynomial_Lift ( lf : Eval_Poly; l : List ) return List is
res,res_last,tmp : List;
begin
tmp := l;
while not Is_Null(tmp) loop
Append(res,res_last,Polynomial_Lift(lf,Head_Of(tmp).all));
tmp := Tail_Of(tmp);
end loop;
return res;
end Polynomial_Lift;
function Polynomial_Lift ( lf : Poly_Sys; l : Array_of_Lists )
return Array_of_Lists is
res : Array_of_Lists(l'range);
begin
for i in res'range loop
res(i) := Polynomial_Lift(lf(i),l(i));
end loop;
return res;
end Polynomial_Lift;
function Polynomial_Lift ( lf : Eval_Poly_Sys; l : Array_of_Lists )
return Array_of_Lists is
res : Array_of_Lists(l'range);
begin
for i in res'range loop
res(i) := Polynomial_Lift(lf(i),l(i));
end loop;
return res;
end Polynomial_Lift;
end Floating_Lifting_Functions;