File : taylors2.ads


with Ada.Text_IO, Ints, Reps;
use Ada.Text_IO, Ints, Reps;

pragma Elaborate (Ints,Reps);

generic

  PDeg: in Natural;

-------------------- begin_include scalars Scalar

  type Scalar is private;

--- addition and multiplication
  with function IsZero(S: Scalar) return Boolean is  <>;
  with procedure SetZero(S: out Scalar) is <>;
  with procedure Neg(S: in out Scalar) is <>;
  with procedure Neg(S1: in Scalar; S2: out Scalar) is <>;
  with function "-"(S: Scalar) return Scalar is <>;
  with procedure Add(S1: in Scalar; S2: in out Scalar) is <>;
  with procedure Sum(S1,S2: in Scalar; S3: out Scalar) is <>;
  with function "+"(S1,S2: Scalar) return Scalar is <>;
  with procedure Sub(S1: in Scalar; S2: in out Scalar) is <>;
  with procedure Diff(S1,S2: in Scalar; S3: out Scalar) is <>;
  with function "-"(S1,S2: Scalar) return Scalar is <>;
  with procedure Mult(I: in Integer; S: in out Scalar) is <>;
  with procedure Prod(I: in Integer; S1: in Scalar; S2: out Scalar) is <>;
  with function "*"(I: Integer; S: Scalar) return Scalar is <>;
  with procedure MultAdd(I: Integer; S1: in Scalar; S2: in out Scalar) is <>;
  with procedure Mult(S1: in Scalar; S2: in out Scalar) is <>;
  with procedure Prod(S1,S2: in Scalar; S3: out Scalar) is <>;
  with function "*"(S1,S2: Scalar) return Scalar is <>;
  with procedure MultAdd(S1,S2: in Scalar; S3: in out Scalar) is <>;
  with function "**"(S: Scalar; I: Integer) return Scalar is <>;

--- conversion and i/o
  with function Scal(K: Integer) return Scalar is <>;
  with function Scal(R: Rep) return Scalar is <>;
  with procedure ShowType(S: in Scalar) is <>;
  with procedure Show1(N: in String; S: in Scalar) is <>;
  with procedure Show2(N: in String; S,S2: in Scalar) is <>;
  with procedure Get(F: in File_Type; S: out Scalar; Decimal: in Boolean := False) is <>;
  with procedure Put(F: in File_Type; S: in Scalar; Decimal: in Boolean := False) is <>;
-------------------- end_include scalars Scalar

-------------------- begin_include scalars-more Scalar

--- basic
  with function IsNumeric(S: Scalar) return Boolean is <>;
  with function IsSharp(S: Scalar) return Boolean is <>;
  with function IsNumbers(S: Scalar) return Boolean is <>;
  with procedure ModNumbers(S: in out Scalar) is <>;
  with procedure ToBalls(S: in out Scalar) is <>;
  with function Approx(S: Scalar) return Rep is <>;

--- sets
  with function Center0(S: Scalar) return Boolean is <>;
  with function Contains0(S: Scalar) return Boolean is <>;
  with function Contains(S1,S2: Scalar) return Boolean is <>;
  with function BallAt0(R: Rep) return Scalar is <>;
  with function BallAt0(S: Scalar) return Scalar is <>;
  with function DiskAt0(R: Rep) return Scalar is <>;
  with function DiskAt0(S: Scalar) return Scalar is <>;
  with function Disk(R1,R2: Rep) return Scalar is <>;
  with function Disk(S: Scalar) return Scalar is <>;
  with function Center(S: Scalar) return Scalar is <>;
  with function CenterDisk(S: Scalar) return Scalar is <>;
  with function ModCenter(S: Scalar) return Scalar is <>;
  with function Union(S1,S2: Scalar) return Scalar is <>;
  with function Intersection(S1,S2: Scalar) return Scalar is <>;

--- order
  with function "<"(S1,S2: Scalar) return Boolean is <>;
  with function "<="(S1,S2: Scalar) return Boolean is <>;
  with function ">="(S1,S2: Scalar) return Boolean is <>;
  with function ">"(S1,S2: Scalar) return Boolean is <>;
  with function Min(S1,S2: Scalar) return Scalar is <>;
  with function Max(S1,S2: Scalar) return Scalar is <>;
  with function Inf(S: Scalar) return Rep is <>;
  with function Sup(S: Scalar) return Rep is <>;

--- functions
  with function Norm(S: Scalar) return Scalar is <>;
  with function MaxNorm(S: Scalar) return Radius is <>;
  with function Sqr(S: Scalar) return Scalar is <>;
  with function "*"(R: Rep; S: Scalar) return Scalar is <>;
  with function "/"(S: Scalar; R: Rep) return Scalar is <>;
  with function Inv(S: Scalar) return Scalar is <>;
  with function "/"(S1,S2: Scalar) return Scalar is <>;
  with function Exp(S: Scalar) return Scalar is <>;
  with function Log(S: Scalar) return Scalar is <>;
  with function Sqrt(S: Scalar) return Scalar is <>;

-------------------- end_include scalars-more Scalar

  with procedure UpMultAdd(R1,R2: in Rep; R3: in out Rep) is <>;

package Taylors2 is -- Taylor series in 2 variables, say U and V

  pragma Elaborate_Body;

  subtype Power is Integer range 0 .. PDeg;
  type Components is array(Power,Power) of Scalar;

  type Taylor2 is
    record
      R: RadPair;     --- domain radii
      C: Components;  --- coefficients and errors
    end record;

  type Taylor2Mat is array(Integer range <>,Integer range <>) of Taylor2;

  procedure SetRho(R: in RadPair; F: in out Taylor2);  -- change domain radius
  function IsZero(F: Taylor2) return Boolean;          -- F=0
  function Zero_Taylor2 return Taylor2;                -- 0
  procedure SetZero(R: in RadPair; F: out Taylor2);    -- F=0
  procedure ZapConst(F: in out Taylor2);               -- modulo constant
  procedure AddConst(C: in Scalar; F: in out Taylor2); -- F+C
  procedure UnitVector(I,J: in Natural; R: in RadPair; F: out Taylor2);     -- UnitVector(I,J)
  function IsNumbers(F: Taylor2) return Boolean;       -- known to be a polynomial
  function CenterDisk(F: Taylor2) return Taylor2;      -- part that is known to be polynomial
  procedure ModNumbers(F: in out Taylor2);             -- part that may not be be polynomial
  procedure ModNumbers(F: in Taylor2; G: out Taylor2); -- part that may not be be polynomial
  function ModNumbers(F: Taylor2) return Taylor2;      -- part that may not be be polynomial
  function Norm(R: RadPair; F: Taylor2) return Scalar; -- ||F||_R
  function Norm(F: Taylor2) return Scalar;             -- ||F||_Rho(F)
  procedure ToBalls(F: in out Taylor2);                -- erase polynomial info

  procedure Neg(F: in out Taylor2);                    -- -F
  procedure Neg(F: in Taylor2; G: out Taylor2);        -- -F
  function "-"(F: Taylor2) return Taylor2;             -- -F
  procedure Add(F: in Taylor2; G: in out Taylor2);     -- F+G
  procedure Sum(F,G: in Taylor2; H: out Taylor2);      -- F+G
  function "+"(F,G: Taylor2) return Taylor2;           -- F+G
  procedure Sub(F: in Taylor2; G: in out Taylor2);     -- F-G
  procedure Diff(F,G: in Taylor2; H: out Taylor2);     -- F-G
  function "-"(F,G: Taylor2) return Taylor2;           -- F-G
  procedure Mult(K: in Integer; F: in out Taylor2);                   -- K*F
  procedure Prod(K: in Integer; F: in Taylor2; G: out Taylor2);       -- K*F
  function "*"(K: Integer; F: Taylor2) return Taylor2;                -- K*F
  procedure MultAdd(K: in Integer; F: in Taylor2; G: in out Taylor2); -- add K*F to G
  procedure Mult(S: in Scalar; F: in out Taylor2);                    -- S*F
  procedure Prod(S: in Scalar; F: in Taylor2; G: out Taylor2);        -- S*F
  function "*"(S: Scalar; F: Taylor2) return Taylor2;                 -- S*F
  procedure MultAdd(S: in Scalar; F: in Taylor2; G: in out Taylor2);  -- add S*F

  procedure Mult(F: in Taylor2; G: in out Taylor2);                   -- F*G
  procedure Prod(F,G: in Taylor2; H: out Taylor2);                    -- F*G
  function "*"(F,G: Taylor2) return Taylor2;                          -- F*G
  procedure MultAdd(F,G: in Taylor2; H: in out Taylor2);              -- add F*G to H
  procedure Scale(S1,S2: in Scalar; F: in out Taylor2);               -- F(S1.S2.)
  function Val(S1,S2: Scalar; F: Taylor2) return Scalar;                           -- F(S1,S2)
  procedure Ders(R: in RadPair; F0: in Taylor2; F: out Taylor2);                   -- 0th derivative
  procedure Ders(R: in RadPair; F0: in Taylor2; F,Fu,Fv: out Taylor2);             -- derivatives
  procedure Ders(R: in RadPair; F0: in Taylor2; F,Fu,Fv,Fuu,Fuv,Fvv: out Taylor2); -- derivatives
  procedure Ders(D: in Natural; R: in RadPair; F: in Taylor2; G: out Taylor2Mat);  -- derivatives

  procedure Show1(N: in String; H: in Taylor2);
  procedure Show2(N: in String; H1,H2: in Taylor2);
  procedure Get(F: in File_Type; H: out Taylor2; Decimal: in Boolean := False);
  procedure Put(F: in File_Type; H: in Taylor2; Decimal: in Boolean := False);
  procedure Read(Name: in String; H: out Taylor2; Decimal: in Boolean := False);
  procedure Write(Name: in String; H: in Taylor2; Decimal: in Boolean := False);

  --- auxiliary
  function InDomain(R: RadPair; F: Taylor2) return Boolean;
  function QuasiDeg1(D: Integer; F: Taylor2) return Integer;
  function QuasiDeg(F: Taylor2) return Integer;

  ScalZero:    constant Scalar    := Scal(0);
  ScalOne:     constant Scalar    := Scal(1);
  ScalNegOne:  constant Scalar    := Scal(-1);
  ScalTwo:     constant Scalar    := Scal(2);
  ScalFour:    constant Scalar    := Scal(4);
  Trunc:       constant Boolean   := IsNumeric(ScalZero);

private

  procedure Collect(R1,R2: in Radius; DF: in Natural; F: in out RepMatrix; G: in out Components);
  procedure MultAdd(DF,DG: in Natural; F,G: in Taylor2; H: in out Taylor2);
  procedure PolyDerU(F: in Taylor2; G: out Taylor2);
  procedure PolyDerV(F: in Taylor2; G: out Taylor2);
  function DerFac1(R1,R2: Radius) return Scalar;
  function DerFac2(R1,R2: Radius) return Scalar;

  T3:    constant Integer   := 3*Int(Trunc);
  EZero: constant RepMatrix := ZeroRepMat(2*PDeg);
  Tay_Zero: Taylor2;

end Taylors2;