Coding of Polyhedron exchange transformations (PETs)¶
Coding of Polyhedron exchange transformations (PETs)
Coding of Z^2actions given by a tuple of Polyhedron exchange transformations (PETs) and one polyhedron partition
EXAMPLES:
A polyhedron partition:
sage: from slabbe import PolyhedronPartition
sage: from slabbe import PolyhedronExchangeTransformation as PET
AUTHORS:
Sébastien Labbé, January 2020, initial version

class
slabbe.coding_of_PETs.
PETsCoding
(PETs, partition)¶ Bases:
object
Coding of a tuple of commuting PETs by a partition
INPUT:
PETs
– tuple of PolyhedronExchangeTransformationpartition
– polyhedron partition
EXAMPLES:
sage: from slabbe import PolyhedronPartition sage: h = 1/3 sage: p = Polyhedron([(0,h),(0,1),(h,1)]) sage: q = Polyhedron([(0,0), (0,h), (h,1), (h,0)]) sage: r = Polyhedron([(h,1), (1,1), (1,h), (h,0)]) sage: s = Polyhedron([(h,0), (1,0), (1,h)]) sage: P = PolyhedronPartition({0:p, 1:q, 2:r, 3:s}) sage: from slabbe import PolyhedronExchangeTransformation as PET sage: base = identity_matrix(2) sage: Re1 = PET.toral_translation(base, vector((2/3, 0))) sage: Re2 = PET.toral_translation(base, vector((0, 1/4))) sage: from slabbe import PETsCoding sage: PETsCoding((Re1,Re2), P) Coding of PETs (Polyhedron Exchange Transformation of Polyhedron partition of 2 atoms with 2 letters with translations {0: (2/3, 0), 1: (1/3, 0)}, Polyhedron Exchange Transformation of Polyhedron partition of 2 atoms with 2 letters with translations {0: (0, 1/4), 1: (0, 3/4)}) by partition Polyhedron partition of 4 atoms with 4 letters

ambient_space
()¶ TODO: Maybe we want to make the union with the ambient space of the PETs?

configuration
(x0)¶

cylinder
(pattern)¶ Return the coding region of the pattern.
INPUT:
pattern
– list of lists or dict of positions to code
OUTPUT:
polyhedron partition (containing probably only one atom, or more to handle the case of union of polyhedrons)
EXAMPLES:
sage: from slabbe import PolyhedronPartition sage: h = 1/3 sage: p = Polyhedron([(0,h),(0,1),(h,1)]) sage: q = Polyhedron([(0,0), (0,h), (h,1), (h,0)]) sage: r = Polyhedron([(h,1), (1,1), (1,h), (h,0)]) sage: s = Polyhedron([(h,0), (1,0), (1,h)]) sage: P = PolyhedronPartition({0:p, 1:q, 2:r, 3:s}) sage: from slabbe import PolyhedronExchangeTransformation as PET sage: base = identity_matrix(2) sage: Re1 = PET.toral_translation(base, vector((2/3, 0))) sage: Re2 = PET.toral_translation(base, vector((0, 1/4))) sage: from slabbe import PETsCoding sage: X_P_R = PETsCoding((Re1,Re2), P) sage: pattern = [[1, 1, 0, 0, 1], [3, 2, 2, 2, 3], [2, 2, 2, 2, 2]] sage: C = X_P_R.cylinder(pattern) sage: C Polyhedron partition of 1 atoms with 1 letters sage: atom = C.atoms()[0] sage: atom A 2dimensional polyhedron in QQ^2 defined as the convex hull of 6 vertices sage: atom.vertices() (A vertex at (1/9, 1/18), A vertex at (5/24, 1/4), A vertex at (0, 0), A vertex at (1/6, 1/4), A vertex at (1/18, 7/36), A vertex at (0, 1/12)) sage: v = vector((1/7, 1/7)) sage: v.set_immutable() sage: v in atom True

partition_for_patterns
(sizes)¶ Return the coding region of the pattern.
INPUT:
pattern
– list of lists or dict of the form{positions:code}
OUTPUT:
polyhedron partition (containing probably only one atom, or more to handle the case of union of polyhedrons)
EXAMPLES:
sage: from slabbe import PolyhedronPartition sage: h = 1/3 sage: p = Polyhedron([(0,h),(0,1),(h,1)]) sage: q = Polyhedron([(0,0), (0,h), (h,1), (h,0)]) sage: r = Polyhedron([(h,1), (1,1), (1,h), (h,0)]) sage: s = Polyhedron([(h,0), (1,0), (1,h)]) sage: P = PolyhedronPartition({0:p, 1:q, 2:r, 3:s}) sage: from slabbe import PolyhedronExchangeTransformation as PET sage: base = identity_matrix(2) sage: Re1 = PET.toral_translation(base, vector((2/3, 0))) sage: Re2 = PET.toral_translation(base, vector((0, 1/4))) sage: from slabbe import PETsCoding sage: X_P_R = PETsCoding((Re1,Re2), P) sage: X_P_R.partition_for_patterns((2,2)) (Polyhedron partition of 24 atoms with 24 letters, {0: [[0, 0], [2, 2]], 1: [[0, 1], [2, 2]], 2: [[0, 1], [2, 3]], 3: [[1, 0], [2, 2]], 4: [[1, 0], [3, 2]], 5: [[1, 1], [2, 2]], 6: [[1, 1], [3, 2]], 7: [[1, 1], [3, 3]], 8: [[1, 1], [2, 3]], 9: [[2, 2], [0, 0]], 10: [[2, 2], [1, 0]], 11: [[2, 2], [1, 1]], 12: [[2, 2], [2, 2]], 13: [[2, 2], [0, 1]], 14: [[2, 2], [1, 1]], 15: [[2, 2], [2, 2]], 16: [[2, 3], [0, 1]], 17: [[2, 3], [1, 1]], 18: [[2, 3], [2, 2]], 19: [[2, 3], [2, 3]], 20: [[3, 2], [1, 1]], 21: [[3, 2], [2, 2]], 22: [[3, 2], [3, 2]], 23: [[3, 3], [3, 2]]}) sage: X_P_R.partition_for_patterns((1,3)) (Polyhedron partition of 18 atoms with 18 letters, {0: [[0, 0, 0]], 1: [[0, 0, 1]], 2: [[0, 1, 0]], 3: [[0, 1, 1]], 4: [[1, 0, 0]], 5: [[1, 0, 1]], 6: [[1, 1, 0]], 7: [[1, 1, 1]], 8: [[1, 1, 1]], 9: [[1, 1, 1]], 10: [[2, 2, 2]], 11: [[2, 2, 2]], 12: [[2, 2, 2]], 13: [[2, 2, 3]], 14: [[2, 3, 2]], 15: [[2, 3, 3]], 16: [[3, 2, 2]], 17: [[3, 3, 2]]})

pattern
(x0, sizes)¶ Return the pattern obtained as the coding of the orbit of some starting point by the application of the PETs a certain number of times given by the tuple of sizes.
TODO: add a input direction when the point lies in more than one atoms
INPUT:
x0
– point in the domain of the partitionsizes
– tuple of integers
OUTPUT:
list of lists (using cartesian coordinates)
EXAMPLES:
sage: from slabbe import PolyhedronPartition sage: h = 1/3 sage: p = Polyhedron([(0,h),(0,1),(h,1)]) sage: q = Polyhedron([(0,0), (0,h), (h,1), (h,0)]) sage: r = Polyhedron([(h,1), (1,1), (1,h), (h,0)]) sage: s = Polyhedron([(h,0), (1,0), (1,h)]) sage: P = PolyhedronPartition({0:p, 1:q, 2:r, 3:s}) sage: from slabbe import PolyhedronExchangeTransformation as PET sage: base = identity_matrix(2) sage: Re1 = PET.toral_translation(base, vector((2/3, 0))) sage: Re2 = PET.toral_translation(base, vector((0, 1/4))) sage: from slabbe import PETsCoding sage: X_P_R = PETsCoding((Re1,Re2), P) sage: X_P_R.pattern((1/7,1/7), (3,5)) [[1, 1, 0, 0, 1], [3, 2, 2, 2, 3], [2, 2, 2, 2, 2]]
When the point lies on the boundary, it currently raises an error:
sage: X_P_R.pattern((0,0), (3,5)) Traceback (most recent call last): ... ValueError: polyhedron p whose vertices are (A vertex at (0, 3/4),) lies in more than one atoms (=[0, 1])