package body Exponent_Vectors is -- CREATORS : function Create ( p : Standard_Complex_Laur_Polys.Poly ) return VecVec is use Standard_Complex_Laur_Polys; res : VecVec(1..Number_of_Terms(p)); ind : natural := 0; procedure Add_Exponent ( t : in Term; continue : out boolean ) is begin ind := ind + 1; res(ind) := new Vector(t.dg'range); for i in t.dg'range loop res(ind)(i) := t.dg(i); end loop; continue := true; end Add_Exponent; procedure Add_Exponents is new Visiting_Iterator(Add_Exponent); begin Add_Exponents(p); return res; end Create; function Create ( p : Standard_Complex_Polynomials.Poly ) return VecVec is use Standard_Complex_Polynomials; res : VecVec(1..Number_of_Terms(p)); ind : natural := 0; procedure Add_Exponent ( t : in Term; continue : out boolean ) is begin ind := ind + 1; res(ind) := new Vector(t.dg'range); for i in t.dg'range loop res(ind)(i) := t.dg(i); end loop; continue := true; end Add_Exponent; procedure Add_Exponents is new Visiting_Iterator(Add_Exponent); begin Add_Exponents(p); return res; end Create; function Create ( p : Poly_Sys ) return Exponent_Vectors_Array is res : Exponent_Vectors_Array(p'range); begin for i in p'range loop declare cpi : constant VecVec := Create(p(i)); begin res(i) := new VecVec(cpi'range); for j in cpi'range loop res(i)(j) := cpi(j); end loop; end; -- a detour for GNAT 3.07 -- res(i) := new VecVec'(Create(p(i))); end loop; return res; end Create; function Create ( p : Laur_Sys ) return Exponent_Vectors_Array is res : Exponent_Vectors_Array(p'range); begin for i in p'range loop declare cpi : constant VecVec := Create(p(i)); begin res(i) := new VecVec(cpi'range); for j in cpi'range loop res(i)(j) := cpi(j); end loop; end; -- a detour for GNAT 3.07 -- res(i) := new VecVec'(Create(p(i))); end loop; return res; end Create; -- SELECTOR : function Position ( ev : VecVec; v : Vector ) return integer is begin for i in ev'range loop if Equal(ev(i).all,v) then return i; end if; end loop; return ev'last+1; end Position; -- EVALUATORS : function Eval ( e : Vector; c : Complex_Number; x : Standard_Complex_Vectors.Vector ) return Complex_Number is res : Complex_Number := c; begin for i in e'range loop for j in 1..e(i) loop res := res*x(i); end loop; for j in 1..-e(i) loop res := res/x(i); end loop; end loop; return res; end Eval; function Eval ( ev : VecVec; c,x : Standard_Complex_Vectors.Vector ) return Complex_Number is res : Complex_Number := Eval(ev(ev'first).all,c(c'first),x); begin for i in c'first+1..c'last loop res := res + Eval(ev(i).all,c(i),x); end loop; return res; end Eval; function Eval ( ev : Exponent_Vectors_Array; c : Standard_Complex_VecVecs.VecVec; x : Standard_Complex_Vectors.Vector ) return Standard_Complex_Vectors.Vector is res : Standard_Complex_Vectors.Vector(x'range); begin for i in ev'range loop res(i) := Eval(ev(i).all,c(i).all,x); end loop; return res; end Eval; -- DESTRUCTORS : procedure Clear ( v : in out Exponent_Vectors_Array ) is begin for i in v'range loop Deep_Clear(v(i)); end loop; end Clear; end Exponent_Vectors;