with text_io; use text_io;
with Standard_Floating_Numbers; use Standard_Floating_Numbers;
with Generic_Lists;
with Standard_Complex_Solutions; use Standard_Complex_Solutions;
with Permutations,Symmetry_Group; use Permutations,Symmetry_Group;
package Orbits_of_Solutions is
-- DESCRIPTION :
-- This package contains routines for manipulating the
-- solutions set of a symmetric polynomial system.
-- DATA STRUCTURES :
type Orbit ( n : natural ) is record
orb : Permutation(1..n); -- data representing the orbit
-- e.g.: orb = [ 1 1 2 2 ] => solution is like (a,a,b,b) or (a,b,a,b)
nbdiff : natural; -- number of different values
nbgen : natural; -- number of generating solutions
nbsols : natural; -- number of solutions in the orbit
end record;
type Link_to_Orbit is access Orbit;
package Lists_of_Orbits is new Generic_Lists(Link_to_Orbit);
type List_of_Orbits is new Lists_of_Orbits.List;
-- CONSTRUCTORS :
function Generating ( sols : Solution_List; sign : boolean;
tol : double_float ) return Solution_List;
-- DESCRIPTION :
-- Returns a list of generating solutions, by permutations, all
-- other solutions in sols can be derived from the resulting list.
-- If sign is true, then also permutations who alter the sign of
-- the components are tried.
procedure Analyze ( l : in List_of_Permutations; sign : in boolean;
tol : in double_float; sols : in out Solution_List );
-- DESCRIPTION :
-- the solution list sols will be checked upon symmetry, according
-- to the list of permutations l
-- ON ENTRY :
-- l a list of permutations;
-- sign if true then sign symmetry has to be taken into account;
-- tol tolerance to decide wether two solutions are equal;
-- sols a list of solutions.
-- ON RETURN :
-- sols a list of solutions, where only one element per orbit
-- is in the list;
-- the multiplicity field is used to indicate the number
-- of elements in the orbit.
procedure Orbit_Structure
( s : in Solution; tol : in double_float;
orbit : in out Permutation; nbdiff : out natural);
-- DESCRIPTION :
-- This procedure returns the structure of the orbit of the solution.
-- ON ENTRY :
-- s a solution;
-- tol tolerance to decide wether two solutions are equal.
-- ON RETURN :
-- orbit orbit(i) = j means that x_i has the same value as x_j;
-- nbdiff the number of different values in the orbit.
function Orbits ( sols : Solution_List; tol : double_float )
return Permutation;
-- DESCRIPTION :
-- Let orb := Orbits(sols,tol),
-- then orb(i) gives the number of solutions belonging to an orbit
-- with i different values.
-- ON ENTRY :
-- sols a list of solutions;
-- tol tolerance to decide wether two solutions are equal.
procedure Orbits ( grp : in List_of_Permutations; tol : in double_float;
sols : in out Solution_List;
lorb : in out List_of_Orbits );
-- DESCRIPTION :
-- The list of solutions will be analyzed according to the
-- symmetry group. Together with the information on the orbits,
-- the list of generating solutions will be produced.
-- ON ENTRY :
-- grp a list of permutations representing the symmetry group;
-- tol used to compare two solutions;
-- sols the list of solutions.
-- ON RETURN :
-- sols the generating list of solutions;
-- lorb the list containing the information of the orbits.
-- SELECTOR :
function Same_Orbit ( orb1,orb2 : Permutation ) return boolean;
-- DESCRIPTION :
-- Returns true when the structures of the orbits are the same.
-- For example : 1 1 1 2 = 1 2 1 1, but 1 1 2 2 /= 2 2 1 2.
-- DESTRUCTOR :
procedure Clear ( lorb : in out List_of_Orbits );
-- DESCRIPTION :
-- All memory space allocated for lorb will be freed.
end Orbits_of_Solutions;