snappy 3.1.1__cp38-cp38-win_amd64.whl → 3.2__cp38-cp38-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- snappy/CyOpenGL.cp38-win_amd64.pyd +0 -0
- snappy/SnapPy.cp38-win_amd64.pyd +0 -0
- snappy/SnapPyHP.cp38-win_amd64.pyd +0 -0
- snappy/__init__.py +299 -402
- snappy/app.py +70 -20
- snappy/browser.py +18 -17
- snappy/canonical.py +249 -0
- snappy/{verify/cusp_shapes.py → cusps/__init__.py} +8 -18
- snappy/cusps/cusp_area_matrix.py +101 -0
- snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +23 -39
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/test.py +21 -0
- snappy/cusps/trig_cusp_area_matrix.py +63 -0
- snappy/database.py +10 -9
- snappy/decorated_isosig.py +337 -114
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +40 -7
- snappy/dev/extended_ptolemy/extended.py +3 -3
- snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +1 -1
- snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
- snappy/doc/_images/m125_paper_plane.jpg +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
- snappy/doc/_sources/additional_classes.rst.txt +40 -40
- snappy/doc/_sources/bugs.rst.txt +14 -14
- snappy/doc/_sources/censuses.rst.txt +51 -51
- snappy/doc/_sources/credits.rst.txt +75 -75
- snappy/doc/_sources/development.rst.txt +259 -239
- snappy/doc/_sources/index.rst.txt +182 -115
- snappy/doc/_sources/installing.rst.txt +247 -264
- snappy/doc/_sources/manifold.rst.txt +6 -6
- snappy/doc/_sources/manifoldhp.rst.txt +46 -46
- snappy/doc/_sources/news.rst.txt +355 -283
- snappy/doc/_sources/other.rst.txt +25 -25
- snappy/doc/_sources/platonic_census.rst.txt +20 -20
- snappy/doc/_sources/plink.rst.txt +102 -102
- snappy/doc/_sources/ptolemy.rst.txt +66 -66
- snappy/doc/_sources/ptolemy_classes.rst.txt +42 -42
- snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -297
- snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -363
- snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -301
- snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -61
- snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -105
- snappy/doc/_sources/screenshots.rst.txt +21 -21
- snappy/doc/_sources/snap.rst.txt +87 -87
- snappy/doc/_sources/snappy.rst.txt +28 -28
- snappy/doc/_sources/spherogram.rst.txt +103 -103
- snappy/doc/_sources/todo.rst.txt +47 -47
- snappy/doc/_sources/triangulation.rst.txt +11 -11
- snappy/doc/_sources/tutorial.rst.txt +49 -49
- snappy/doc/_sources/verify.rst.txt +210 -150
- snappy/doc/_sources/verify_internals.rst.txt +79 -90
- snappy/doc/_static/basic.css +924 -902
- snappy/doc/_static/css/badge_only.css +1 -1
- snappy/doc/_static/css/theme.css +1 -1
- snappy/doc/_static/doctools.js +1 -1
- snappy/doc/_static/documentation_options.js +12 -13
- snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
- snappy/doc/_static/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +199 -199
- snappy/doc/_static/pygments.css +74 -73
- snappy/doc/_static/searchtools.js +125 -71
- snappy/doc/_static/snappy_furo.css +33 -33
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
- snappy/doc/_static/sphinx_highlight.js +13 -3
- snappy/doc/additional_classes.html +1499 -1330
- snappy/doc/bugs.html +131 -134
- snappy/doc/censuses.html +426 -445
- snappy/doc/credits.html +180 -183
- snappy/doc/development.html +383 -363
- snappy/doc/genindex.html +1330 -1409
- snappy/doc/index.html +261 -206
- snappy/doc/installing.html +345 -363
- snappy/doc/manifold.html +3451 -2839
- snappy/doc/manifoldhp.html +179 -182
- snappy/doc/news.html +387 -329
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +160 -162
- snappy/doc/platonic_census.html +374 -377
- snappy/doc/plink.html +209 -212
- snappy/doc/ptolemy.html +253 -255
- snappy/doc/ptolemy_classes.html +1143 -1146
- snappy/doc/ptolemy_examples1.html +408 -410
- snappy/doc/ptolemy_examples2.html +470 -473
- snappy/doc/ptolemy_examples3.html +413 -416
- snappy/doc/ptolemy_examples4.html +194 -197
- snappy/doc/ptolemy_prelim.html +247 -250
- snappy/doc/py-modindex.html +164 -167
- snappy/doc/screenshots.html +140 -142
- snappy/doc/search.html +134 -137
- snappy/doc/searchindex.js +1 -1
- snappy/doc/snap.html +201 -204
- snappy/doc/snappy.html +180 -182
- snappy/doc/spherogram.html +1210 -1213
- snappy/doc/todo.html +165 -168
- snappy/doc/triangulation.html +1583 -1474
- snappy/doc/tutorial.html +158 -161
- snappy/doc/verify.html +329 -275
- snappy/doc/verify_internals.html +1234 -1691
- snappy/drilling/__init__.py +153 -235
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +0 -2
- snappy/drilling/crush.py +56 -130
- snappy/drilling/cusps.py +12 -6
- snappy/drilling/debug.py +2 -1
- snappy/drilling/exceptions.py +7 -40
- snappy/drilling/moves.py +302 -243
- snappy/drilling/perturb.py +63 -37
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +0 -5
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +126 -0
- snappy/drilling/tracing.py +9 -37
- snappy/exceptions.py +18 -5
- snappy/exterior_to_link/barycentric_geometry.py +2 -4
- snappy/exterior_to_link/main.py +8 -7
- snappy/exterior_to_link/mcomplex_with_link.py +2 -2
- snappy/exterior_to_link/rational_linear_algebra.py +1 -1
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
- snappy/exterior_to_link/test.py +21 -33
- snappy/geometric_structure/__init__.py +212 -0
- snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
- snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
- snappy/geometric_structure/geodesic/__init__.py +0 -0
- snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
- snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
- snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
- snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
- snappy/geometric_structure/geodesic/constants.py +6 -0
- snappy/geometric_structure/geodesic/exceptions.py +22 -0
- snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
- snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
- snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
- snappy/geometric_structure/geodesic/line.py +30 -0
- snappy/geometric_structure/geodesic/multiplicity.py +127 -0
- snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +23 -13
- snappy/horoviewer.py +7 -7
- snappy/hyperboloid/__init__.py +96 -31
- snappy/hyperboloid/distances.py +245 -0
- snappy/hyperboloid/horoball.py +19 -0
- snappy/hyperboloid/line.py +35 -0
- snappy/hyperboloid/point.py +9 -0
- snappy/hyperboloid/triangle.py +29 -0
- snappy/isometry_signature.py +382 -0
- snappy/len_spec/__init__.py +596 -0
- snappy/len_spec/geodesic_info.py +110 -0
- snappy/len_spec/geodesic_key_info_dict.py +117 -0
- snappy/len_spec/geodesic_piece.py +143 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +80 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
- snappy/len_spec/spine.py +206 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +275 -0
- snappy/len_spec/word.py +86 -0
- snappy/math_basics.py +39 -13
- snappy/matrix.py +52 -9
- snappy/number.py +12 -6
- snappy/numeric_output_checker.py +2 -3
- snappy/pari.py +8 -4
- snappy/phone_home.py +2 -1
- snappy/polyviewer.py +8 -8
- snappy/ptolemy/__init__.py +1 -1
- snappy/ptolemy/component.py +2 -2
- snappy/ptolemy/coordinates.py +25 -25
- snappy/ptolemy/findLoops.py +9 -9
- snappy/ptolemy/manifoldMethods.py +27 -29
- snappy/ptolemy/polynomial.py +50 -57
- snappy/ptolemy/processFileBase.py +60 -0
- snappy/ptolemy/ptolemyVariety.py +109 -41
- snappy/ptolemy/reginaWrapper.py +4 -4
- snappy/ptolemy/rur.py +1 -1
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
- snappy/ptolemy/test.py +99 -54
- snappy/ptolemy/utilities.py +1 -1
- snappy/raytracing/__init__.py +64 -0
- snappy/raytracing/additional_horospheres.py +64 -0
- snappy/raytracing/additional_len_spec_choices.py +63 -0
- snappy/raytracing/cohomology_fractal.py +0 -3
- snappy/raytracing/eyeball.py +123 -0
- snappy/raytracing/finite_raytracing_data.py +17 -17
- snappy/raytracing/finite_viewer.py +15 -15
- snappy/raytracing/geodesic_tube_info.py +93 -63
- snappy/raytracing/geodesics.py +94 -64
- snappy/raytracing/geodesics_window.py +56 -34
- snappy/raytracing/gui_utilities.py +21 -6
- snappy/raytracing/hyperboloid_navigation.py +29 -4
- snappy/raytracing/hyperboloid_utilities.py +73 -73
- snappy/raytracing/ideal_raytracing_data.py +121 -91
- snappy/raytracing/inside_viewer.py +199 -66
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +37 -25
- snappy/raytracing/raytracing_view.py +70 -65
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +39 -3
- snappy/raytracing/shaders/fragment.glsl +451 -133
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +42 -9
- snappy/sage_helper.py +67 -134
- snappy/settings.py +90 -77
- snappy/shell.py +2 -0
- snappy/snap/character_varieties.py +2 -2
- snappy/snap/find_field.py +4 -3
- snappy/snap/fundamental_polyhedron.py +2 -2
- snappy/snap/kernel_structures.py +5 -1
- snappy/snap/nsagetools.py +9 -8
- snappy/snap/peripheral/dual_cellulation.py +4 -3
- snappy/snap/peripheral/peripheral.py +2 -2
- snappy/snap/peripheral/surface.py +5 -5
- snappy/snap/peripheral/test.py +1 -1
- snappy/snap/polished_reps.py +8 -8
- snappy/snap/slice_obs_HKL.py +16 -14
- snappy/snap/t3mlite/arrow.py +3 -3
- snappy/snap/t3mlite/edge.py +3 -3
- snappy/snap/t3mlite/homology.py +2 -2
- snappy/snap/t3mlite/mcomplex.py +3 -3
- snappy/snap/t3mlite/simplex.py +12 -0
- snappy/snap/t3mlite/spun.py +18 -17
- snappy/snap/t3mlite/test_vs_regina.py +4 -4
- snappy/snap/test.py +37 -53
- snappy/snap/utilities.py +4 -5
- snappy/test.py +121 -138
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -0
- snappy/tiling/canonical_key_dict.py +59 -0
- snappy/tiling/dict_based_set.py +79 -0
- snappy/tiling/floor.py +49 -0
- snappy/tiling/hyperboloid_dict.py +54 -0
- snappy/tiling/iter_utils.py +78 -0
- snappy/tiling/lifted_tetrahedron.py +22 -0
- snappy/tiling/lifted_tetrahedron_set.py +54 -0
- snappy/tiling/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +215 -0
- snappy/tiling/triangle.py +33 -0
- snappy/tkterminal.py +113 -84
- snappy/twister/main.py +1 -7
- snappy/twister/twister_core.cp38-win_amd64.pyd +0 -0
- snappy/upper_halfspace/__init__.py +78 -17
- snappy/verify/__init__.py +3 -7
- snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
- snappy/verify/complex_volume/adjust_torsion.py +1 -2
- snappy/verify/complex_volume/closed.py +13 -13
- snappy/verify/complex_volume/cusped.py +6 -6
- snappy/verify/complex_volume/extended_bloch.py +5 -8
- snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +0 -55
- snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
- snappy/verify/interval_newton_shapes_engine.py +7 -5
- snappy/verify/interval_tree.py +5 -5
- snappy/verify/krawczyk_shapes_engine.py +17 -18
- snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
- snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
- snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
- snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
- snappy/verify/shapes.py +5 -3
- snappy/verify/short_slopes.py +39 -41
- snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
- snappy/verify/test.py +57 -60
- snappy/verify/upper_halfspace/extended_matrix.py +1 -1
- snappy/verify/upper_halfspace/finite_point.py +3 -4
- snappy/verify/upper_halfspace/ideal_point.py +9 -9
- snappy/verify/volume.py +2 -2
- snappy/version.py +2 -2
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +14 -10
- snappy-3.2.dist-info/RECORD +503 -0
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
- snappy/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/__pycache__/browser.cpython-38.pyc +0 -0
- snappy/__pycache__/cache.cpython-38.pyc +0 -0
- snappy/__pycache__/database.cpython-38.pyc +0 -0
- snappy/__pycache__/db_utilities.cpython-38.pyc +0 -0
- snappy/__pycache__/decorated_isosig.cpython-38.pyc +0 -0
- snappy/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/__pycache__/export_stl.cpython-38.pyc +0 -0
- snappy/__pycache__/filedialog.cpython-38.pyc +0 -0
- snappy/__pycache__/gui.cpython-38.pyc +0 -0
- snappy/__pycache__/horoviewer.cpython-38.pyc +0 -0
- snappy/__pycache__/math_basics.cpython-38.pyc +0 -0
- snappy/__pycache__/matrix.cpython-38.pyc +0 -0
- snappy/__pycache__/number.cpython-38.pyc +0 -0
- snappy/__pycache__/numeric_output_checker.cpython-38.pyc +0 -0
- snappy/__pycache__/pari.cpython-38.pyc +0 -0
- snappy/__pycache__/polyviewer.cpython-38.pyc +0 -0
- snappy/__pycache__/sage_helper.cpython-38.pyc +0 -0
- snappy/__pycache__/version.cpython-38.pyc +0 -0
- snappy/doc/_sources/verify_canon.rst.txt +0 -90
- snappy/doc/_static/jquery-3.6.0.js +0 -10881
- snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
- snappy/doc/_static/js/html5shiv.min.js +0 -4
- snappy/doc/_static/underscore-1.13.1.js +0 -2042
- snappy/doc/_static/underscore.js +0 -6
- snappy/doc/verify_canon.html +0 -304
- snappy/drilling/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/constants.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/crush.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/cusps.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/debug.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/epsilons.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/fixed_points.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_info.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_tube.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geometric_structure.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/line.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/moves.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/peripheral_curves.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/perturb.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/quotient_space.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/spatial_dict.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/subdivide.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/tracing.cpython-38.pyc +0 -0
- snappy/drilling/geodesic_tube.py +0 -441
- snappy/drilling/geometric_structure.py +0 -366
- snappy/drilling/line.py +0 -122
- snappy/drilling/quotient_space.py +0 -94
- snappy/drilling/spatial_dict.py +0 -128
- snappy/exterior_to_link/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/hyp_utils.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/link_projection.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/main.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/pl_utils.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/put_in_S3.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/stored_moves.cpython-38.pyc +0 -0
- snappy/hyperboloid/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/manifolds/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/component.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/coordinates.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/fieldExtensions.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/findLoops.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/homology.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/manifoldMethods.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/matrix.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/polynomial.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processComponents.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileBase.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileDispatch.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processMagmaFile.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processRurFile.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVariety.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/rur.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/utilities.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/character_varieties.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/fundamental_polyhedron.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/interval_reps.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/kernel_structures.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/mcomplex_base.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/nsagetools.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/polished_reps.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/shapes.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/slice_obs_HKL.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/utilities.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/link.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/peripheral.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/surface.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/arrow.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/corner.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/edge.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/face.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/files.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/homology.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/linalg.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/mcomplex.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/perm4.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/simplex.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/spun.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/surface.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/vertex.cpython-38.pyc +0 -0
- snappy/togl/__init__.py +0 -3
- snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
- snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
- snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
- snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
- snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
- snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
- snappy/twister/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/twister/__pycache__/main.cpython-38.pyc +0 -0
- snappy/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cuspCrossSection.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cuspTranslations.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cusp_areas.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cusp_shapes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/interval_tree.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/realAlgebra.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/shapes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/short_slopes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/squareExtensions.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/verifyCanonical.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/verifyHyperbolicity.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/volume.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/closed.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/cusped.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-38.pyc +0 -0
- snappy/verify/cuspCrossSection.py +0 -1422
- snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-38.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
- snappy-3.1.1.dist-info/RECORD +0 -575
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
snappy/decorated_isosig.py
CHANGED
@@ -14,8 +14,6 @@ space, the permutation may be omitted when it is equal to the identity
|
|
14
14
|
permutation; this is indicated by the fact that the length of the
|
15
15
|
decoration is 4n rather than 5n.
|
16
16
|
|
17
|
-
Currently, only oriented manifolds are supported.
|
18
|
-
|
19
17
|
A simple valid decorated isosig for a two-cusped manifold is::
|
20
18
|
|
21
19
|
eLPkbdcddhgggb_abBaaBBaaB
|
@@ -36,18 +34,60 @@ isosig, decorator = di.split('_')
|
|
36
34
|
|
37
35
|
Note: An isosig is an invariant of a triangulation of an *unoriented*
|
38
36
|
manifold. For an amphicheiral manifold M, it can happen that
|
39
|
-
Manifold(M.triangulation_isosig()) has the opposite
|
40
|
-
|
37
|
+
Manifold(M.triangulation_isosig(decorated=False)) has the opposite
|
38
|
+
orientation from M itself.
|
39
|
+
The decoration implicitly embeds the preferred orientation of
|
41
40
|
M in the sign of the determinant of the change-of-basis matrices.
|
42
41
|
|
43
42
|
Note: If the triangulation has combinatorial symmetries, there can be
|
44
43
|
multiple change-of-basis matrices that yield combinatorially
|
45
44
|
isomorphic pairs (triangulation, peripheral curves). In such cases,
|
46
45
|
the decoration is the lexicographically first one.
|
46
|
+
|
47
|
+
Caveat: We pick the decoration with the lexicographically smallest
|
48
|
+
encoding with the following consequence: If we have more 26 cusps, the
|
49
|
+
lexicographically smallest permutation might not have the smallest encoding
|
50
|
+
and thus might not be the one picked.
|
51
|
+
|
52
|
+
Caveat: We drop the trivial permutation from the encoding. Pairs (a,b) of string
|
53
|
+
come with the lexicographic ordering. We also obtain a (partial) ordering by
|
54
|
+
ordering by a + b. These two orderings are not the same.
|
55
|
+
In particular, there is a combinatorial isomorphism from
|
56
|
+
Triangulation('L6n1') to
|
57
|
+
Triangulation(Triangulation('L6n1').triangulation_isosig(decorated = False))
|
58
|
+
that acts on the cusp by the identity perm and, thus, we would expect it to
|
59
|
+
be preferred. However,
|
60
|
+
Triangulation("L6n1(0,0)(0,0)(0,0)").triangulation_isosig() results in
|
61
|
+
'gLMzQbcdefffaelaaai_acbBaabCbbabbBC' which does not use the identity perm.
|
62
|
+
|
63
|
+
Caveat: There are de-facto two canonical choices of peripheral curves.
|
64
|
+
When calling
|
65
|
+
>>> T = Triangulation('ovLMvvPQQQccddlmnijklmnmnlgvfamtvfblhaumx'),
|
66
|
+
the SnapPea kernel picks peripheral curves and then orients the manifold
|
67
|
+
(see data_to_triangulation in kernel_code/kernel/triangulation.c)
|
68
|
+
>>> T.set_peripheral_curves('combinatorial')
|
69
|
+
is now calling the same SnapPea kernel code to pick peripheral curve but
|
70
|
+
on the oriented manifold. This can result in different peripheral curves.
|
71
|
+
|
72
|
+
Note that the encoding and decoding needs to use the same of the two
|
73
|
+
canonical choices of peripheral curves.
|
74
|
+
|
75
|
+
For the decoding, there is a difference based on whether the isosig is
|
76
|
+
decorated because set_peripheral_from_decoration calls
|
77
|
+
manifold.set_peripheral_curves('combinatorial').
|
78
|
+
|
79
|
+
We need to account for that in the encoding: we need to use
|
80
|
+
set_peripheral_curves('combinatorial') on the "target" triangulation if
|
81
|
+
we anticipate a decoration. And if we called
|
82
|
+
set_peripheral_curves('combinatorial'), we need to make sure we have a
|
83
|
+
decoration (see force_decoration).
|
47
84
|
"""
|
85
|
+
|
48
86
|
import re
|
49
87
|
import string
|
50
88
|
|
89
|
+
from .matrix import make_vector
|
90
|
+
|
51
91
|
# Used between the base isosig and the decorated version.
|
52
92
|
separator = '_'
|
53
93
|
|
@@ -58,7 +98,7 @@ separator_pat = '[%s]{1}' % separator
|
|
58
98
|
base64_opt_pat = r'([a-zA-Z0-9\+\-]*)'
|
59
99
|
isosig_pattern = re.compile(base64_pat + separator_pat + base64_opt_pat + '$')
|
60
100
|
|
61
|
-
# We store lists of integers as base64 strings.
|
101
|
+
# We store lists of integers as (non-RFC4648) base64 strings.
|
62
102
|
|
63
103
|
base64_letters = string.ascii_letters + '0123456789+-'
|
64
104
|
base64_lower = string.ascii_lowercase + '01234+'
|
@@ -66,7 +106,7 @@ base64_upper = string.ascii_uppercase + '56789-'
|
|
66
106
|
in_one = string.ascii_lowercase[:16] + string.ascii_lowercase[1:16].upper()
|
67
107
|
|
68
108
|
int_to_letter = dict(enumerate(base64_letters))
|
69
|
-
letter_to_int =
|
109
|
+
letter_to_int = {a: i for i, a in enumerate(base64_letters)}
|
70
110
|
|
71
111
|
|
72
112
|
def encode_nonnegative_int(x):
|
@@ -138,9 +178,9 @@ def decode_integer_list(encoded):
|
|
138
178
|
ans.append(sign*decode_nonnegative_int(current))
|
139
179
|
return ans
|
140
180
|
|
181
|
+
###############################################################################
|
141
182
|
# Some helper functions
|
142
183
|
|
143
|
-
|
144
184
|
def det(A):
|
145
185
|
return A[0][0]*A[1][1] - A[0][1]*A[1][0]
|
146
186
|
|
@@ -156,146 +196,253 @@ def as_two_by_two_matrices(L):
|
|
156
196
|
assert len(L) % 4 == 0
|
157
197
|
return [[(L[i], L[i+1]), (L[i+2], L[i+3])] for i in range(0, len(L), 4)]
|
158
198
|
|
199
|
+
def first_non_zero_entry_in_column(matrix, col):
|
200
|
+
e = matrix[0, col]
|
201
|
+
if e != 0:
|
202
|
+
return e
|
203
|
+
return matrix[1, col]
|
159
204
|
|
160
205
|
def sgn_column(matrix, col):
|
161
206
|
"""
|
162
207
|
Returns +1 or -1 depending on the sign of the first non-zero entry
|
163
208
|
in the column of the given matrix.
|
164
209
|
"""
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
210
|
+
if first_non_zero_entry_in_column(matrix, col) > 0:
|
211
|
+
return +1
|
212
|
+
else:
|
213
|
+
return -1
|
169
214
|
|
170
|
-
def
|
215
|
+
def apply_peripheral_curve_flips(
|
216
|
+
matrix, slope, manifold_orientable, isomorphism_orientation):
|
171
217
|
"""
|
172
|
-
|
173
|
-
|
218
|
+
Flips peripheral curves (as encoded by matrix) to bring them into
|
219
|
+
canonical form and updates slope accordingly.
|
174
220
|
"""
|
175
221
|
|
176
|
-
|
177
|
-
|
178
|
-
# the entire manifold
|
179
|
-
det_sign = ( matrices[0][0,0] * matrices[0][1,1]
|
180
|
-
- matrices[0][0,1] * matrices[0][1,0])
|
222
|
+
# Determine whether to flip meridian
|
223
|
+
f0 = sgn_column(matrix, 0)
|
181
224
|
|
225
|
+
# Determine whether to flip longitude
|
226
|
+
if manifold_orientable:
|
182
227
|
# We conform the matrix such that the first non-zero entry in the
|
183
228
|
# first column and the determinant are always positive
|
184
|
-
|
185
|
-
for matrix in matrices ]
|
229
|
+
f1 = f0 * isomorphism_orientation
|
186
230
|
else:
|
187
231
|
# We conform the matrix such that the first non-zero entry in each
|
188
232
|
# column is always positive
|
189
|
-
|
190
|
-
|
233
|
+
f1 = sgn_column(matrix, 1)
|
234
|
+
|
235
|
+
flips = [ f0, f1 ]
|
191
236
|
|
237
|
+
for col, flip in enumerate(flips):
|
238
|
+
for row in range(2):
|
239
|
+
matrix[row,col] *= flip
|
240
|
+
slope[col] *= flip
|
192
241
|
|
193
|
-
def
|
242
|
+
def pack_matrices(matrices):
|
194
243
|
"""
|
195
244
|
Multiplies the columns of each matrix by the entries in flips and
|
196
245
|
packs all the matrices into one array, column-major.
|
197
246
|
"""
|
198
|
-
result = []
|
199
247
|
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
return result
|
248
|
+
return [ matrix[row,col]
|
249
|
+
for matrix in matrices
|
250
|
+
for col in range(2)
|
251
|
+
for row in range(2) ]
|
206
252
|
|
207
253
|
|
208
254
|
def supress_minus_zero(x):
|
209
|
-
|
255
|
+
if x == 0:
|
256
|
+
return 0
|
257
|
+
else:
|
258
|
+
return x
|
210
259
|
|
211
|
-
# main two functions
|
212
260
|
|
261
|
+
def is_trivial_perm(perm):
|
262
|
+
return all(i == p for i, p in enumerate(perm))
|
213
263
|
|
214
|
-
def decorated_isosig(manifold, triangulation_class,
|
215
|
-
ignore_cusp_ordering=False,
|
216
|
-
ignore_curve_orientations=False,
|
217
|
-
ignore_orientation=True):
|
218
264
|
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
# Do not decorate if no cusps
|
224
|
-
if manifold.num_cusps() == 0:
|
225
|
-
return isosig
|
265
|
+
def key_prefer_pos(x):
|
266
|
+
"""
|
267
|
+
Intended for key argument to min.
|
226
268
|
|
227
|
-
|
228
|
-
|
269
|
+
Prefers positive and then absolute value.
|
270
|
+
"""
|
271
|
+
|
272
|
+
if x >= 0:
|
273
|
+
return (0, x)
|
274
|
+
else:
|
275
|
+
return (1, -x)
|
229
276
|
|
230
|
-
|
231
|
-
|
277
|
+
def key_slope(slope):
|
278
|
+
"""
|
279
|
+
Intended for key argument to min.
|
232
280
|
|
233
|
-
|
234
|
-
|
235
|
-
min_flips = None
|
281
|
+
Prefers positive and small denominator.
|
282
|
+
"""
|
236
283
|
|
237
|
-
|
238
|
-
|
284
|
+
slope_m, slope_l = slope
|
285
|
+
return (key_prefer_pos(slope_l), key_prefer_pos(slope_m))
|
239
286
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
not ignore_orientation and
|
244
|
-
det(tri_iso.cusp_maps()[0]) < 0):
|
245
|
-
continue
|
287
|
+
def key_decoration_info(info):
|
288
|
+
encoded, slopes = info
|
289
|
+
return [encoded, [key_slope(slope) for slope in slopes]]
|
246
290
|
|
247
|
-
|
248
|
-
|
291
|
+
def normalized_slope(slope):
|
292
|
+
"""
|
293
|
+
Returns slope or -slope preferring positive and small denominator.
|
249
294
|
|
250
|
-
|
251
|
-
|
252
|
-
# we need to apply it to the matrices
|
253
|
-
matrices = [ tri_iso.cusp_maps()[i] for i in perm ]
|
254
|
-
else:
|
255
|
-
matrices = tri_iso.cusp_maps()
|
295
|
+
Equivalent to min([slope, -slope], key=key_slope)
|
296
|
+
"""
|
256
297
|
|
298
|
+
slope_m, slope_l = slope
|
299
|
+
if slope_l < 0:
|
300
|
+
return -slope
|
301
|
+
if slope_l > 0:
|
302
|
+
return slope
|
303
|
+
if slope_m < 0:
|
304
|
+
return -slope
|
305
|
+
return slope
|
306
|
+
|
307
|
+
def candidate_decoration_info(
|
308
|
+
isomorphism,
|
309
|
+
slopes,
|
310
|
+
manifold_orientable,
|
311
|
+
ignore_cusp_ordering,
|
312
|
+
ignore_curves,
|
313
|
+
ignore_curve_orientations,
|
314
|
+
ignore_filling_orientations,
|
315
|
+
ignore_orientation):
|
316
|
+
|
317
|
+
matrices = isomorphism.cusp_maps()
|
318
|
+
isomorphism_orientation = matrices[0].det()
|
319
|
+
|
320
|
+
# Do not consider orientation-reversing isomorphisms if
|
321
|
+
# ignore_orientation isn't specified.
|
322
|
+
if manifold_orientable and not ignore_orientation:
|
323
|
+
if isomorphism_orientation < 0:
|
324
|
+
return None
|
325
|
+
|
326
|
+
# Make a copy as vectors so that we can modify in place and
|
327
|
+
# apply matrices.
|
328
|
+
# Outside of SnapPy, SimpleVector is not making a copy of the
|
329
|
+
# tuple and we need a list to modify things in place.
|
330
|
+
slopes = [ make_vector([slope_m, slope_l])
|
331
|
+
for slope_m, slope_l in slopes ]
|
332
|
+
|
333
|
+
# Permutation of cusps
|
334
|
+
perm = inverse_perm(isomorphism.cusp_images())
|
335
|
+
|
336
|
+
if ignore_cusp_ordering:
|
337
|
+
# If we do not include the permutation in the encoding,
|
338
|
+
# we need to apply it to the matrices
|
339
|
+
matrices = [ matrices[i] for i in perm ]
|
340
|
+
slopes = [ slopes[i] for i in perm ]
|
341
|
+
|
342
|
+
if ignore_curves:
|
343
|
+
slopes = [ matrix * slope
|
344
|
+
for matrix, slope in zip(matrices, slopes) ]
|
345
|
+
else:
|
257
346
|
if ignore_curve_orientations:
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
347
|
+
for matrix, slope in zip(matrices, slopes):
|
348
|
+
apply_peripheral_curve_flips(
|
349
|
+
matrix, slope, manifold_orientable, isomorphism_orientation)
|
350
|
+
|
351
|
+
encoded = ''
|
352
|
+
|
353
|
+
if not ignore_cusp_ordering:
|
354
|
+
#
|
355
|
+
# Force decoration to fix a very subtle bug!
|
356
|
+
#
|
357
|
+
# Recall that we call N.set_peripheral_curves('combinatorial')
|
358
|
+
# in decorated_isosig below if either ignore_cusp_ordering or
|
359
|
+
# ignore_curves is False.
|
360
|
+
#
|
361
|
+
# On the decoding site, we thus also need to call
|
362
|
+
# manifold.set_peripheral_curves('combinatorial') in those cases.
|
363
|
+
# This happens in set_peripheral_from_decoration and thus only
|
364
|
+
# if the isosig returned here has a decoration, that is "encoded"
|
365
|
+
# is not empty.
|
366
|
+
#
|
367
|
+
# Assume that ignore_cusp_ordering is False and ignore_curves is
|
368
|
+
# True and the permutation happens to be the identity.
|
369
|
+
#
|
370
|
+
# We need to make sure not to have an empty "encoded" in this case.
|
371
|
+
force_decoration = ignore_curves
|
372
|
+
|
373
|
+
if force_decoration or not is_trivial_perm(perm):
|
374
|
+
# Encode permutation
|
375
|
+
encoded += encode_integer_list(perm)
|
376
|
+
|
377
|
+
if not ignore_curves:
|
264
378
|
# Encode the matrices
|
265
|
-
|
379
|
+
encoded += encode_integer_list(pack_matrices(matrices))
|
266
380
|
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
else:
|
271
|
-
# Encode permutation and matrices
|
272
|
-
encoded = encode_integer_list(perm + decorations)
|
273
|
-
|
274
|
-
if min_encoded is None or encoded < min_encoded:
|
275
|
-
# If this is lexicographically smallest, remember it
|
276
|
-
min_encoded = encoded
|
277
|
-
min_perm = perm
|
278
|
-
min_flips = flips
|
279
|
-
|
280
|
-
# Add decoration to isosig
|
281
|
-
ans = isosig + separator + min_encoded
|
282
|
-
|
283
|
-
# Add Dehn-fillings if we have any
|
284
|
-
if False in manifold.cusp_info('complete?'):
|
285
|
-
if ignore_cusp_ordering:
|
286
|
-
# If we do not include the permutation in the encoding,
|
287
|
-
# we need to apply it to the slopes
|
288
|
-
slopes = [ manifold.cusp_info('filling')[i] for i in min_perm ]
|
289
|
-
else:
|
290
|
-
slopes = manifold.cusp_info('filling')
|
381
|
+
if ignore_filling_orientations:
|
382
|
+
slopes = [ normalized_slope(slope)
|
383
|
+
for slope in slopes ]
|
291
384
|
|
292
|
-
|
293
|
-
# Apply the flips to the slopes
|
294
|
-
ans += '(%g,%g)' % (supress_minus_zero(flip[0] * slope[0]),
|
295
|
-
supress_minus_zero(flip[1] * slope[1]))
|
385
|
+
return encoded, slopes
|
296
386
|
|
297
|
-
|
387
|
+
# main two functions
|
298
388
|
|
389
|
+
def decorated_isosig(manifold, triangulation_class,
|
390
|
+
ignore_cusp_ordering=False,
|
391
|
+
ignore_curves=False,
|
392
|
+
ignore_curve_orientations=False,
|
393
|
+
ignore_filling_orientations=False,
|
394
|
+
ignore_orientation=True):
|
395
|
+
|
396
|
+
isosig = manifold._undecorated_triangulation_isosig(
|
397
|
+
ignore_orientation=ignore_orientation)
|
398
|
+
|
399
|
+
# Do not decorate if no cusps
|
400
|
+
if manifold.num_cusps() == 0:
|
401
|
+
return isosig
|
402
|
+
|
403
|
+
N = triangulation_class(isosig, remove_finite_vertices=False)
|
404
|
+
if not (ignore_cusp_ordering and ignore_curves):
|
405
|
+
# Note that data_to_triangulation determines the peripheral
|
406
|
+
# curves before orienting the manifold.
|
407
|
+
# Thus, we get different peripheral curves when calling
|
408
|
+
# N.set_peripheral_curves.
|
409
|
+
# For backwards compatibility (see set_peripheral_from_decoration),
|
410
|
+
# we need to keep calling N.set_peripheral_curves here unless there is
|
411
|
+
# no decoration.
|
412
|
+
N.set_peripheral_curves('combinatorial')
|
413
|
+
|
414
|
+
manifold_orientable = manifold.is_orientable()
|
415
|
+
slopes = manifold.cusp_info('filling')
|
416
|
+
|
417
|
+
# Try all combinatorial isomorphisms and pick
|
418
|
+
# lexicographically smallest info.
|
419
|
+
encoded, slopes = min(
|
420
|
+
(info
|
421
|
+
for isomorphism in manifold.isomorphisms_to(N)
|
422
|
+
if (
|
423
|
+
info := candidate_decoration_info(
|
424
|
+
isomorphism,
|
425
|
+
slopes,
|
426
|
+
manifold_orientable=manifold_orientable,
|
427
|
+
ignore_cusp_ordering=ignore_cusp_ordering,
|
428
|
+
ignore_curves=ignore_curves,
|
429
|
+
ignore_curve_orientations=ignore_curve_orientations,
|
430
|
+
ignore_filling_orientations=ignore_filling_orientations,
|
431
|
+
ignore_orientation=ignore_orientation)
|
432
|
+
) is not None),
|
433
|
+
key = key_decoration_info)
|
434
|
+
|
435
|
+
ans = isosig
|
436
|
+
|
437
|
+
if encoded:
|
438
|
+
ans += separator + encoded
|
439
|
+
|
440
|
+
if not all(manifold.cusp_info('complete?')):
|
441
|
+
for slope_m, slope_l in slopes:
|
442
|
+
ans += '(%g,%g)' % (supress_minus_zero(slope_m),
|
443
|
+
supress_minus_zero(slope_l))
|
444
|
+
|
445
|
+
return ans
|
299
446
|
|
300
447
|
def set_peripheral_from_decoration(manifold, decoration):
|
301
448
|
"""
|
@@ -305,16 +452,25 @@ def set_peripheral_from_decoration(manifold, decoration):
|
|
305
452
|
dec = decode_integer_list(decoration)
|
306
453
|
manifold.set_peripheral_curves('combinatorial')
|
307
454
|
n = manifold.num_cusps()
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
455
|
+
k = len(dec)
|
456
|
+
|
457
|
+
if k not in [ n, 4 * n, 5 * n]:
|
458
|
+
raise ValueError("Decoration has unexpected length.")
|
459
|
+
|
460
|
+
if k == n or k == 5 * n:
|
461
|
+
if k == n:
|
462
|
+
manifold._reindex_cusps(dec)
|
463
|
+
else:
|
464
|
+
manifold._reindex_cusps(dec[:n])
|
465
|
+
if k == 4 * n or k == 5 * n:
|
466
|
+
if k == 4 * n:
|
467
|
+
cobs = as_two_by_two_matrices(dec)
|
468
|
+
else:
|
469
|
+
cobs = as_two_by_two_matrices(dec[n:])
|
470
|
+
if det(cobs[0]) < 0 and manifold.is_orientable():
|
471
|
+
manifold.reverse_orientation()
|
472
|
+
cobs = [[(-a, b), (-c, d)] for [(a, b), (c,d)] in cobs]
|
473
|
+
manifold.set_peripheral_curves(cobs)
|
318
474
|
|
319
475
|
# Testing code
|
320
476
|
|
@@ -479,9 +635,76 @@ def test_by_dehn_filling():
|
|
479
635
|
|
480
636
|
print("Tested %d randomly Dehn filled manifolds" % count)
|
481
637
|
|
638
|
+
def test_slope_transformations():
|
639
|
+
"""
|
640
|
+
Tests that slopes are transformed so that the filled
|
641
|
+
manifold is the same.
|
642
|
+
"""
|
482
643
|
|
483
|
-
|
644
|
+
import snappy
|
645
|
+
M = snappy.ManifoldHP("L14n63023(-5,1)(5,1)(10,1)")
|
646
|
+
oriented_isosig = M.triangulation_isosig(
|
647
|
+
decorated=False, ignore_orientation=False)
|
648
|
+
isosig = M.triangulation_isosig(
|
649
|
+
decorated=False)
|
650
|
+
Mop = M.copy()
|
651
|
+
Mop.reverse_orientation()
|
652
|
+
reverse_oriented_isosig = Mop.triangulation_isosig(
|
653
|
+
decorated=False, ignore_orientation=False)
|
654
|
+
|
655
|
+
if oriented_isosig != 'vLLvvLLMALQQzQQceillmnppqrlmrqtruututiivimllaelaqxrvdoxqltt':
|
656
|
+
raise AssertionError()
|
657
|
+
if isosig != 'vLLvLLPwPQLAMPQcefikkmnplkopqrsttutuuiixvimqlippawidlabavth':
|
658
|
+
raise AssertionError()
|
659
|
+
|
660
|
+
# The canonical orientation (used to compute the unoriented isosig)
|
661
|
+
# is the reverse of the actual orientation:
|
662
|
+
if reverse_oriented_isosig != isosig:
|
663
|
+
raise AssertionError()
|
664
|
+
if oriented_isosig == isosig:
|
665
|
+
raise ValueError()
|
666
|
+
|
667
|
+
isom_sig_pos = M.isometry_signature(ignore_orientation = False)
|
668
|
+
if isom_sig_pos != 'KLALvLwLLwMQLQPAMzMzMPzMPcbbeghnklntpqpqvrswtuvxyzABCDEFEGHIJJhhkofnaocnmrlsiaowxfcsaxhxhxhxhjhhhhs':
|
669
|
+
raise AssertionError()
|
670
|
+
isom_sig_neg = Mop.isometry_signature(ignore_orientation = False)
|
671
|
+
if isom_sig_neg != 'KLAMvMvvAwLvQPPPQMPzMPzMPcbbdegilopoouqtryvuxvwxzzBACDEFEGHIJJhhkhhohahrscaagwxkkgbvwpuxwqxqxwxxxxr':
|
672
|
+
raise AssertionError()
|
673
|
+
|
674
|
+
# It is not just the triangulation that is chiral, the manifold itself is:
|
675
|
+
if isom_sig_pos == isom_sig_neg:
|
676
|
+
raise ValueError()
|
677
|
+
|
678
|
+
# So we expect the oriented isometry signature to flip when neither the isomorphism
|
679
|
+
# signature nor its decoration capture the orientation.
|
680
|
+
for ignore_cusp_ordering in [False, True]:
|
681
|
+
for ignore_curves in [False, True]:
|
682
|
+
for ignore_curve_orientations in [False, True]:
|
683
|
+
for ignore_filling_orientations in [False, True]:
|
684
|
+
for ignore_orientation in [False, True]:
|
685
|
+
isosig = M.triangulation_isosig(
|
686
|
+
ignore_cusp_ordering = ignore_cusp_ordering,
|
687
|
+
ignore_curves = ignore_curves,
|
688
|
+
ignore_curve_orientations = ignore_curve_orientations,
|
689
|
+
ignore_filling_orientations = ignore_filling_orientations,
|
690
|
+
ignore_orientation = ignore_orientation)
|
691
|
+
isom_sig = (
|
692
|
+
snappy.ManifoldHP(isosig)
|
693
|
+
.isometry_signature(ignore_orientation = False))
|
694
|
+
does_ignore_orientation = (
|
695
|
+
ignore_orientation and
|
696
|
+
(ignore_curve_orientations or ignore_curves))
|
697
|
+
expected_isom_sig = (
|
698
|
+
isom_sig_neg
|
699
|
+
if does_ignore_orientation
|
700
|
+
else isom_sig_pos)
|
701
|
+
if isom_sig != expected_isom_sig:
|
702
|
+
raise AssertionError()
|
703
|
+
print("Tested slope transformations")
|
704
|
+
|
705
|
+
def run_tests():
|
484
706
|
test_integer_list_encoder()
|
485
707
|
main_test()
|
486
708
|
test_link_invariant()
|
487
709
|
test_by_dehn_filling()
|
710
|
+
test_slope_transformations()
|
@@ -101,16 +101,49 @@ def has_value(v, values):
|
|
101
101
|
return False
|
102
102
|
|
103
103
|
if __name__ == '__main__':
|
104
|
-
|
104
|
+
# Use 5_2(1,2) as an example.
|
105
105
|
from snappy import ManifoldHP
|
106
106
|
|
107
107
|
M = ManifoldHP("5_2")
|
108
108
|
M.chern_simons()
|
109
109
|
M.dehn_fill((1,2))
|
110
110
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
111
|
+
# Complex volume of geometric representation of 5_2(1,2).
|
112
|
+
# Unverified.
|
113
|
+
geom_cvol = M.complex_volume()
|
114
|
+
|
115
|
+
# This file uses a different convention (simply adding Neumann's
|
116
|
+
# extensions of Roger's dilogarithm to the Abelian cover of C \ {0,1})
|
117
|
+
# from the rest of SnapPy, so convert.
|
118
|
+
geom_cvol = sage.all.I * geom_cvol
|
119
|
+
|
120
|
+
# The complex volumes as verified intervals of the SL(2,C)-representations
|
121
|
+
# detected by the (spun-)triangulation.
|
122
|
+
# Grouped by algebraic component of the extended Ptolemy variety.
|
123
|
+
#
|
124
|
+
# We can only compute it in this file up to multiples of pi^2/2.
|
125
|
+
#
|
126
|
+
# (Note that Neumann's method can compute it up to multiple of pi^2 but
|
127
|
+
# assumes an ordered triangulation. Most census triangulations are not
|
128
|
+
# orderable and would require subdivision).
|
129
|
+
#
|
130
|
+
# The method uses SageMath's giac to compute the rational univariate
|
131
|
+
# representation and evaluates it at the roots of the defining polynomial
|
132
|
+
# using complex intervals.
|
133
|
+
#
|
134
|
+
# It can be accessed from sage (with SnapPy installed) by:
|
135
|
+
# from snappy.dev.extended_ptolemy.complexVolumesClosed import complex_volumes
|
136
|
+
#
|
137
|
+
# Tested with SageMath 9.7 and 10.0.
|
138
|
+
#
|
139
|
+
cvols_by_component = complex_volumes(M, precision = 300)
|
140
|
+
|
141
|
+
print(cvols_by_component)
|
142
|
+
|
143
|
+
# Concatenate the grouped complex volumes to just have a single list.
|
144
|
+
cvols = sum(cvols_by_component, [])
|
145
|
+
|
146
|
+
if not has_value(geom_cvol, cvols):
|
147
|
+
raise RuntimeError(
|
148
|
+
"There is a problem. The complex volume of the geometric "
|
149
|
+
"representation is not included.")
|
@@ -153,7 +153,7 @@ def simplify_equation(poly):
|
|
153
153
|
def extended_ptolemy_equations(manifold, gen_obs_class=None,
|
154
154
|
nonzero_cond=True, return_full_var_dict = False,
|
155
155
|
notation = 'short'):
|
156
|
-
"""
|
156
|
+
r"""
|
157
157
|
We assign ptolemy coordinates ['a', 'b', 'c', 'd', 'e', 'f'] to the
|
158
158
|
*directed* edges::
|
159
159
|
|
@@ -165,12 +165,12 @@ def extended_ptolemy_equations(manifold, gen_obs_class=None,
|
|
165
165
|
|
166
166
|
1
|
167
167
|
/|\
|
168
|
-
|
168
|
+
d / | \ e
|
169
169
|
/ | \
|
170
170
|
/ | \
|
171
171
|
2----|----3 with back edge from 2 to 3 labelled f.
|
172
172
|
\ | /
|
173
|
-
|
173
|
+
b \ |a / c
|
174
174
|
\ | /
|
175
175
|
\|/
|
176
176
|
0
|