File: [local] / OpenXM_contrib / PHC / Ada / Main / black_box_root_counting.adb (download)
Revision 1.1.1.1 (vendor branch), Sun Oct 29 17:45:23 2000 UTC (23 years, 11 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 integer_io; use integer_io;
with Timing_Package; use Timing_Package;
with Communications_with_User; use Communications_with_User;
with Standard_Integer_Vectors; use Standard_Integer_Vectors;
with Standard_Complex_Poly_Systems; use Standard_Complex_Poly_Systems;
with Standard_Complex_Poly_Systems_io; use Standard_Complex_Poly_Systems_io;
with Arrays_of_Integer_Vector_Lists; use Arrays_of_Integer_Vector_Lists;
with Standard_Complex_Solutions_io; use Standard_Complex_Solutions_io;
with Total_Degree_Start_Systems; use Total_Degree_Start_Systems;
with Partitions_of_Sets_Of_Unknowns; use Partitions_of_Sets_of_Unknowns;
with Partitions_of_Sets_Of_Unknowns_io; use Partitions_of_Sets_of_Unknowns_io;
with m_Homogeneous_Bezout_Numbers; use m_Homogeneous_Bezout_Numbers;
with m_Homogeneous_Start_Systems; use m_Homogeneous_Start_Systems;
with Set_Structure,Set_Structure_io;
with Degree_Sets_Tables; use Degree_Sets_Tables;
with Random_Product_System;
with Random_Product_Start_Systems; use Random_Product_Start_Systems;
with Integer_Mixed_Subdivisions; use Integer_Mixed_Subdivisions;
with Black_Mixed_Volume_Computations; use Black_Mixed_Volume_Computations;
procedure Black_Box_Root_Counting
( file : in file_type;
p : in out Poly_Sys; rc : out natural;
q : out Poly_Sys; qsols : out Solution_List;
rocotime,hocotime : out duration ) is
function Set_Structure_Bound ( p : Poly_Sys ) return natural is
begin
Random_Product_Start_Systems.Build_Set_Structure(p);
return Permanent(Degree_Sets_Tables.Create);
end Set_Structure_Bound;
procedure Count_Roots
( file : in file_type; p : in out Poly_Sys;
tode,mhbz,setb,mivo : out natural;
zz : out Partition; nz : out natural;
lifsup : out Link_to_Array_of_Lists;
mix : out Link_to_Vector; mixsub : out Mixed_Subdivision ) is
-- DESCRIPTION :
-- Computes four different root counts for the system p.
-- ON ENTRY :
-- file output file;
-- p a polynomial system.
-- ON RETURN :
-- tode total degree;
-- mhbz m-homogeneous Bezout number;
-- setb bound based on set structure;
-- mivo mixed volume;
-- zz partition used to compute mhbz;
-- nz number of sets in partition zz;
-- lifsup lifted supports of the system;
-- mix type of mixture;
-- mixsub mixed subdivision used to compute mivo.
timer : timing_widget;
n : constant natural := p'length;
d,bz,m,bs,mv : natural;
z : Partition(1..n);
begin
tstart(timer);
d := Total_Degree(p);
PB(p,bz,m,z);
bs := Set_Structure_Bound(p);
Black_Box_Mixed_Volume_Computation(p,mix,lifsup,mixsub,mv);
tstop(timer);
new_line(file);
put_line(file,"ROOT COUNTS :");
new_line(file);
put(file,"total degree : ");
put(file,d,1); new_line(file);
put(file,m,1); put(file,"-homogeneous Bezout number : ");
put(file,bz,1); new_line(file);
put(file," with partition : "); put(file,z(1..m)); new_line(file);
put(file,"general linear-product Bezout number : ");
put(file,bs,1); new_line(file);
put_line(file," based on the set structure :");
Set_Structure_io.put(file);
put(file,"mixed volume : "); put(file,mv,1); new_line(file);
new_line(file);
print_times(file,timer,"Root Counting");
tode := d; mhbz := bz; setb := bs; mivo := mv;
zz := z; nz := m;
rocotime := Elapsed_User_Time(timer);
end Count_Roots;
function Is_Minimum ( a,b,c,x : natural ) return boolean is
-- DESCRIPTION :
-- Returns true if x <= a, x <= b, and x <= c.
begin
return (x <= a) and (x <= b) and (x <= c);
end Is_Minimum;
procedure Construct_Start_System
( file : in file_type; p : in out Poly_Sys;
d,bz,bs,mv : in natural; z : in Partition;
mix : in Vector; lifted : in Array_of_Lists;
mixsub : in Mixed_Subdivision; roco : out natural;
qq : in out Poly_Sys; qqsols : in out Solution_List ) is
-- DESCRIPTION :
-- Constructs a start system for the minimal root count and least
-- amount of work.
-- ON ENTRY :
-- file output file;
-- p polynomial system;
-- d total degree;
-- bz m-homogeneous Bezout number;
-- bs Bezout number based on set structure;
-- mv mixed volume;
-- z partition that corresponds with bz;
-- mix type of mixture of the supports;
-- mixsub mixed subdivision used to computed mv.
-- ON RETURN :
-- roco minimum(d,bz,bs,mv);
-- qq start system;
-- qqsols solutions of qq.
timer : timing_widget;
n : constant natural := p'length;
nl : natural;
begin
new_line(file);
tstart(timer);
if Is_Minimum(bz,bs,mv,d)
then put_line(file,"START SYSTEM BASED ON TOTAL DEGREE :");
roco := d;
Start_System(p,qq,qqsols);
elsif Is_Minimum(d,bs,mv,bz)
then put(file,z'length,1);
put_line(file,"-HOMOGENEOUS START SYSTEM :");
roco := bz;
m_Homogeneous_Start_System(p,z,qq,qqsols);
elsif Is_Minimum(d,bz,mv,bs)
then put_line(file,"LINEAR-PRODUCT START SYSTEM : ");
roco := bs;
Random_Product_System.Init(n);
Build_Random_Product_System(n);
qq := Random_Product_System.Polynomial_System;
Random_Product_System.Solve(qqsols,nl);
Set_Structure.Clear;
Random_Product_System.Clear;
else put_line(file,"RANDOM COEFFICIENT START SYSTEM :");
roco := mv;
Black_Box_Polyhedral_Continuation
(p,mix,lifted,mixsub,qq,qqsols);
end if;
tstop(timer);
new_line(file);
put_line(file,qq);
new_line(file);
put_line(file,"START SOLUTIONS : ");
new_line(file);
put(file,Length_Of(qqsols),Head_Of(qqsols).n,qqsols);
new_line(file);
print_times(file,timer,"Construction of Start System");
hocotime := Elapsed_User_Time(timer);
end Construct_Start_System;
procedure Main is
d,bz,bs,mv : natural;
z : partition(p'range);
nz : natural;
mix : Standard_Integer_Vectors.Link_to_Vector;
mixsub : Mixed_Subdivision;
lifsup : Link_to_Array_of_Lists;
qq : Poly_Sys(p'range);
qqsols : Solution_List;
begin
Count_Roots(file,p,d,bz,bs,mv,z,nz,lifsup,mix,mixsub);
Construct_Start_System
(file,p,d,bz,bs,mv,z(1..nz),mix.all,lifsup.all,mixsub,rc,qq,qqsols);
q := qq; qsols := qqsols;
Clear(z);
Clear(mix);
Deep_Clear(lifsup);
Deep_Clear(mixsub);
end Main;
begin
Main;
end Black_Box_Root_Counting;