|
|
from sympy.core.symbol import symbols |
|
|
from sympy.sets.sets import FiniteSet |
|
|
from sympy.combinatorics.polyhedron import (Polyhedron, |
|
|
tetrahedron, cube as square, octahedron, dodecahedron, icosahedron, |
|
|
cube_faces) |
|
|
from sympy.combinatorics.permutations import Permutation |
|
|
from sympy.combinatorics.perm_groups import PermutationGroup |
|
|
from sympy.testing.pytest import raises |
|
|
|
|
|
rmul = Permutation.rmul |
|
|
|
|
|
|
|
|
def test_polyhedron(): |
|
|
raises(ValueError, lambda: Polyhedron(list('ab'), |
|
|
pgroup=[Permutation([0])])) |
|
|
pgroup = [Permutation([[0, 7, 2, 5], [6, 1, 4, 3]]), |
|
|
Permutation([[0, 7, 1, 6], [5, 2, 4, 3]]), |
|
|
Permutation([[3, 6, 0, 5], [4, 1, 7, 2]]), |
|
|
Permutation([[7, 4, 5], [1, 3, 0], [2], [6]]), |
|
|
Permutation([[1, 3, 2], [7, 6, 5], [4], [0]]), |
|
|
Permutation([[4, 7, 6], [2, 0, 3], [1], [5]]), |
|
|
Permutation([[1, 2, 0], [4, 5, 6], [3], [7]]), |
|
|
Permutation([[4, 2], [0, 6], [3, 7], [1, 5]]), |
|
|
Permutation([[3, 5], [7, 1], [2, 6], [0, 4]]), |
|
|
Permutation([[2, 5], [1, 6], [0, 4], [3, 7]]), |
|
|
Permutation([[4, 3], [7, 0], [5, 1], [6, 2]]), |
|
|
Permutation([[4, 1], [0, 5], [6, 2], [7, 3]]), |
|
|
Permutation([[7, 2], [3, 6], [0, 4], [1, 5]]), |
|
|
Permutation([0, 1, 2, 3, 4, 5, 6, 7])] |
|
|
corners = tuple(symbols('A:H')) |
|
|
faces = cube_faces |
|
|
cube = Polyhedron(corners, faces, pgroup) |
|
|
|
|
|
assert cube.edges == FiniteSet(*( |
|
|
(0, 1), (6, 7), (1, 2), (5, 6), (0, 3), (2, 3), |
|
|
(4, 7), (4, 5), (3, 7), (1, 5), (0, 4), (2, 6))) |
|
|
|
|
|
for i in range(3): |
|
|
cube.rotate(cube.pgroup[i]**2) |
|
|
|
|
|
assert cube.corners == corners |
|
|
|
|
|
for i in range(3, 7): |
|
|
cube.rotate(cube.pgroup[i]**2) |
|
|
|
|
|
assert cube.corners == corners |
|
|
cube.rotate(1) |
|
|
raises(ValueError, lambda: cube.rotate(Permutation([0, 1]))) |
|
|
assert cube.corners != corners |
|
|
assert cube.array_form == [7, 6, 4, 5, 3, 2, 0, 1] |
|
|
assert cube.cyclic_form == [[0, 7, 1, 6], [2, 4, 3, 5]] |
|
|
cube.reset() |
|
|
assert cube.corners == corners |
|
|
|
|
|
def check(h, size, rpt, target): |
|
|
|
|
|
assert len(h.faces) + len(h.vertices) - len(h.edges) == 2 |
|
|
assert h.size == size |
|
|
|
|
|
got = set() |
|
|
for p in h.pgroup: |
|
|
|
|
|
P = h.copy() |
|
|
hit = P.corners |
|
|
for i in range(rpt): |
|
|
P.rotate(p) |
|
|
if P.corners == hit: |
|
|
break |
|
|
else: |
|
|
print('error in permutation', p.array_form) |
|
|
for i in range(rpt): |
|
|
P.rotate(p) |
|
|
got.add(tuple(P.corners)) |
|
|
c = P.corners |
|
|
f = [[c[i] for i in f] for f in P.faces] |
|
|
assert h.faces == Polyhedron(c, f).faces |
|
|
assert len(got) == target |
|
|
assert PermutationGroup([Permutation(g) for g in got]).is_group |
|
|
|
|
|
for h, size, rpt, target in zip( |
|
|
(tetrahedron, square, octahedron, dodecahedron, icosahedron), |
|
|
(4, 8, 6, 20, 12), |
|
|
(3, 4, 4, 5, 5), |
|
|
(12, 24, 24, 60, 60)): |
|
|
check(h, size, rpt, target) |
|
|
|
|
|
|
|
|
def test_pgroups(): |
|
|
from sympy.combinatorics.polyhedron import (cube, tetrahedron_faces, |
|
|
octahedron_faces, dodecahedron_faces, icosahedron_faces) |
|
|
from sympy.combinatorics.polyhedron import _pgroup_calcs |
|
|
(tetrahedron2, cube2, octahedron2, dodecahedron2, icosahedron2, |
|
|
tetrahedron_faces2, cube_faces2, octahedron_faces2, |
|
|
dodecahedron_faces2, icosahedron_faces2) = _pgroup_calcs() |
|
|
|
|
|
assert tetrahedron == tetrahedron2 |
|
|
assert cube == cube2 |
|
|
assert octahedron == octahedron2 |
|
|
assert dodecahedron == dodecahedron2 |
|
|
assert icosahedron == icosahedron2 |
|
|
assert sorted(map(sorted, tetrahedron_faces)) == sorted(map(sorted, tetrahedron_faces2)) |
|
|
assert sorted(cube_faces) == sorted(cube_faces2) |
|
|
assert sorted(octahedron_faces) == sorted(octahedron_faces2) |
|
|
assert sorted(dodecahedron_faces) == sorted(dodecahedron_faces2) |
|
|
assert sorted(icosahedron_faces) == sorted(icosahedron_faces2) |
|
|
|