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
@@ -0,0 +1,35 @@
|
|
1
|
+
from ..hyperboloid import r13_dot
|
2
|
+
|
3
|
+
__all__ = [ 'R13Line' ]
|
4
|
+
|
5
|
+
class R13Line:
|
6
|
+
"""
|
7
|
+
A line in the hyperboloid model - represented by two
|
8
|
+
like-like vectors spanning the line.
|
9
|
+
|
10
|
+
For distance computations, the inner product between the two
|
11
|
+
vectors is stored as well.
|
12
|
+
"""
|
13
|
+
|
14
|
+
def __init__(self,
|
15
|
+
points, # Two light-like vectors
|
16
|
+
inner_product=None): # Optional: their inner product
|
17
|
+
"""
|
18
|
+
inner_product can be given if known, otherwise, will be computed.
|
19
|
+
"""
|
20
|
+
self.points = points
|
21
|
+
if inner_product is None:
|
22
|
+
self.inner_product = r13_dot(points[0], points[1])
|
23
|
+
else:
|
24
|
+
self.inner_product = inner_product
|
25
|
+
|
26
|
+
def transformed(self,
|
27
|
+
m): # O13-matrix
|
28
|
+
"""
|
29
|
+
Returns image of the line under given O13-matrix m.
|
30
|
+
"""
|
31
|
+
|
32
|
+
return R13Line(
|
33
|
+
[ m * point for point in self.points],
|
34
|
+
self.inner_product)
|
35
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
from .line import R13Line
|
2
|
+
from . import (time_r13_normalise,
|
3
|
+
space_r13_normalise,
|
4
|
+
r13_dot)
|
5
|
+
|
6
|
+
from typing import Sequence
|
7
|
+
|
8
|
+
__all__ = ['R13IdealTriangle']
|
9
|
+
|
10
|
+
class R13IdealTriangle:
|
11
|
+
def __init__(self,
|
12
|
+
plane, # one space-like normal vector
|
13
|
+
bounding_planes, # three space-like normal vectors
|
14
|
+
edges : Sequence[R13Line] # Same order as bounding_planes
|
15
|
+
):
|
16
|
+
self.plane = plane
|
17
|
+
self.bounding_planes = bounding_planes
|
18
|
+
self.edges = edges
|
19
|
+
|
20
|
+
def triangle_bounding_plane(v_opp, v0, v1):
|
21
|
+
m = time_r13_normalise(
|
22
|
+
-(r13_dot(v1, v_opp) * v0 + r13_dot(v0, v_opp) * v1))
|
23
|
+
|
24
|
+
return _make_r13_unit_tangent_vector(m - v_opp, m)
|
25
|
+
|
26
|
+
def _make_r13_unit_tangent_vector(direction, point):
|
27
|
+
s = r13_dot(direction, point)
|
28
|
+
return space_r13_normalise(direction + s * point)
|
29
|
+
|
@@ -0,0 +1,382 @@
|
|
1
|
+
from . import Triangulation, TriangulationHP, ManifoldHP
|
2
|
+
from . import verify
|
3
|
+
from .sage_helper import _within_sage
|
4
|
+
from .math_basics import is_RealIntervalFieldElement
|
5
|
+
from .exceptions import InsufficientPrecisionError, NonorientableManifoldError
|
6
|
+
from .geometric_structure.geodesic.exceptions import WordAppearsToBeParabolic
|
7
|
+
from .decorated_isosig import key_slope, normalized_slope
|
8
|
+
from .matrix import make_vector
|
9
|
+
|
10
|
+
def isometry_signature(
|
11
|
+
manifold, of_link=False, ignore_orientation=True, verified=False,
|
12
|
+
interval_bits_precs=verify.default_interval_bits_precs,
|
13
|
+
exact_bits_prec_and_degrees=verify.default_exact_bits_prec_and_degrees,
|
14
|
+
verbose=False) -> str:
|
15
|
+
"""
|
16
|
+
Returns the "isometry signature", a complete invariant of the hyperbolic
|
17
|
+
3-manifold obtained by applying the Dehn-fillings.
|
18
|
+
The isometry signature is always a (decorated) isomorphism signature, see
|
19
|
+
:meth:`.triangulation_isosig`, and was introduced in
|
20
|
+
`Goerner '16 <http://arxiv.org/abs/1502.00383>`_.
|
21
|
+
|
22
|
+
Depending on :attr:`ignore_orientation`, it is a complete invariant of
|
23
|
+
either the oriented (if orientable) or unoriented hyperbolic 3-manifold.
|
24
|
+
If :attr:`of_link = True` is specified, the signature is decorated by the
|
25
|
+
unoriented peripheral curves (aka meridian and longitude, up to homotopy).
|
26
|
+
If the 3-manifold arises as a link complement, the decorated isometry
|
27
|
+
signature obtained with :attr:`of_link = True` is a complete invariant of
|
28
|
+
the link.
|
29
|
+
|
30
|
+
The isometry signature is computed differently based on whether there
|
31
|
+
is at least one unfilled cusp.
|
32
|
+
|
33
|
+
**Cusped manifolds**
|
34
|
+
|
35
|
+
If there is at least one unfilled cusped, we are in the cusped case.
|
36
|
+
|
37
|
+
Here is an example of two links having isometric (hyperbolic) complements:
|
38
|
+
|
39
|
+
>>> M = Manifold("L5a1")
|
40
|
+
>>> N = Manifold("L7n2")
|
41
|
+
>>> M.isometry_signature()
|
42
|
+
'eLPkbdcddhgggb'
|
43
|
+
>>> N.isometry_signature()
|
44
|
+
'eLPkbdcddhgggb'
|
45
|
+
|
46
|
+
The complements do have opposite handedness though::
|
47
|
+
|
48
|
+
>>> M.isometry_signature(ignore_orientation=False)
|
49
|
+
'eLPkbdcddxvvcv'
|
50
|
+
>>> N.isometry_signature(ignore_orientation=False)
|
51
|
+
'eLPkbdcddhgggb'
|
52
|
+
|
53
|
+
We can show that the two links are distinct::
|
54
|
+
|
55
|
+
>>> M.isometry_signature(of_link = True)
|
56
|
+
'eLPkbdcddhgggb_baCbbaCb'
|
57
|
+
>>> N.isometry_signature(of_link = True)
|
58
|
+
'eLPkbdcddhgggb_bBcBbaCb'
|
59
|
+
|
60
|
+
If we Dehn-fill some cusps, the method uses the filled triangulation.
|
61
|
+
Here, we Dehn-fill the Whitehead link to get the figure-eight knot::
|
62
|
+
|
63
|
+
>>> M.dehn_fill((1,1), 0)
|
64
|
+
>>> M.isometry_signature(of_link = True)
|
65
|
+
'cPcbbbiht_bacb'
|
66
|
+
>>> Manifold("4_1").isometry_signature(of_link = True)
|
67
|
+
'cPcbbbiht_bacb'
|
68
|
+
|
69
|
+
In general, the isometry signature is the isomorphism signature (see
|
70
|
+
:meth:`.triangulation_isosig`) of the
|
71
|
+
:meth:`.canonical_retriangulation` of the
|
72
|
+
:meth:`.filled_triangulation`::
|
73
|
+
|
74
|
+
>>> T = M.filled_triangulation().canonical_retriangulation()
|
75
|
+
>>> T.triangulation_isosig(ignore_cusp_ordering = True,
|
76
|
+
... ignore_curve_orientations = True)
|
77
|
+
'cPcbbbiht_bacb'
|
78
|
+
|
79
|
+
**Closed manifolds**
|
80
|
+
|
81
|
+
If all cusps are filled, we are in the closed case. In this case, the
|
82
|
+
isometry signature gives the resulting closed hyperbolic 3-manifold as
|
83
|
+
canonical surgery on a hyperbolic 1-cusped manifold (which is encoded by
|
84
|
+
its isometry signature). Only orientable manifolds are supported in the
|
85
|
+
closed case.
|
86
|
+
|
87
|
+
>>> M = Manifold("v2000(1,3)")
|
88
|
+
>>> M.isometry_signature()
|
89
|
+
'fLLQcacdedenbxxrr(-7,12)'
|
90
|
+
|
91
|
+
The following code illustrates how the isometry signature is computed::
|
92
|
+
|
93
|
+
>>> M.length_spectrum_alt(count=2) # doctest: +NUMERIC9
|
94
|
+
[Length Core curve Word
|
95
|
+
0.06491027903143 - 2.63765810995071*I - d,
|
96
|
+
0.49405010583448 + 2.38451103485706*I - a]
|
97
|
+
>>> K = M.drill_word('d').filled_triangulation().canonical_retriangulation()
|
98
|
+
>>> K.dehn_fill((1,0), 0)
|
99
|
+
>>> K.triangulation_isosig(ignore_cusp_ordering=True, ignore_curves=True)
|
100
|
+
'fLLQcacdedenbxxrr(-7,12)'
|
101
|
+
|
102
|
+
Note that there is clearly a unique shortest geodesic in this example.
|
103
|
+
In general, the method first considers a canonical set of geodesics.
|
104
|
+
For each such geodesic, it computes a candidate signature as above. It
|
105
|
+
then picks a canonical signature among the candidates. Further details
|
106
|
+
can be found in an upcoming paper.
|
107
|
+
|
108
|
+
**Verified computations**
|
109
|
+
|
110
|
+
While the isometry signature is purely combinatorial, some intermediate
|
111
|
+
computations are numerical. Thus, if :attr:`verified = False`,
|
112
|
+
floating-point issues can arise.
|
113
|
+
|
114
|
+
The method can be made :ref:`verified <verify-primer>` by passing
|
115
|
+
:attr:`verified = True`::
|
116
|
+
|
117
|
+
sage: M=Manifold("m007(4,1)")
|
118
|
+
sage: M.isometry_signature(verified=True)
|
119
|
+
'eLPkbcdddhggsj(3,1)'
|
120
|
+
|
121
|
+
This method always needs to compute at least one canonical retriangulation.
|
122
|
+
It can take the same arguments as :meth:`.canonical_retriangulation` and
|
123
|
+
passes them to :meth:`.canonical_retriangulation` when computing the
|
124
|
+
verified canonical retriangulation. If the manifold is closed, interval
|
125
|
+
arithmetic is used when finding and drilling the short geodesics.
|
126
|
+
|
127
|
+
:param of_link:
|
128
|
+
Also encode the unoriented peripheral curves.
|
129
|
+
Note that it is not necessary for the manifold to be a link
|
130
|
+
complement to invoke this flag.
|
131
|
+
Only relevant in the cusped case.
|
132
|
+
:param ignore_orientation:
|
133
|
+
Do not encode the orientation of the 3-manifold.
|
134
|
+
:param verified:
|
135
|
+
Use :ref:`verified computation <verify-primer>`.
|
136
|
+
:param interval_bits_precs:
|
137
|
+
Passed to :meth:`.canonical_retriangulation` and (in the closed
|
138
|
+
case) also used when calling :meth:`.length_spectrum_alt_gen` and
|
139
|
+
:meth:`.drill_word` to find and drill the short geodesics.
|
140
|
+
:param exact_bits_prec_and_degrees:
|
141
|
+
Passed to :meth:`.canonical_retriangulation`.
|
142
|
+
:param verbose:
|
143
|
+
Print information about finding and drilling the short geodesics.
|
144
|
+
Also passed to :meth:`.canonical_retriangulation`.
|
145
|
+
"""
|
146
|
+
|
147
|
+
if any(manifold.cusp_info('complete?')):
|
148
|
+
return isometry_signature_cusped(
|
149
|
+
manifold,
|
150
|
+
of_link=of_link,
|
151
|
+
ignore_orientation=ignore_orientation,
|
152
|
+
verified=verified,
|
153
|
+
interval_bits_precs=interval_bits_precs,
|
154
|
+
exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
|
155
|
+
verbose=verbose)
|
156
|
+
else:
|
157
|
+
return isometry_signature_closed(
|
158
|
+
manifold,
|
159
|
+
ignore_orientation=ignore_orientation,
|
160
|
+
verified=verified,
|
161
|
+
interval_bits_precs=interval_bits_precs,
|
162
|
+
exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
|
163
|
+
verbose=verbose)
|
164
|
+
|
165
|
+
|
166
|
+
def isometry_signature_cusped(
|
167
|
+
manifold, *,
|
168
|
+
of_link,
|
169
|
+
ignore_orientation,
|
170
|
+
verified,
|
171
|
+
interval_bits_precs,
|
172
|
+
exact_bits_prec_and_degrees,
|
173
|
+
verbose):
|
174
|
+
if not all(manifold.cusp_info('complete?')):
|
175
|
+
manifold = manifold.filled_triangulation()
|
176
|
+
if not all(manifold.cusp_info('complete?')):
|
177
|
+
raise ValueError(
|
178
|
+
'Could not compute filled triangulation. '
|
179
|
+
'Are the filling coefficients co-prime integers?')
|
180
|
+
|
181
|
+
retrig = manifold.canonical_retriangulation(
|
182
|
+
verified=verified,
|
183
|
+
interval_bits_precs=interval_bits_precs,
|
184
|
+
exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
|
185
|
+
verbose=verbose)
|
186
|
+
|
187
|
+
return retrig.triangulation_isosig(
|
188
|
+
decorated=of_link,
|
189
|
+
ignore_cusp_ordering=True,
|
190
|
+
ignore_curve_orientations=True,
|
191
|
+
ignore_orientation=ignore_orientation)
|
192
|
+
|
193
|
+
def isometry_signature_closed(
|
194
|
+
manifold, *,
|
195
|
+
ignore_orientation,
|
196
|
+
verified,
|
197
|
+
interval_bits_precs,
|
198
|
+
exact_bits_prec_and_degrees,
|
199
|
+
verbose):
|
200
|
+
|
201
|
+
if not manifold.is_orientable():
|
202
|
+
raise NonorientableManifoldError(
|
203
|
+
"Manifold.isometry_signature (closed case)", manifold)
|
204
|
+
|
205
|
+
if verbose:
|
206
|
+
print("Step 1: Finding shortest geodesics")
|
207
|
+
|
208
|
+
shortest_geodesics = find_shortest_geodesics_precisions(
|
209
|
+
manifold,
|
210
|
+
bits_precs=interval_bits_precs,
|
211
|
+
verified=verified,
|
212
|
+
verbose=verbose)
|
213
|
+
|
214
|
+
if verbose:
|
215
|
+
print("Step 2: Drill each geodesic for potential isometry signatures")
|
216
|
+
|
217
|
+
potential_signatures = []
|
218
|
+
|
219
|
+
for shortest_geodesic in shortest_geodesics:
|
220
|
+
if verbose:
|
221
|
+
print("Drilling ", shortest_geodesic)
|
222
|
+
|
223
|
+
drilled_manifold = drill_manifold_precisions(
|
224
|
+
manifold, shortest_geodesic,
|
225
|
+
bits_precs=interval_bits_precs,
|
226
|
+
verified=verified,
|
227
|
+
verbose=verbose)
|
228
|
+
|
229
|
+
if not all(drilled_manifold.cusp_info('complete?')):
|
230
|
+
drilled_manifold = drilled_manifold.filled_triangulation()
|
231
|
+
|
232
|
+
if verbose:
|
233
|
+
print("Computing isometry signature of drilled manifold")
|
234
|
+
|
235
|
+
try:
|
236
|
+
retrig = drilled_manifold.canonical_retriangulation(
|
237
|
+
verified=verified,
|
238
|
+
interval_bits_precs=interval_bits_precs,
|
239
|
+
exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
|
240
|
+
verbose=verbose)
|
241
|
+
except Exception as e:
|
242
|
+
raise RuntimeError(
|
243
|
+
"Could not compute or verify canonical retriangulation of "
|
244
|
+
"drilled manifold. "
|
245
|
+
"Geodesic was: %s." % shortest_geodesic) from e
|
246
|
+
|
247
|
+
isosig = retrig.triangulation_isosig(
|
248
|
+
decorated=False,
|
249
|
+
ignore_orientation=ignore_orientation)
|
250
|
+
|
251
|
+
for slope in compute_meridian_slopes(isosig, retrig):
|
252
|
+
sig = (isosig, slope)
|
253
|
+
if verbose:
|
254
|
+
print("Potential isometry signature %s%r" % sig)
|
255
|
+
potential_signatures.append(sig)
|
256
|
+
|
257
|
+
isosig, (m, l) = min(potential_signatures, key=key_signature)
|
258
|
+
|
259
|
+
return '%s(%d,%d)' % (isosig, m, l)
|
260
|
+
|
261
|
+
|
262
|
+
def find_shortest_geodesics_precisions(
|
263
|
+
manifold, *, bits_precs, verified, verbose):
|
264
|
+
|
265
|
+
err = ValueError("bits_precs was empty.")
|
266
|
+
|
267
|
+
for bits_prec in bits_precs:
|
268
|
+
if verbose:
|
269
|
+
print("Using precision %d to find shortest geodesics" % bits_prec)
|
270
|
+
try:
|
271
|
+
return find_shortest_geodesics(
|
272
|
+
manifold,
|
273
|
+
bits_prec=bits_prec,
|
274
|
+
verified=verified,
|
275
|
+
verbose=verbose)
|
276
|
+
except (InsufficientPrecisionError,
|
277
|
+
ValueError,
|
278
|
+
RuntimeError # from Manifold.tetrahedra_shapes
|
279
|
+
) as e:
|
280
|
+
err = e
|
281
|
+
|
282
|
+
raise err
|
283
|
+
|
284
|
+
|
285
|
+
def find_shortest_geodesics(manifold, *, bits_prec, verified, verbose):
|
286
|
+
length_spectrum = manifold.length_spectrum_alt_gen(
|
287
|
+
bits_prec=bits_prec, verified=verified)
|
288
|
+
|
289
|
+
is_first = True
|
290
|
+
|
291
|
+
words_to_drill = []
|
292
|
+
|
293
|
+
for geodesic in length_spectrum:
|
294
|
+
if is_first:
|
295
|
+
systole = geodesic.length.real()
|
296
|
+
cutoff = compute_cutoff(systole)
|
297
|
+
is_first = False
|
298
|
+
if verbose:
|
299
|
+
print("Systole: ", systole)
|
300
|
+
print("Cutoff for shortest geodesics: ", cutoff)
|
301
|
+
|
302
|
+
r = geodesic.length.real()
|
303
|
+
|
304
|
+
if verbose:
|
305
|
+
print("Word: ", geodesic.word)
|
306
|
+
print("Geodesic length: ", r)
|
307
|
+
|
308
|
+
if r > cutoff:
|
309
|
+
break
|
310
|
+
|
311
|
+
if r < cutoff:
|
312
|
+
if verbose:
|
313
|
+
print("Adding word to candidates")
|
314
|
+
words_to_drill.append(geodesic.word)
|
315
|
+
continue
|
316
|
+
|
317
|
+
raise InsufficientPrecisionError(
|
318
|
+
"Could not determine whether geodesic length is "
|
319
|
+
"less or greater than cutoff.\n"
|
320
|
+
"Cutoff: %r\n"
|
321
|
+
"Length: %r\n" % (cutoff, r))
|
322
|
+
|
323
|
+
return words_to_drill
|
324
|
+
|
325
|
+
_cutoff_binary_digits = 16
|
326
|
+
|
327
|
+
def compute_cutoff(systole):
|
328
|
+
RF = systole.parent()
|
329
|
+
|
330
|
+
if _within_sage:
|
331
|
+
l = systole.log2()
|
332
|
+
else:
|
333
|
+
l = systole.log() / RF(2).log()
|
334
|
+
|
335
|
+
f = l.floor()
|
336
|
+
|
337
|
+
if is_RealIntervalFieldElement(l):
|
338
|
+
is_int, f_int = f.is_int()
|
339
|
+
if not is_int:
|
340
|
+
raise InsufficientPrecisionError(
|
341
|
+
"Could not determine magnitude of systole.")
|
342
|
+
else:
|
343
|
+
f_int = f
|
344
|
+
|
345
|
+
return systole + RF(2) ** (f_int - _cutoff_binary_digits)
|
346
|
+
|
347
|
+
def drill_manifold_precisions(
|
348
|
+
manifold, word, *,
|
349
|
+
bits_precs, verified, verbose):
|
350
|
+
|
351
|
+
err = ValueError("bits_precs was empty.")
|
352
|
+
|
353
|
+
for bits_prec in bits_precs:
|
354
|
+
try:
|
355
|
+
if verbose:
|
356
|
+
print("Drilling with precision %d" % bits_prec)
|
357
|
+
|
358
|
+
return manifold.drill_word(
|
359
|
+
word,
|
360
|
+
bits_prec=bits_prec,
|
361
|
+
verified=verified,
|
362
|
+
verbose=verbose)
|
363
|
+
except (InsufficientPrecisionError,
|
364
|
+
ValueError,
|
365
|
+
RuntimeError, # from Manifold.tetrahedra_shapes
|
366
|
+
WordAppearsToBeParabolic) as e:
|
367
|
+
err = e
|
368
|
+
|
369
|
+
raise err
|
370
|
+
|
371
|
+
def compute_meridian_slopes(isosig, tri):
|
372
|
+
isosig_tri = Triangulation(isosig, remove_finite_vertices=False)
|
373
|
+
# Do not call isosig_tri.set_peripheral_curves('combinatorial')
|
374
|
+
# here.
|
375
|
+
for iso in tri.isomorphisms_to(isosig_tri):
|
376
|
+
cusp_map, = iso.cusp_maps()
|
377
|
+
slope = make_vector([cusp_map[0,0], cusp_map[1,0]])
|
378
|
+
yield normalized_slope(slope)
|
379
|
+
|
380
|
+
def key_signature(signature):
|
381
|
+
isosig, slope = signature
|
382
|
+
return (isosig, key_slope(slope))
|