Interval exchange families¶
File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 1)
Linear families of interval exchange transformations
- class surface_dynamics.interval_exchanges.iet_family.IETFamily¶
Bases:
object
File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 141)
A linear family of interval exchange transformations
This class consists of two attributes:
a permutation (must be labeled)
a cone of lengths (a subcone of the positive cone)
EXAMPLES:
sage: from surface_dynamics import * sage: p = iet.Permutation('a b c d', 'd c b a') sage: F = iet.IETFamily(p, (ZZ**4).basis()) # optional: pplpy sage: F # optional: pplpy top 0 1 2 3 bot 3 2 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 sage: iet.IETFamily(p, [(2,3,0,0), (0,1,1,1)]) # optional: pplpy top 0 1 2 3 bot 3 2 1 0 0 1 1 1 2 3 0 0 sage: iet.IETFamily(p, [(1,0,0,0), (1,-1,1,1)]) # optional: pplpy Traceback (most recent call last): ... ValueError: C must be a subcone of the non-negative cone sage: iet.IETFamily(p, Polyhedron(vertices=[(0,0,0,0), (1,0,0,0),(0,1,0,0),(1,1,1,1)])) # optional: pplpy Traceback (most recent call last): ... ValueError: should have only zero as vertices
- children()¶
File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 503)
Compute the children of the pair
(p, C)
composed of a permutation and a slice of a Rauzy simplex.EXAMPLES:
sage: from surface_dynamics import * sage: p = iet.Permutation('a b c d', 'd c b a') sage: F = iet.IETFamily(p, Polyhedron(rays=(ZZ**4).basis())) # optional: pplpy sage: top, bot = F.children() # optional: pplpy sage: top[0] # optional: pplpy 't' sage: top[1] # optional: pplpy top 0 1 2 3 bot 3 0 2 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 sage: bot[0] # optional: pplpy 'b' sage: bot[1] # optional: pplpy top 0 3 1 2 bot 3 2 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 sage: p = iet.Permutation('a b c d e f', 'e b f c a d') sage: F = iet.IETFamily(p, Polyhedron(rays=[(1,1,1,1,1,2),(0,1,0,1,0,1)])) # optional: pplpy sage: c = F.children() # optional: pplpy sage: len(c) # optional: pplpy 1 sage: c[0][0] # optional: pplpy 't' sage: c[0][1] # optional: pplpy top 0 1 2 3 4 5 bot 4 1 5 3 2 0 0 1 0 1 0 0 1 1 1 1 1 1 sage: F = iet.IETFamily(p, Polyhedron(rays=[(0,0,0,1,0,0),(1,0,0,0,0,0),(1,1,1,1,1,1)])) # optional: pplpy sage: c = F.children() # optional: pplpy sage: len(c) # optional: pplpy 1 sage: c[0][0] # optional: pplpy 'b' sage: c[0][1] # optional: pplpy top 0 1 2 3 5 4 bot 4 1 5 2 0 3 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 0 1 1
- has_connection()¶
File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 444)
Check whether this family has a connection.
EXAMPLES:
sage: from surface_dynamics import * sage: p = iet.Permutation('A B C D E', 'E D C B A') sage: C0 = Polyhedron(rays=(ZZ**5).basis()) sage: iet.IETFamily(p, C0).has_connection() # optional: pplpy False sage: C = Polyhedron(rays=[(1,2,3,2,3),(1,1,0,0,2)]) sage: iet.IETFamily(p, C).has_connection() # optional: pplpy True sage: C = Polyhedron(rays=[(1,1,1,1,4),(2,0,1,2,5)]) sage: iet.IETFamily(p, C).has_connection() # optional: pplpy True sage: C = Polyhedron(rays=[(1,0,0,1,0),(1,0,0,0,1),(0,1,0,1,0),(0,1,0,0,1)]) sage: iet.IETFamily(p, C).has_connection() # optional: pplpy True sage: C = Polyhedron(rays=[(1,2,2,2,2)]) sage: iet.IETFamily(p, C).has_connection() # optional: pplpy False
- permutation()¶
File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 353)
Return the permutation as a list of integers
- random_element(ring, *args, **kwds)¶
File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 667)
Return a random point in the cone
EXAMPLES:
sage: from surface_dynamics import * sage: from surface_dynamics.misc.linalg import deformation_space sage: q = iet.Permutation([0,1,2,3,4,5],[5,3,2,1,0,4]) sage: rays = [[0, 0, 0, 1, 1, 0], [3, 1, 0, 1, 0, 2], [5, 0, 1, 2, 0, 3]] sage: F = iet.IETFamily(q, rays) # optional: pplpy sage: F # optional: pplpy top 0 1 2 3 4 5 bot 5 3 2 1 0 4 0 0 0 1 1 0 3 1 0 1 0 2 5 0 1 2 0 3 sage: x = polygen(ZZ) sage: K.<a> = NumberField(x^10 - 3, embedding=AA(3)**(1/10)) sage: T = F.random_element(K) # optional: pplpy sage: V = deformation_space(T.lengths()) # optional: pplpy sage: (QQ**6).subspace(F.rays()) == V # optional: pplpy True
- random_element_statistics(ring, num_exp=100, num_iterations=200, intervalxt=None, *args, **kwds)¶
File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 708)
Return a triple
(num_minimals, num_saddles, num_unknowns)
of number of interval exchange transformations found to be respectively minimal, with a saddle connection or “unknown” by mean of at mostnum_iterations
steps of Zorich induction over a sample ofnum_exp
random interval exchange transformations in this family.INPUT:
ring
– the ring in which is taken the lengths (usually a number field)num_exp
– number of experimentsnum_iterations
– the number of Zorich move to be performed on the interval exchange transformations to find a saddle connectionintervalxt
– whether to use pyintervalxt for iteration (much faster for large number of induction steps)
EXAMPLES:
sage: from surface_dynamics import * sage: q = iet.Permutation([0,1,2,3,4,5],[5,3,2,1,0,4]) sage: rays = [[0, 0, 0, 1, 1, 0], [3, 1, 0, 1, 0, 2], [5, 0, 1, 2, 0, 3]] sage: F = iet.IETFamily(q, rays) # optional: pplpy sage: x = polygen(QQ) sage: K.<cbrt3> = NumberField(x^3 - 3, embedding=AA(3)**(1/3)) sage: F.random_element_statistics(K, intervalxt=False) # optional: pplpy (0, 100, 0) sage: F.random_element_statistics(K, intervalxt=True) # optional: pplpy # optional: gmpxxyy # optional: pyeantic # optional: pyintervalxt ...(0, 100, 0)
A conjectural counterexample to Dynnikov-Skripshenko conjecture:
sage: path = 'bbbbbtbttbttbbttbtttbbbbttbttbtbbtbbtbbtt' sage: p = iet.Permutation('a b c d e f g h i', 'i h g f e d c b a') sage: R = p.rauzy_diagram() sage: T = R.path(p, *path).self_similar_iet() sage: T.sah_arnoux_fathi_invariant() (0, 0, 0, 0, 0, 0) sage: F = iet.IETFamily(T) # optional: pplpy sage: F # optional: pplpy top 0 1 2 3 4 5 6 7 8 bot 8 7 6 5 4 3 2 1 0 71 67 70 107 0 0 19 2 0 95 63 21 44 35 0 0 0 43 105 94 88 147 0 0 0 15 19 253 310 0 243 34 101 68 0 0 425 395 404 611 14 0 129 0 0 524 703 0 628 0 245 51 68 0 619 462 0 229 238 63 0 0 272 701 910 0 823 0 308 0 119 51 sage: minimals, saddles, unknowns = F.random_element_statistics(K, num_exp=20, num_iterations=200, intervalxt=False) # optional: pplpy sage: assert minimals == 0 and saddles < 3 and unknowns > 17, (minimals, saddles, unknowns) # optional: pplpy sage: minimals, saddles, unknowns = F.random_element_statistics(K, num_exp=20, num_iterations=200, intervalxt=True) # optional: pplpy # optional: gmpxxyy # optional: pyeantic # optional: pyintervalxt sage: assert minimals == 0 and saddles < 3 and unknowns > 17, (minimals, saddles, unknowns) # optional: pplpy # optional: gmpxxyy # optional: pyeantic # optional: pyintervalxt
- random_integer_point_statistics(num_exp=100)¶
File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 812)
OUTPUT: a dictionary whose keys are integers
i
and values are the number of integer points found so that the number of cylinders isi
.
- ray_coefficient(nray, i)¶
File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 228)
Return the
i
-th coefficient of thenray
-th rayEXAMPLES:
sage: from surface_dynamics import * sage: p = iet.Permutation('a b c d', 'd c b a') sage: F = iet.IETFamily(p, [(2,3,0,0), (0,1,1,1)]) # optional: pplpy sage: F.ray_coefficient(0, 2) # optional: pplpy 1 sage: F.ray_coefficient(1, 0) # optional: pplpy 2 sage: F.ray_coefficient(3, 0) # optional: pplpy Traceback (most recent call last): ... IndexError: row index out of range sage: F.ray_coefficient(1, 5) # optional: pplpy Traceback (most recent call last): ... IndexError: column index out of range
- rays()¶
File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 258)
Return the rays as vectors
EXAMPLES:
sage: from surface_dynamics import * sage: p = iet.Permutation('a b c d', 'd c b a') sage: F = iet.IETFamily(p, [(2,3,0,0), (0,1,1,1)]) # optional: pplpy sage: F.rays() # optional: pplpy [(0, 1, 1, 1), (2, 3, 0, 0)]
- tree(max_depth=5, verbose=False)¶
File: surface_dynamics/interval_exchanges/iet_family.pyx (starting at line 598)
The tree should be smarter in several ways:
once a saddle connection is found it should check whether it is stable and whether it corresponds to a splitting, a cylinder decomposition, etc
implement a C version!
understand what the parabolic are doing!
EXAMPLES:
sage: from surface_dynamics import * sage: p = iet.Permutation([0,1,2,3,4,5],[5,4,3,2,1,0]) sage: rays = [[5, 1, 0, 0, 3, 8], [2, 1, 0, 3, 0, 5], [1, 0, 1, 2, 0, 3], [3, 0, 1, 0, 2, 5]] sage: F = iet.IETFamily(p, rays) # optional: pplpy