with Standard_Floating_Numbers; use Standard_Floating_Numbers;
with Generic_Lists;
with Standard_Complex_Numbers; use Standard_Complex_Numbers;
with Standard_Complex_Vectors; use Standard_Complex_Vectors;
package Standard_Complex_Solutions is
-- DESCRIPTION :
-- This package provides an abstraction of a list and an array
-- of solutions as vectors of standard complex numbers.
-- DATA STRUCTURES :
type Solution ( n : natural ) is record
t : Complex_Number; -- continuation parameter t
m : natural; -- multiplicity of the solution
v : Vector(1..n); -- the solution
err : double_float; -- error = |correction| from Newton
rco : double_float; -- inverse of condition number
res : double_float; -- norm of residual vector
end record;
type Link_to_Solution is access Solution;
package List_of_Solutions is new Generic_Lists(Link_to_Solution);
type Solution_List is new List_of_Solutions.List;
type Solution_Array is array ( positive range <> ) of Link_to_Solution;
-- CREATORS :
function Create ( sl : Solution_List ) return Solution_Array;
function Create ( sa : Solution_Array ) return Solution_List;
-- DESCRIPTION :
-- Allows the transition from a list to an array and vice versa.
-- COMPARISON and COPYING :
function Equal ( s1,s2 : Solution; tol : double_float ) return boolean;
-- DESCRIPTION :
-- Returns true if for each component
-- |s1.v(i)-s2.v(i)|/|s1.v(i)| < tol, for i in s1.v'range.
function Equal ( s1,s2 : Solution_List; tol : double_float ) return boolean;
function Equal ( s1,s2 : Solution_Array; tol : double_float ) return boolean;
-- DESCRIPTION :
-- Returns true if both lists of arrays are equal to each other, upon
-- the given tolerance for the relative error.
procedure Equals ( sols : in out Solution_List; flag : in natural;
tol : in double_float; same : out boolean );
-- DESCRIPTION :
-- The solutions that are equal to each other are marked with a flag.
procedure Equals ( sa : in Solution_Array; x : in Vector; i : in natural;
tol : in double_float; j : in out natural );
-- DESCRIPTION :
-- Compares the first i-1 vectors in sa with x.
-- ON ENTRY :
-- sa a solution array, containing at least i-1 elements;
-- x a vector;
-- i an index, normally the entry of x in sa;
-- tol tolerance for relative error on two vectors;
-- j must be equal to sa'first.
-- ON RETURN :
-- j the entry for which sa(j) equals x.
procedure Copy ( s1 : in Solution_List; s2 : in out Solution_List );
procedure Copy ( s1 : in Solution_Array; s2 : in out Solution_Array );
-- DESCRIPTION :
-- Makes a deep copy of the list or the array of solutions.
-- SELECTORS :
function Number ( sols : Solution_List; flag : natural ) return natural;
-- DESCRIPTION :
-- Returns the number of solutions in the list with a multiplicity
-- equal to flag.
function Is_In ( sols : Solution_List; s : Solution; tol : double_float )
return boolean;
function Is_In ( sa : Solution_Array; s : Solution; tol : double_float )
return boolean;
-- DESCRIPTION :
-- Returns true if the solution s belongs to the list or to the array.
function Get ( sols : Solution_List; pos : positive ) return Solution;
-- DESCRIPTION :
-- Returns the solution at the given position.
-- REQUIRED : pos <= Length_Of(sols).
-- CONSTRUCTORS :
procedure Append ( first,last : in out Solution_List; s : in Solution );
-- DESCRIPTION :
-- The solution sol is appended to the list first;
-- last is a pointer to the last element of the list first.
procedure Add ( sols : in out Solution_List; s : in Solution );
-- DESCRIPTION :
-- The solution sol is appended to the list sols.
procedure Add ( sols : in out Solution_List; s : in Solution;
tol : in double_float; other : out natural );
-- DESCRIPTION :
-- Append the solution to the list, if it does not already belong to it.
-- MODIFIERS :
procedure Change ( sols : in out Solution_List; pos : in positive;
s : in Solution; tol : in double_float;
other : out natural );
-- DESCRIPTION :
-- Changes the solution at the given position into s, if the solution
-- does not already occur.
-- REQUIRED : pos <= Length_Of(sols).
procedure Set_Continuation_Parameter
( sols : in out Solution_List; t : in Complex_Number );
-- DESCRIPTION :
-- All solutions in the list will be given the continuation parameter t.
procedure Change_Multiplicity
( sols : in out Solution_List; pos : in positive;
m : in natural );
-- DESCRIPTION :
-- Changes the multiplicity of the solution with the given position
-- into m.
-- REQUIRED : pos <= Length_Of(sols).
procedure Remove ( sols : in out Solution_List; pos : in positive );
-- DESCRIPTION :
-- Removes the solution with given position from the list.
-- REQUIRED : pos <= Length_Of(sols).
generic
with function To_Be_Removed ( flag : in natural ) return boolean;
procedure Delete ( sols : in out Solution_List );
-- DESCRIPTION :
-- Removes all solutions in s for which To_Be_Removed(s.m) holds.
procedure Remove_All ( sols : in out Solution_List; flag : in natural );
-- DESCRIPTION :
-- All solutions with a multiplicity equal to flag are removed.
-- DESTRUCTORS :
procedure Clear ( sa : in out Solution_Array );
procedure Clear ( ls : in out Link_to_Solution );
procedure Shallow_Clear ( sl : in out Solution_List );
procedure Deep_Clear ( sl : in out Solution_List );
-- DESCRIPTION :
-- Deallocation of the occupied memory space.
-- A shallow clear only deallocates the pointers,
-- so that the data may still be accessible by sharing,
-- whereas a deep clear also makes the data inaccessible.
end Standard_Complex_Solutions;