File : vectors.ads


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

pragma Elaborate (Reps);

generic

-------------------- 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
-------------------- begin_include components Scalar Component

  type Component is private;

--- vector space
  with procedure Mult(S: in Scalar; C: in out Component) is <>;
  with procedure Prod(S: in Scalar; C1: in Component; C2: out Component) is <>;
  with function "*"(S: Scalar; C: Component) return Component is <>;
  with procedure MultAdd(S: in Scalar; C1: in Component; C2: in out Component) is <>;

--- addition and multiplication
  with function IsZero(C: Component) return Boolean is  <>;
  with procedure SetZero(C: out Component) is <>;
  with procedure Neg(C: in out Component) is <>;
  with procedure Neg(C1: in Component; C2: out Component) is <>;
  with function "-"(C: Component) return Component is <>;
  with procedure Add(C1: in Component; C2: in out Component) is <>;
  with procedure Sum(C1,C2: in Component; C3: out Component) is <>;
  with function "+"(C1,C2: Component) return Component is <>;
  with procedure Sub(C1: in Component; C2: in out Component) is <>;
  with procedure Diff(C1,C2: in Component; C3: out Component) is <>;
  with function "-"(C1,C2: Component) return Component is <>;
  with procedure Mult(I: in Integer; C1: in out Component) is <>;
  with procedure Prod(I: in Integer; C1: in Component; C2: out Component) is <>;
  with function "*"(I: Integer; C: Component) return Component is <>;
  with procedure MultAdd(I: Integer; C1: in Component; C2: in out Component) is <>;
  with procedure Mult(C1: in Component; C2: in out Component) is <>;
  with procedure Prod(C1,C2: in Component; C3: out Component) is <>;
  with function "*"(C1,C2: Component) return Component is <>;
  with procedure MultAdd(C1,C2: in Component; C3: in out Component) is <>;

--- i/o
  with procedure Show1(N: in String; C: in Component) is <>;
  with procedure Show2(N: in String; C1,C2: in Component) is <>;
  with procedure Get(F: in File_Type; C: out Component; Decimal: in Boolean := False) is <>;
  with procedure Put(F: in File_Type; C: in Component; Decimal: in Boolean := False) is <>;
-------------------- end_include components

package Vectors is -- generic vectors and matrices

  type Vector is array(Integer range <>) of Component;

  function IsZero(V: Vector) return Boolean;                           -- V=0
  procedure SetZero(V: out Vector);                                    -- V := 0
  function EffLast(V: Vector) return Integer;                          -- last index mod zeros
  procedure Neg(V: in out Vector);                                     -- V := -V
  procedure Neg(V1: in Vector; V2: out Vector);                        -- V2 := -V1
  function "-"(V: Vector) return Vector;                               -- return -V
  procedure Add(V1: in Vector; V2: in out Vector);                     -- V2 := V2+V1
  procedure Sum(V1,V2: in Vector; V3: out Vector);                     -- V3 := V1+V2
  function "+"(V1,V2: Vector) return Vector;                           -- return V1+V2
  procedure Sub(V1: in Vector; V2: in out Vector);                     -- V2 := V2-V1
  procedure Diff(V1,V2: in Vector; V3: out Vector);                    -- V3 := V1-V2
  function "-"(V1,V2: Vector) return Vector;                           -- return V1-V2
  procedure Mult(K: in Integer; V: in out Vector);                     -- V := K*V
  procedure Prod(K: in Integer; V1: in Vector; V2: out Vector);        -- V2 := K*V1
  function "*"(K: Integer; V: Vector) return Vector;                   -- return K*V
  procedure Mult(S: in Scalar; V: in out Vector);                      -- V := S*V
  procedure Prod(S: in Scalar; V1: in Vector; V2: out Vector);         -- V2 := S*V1
  function "*"(S: Scalar; V: Vector) return Vector;                    -- return S*V
  procedure MultAdd(S: Scalar; V1: in Vector; V2: in out Vector);      -- V2 := V2+S*V1

  procedure Show1(N: in String; V: in Vector);
  procedure Show2(N: in String; V1,V2: in Vector);
  procedure Get(F: in File_Type; V: out Vector; Decimal: in Boolean := False);
  procedure Put(F: in File_Type; V: in Vector; Decimal: in Boolean := False);
  procedure Read(Name: in String; V: out Vector; Decimal: in Boolean := False);
  procedure Write(Name: in String; V: in Vector; Decimal: in Boolean := False);

  type Matrix is array(Integer range <>, Integer range <>) of Scalar;

  function IsZero(A: Matrix) return Boolean;
  procedure SetZero(A: out Matrix);
  procedure ZeroRow(I: in Integer; A: in out Matrix);
  procedure ZeroColumn(J: in Integer; A: in out Matrix);
  procedure AddConst(R: Rep; A: in out Matrix);
  function EffLast1(A: Matrix) return Integer;
  function EffLast2(A: Matrix) return Integer;
  procedure Transpose(A: in out Matrix);
  function Transpose(A: Matrix) return Matrix;
  procedure Neg(A: in out Matrix);
  procedure Neg(A1: in Matrix; A2: out Matrix);
  function "-"(A: Matrix) return Matrix;
  procedure Add(A1: in Matrix; A2: in out Matrix);
  procedure Sum(A1,A2: in Matrix; A3: out Matrix);
  function "+"(A1,A2: Matrix) return Matrix;
  procedure Sub(A1: in Matrix; A2: in out Matrix);
  procedure Diff(A1,A2: in Matrix; A3: out Matrix);
  function "-"(A1,A2: Matrix) return Matrix;
  procedure Mult(K: in Integer; A: in out Matrix);
  procedure Prod(K: in Integer; A1: in Matrix; A2: out Matrix);
  function "*"(K: Integer; A: Matrix) return Matrix;
  procedure Mult(S: in Scalar; A: in out Matrix);
  procedure Prod(S: in Scalar; A1: in Matrix; A2: out Matrix);
  function "*"(S: Scalar; A: Matrix) return Matrix;
  procedure MultAdd(S: in Scalar; A1: in Matrix; A2: in out Matrix);

  procedure Mult(A: in Matrix; V: in out Vector);
  procedure Prod(A: in Matrix; V1: in Vector; V2: out Vector);
  function "*"(A: Matrix; V: Vector) return Vector;
  procedure MultAdd(A: in Matrix; V1: in Vector; V2: in out Vector);
  procedure Mult(A1: in Matrix; A2: in out Matrix);
  procedure Prod(A1,A2: in Matrix; A3: out Matrix);
  function "*"(A1,A2: Matrix) return Matrix;
  procedure MultAdd(A1,A2: in Matrix; A3: in out Matrix);

  procedure Show1(N: in String; A: in Matrix);
  procedure Show2(N: in String; A1,A2: in Matrix);
  procedure Get(F: in File_Type; A: out Matrix; Decimal: in Boolean := True);
  procedure Put(F: in File_Type; A: in Matrix; Decimal: in Boolean := True);
  procedure Read(Name: in String; A: out Matrix; Decimal: in Boolean := False);
  procedure Write(Name: in String; A: in Matrix; Decimal: in Boolean := False);

end Vectors;