Source code for tests.test_ActionSym
""" Tests properties of :class:`choreo.ActionSym`.
.. autosummary::
:toctree: _generated/
:template: tests-formatting/base.rst
:nosignatures:
test_Identity
test_Random
test_rotation_generation
test_Cayley_graph
"""
import pytest
from .test_config import *
import numpy as np
import scipy
import networkx
import choreo
[docs]
@ParametrizeDocstrings
@pytest.mark.parametrize("geodim", Physical_dims)
@pytest.mark.parametrize("nbody", Few_bodies)
def test_Identity(float64_tols, geodim, nbody):
""" Tests properties of the identity transformation.
"""
Id = choreo.ActionSym.Identity(nbody, geodim)
assert Id.IsIdentity(atol = float64_tols.atol)
assert Id.IsWellFormed(atol = float64_tols.atol)
Id2 = Id.Compose(Id)
assert Id2.IsIdentity(atol = float64_tols.atol)
InvId = Id.Inverse()
assert Id.IsSame(InvId, atol = float64_tols.atol)
[docs]
@ParametrizeDocstrings
@RepeatTest()
@pytest.mark.parametrize("geodim", Physical_dims)
@pytest.mark.parametrize("nbody", Few_bodies)
def test_Random(float64_tols, geodim, nbody):
""" Tests group properties on random transformations.
"""
Id = choreo.ActionSym.Identity(nbody, geodim)
A = choreo.ActionSym.Random(nbody, geodim)
AInv = A.Inverse()
assert A.IsWellFormed(atol = float64_tols.atol)
assert AInv.IsWellFormed(atol = float64_tols.atol)
assert Id.IsSame(A.Compose(AInv), atol = float64_tols.atol)
assert Id.IsSame(AInv.Compose(A), atol = float64_tols.atol)
B = choreo.ActionSym.Random(nbody, geodim)
BInv = B.Inverse()
assert not(A.IsSame(B, atol = float64_tols.atol))
AB = A.Compose(B)
BA = B.Compose(A)
assert AB.IsWellFormed(atol = float64_tols.atol)
assert BA.IsWellFormed(atol = float64_tols.atol)
n = AB.TimeShiftDen
for i in range(n):
tb = B.ApplyT(i, n)
tab = A.ApplyT(*tb)
assert tab == AB.ApplyT(i, n)
ABInv = AB.Inverse()
BAInv = BA.Inverse()
assert ABInv.IsWellFormed(atol = float64_tols.atol)
assert BAInv.IsWellFormed(atol = float64_tols.atol)
assert ABInv.IsSame(BInv.Compose(AInv), atol = float64_tols.atol)
assert BAInv.IsSame(AInv.Compose(BInv), atol = float64_tols.atol)
C = choreo.ActionSym.Random(nbody, geodim)
A_BC = A.Compose(B.Compose(C))
AB_C = A.Compose(B).Compose(C)
assert A_BC.IsWellFormed(atol = float64_tols.atol)
assert AB_C.IsWellFormed(atol = float64_tols.atol)
assert A_BC.IsSame(AB_C, atol = float64_tols.atol)
[docs]
@ParametrizeDocstrings
@pytest.mark.parametrize("geodim", Physical_dims)
def test_rotation_generation(float64_tols, geodim):
""" Tests parametrization of the orthogonal group.
"""
n = (geodim * (geodim - 1)) // 2
params = np.random.random(n)
idmat = np.identity(geodim,dtype=np.float64)
mat = choreo.ActionSym.SurjectiveDirectSpaceRot(params)
matTmat = np.matmul(mat.T,mat )
matmatT = np.matmul(mat ,mat.T)
assert np.allclose(matTmat, idmat, rtol = float64_tols.rtol, atol = float64_tols.atol)
assert np.allclose(matmatT, idmat, rtol = float64_tols.rtol, atol = float64_tols.atol)
assert abs(scipy.linalg.det(mat) - 1.) < float64_tols.atol
[docs]
@ParametrizeDocstrings
@pytest.mark.parametrize("Sym_list", [pytest.param(Sym_list, id=name) for name, Sym_list in SymList_dict.items()])
def test_Cayley_graph(Sym_list):
""" Tests properties of Cayley graphs.
Tests:
* Strong connectedness
* Regularity
"""
nsym = len(Sym_list)
if nsym < 1:
return
Sym = Sym_list[0]
nbody = Sym.BodyPerm.shape[0]
geodim = Sym.SpaceRot.shape[0]
CayleyGraph = choreo.ActionSym.BuildCayleyGraph(nbody, geodim, GeneratorList = Sym_list)
assert networkx.is_strongly_connected(CayleyGraph)
assert len(Sym_list) * CayleyGraph.number_of_nodes() == CayleyGraph.number_of_edges()
for node in CayleyGraph:
nneigh = 0
for neigh in CayleyGraph.successors(node):
nneigh += 1
assert nneigh == nsym
nneigh = 0
for neigh in CayleyGraph.predecessors(node):
nneigh += 1
assert nneigh == nsym