with Integer_Faces_of_Polytope; use Integer_Faces_of_Polytope;
with Integer_Lifting_Functions; use Integer_Lifting_Functions;
with Integer_Pruning_Methods; use Integer_Pruning_Methods;
package body Mixed_Coherent_Subdivisions is
-- a polynomial system as lifting function :
function Mixed_Coherent_Subdivision
( n : natural; mix : Vector; points : Array_of_Lists;
lift : Poly_Sys ) return Mixed_Subdivision is
res : Mixed_Subdivision;
lifted : Array_of_Lists(mix'range);
nbsucc,nbfail : Standard_Floating_Vectors.Vector(mix'range)
:= (mix'range => 0.0);
begin
Mixed_Coherent_Subdivision(n,mix,points,lift,lifted,nbsucc,nbfail,res);
Deep_Clear(lifted);
return res;
end Mixed_Coherent_Subdivision;
procedure Mixed_Coherent_Subdivision
( n : in natural; mix : in Vector; points : in Array_of_Lists;
lift : in Poly_Sys; lifted : in out Array_of_Lists;
nbsucc,nbfail : in out Standard_Floating_Vectors.Vector;
mixsub : out Mixed_Subdivision ) is
fa : Array_of_Faces(mix'range);
index : natural := points'first;
begin
for k in lifted'range loop -- generate lower faces
lifted(k) := Polynomial_Lift(lift(k),points(index));
fa(k) := Create_Lower(mix(k),n+1,lifted(k));
index := index + mix(k);
end loop;
Create_CS(n,mix,fa,lifted,nbsucc,nbfail,mixsub); -- prune for mixed cells
Shallow_Clear(fa);
end Mixed_Coherent_Subdivision;
-- a user-defined lifting function :
function Mixed_Coherent_Subdivision
( n : natural; mix : Vector; points : Array_of_Lists;
linear : boolean; lift : VecVec )
return Mixed_Subdivision is
res : Mixed_Subdivision;
lifted : Array_of_Lists(mix'range);
nbsucc,nbfail : Standard_Floating_Vectors.Vector(mix'range)
:= (mix'range => 0.0);
begin
Mixed_Coherent_Subdivision
(n,mix,points,linear,lift,lifted,nbsucc,nbfail,res);
Deep_Clear(lifted);
return res;
end Mixed_Coherent_Subdivision;
procedure Mixed_Coherent_Subdivision
( n : in natural; mix : in Vector; points : in Array_of_Lists;
linear : in boolean; lift : VecVec;
lifted : in out Array_of_Lists;
nbsucc,nbfail : in out Standard_Floating_Vectors.Vector;
mixsub : out Mixed_Subdivision ) is
fa : Array_of_Faces(mix'range);
index : natural := points'first;
begin
for k in lifted'range loop -- compute lower faces
if linear
then lifted(k) := Linear_Lift(lift(k).all,points(index));
else lifted(k) := Point_Lift(lift(k).all,points(index));
end if;
fa(k) := Create_Lower(mix(k),n+1,lifted(k));
index := index + mix(k);
end loop;
Create_CS(n,mix,fa,lifted,nbsucc,nbfail,mixsub); -- prune for mixed cells
Shallow_Clear(fa);
end Mixed_Coherent_Subdivision;
-- a randomly generated lifting function :
function Mixed_Coherent_Subdivision
( n : natural; mix : Vector; points : Array_of_Lists;
linear : boolean; low,upp : Vector )
return Mixed_Subdivision is
res : Mixed_Subdivision;
lifted : Array_of_Lists(mix'range);
nbsucc,nbfail : Standard_Floating_Vectors.Vector(mix'range)
:= (mix'range => 0.0);
begin
Mixed_Coherent_Subdivision
(n,mix,points,linear,low,upp,lifted,nbsucc,nbfail,res);
Deep_Clear(lifted);
return res;
end Mixed_Coherent_Subdivision;
procedure Mixed_Coherent_Subdivision
( n : in natural; mix : in Vector; points : in Array_of_Lists;
linear : in boolean; low,upp : in Vector;
lifted : in out Array_of_Lists;
nbsucc,nbfail : in out Standard_Floating_Vectors.Vector;
mixsub : out Mixed_Subdivision ) is
fa : Array_of_Faces(mix'range);
index : natural := points'first;
begin
for k in lifted'range loop -- compute lower faces
if linear
then lifted(k) := Random_Linear_Lift(low(k),upp(k),points(index));
else lifted(k) := Random_Lift(low(k),upp(k),points(index));
end if;
fa(k) := Create_Lower(mix(k),n+1,lifted(k));
index := index + mix(k);
end loop;
Create_CS(n,mix,fa,lifted,nbsucc,nbfail,mixsub); -- prune for mixed cells
Shallow_Clear(fa);
end Mixed_Coherent_Subdivision;
end Mixed_Coherent_Subdivisions;