File : numerics.ads


with Ada.Text_IO, Ada.Numerics.Generic_Elementary_Functions, Reps;
use Reps, Ada.Text_IO;

pragma Elaborate (Reps);

package Numerics is

  pragma Elaborate_Body;

  type Numeric is new Rep;

  function Scal(R: Rep) return Numeric;
  function Scal(K: Integer) return Numeric;
  function Approx(N: Numeric) return Rep;
  function IsZero(S: Numeric) return Boolean;
  procedure SetZero(S: out Numeric);
  function Average(S,T: Numeric) return Numeric;
  function Disk(R1,R2: Rep) return Numeric;
  function MaxNorm(S: Numeric) return Radius;
  function Contains(S,T: Numeric) return Boolean;
  procedure Mult(K: in Integer; S: in out Numeric);
  procedure Prod(K: in Integer; S: in Numeric; T: out Numeric);
  function "*"(K: Integer; S: Numeric) return Numeric;
  procedure MultAdd(K: in Integer; S: in Numeric; T: in out Numeric);
  procedure Mult(R: in Rep; S: in out Numeric);
  procedure Prod(R: in Rep; S1: in Numeric; S2: out Numeric);
  function "*"(R: Rep; S: Numeric) return Numeric;
  procedure MultAdd(R: in Rep; S1: in Numeric; S2: in out Numeric);
  function "/"(S: Numeric; R: Rep) return Numeric;

  pragma Inline (Scal,Approx,IsZero,SetZero);

  function ReturnTrue(S: Numeric) return Boolean;
  function ReturnZero(S: Numeric) return Numeric;
  function ReturnZero(R: Rep) return Numeric;
  function Identity(S: Numeric) return Numeric;
  procedure ZeroOut(S: in out Numeric);

  function Norm(S: Numeric) return Numeric renames "abs";
  function Max(S,T: Numeric) return Numeric renames Numeric'Max;
  function Min(S,T: Numeric) return Numeric renames Numeric'Min;
  function Sup(S: Numeric) return Rep renames Approx;
  function Inf(S: Numeric) return Rep renames Approx;
  function IsNumeric(S: Numeric) return Boolean renames ReturnTrue;
  function IsNumbers(S: Numeric) return Boolean renames ReturnTrue;
  function IsSharp(S: Numeric) return Boolean renames ReturnTrue;
  function ModCenter(S: Numeric) return Numeric renames ReturnZero;
  procedure ModNumbers(S: in out Numeric) renames ZeroOut;
  procedure ToBalls(S: in out Numeric) renames ZeroOut;
  function ModNumbers(S: Numeric) return Numeric renames ReturnZero;
  function BallAt0(R: Rep) return Numeric renames ReturnZero;
  function BallAt0(S: Numeric) return Numeric renames ReturnZero;
  function DiskAt0(R: Rep) return Numeric renames ReturnZero;
  function DiskAt0(S: Numeric) return Numeric renames ReturnZero;
  function Center(S: Numeric) return Numeric renames Identity;
  function Disk(S: Numeric) return Numeric renames Identity;
  function CenterDisk(S: Numeric) return Numeric renames Identity;
  function Center0(S: Numeric) return Boolean renames IsZero;
  function Contains0(S: Numeric) return Boolean renames IsZero;
  function Union(S1,S2: Numeric) return Numeric renames Average;
  function Intersection(S1,S2: Numeric) return Numeric renames Average;

  procedure Neg(S: in out Numeric);
  procedure Neg(S: in Numeric; T: out Numeric);
  procedure Add(S: in Numeric; T: in out Numeric);
  procedure Sum(S,T: in Numeric; P: out Numeric);
  procedure Sub(S: in Numeric; T: in out Numeric);
  procedure Diff(S,T: in Numeric; P: out Numeric);
  procedure Mult(S: in Numeric; T: in out Numeric);
  procedure Prod(S,T: in Numeric; P: out Numeric);
  procedure MultAdd(S,T: in Numeric; P: in out Numeric);
  function Sqr(S: Numeric) return Numeric;
  function Inv(S: Numeric) return Numeric;
  procedure Div(S: in Numeric; T: in out Numeric);

  pragma Inline (Neg,Add,Sum,Sub,Diff,Mult,Prod,MultAdd,Sqr,Inv,Div);

  procedure ShowType(S: in Numeric);
  procedure Show1(N: in String; S: in Numeric);
  procedure Show2(N: in String; S1,S2: in Numeric);
  procedure Get(F: in File_Type; S: out Numeric; Decimal: in Boolean := True);
  procedure Put(F: in File_Type; S: in Numeric; Decimal: in Boolean := True);

  package EF is new Ada.Numerics.Generic_Elementary_Functions(Numeric);

  function Exp(S: Numeric) return Numeric renames EF.Exp;
  function Log(S: Numeric) return Numeric renames EF.Log;
  function Sqrt(S: Numeric) return Numeric renames EF.Sqrt;

  procedure UpMultAdd(R1,R2: in Rep; R3: in out Rep);

end Numerics;