Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Product/multi_homogeneous_start_systems.adb, Revision 1.1
1.1 ! maekawa 1: with Standard_Floating_Numbers; use Standard_Floating_Numbers;
! 2: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
! 3: with Standard_Random_Numbers; use Standard_Random_Numbers;
! 4: with Standard_Natural_Vectors; use Standard_Natural_Vectors;
! 5: with Standard_Complex_Vectors;
! 6: with Standard_Complex_Matrices; use Standard_Complex_Matrices;
! 7: with Standard_Complex_Linear_Solvers; use Standard_Complex_Linear_Solvers;
! 8: with Standard_Complex_Polynomials; use Standard_Complex_Polynomials;
! 9:
! 10: with Sets_of_Unknowns; use Sets_of_Unknowns;
! 11: with Degrees_in_Sets_of_Unknowns; use Degrees_in_Sets_of_Unknowns;
! 12: with Partitions_of_Sets_of_Unknowns; use Partitions_of_Sets_of_Unknowns;
! 13: with Degree_Structure; use Degree_Structure;
! 14: with Random_Product_System;
! 15:
! 16: package body Multi_Homogeneous_Start_Systems is
! 17:
! 18: procedure Add_Hyperplanes ( i : in natural; p : in Poly;
! 19: z : in partition; m : in natural;
! 20: dg : in Standard_Natural_Vectors.Vector) is
! 21: -- DESCRIPTION :
! 22: -- This routine adds hyperplanes to the Random Product System
! 23: -- according to the partition and the degrees of the polynomial
! 24:
! 25: -- ON ENTRY :
! 26: -- i the number of the polynomial in the system;
! 27: -- p the i-the polynomial of the system;
! 28: -- z a partition of the set of unknowns of p;
! 29: -- m the number of sets in z;
! 30: -- dg the degrees of the polynomial in the sets of z,
! 31: -- for j in 1..m : dg(j) = Degree(p,z(j)).
! 32:
! 33: n : natural := Number_Of_Unknowns(p);
! 34: h : Standard_Complex_Vectors.Vector(0..n);
! 35:
! 36: begin
! 37: for k in 1..m loop
! 38: for l in 1..dg(k) loop
! 39: h(0) := random1;
! 40: for j in 1..n loop
! 41: if Is_In(z(k),j)
! 42: then h(j) := Random1;
! 43: else h(j) := Create(0.0);
! 44: end if;
! 45: end loop;
! 46: Random_Product_System.Add_Hyperplane(i,h);
! 47: end loop;
! 48: end loop;
! 49: end Add_Hyperplanes;
! 50:
! 51: procedure Construct_Random_Product_System ( p : in Poly_Sys ) is
! 52:
! 53: -- DESCRIPTION :
! 54: -- This procedure constructs a random product system by
! 55: -- finding a good partition for each equation of the system p.
! 56:
! 57: n : natural := p'length;
! 58: m : natural;
! 59: begin
! 60: if Degree_Structure.Empty
! 61: then Degree_Structure.Create(p);
! 62: end if;
! 63: for i in p'range loop
! 64: m := Degree_Structure.Get(i);
! 65: declare
! 66: z : Partition(1..m);
! 67: dg : Standard_Natural_Vectors.Vector(1..m);
! 68: begin
! 69: Degree_Structure.Get(i,z,dg);
! 70: Add_Hyperplanes(i,p(i),z,m,dg);
! 71: Clear(z);
! 72: end;
! 73: end loop;
! 74: end Construct_Random_Product_System;
! 75:
! 76: procedure RPQ ( p : in Poly_Sys; q : out Poly_Sys;
! 77: sols : in out Solution_List; nl : out natural) is
! 78:
! 79: n : natural := p'length;
! 80:
! 81: begin
! 82: Random_Product_System.Init(n);
! 83: Construct_Random_Product_System(p);
! 84: q := Random_Product_System.Polynomial_System;
! 85: Random_Product_System.Solve(sols,nl);
! 86: Degree_Structure.Clear;
! 87: Random_Product_System.Clear;
! 88: end RPQ;
! 89:
! 90: procedure Solve ( i,n : in natural; sols : in out Solution_List;
! 91: a : in out Matrix;
! 92: b : in out Standard_Complex_Vectors.Vector;
! 93: acc : in out partition ) is
! 94: begin
! 95: if i > n
! 96: then declare
! 97: aa : Matrix(a'range(1),a'range(2));
! 98: bb : Standard_Complex_Vectors.Vector(b'range);
! 99: rcond : double_float;
! 100: ipvt : Standard_Natural_Vectors.Vector(b'range);
! 101: begin
! 102: for k in a'range(1) loop
! 103: for l in a'range(2) loop
! 104: aa(k,l) := a(k,l);
! 105: end loop;
! 106: bb(k) := b(k);
! 107: end loop;
! 108: lufco(aa,n,ipvt,rcond);
! 109: -- put("rcond : "); put(rcond); new_line;
! 110: if rcond + 1.0 /= 1.0
! 111: then lusolve(aa,n,ipvt,bb);
! 112: declare
! 113: s : Solution(n);
! 114: begin
! 115: s.t := Create(0.0);
! 116: s.m := 1;
! 117: s.v := bb;
! 118: Add(sols,s);
! 119: end;
! 120: end if;
! 121: exception
! 122: when numeric_error => return;
! 123: end;
! 124: else declare
! 125: h : Standard_Complex_Vectors.Vector(0..n);
! 126: count : natural := 0;
! 127: z : Partition(1..n);
! 128: m : natural;
! 129: d : Standard_Natural_Vectors.Vector(1..n);
! 130: begin
! 131: Degree_Structure.Get(i,z,d);
! 132: m := Degree_Structure.Get(i);
! 133: for j1 in 1..m loop
! 134: if Degree_Structure.Admissible(acc,i-1,z(j1))
! 135: then acc(i) := Create(z(j1));
! 136: for j2 in 1..d(j1) loop
! 137: count := count + 1;
! 138: h := Random_Product_System.Get_Hyperplane(i,count);
! 139: b(i) := -h(0);
! 140: for k in 1..n loop
! 141: a(i,k) := h(k);
! 142: end loop;
! 143: Solve(i+1,n,sols,a,b,acc);
! 144: end loop;
! 145: Clear(acc(i));
! 146: else count := count + d(j1);
! 147: end if;
! 148: end loop;
! 149: Clear(z);
! 150: end;
! 151: end if;
! 152: end Solve;
! 153:
! 154: procedure Solve_Start_System
! 155: ( n : in natural; sols : in out Solution_List ) is
! 156:
! 157: m : Matrix(1..n,1..n);
! 158: v : Standard_Complex_Vectors.Vector(1..n);
! 159: acc : Partition(1..n);
! 160:
! 161: begin
! 162: for i in 1..n loop
! 163: for j in 1..n loop
! 164: m(i,j) := Create(0.0);
! 165: end loop;
! 166: v(i) := Create(0.0);
! 167: end loop;
! 168: Solve(1,n,sols,m,v,acc);
! 169: end Solve_Start_System;
! 170:
! 171: procedure GBQ ( p : in Poly_Sys; q : out Poly_Sys;
! 172: sols : in out Solution_List ) is
! 173:
! 174: n : natural := p'length;
! 175:
! 176: begin
! 177: Random_Product_System.Init(n);
! 178: Construct_Random_Product_System(p);
! 179: q := Random_Product_System.Polynomial_System;
! 180: Solve_Start_System(n,sols);
! 181: Degree_Structure.Clear;
! 182: Random_Product_System.Clear;
! 183: end GBQ;
! 184:
! 185: end Multi_Homogeneous_Start_Systems;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>