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/drilling/__init__.py
CHANGED
@@ -2,62 +2,63 @@ from . import exceptions
|
|
2
2
|
from . import epsilons
|
3
3
|
from . import debug
|
4
4
|
from .tracing import trace_geodesic
|
5
|
-
from .crush import crush_geodesic_pieces
|
6
|
-
from .line import R13LineWithMatrix
|
7
|
-
from .geometric_structure import add_r13_geometry, word_to_psl2c_matrix
|
8
|
-
from .geodesic_info import GeodesicInfo, sample_line
|
9
5
|
from .perturb import perturb_geodesics
|
10
6
|
from .subdivide import traverse_geodesics_to_subdivide
|
7
|
+
from .barycentric import mark_subtetrahedra_about_geodesic_pieces
|
8
|
+
from .shorten import shorten_in_barycentric_subdivision
|
9
|
+
from .crush import crush_geodesic_pieces
|
11
10
|
from .cusps import (
|
12
11
|
CuspPostDrillInfo,
|
13
12
|
index_geodesics_and_add_post_drill_infos,
|
14
13
|
reorder_vertices_and_get_post_drill_infos,
|
15
14
|
refill_and_adjust_peripheral_curves)
|
16
15
|
|
16
|
+
from .. import Manifold, ManifoldHP
|
17
|
+
|
18
|
+
from ..geometric_structure.geodesic.geodesic_start_point_info import GeodesicStartPointInfo, compute_geodesic_start_point_info
|
19
|
+
from ..geometric_structure import (add_r13_geometry,
|
20
|
+
add_filling_information)
|
21
|
+
from ..geometric_structure.geodesic.add_core_curves import add_r13_core_curves
|
22
|
+
from ..geometric_structure.geodesic.line import R13LineWithMatrix
|
17
23
|
from ..snap.t3mlite import Mcomplex
|
18
24
|
from ..exceptions import InsufficientPrecisionError
|
19
25
|
|
20
|
-
|
21
|
-
import functools
|
22
|
-
from typing import Sequence
|
23
|
-
|
26
|
+
from typing import Optional, Sequence
|
24
27
|
|
25
28
|
def drill_word(manifold,
|
26
29
|
word : str,
|
27
30
|
verified : bool = False,
|
28
|
-
bits_prec=None,
|
29
|
-
verbose : bool = False):
|
31
|
+
bits_prec : Optional[int] = None,
|
32
|
+
verbose : bool = False) -> Manifold:
|
30
33
|
"""
|
31
34
|
Drills the geodesic corresponding to the given word in the unsimplified
|
32
|
-
fundamental group.
|
35
|
+
fundamental group. Here is an example::
|
33
36
|
|
34
|
-
>>> from snappy import Manifold
|
35
37
|
>>> M = Manifold("m004")
|
36
|
-
>>> M.
|
37
|
-
|
38
|
-
|
39
|
-
|
38
|
+
>>> M.length_spectrum_alt(max_len=1.2) # doctest: +NUMERIC9
|
39
|
+
[Length Core curve Word
|
40
|
+
1.08707014499574 + 1.72276844987009*I - bC,
|
41
|
+
1.08707014499574 - 1.72276844987009*I - a]
|
40
42
|
>>> N = M.drill_word('a')
|
41
43
|
>>> N.identify()
|
42
44
|
[m129(0,0)(0,0), 5^2_1(0,0)(0,0), L5a1(0,0)(0,0), ooct01_00001(0,0)(0,0)]
|
43
45
|
|
44
|
-
The last cusp of the
|
45
|
-
geodesic
|
46
|
-
(1,0)
|
47
|
-
of the new longitude is chosen so that it is parallel to the closed geodesic.
|
48
|
-
That is, the new longitude is homotopic to the closed geodesic when embedding
|
49
|
-
the drilled manifold into the original manifold.
|
46
|
+
The last cusp of the resulting manifold corresponds to the drilled
|
47
|
+
geodesic. The longitude and meridian for that cusp are chosen such that
|
48
|
+
``(1,0)``-filling the last cusp results in the given (undrilled) manifold::
|
50
49
|
|
51
|
-
>>> N.dehn_fill((1,0)
|
50
|
+
>>> N.dehn_fill((1,0),-1)
|
52
51
|
>>> M.is_isometric_to(N)
|
53
52
|
True
|
54
53
|
>>> N.cusp_info(1)['core_length'] # doctest: +NUMERIC9
|
55
54
|
1.08707014499574 - 1.72276844987009*I
|
55
|
+
|
56
|
+
The orientation of the new longitude is chosen so that it is parallel to
|
57
|
+
the closed geodesic. That is, the new longitude is homotopic to the closed
|
58
|
+
geodesic when embedding the drilled manifold into the given manifold.
|
56
59
|
|
57
|
-
If the
|
58
|
-
cusp is unfilled instead
|
59
|
-
the above again applies. The cusp order is also changed so that the unfilled
|
60
|
-
cusp becomes the last cusp.
|
60
|
+
If the given geodesic coincides with a core curve of a filled cusp, the
|
61
|
+
cusp is unfilled instead::
|
61
62
|
|
62
63
|
>>> M = Manifold("m004(2,3)")
|
63
64
|
>>> M.volume() # doctest: +NUMERIC9
|
@@ -71,29 +72,19 @@ def drill_word(manifold,
|
|
71
72
|
m004_drilled(0,0)
|
72
73
|
>>> N.num_cusps()
|
73
74
|
1
|
74
|
-
|
75
|
+
|
76
|
+
In this case, the peripheral information is also
|
77
|
+
updated such that the above remark about ``(1,0)``-filling applies again::
|
78
|
+
|
79
|
+
>>> N.dehn_fill((1,0), -1)
|
75
80
|
>>> N.volume() # doctest: +NUMERIC9
|
76
81
|
1.73712388065
|
77
82
|
|
78
|
-
|
79
|
-
|
80
|
-
computations to compute the intersections of the geodesic with the
|
81
|
-
faces of the tetrahedra is numerical. Sometimes it is necessary to increase
|
82
|
-
the precision with `bits_prec` to make this computation accurate or succeed.
|
83
|
-
If `verified = True` is specified, intervals are used for all computations
|
84
|
-
and the result is provably correct (only supported when used inside
|
85
|
-
SageMath).
|
86
|
-
That is, the algorithm will fail with an exception (most likely
|
87
|
-
InsufficientPrecisionError) if insufficient precision is used. Example of
|
88
|
-
verified computation::
|
83
|
+
That is, the longitude and meridian of the unfilled cusps are reinstalled
|
84
|
+
and the cusps reindexed so that the unfilled cusp becomes the last cusp.
|
89
85
|
|
90
|
-
|
91
|
-
sage: M.drill_word('caa', verified = True, bits_prec = 100)
|
92
|
-
m004_drilled(2,3)(0,0)
|
93
|
-
|
94
|
-
An example where we drill the core geodesic::
|
86
|
+
Here is another example where we drill the core geodesic::
|
95
87
|
|
96
|
-
>>> from snappy import Manifold
|
97
88
|
>>> M = Manifold("v2986(3,4)")
|
98
89
|
>>> N = M.drill_word('EdFgabcGEdFgaDcc')
|
99
90
|
>>> N.is_isometric_to(Manifold("v2986"), return_isometries = True) # doctest: +NORMALIZE_WHITESPACE
|
@@ -101,6 +92,42 @@ def drill_word(manifold,
|
|
101
92
|
[3 -1]
|
102
93
|
[4 -1]
|
103
94
|
Does not extend to link]
|
95
|
+
|
96
|
+
While the result of drilling a geodesic is a triangulation and thus
|
97
|
+
combinatorial in nature, some intermediate computations (for example,
|
98
|
+
to compute the intersections of the geodesic with the faces of the
|
99
|
+
tetrahedra) are numerical. Sometimes, it is necessary to increase the
|
100
|
+
precision with :attr:`bits_prec` to make the method succeed and produce
|
101
|
+
the correct result.
|
102
|
+
|
103
|
+
**Verified computation**
|
104
|
+
|
105
|
+
If :attr:`verified = False`, floating-point issues can arise resulting
|
106
|
+
in drilling the wrong loop. The method can be made
|
107
|
+
:ref:`verified <verify-primer>` by passing :attr:`verified = True`::
|
108
|
+
|
109
|
+
sage: M = Manifold("m004(2,3)")
|
110
|
+
sage: M.drill_word('caa', verified = True, bits_prec = 100)
|
111
|
+
m004_drilled(2,3)(0,0)
|
112
|
+
|
113
|
+
That is, if the precision is insufficient to prove the result is correct,
|
114
|
+
the algorithm fails with an exception (most likely
|
115
|
+
``InsufficientPrecisionError``).
|
116
|
+
|
117
|
+
:param word:
|
118
|
+
The word in the unsimplified fundamental group specifying the
|
119
|
+
geodesic to be drilled.
|
120
|
+
:param bits_prec:
|
121
|
+
The precision used in the intermediate computation. Increase
|
122
|
+
if the computation failed.
|
123
|
+
:param verified:
|
124
|
+
Use :ref:`verified computation <verify-primer>`.
|
125
|
+
:param verbose:
|
126
|
+
Print intermediate results and statistics.
|
127
|
+
|
128
|
+
:return:
|
129
|
+
Manifold obtained by drilling geodesic. ``(1,0)``-filling the
|
130
|
+
last cusp gives the given (undrilled) manifold.
|
104
131
|
"""
|
105
132
|
|
106
133
|
return drill_words(manifold,
|
@@ -113,17 +140,17 @@ def drill_word(manifold,
|
|
113
140
|
def drill_words(manifold,
|
114
141
|
words : Sequence[str],
|
115
142
|
verified : bool = False,
|
116
|
-
bits_prec=None,
|
117
|
-
verbose : bool = False):
|
143
|
+
bits_prec : Optional[int] = None,
|
144
|
+
verbose : bool = False) -> Manifold:
|
118
145
|
"""
|
119
|
-
A generalization of
|
120
|
-
|
121
|
-
|
122
|
-
Here is an example where we drill the core curve corresponding to the third cusp
|
123
|
-
and a geodesic that is not a core curve:
|
146
|
+
A generalization of :meth:`drill_word <Manifold.drill_word>` to drill
|
147
|
+
several geodesics simultaneously. It takes a list of words in the
|
148
|
+
unsimplified fundamental group.
|
124
149
|
|
150
|
+
Here is an example where we drill two geodesics. One of the geodesics is
|
151
|
+
the core curve corresponding to the third cusp. The other geodesic is not
|
152
|
+
a core curve::
|
125
153
|
|
126
|
-
>>> from snappy import Manifold
|
127
154
|
>>> M=Manifold("t12047(0,0)(1,3)(1,4)(1,5)")
|
128
155
|
>>> [ info.get('core_length') for info in M.cusp_info() ] # doctest: +NUMERIC9
|
129
156
|
[None,
|
@@ -139,17 +166,19 @@ def drill_words(manifold,
|
|
139
166
|
>>> N
|
140
167
|
t12047_drilled(0,0)(1,3)(1,5)(0,0)(0,0)
|
141
168
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
because one geodesic was a core curve. The
|
147
|
-
(from (1,4)) and grouped with the other
|
169
|
+
Let n be the number of geodesics that were drilled. Then the last n
|
170
|
+
cusps correspond to the drilled geodesics and appear in the same order than
|
171
|
+
the geodesics were given as words. Note that in the above example, we expect
|
172
|
+
six cusps since we started with four cusps and drilled two geodesics. However,
|
173
|
+
we only obtain five cusps because one geodesic was a core curve. The
|
174
|
+
corresponding cusp was unfilled (from ``(1,4)``) and grouped with the other
|
175
|
+
cusps coming from drilling.
|
148
176
|
|
149
|
-
We obtain the
|
177
|
+
We obtain the given (undrilled) manifold by ``(1,0)``-filling the last n
|
178
|
+
cusps.
|
150
179
|
|
151
|
-
>>> N.dehn_fill((1,0),
|
152
|
-
>>> N.dehn_fill((1,0),
|
180
|
+
>>> N.dehn_fill((1,0), -2)
|
181
|
+
>>> N.dehn_fill((1,0), -1)
|
153
182
|
>>> M.is_isometric_to(N)
|
154
183
|
True
|
155
184
|
>>> [ info.get('core_length') for info in N.cusp_info() ] # doctest: +NUMERIC9
|
@@ -159,6 +188,21 @@ def drill_words(manifold,
|
|
159
188
|
0.317363079597924 + 1.48157893409218*I,
|
160
189
|
1.43914411734251 + 2.66246879992796*I]
|
161
190
|
|
191
|
+
:param word:
|
192
|
+
The words in the unsimplified fundamental group specifying the
|
193
|
+
geodesics to be drilled.
|
194
|
+
:param bits_prec:
|
195
|
+
The precision used in the intermediate computation. Increase
|
196
|
+
if the computation failed.
|
197
|
+
:param verified:
|
198
|
+
Use :ref:`verified computation <verify-primer>`.
|
199
|
+
:param verbose:
|
200
|
+
Print intermediate results and statistics.
|
201
|
+
|
202
|
+
:return:
|
203
|
+
Manifold obtained by drilling geodesics. ``(1,0)``-filling the
|
204
|
+
last n cusps gives the given (undrilled) manifold where n is the
|
205
|
+
number of given words.
|
162
206
|
"""
|
163
207
|
|
164
208
|
if isinstance(words, str):
|
@@ -227,13 +271,15 @@ def drill_words_implementation(
|
|
227
271
|
add_r13_geometry(mcomplex,
|
228
272
|
manifold,
|
229
273
|
verified=verified, bits_prec=bits_prec)
|
274
|
+
add_filling_information(mcomplex, manifold)
|
275
|
+
add_r13_core_curves(mcomplex, manifold)
|
230
276
|
|
231
277
|
# For the words compute basic information such as the corresponding
|
232
278
|
# matrix and the end points and a sample point on the fixed line.
|
233
279
|
# Try to conjugate/translate matrix and end points such that the
|
234
280
|
# line intersects the fundamental domain.
|
235
|
-
geodesics : Sequence[
|
236
|
-
|
281
|
+
geodesics : Sequence[GeodesicStartPointInfo] = [
|
282
|
+
compute_geodesic_start_point_info(mcomplex, word)
|
237
283
|
for word in words ]
|
238
284
|
|
239
285
|
# Record information in the geodesics and triangulation needed
|
@@ -246,6 +292,11 @@ def drill_words_implementation(
|
|
246
292
|
geodesics_to_drill = [ g for g in geodesics
|
247
293
|
if not g.core_curve_cusp ]
|
248
294
|
|
295
|
+
if verbose:
|
296
|
+
for g in geodesics:
|
297
|
+
if g.core_curve_cusp:
|
298
|
+
print("%s is core curve" % g.word)
|
299
|
+
|
249
300
|
if perturb:
|
250
301
|
# Move the sample point for each geodesic a bit and use it
|
251
302
|
# as start point. Much of perturb_geodesics is about computing
|
@@ -300,60 +351,8 @@ def drill_words_implementation(
|
|
300
351
|
|
301
352
|
return drilled_manifold
|
302
353
|
|
303
|
-
|
304
|
-
def _verify_not_parabolic(m, mcomplex, word):
|
305
|
-
"""
|
306
|
-
Raise exception when user gives a word corresponding to a parabolic
|
307
|
-
matrix.
|
308
|
-
"""
|
309
|
-
|
310
|
-
if mcomplex.verified:
|
311
|
-
epsilon = 0
|
312
|
-
else:
|
313
|
-
epsilon = epsilons.compute_epsilon(mcomplex.RF)
|
314
|
-
|
315
|
-
tr = m.trace()
|
316
|
-
if not (abs(tr - 2) > epsilon and abs(tr + 2) > epsilon):
|
317
|
-
raise exceptions.WordAppearsToBeParabolic(word, tr)
|
318
|
-
|
319
|
-
|
320
|
-
def compute_geodesic_info(mcomplex : Mcomplex,
|
321
|
-
word) -> GeodesicInfo:
|
322
|
-
"""
|
323
|
-
Compute basic information about a geodesic given a word.
|
324
|
-
|
325
|
-
add_r13_geometry must have been called on the Mcomplex.
|
326
|
-
"""
|
327
|
-
|
328
|
-
m = word_to_psl2c_matrix(mcomplex, word)
|
329
|
-
_verify_not_parabolic(m, mcomplex, word)
|
330
|
-
# Line fixed by matrix
|
331
|
-
line = R13LineWithMatrix.from_psl2c_matrix(m)
|
332
|
-
|
333
|
-
# Pick a point on the line
|
334
|
-
start_point = sample_line(line)
|
335
|
-
|
336
|
-
g = GeodesicInfo(
|
337
|
-
mcomplex=mcomplex,
|
338
|
-
trace=m.trace(),
|
339
|
-
unnormalised_start_point=start_point,
|
340
|
-
unnormalised_end_point=line.o13_matrix * start_point,
|
341
|
-
line=line)
|
342
|
-
|
343
|
-
# Determines whether geodesic corresponds to a core curve.
|
344
|
-
# Applies Decktransformations so that start point lies within
|
345
|
-
# the interior of one tetrahedron in the fundamental domain or
|
346
|
-
# within the union of two tetrahedra neighboring in the hyperboloid
|
347
|
-
# model.
|
348
|
-
#
|
349
|
-
# See GeodesicInfo for details.
|
350
|
-
g.find_tet_or_core_curve()
|
351
|
-
|
352
|
-
return g
|
353
|
-
|
354
|
-
|
355
354
|
def drill_geodesics(mcomplex : Mcomplex,
|
356
|
-
geodesics : Sequence[
|
355
|
+
geodesics : Sequence[GeodesicStartPointInfo],
|
357
356
|
verbose : bool = False) -> Mcomplex:
|
358
357
|
"""
|
359
358
|
Given a triangulation with geometric structure attached with
|
@@ -361,7 +360,7 @@ def drill_geodesics(mcomplex : Mcomplex,
|
|
361
360
|
the triangulation (with finite vertices) obtained by drilling
|
362
361
|
the geodesics.
|
363
362
|
|
364
|
-
Each provided
|
363
|
+
Each provided GeodesicStartPointInfo is supposed to have a start point and
|
365
364
|
a tetrahedron in the fundamental domain that contains the start point
|
366
365
|
in its interior and an end point such that the line segment from the
|
367
366
|
start to the endpoint forms a closed curve in the manifold.
|
@@ -400,10 +399,20 @@ def drill_geodesics(mcomplex : Mcomplex,
|
|
400
399
|
print("Number of tets after subdividing: %d" % (
|
401
400
|
len(tetrahedra)))
|
402
401
|
|
402
|
+
# Mark which subtetrahedra in the barycentric subdivision
|
403
|
+
# are adjacent to the closed curve we traced.
|
404
|
+
mark_subtetrahedra_about_geodesic_pieces(tetrahedra)
|
405
|
+
|
406
|
+
# If the simple closed curve is having two consecutive pieces
|
407
|
+
# adjacent to the same face, making it shorter by replacing
|
408
|
+
# the two pieces by just one corresponding to the third edge
|
409
|
+
# of the triangle.
|
410
|
+
shorten_in_barycentric_subdivision(tetrahedra, verbose)
|
411
|
+
|
403
412
|
# Perform a barycentric subdivision. Then crush all tetrahedra
|
404
413
|
# touching the closed curve we traced. Note that
|
405
414
|
# crush_geodesic_pieces is actually doing the subdivision and
|
406
|
-
# crushing in just one step.
|
415
|
+
# crushing of the subsimplices marked above in just one step.
|
407
416
|
result : Mcomplex = crush_geodesic_pieces(tetrahedra)
|
408
417
|
|
409
418
|
# Sanity checks while we are still testing the new features.
|
@@ -412,21 +421,31 @@ def drill_geodesics(mcomplex : Mcomplex,
|
|
412
421
|
|
413
422
|
return result
|
414
423
|
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
424
|
+
def drill_word_hp(manifold,
|
425
|
+
word : str,
|
426
|
+
verified : bool = False,
|
427
|
+
bits_prec : Optional[int] = None,
|
428
|
+
verbose : bool = False) -> ManifoldHP:
|
429
|
+
return drill_word(
|
430
|
+
manifold,
|
431
|
+
word = word,
|
432
|
+
verified = verified,
|
433
|
+
bits_prec = bits_prec,
|
434
|
+
verbose = verbose).high_precision()
|
435
|
+
drill_word_hp.__doc__ = drill_word.__doc__
|
436
|
+
|
437
|
+
def drill_words_hp(manifold,
|
438
|
+
words : Sequence[str],
|
439
|
+
verified : bool = False,
|
440
|
+
bits_prec : Optional[int] = None,
|
441
|
+
verbose : bool = False) -> ManifoldHP:
|
442
|
+
return drill_words(
|
443
|
+
manifold,
|
444
|
+
words = words,
|
445
|
+
verified = verified,
|
446
|
+
bits_prec = bits_prec,
|
447
|
+
verbose = verbose).high_precision()
|
448
|
+
drill_words_hp.__doc__ = drill_words.__doc__
|
430
449
|
|
431
450
|
def _add_methods(mfld_class, high_precision=False):
|
432
451
|
if high_precision:
|
@@ -435,104 +454,3 @@ def _add_methods(mfld_class, high_precision=False):
|
|
435
454
|
else:
|
436
455
|
mfld_class.drill_word = drill_word
|
437
456
|
mfld_class.drill_words = drill_words
|
438
|
-
|
439
|
-
|
440
|
-
def dummy_function_for_additional_doctests():
|
441
|
-
"""
|
442
|
-
Test with manifold without symmetry. Note that the code in drilling is
|
443
|
-
deterministic but the SnapPea kernel code to remove the finite vertices
|
444
|
-
and simplify is not. Thus, we need canonical_retriangulation() to get
|
445
|
-
a consistent result:
|
446
|
-
|
447
|
-
>>> from snappy import Manifold, ManifoldHP
|
448
|
-
>>> from snappy.drilling.exceptions import GeodesicSystemNotSimpleError
|
449
|
-
>>> M = Manifold("v2986")
|
450
|
-
>>> M.drill_word('gB').canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
|
451
|
-
'kLvvAQQkbhijhghgjijxxacvcccccv_baBaaBDbBa'
|
452
|
-
|
453
|
-
Test non-simple geodesic and verified computation:
|
454
|
-
|
455
|
-
sage: M = ManifoldHP("m004")
|
456
|
-
sage: try:
|
457
|
-
... M.drill_word('bbCC', verified = True)
|
458
|
-
... except GeodesicSystemNotSimpleError as e:
|
459
|
-
... print("Not simple")
|
460
|
-
Not simple
|
461
|
-
|
462
|
-
Tests drilling one geodesic that intersects 1-skeleton::
|
463
|
-
|
464
|
-
>>> M = Manifold("m125")
|
465
|
-
>>> M.drill_word('d').triangulation_isosig(ignore_orientation=False)
|
466
|
-
'gLLPQcdefeffpvauppb_acbBbBaaBbacbBa'
|
467
|
-
|
468
|
-
Tests drilling two geodesics that intersect each other:
|
469
|
-
|
470
|
-
>>> try: # doctest: +NUMERIC9
|
471
|
-
... M.drill_words(['d','Ad'])
|
472
|
-
... except GeodesicSystemNotSimpleError as e:
|
473
|
-
... print("Max tube radius:", e.maximal_tube_radius)
|
474
|
-
Max tube radius: 0.0000000000
|
475
|
-
|
476
|
-
Tests drilling geodesics that are entirely in the 2-skeleton::
|
477
|
-
|
478
|
-
>>> M.drill_words(['a','acAADa']).triangulation_isosig(ignore_orientation=False)
|
479
|
-
'iLMvPQcbbdfhgghhpuabpauab_acbdaBbaBbaBcBBbcbbb'
|
480
|
-
|
481
|
-
Same test as verified computation::
|
482
|
-
|
483
|
-
sage: M.drill_words(['a','acAADa'], verified = True).triangulation_isosig(ignore_orientation=False)
|
484
|
-
'iLMvPQcbbdfhgghhpuabpauab_acbdaBbaBbaBcBBbcbbb'
|
485
|
-
|
486
|
-
Test error when drilling something close to core curve::
|
487
|
-
|
488
|
-
>>> from snappy import Manifold
|
489
|
-
>>> M = Manifold("m125")
|
490
|
-
>>> MM = M.drill_word('d')
|
491
|
-
>>> MM.dehn_fill((1,0),2)
|
492
|
-
>>> bad_word = 'bc'
|
493
|
-
>>> MM.drill_word(bad_word) # doctest: +ELLIPSIS
|
494
|
-
Traceback (most recent call last):
|
495
|
-
...
|
496
|
-
snappy.drilling.exceptions.GeodesicCloseToCoreCurve: The given geodesic is very close to a core curve and might intersect it.
|
497
|
-
|
498
|
-
There are two places where we detect whether the geodesic is close
|
499
|
-
to a core curve (rather than tiling forever). Test the other place
|
500
|
-
in the GeodesicTube code used to determine the maximal amount we can
|
501
|
-
perturb the geodesic:
|
502
|
-
|
503
|
-
>>> drill_words_implementation(MM, [bad_word], verified = False, bits_prec = 53, perturb = True) # doctest: +ELLIPSIS
|
504
|
-
Traceback (most recent call last):
|
505
|
-
...
|
506
|
-
snappy.drilling.exceptions.GeodesicCloseToCoreCurve: The given geodesic is very close to a core curve and might intersect it.
|
507
|
-
|
508
|
-
A particular tricky case in terms testing that the start piece is correctly
|
509
|
-
handled by 2-3 moves (in particular, commit f9879d04 introduced a bug):
|
510
|
-
|
511
|
-
>>> Manifold("m004").drill_words(['CAC','CCbC']).canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
|
512
|
-
'qLvvLvAMQQQkcgimopkllmpkonnnpixcaelchapewetvrn_bcaaBbBBbaBaBbB'
|
513
|
-
|
514
|
-
|
515
|
-
An interesting case where geodesic intersects triangulation in only one tetrahedron:
|
516
|
-
|
517
|
-
>>> Manifold("m019").drill_word('A').canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
|
518
|
-
'gLLPQccdefffqffqqof_BaaBdcbb'
|
519
|
-
|
520
|
-
A bug in an earlier implementation found by Nathan Dunfield (where putting the words in one order caused a failure):
|
521
|
-
|
522
|
-
>>> import sys
|
523
|
-
>>> original_limit = sys.getrecursionlimit()
|
524
|
-
>>> sys.setrecursionlimit(100000)
|
525
|
-
>>> def drilled_isosig(M, words):
|
526
|
-
... for i in range(10):
|
527
|
-
... try:
|
528
|
-
... F = M.drill_words(words).filled_triangulation()
|
529
|
-
... return F.canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
|
530
|
-
... except RuntimeError:
|
531
|
-
... pass
|
532
|
-
>>> drilled_isosig(Manifold('K11n34(0,1)'), ['iFcdbEiFJ', 'iFJ'])
|
533
|
-
'zLLvLLwzAwPQMQzzQkcdgijkjplssrnrotqruvwyxyxyhsgnnighueqdniblsipklpxgcr_BcaBbBba'
|
534
|
-
>>> drilled_isosig(Manifold('K11n34(0,1)'), ['iFJ', 'iFcdbEiFJ'])
|
535
|
-
'zLLvLLwzAwPQMQzzQkcdgijkjplssrnrotqruvwyxyxyhsgnnighueqdniblsipklpxgcr_babBbaBcaB'
|
536
|
-
>>> sys.setrecursionlimit(original_limit)
|
537
|
-
|
538
|
-
"""
|
@@ -0,0 +1,103 @@
|
|
1
|
+
from .tracing import GeodesicPiece
|
2
|
+
|
3
|
+
from ..snap.t3mlite import Tetrahedron, Perm4, simplex
|
4
|
+
|
5
|
+
from typing import Dict, List, Sequence, Tuple
|
6
|
+
|
7
|
+
def mark_subtetrahedra_about_geodesic_pieces(
|
8
|
+
tetrahedra : Sequence[Tetrahedron]) -> None:
|
9
|
+
"""
|
10
|
+
Record which subtetrahedra of the barycentric subdivision
|
11
|
+
are adjacent to a piece of the geodesic.
|
12
|
+
|
13
|
+
This is recorded in the array Tetrahedron.marked_subtetrahedra.
|
14
|
+
|
15
|
+
Recall that the subtetrahedra of the barycentric subdivision
|
16
|
+
are indexed by S4 permutations. The index within
|
17
|
+
Tetrahedron.marked_subtetrahedra is given by perm_to_index(p).
|
18
|
+
|
19
|
+
The value of Tetrahedron.marked_subtetrahedra[j] is 0 if
|
20
|
+
the subtetrahedron is not adjacent to any piece of the geodesic.
|
21
|
+
Otherwise, it is +/-1 depending on whether the 0-1 edge
|
22
|
+
of the subtetrahedron is parallel or anti-parallel to the
|
23
|
+
geodesic piece. This is recorded to orient the meridian
|
24
|
+
and longitude.
|
25
|
+
"""
|
26
|
+
|
27
|
+
for tet in tetrahedra:
|
28
|
+
tet.marked_subtetrahedra = 24 * [ 0 ]
|
29
|
+
|
30
|
+
for tet in tetrahedra:
|
31
|
+
for piece in tet.geodesic_pieces:
|
32
|
+
mark_subtetrahedra_about_edge(tet, _perm_for_piece(piece))
|
33
|
+
|
34
|
+
transpositions : List[Perm4] = [ Perm4((1,0,2,3)),
|
35
|
+
Perm4((0,2,1,3)),
|
36
|
+
Perm4((0,1,3,2)) ]
|
37
|
+
|
38
|
+
def perm_to_index(perm : Perm4) -> int:
|
39
|
+
"""
|
40
|
+
list(Perm4.S4())[perm_to_index(p)] returns the same Perm4 p.
|
41
|
+
"""
|
42
|
+
return _perm_tuple_to_index[perm.tuple()]
|
43
|
+
|
44
|
+
_perm_tuple_to_index : Dict[Tuple[int, int, int, int], int] = {
|
45
|
+
perm.tuple() : i for i, perm in enumerate(Perm4.S4()) }
|
46
|
+
|
47
|
+
def _perm_for_piece(piece : GeodesicPiece):
|
48
|
+
"""
|
49
|
+
Given a GeodesicPiece with endpoints being on the vertices
|
50
|
+
of the tetrahedron and spanning an oriented edge of the tetrahedron,
|
51
|
+
find an "edge embedding permutation" (similar to regina's
|
52
|
+
edge embedding) that maps the 0-1 edge to the given edge.
|
53
|
+
|
54
|
+
The subtetrahedron corresponding to this permutation is
|
55
|
+
adjacent to half of this edge.
|
56
|
+
"""
|
57
|
+
|
58
|
+
s0 = piece.endpoints[0].subsimplex
|
59
|
+
s1 = piece.endpoints[1].subsimplex
|
60
|
+
|
61
|
+
# Important to consistently always pick a permutation of the
|
62
|
+
# same parity and respect the ordering of the vertices V0 and V1
|
63
|
+
# since this affects which subtetrahedron will be chosen as peripheral
|
64
|
+
# base subtetrahedron - and thus ultimately affects the orientation
|
65
|
+
# of the meridian and longitude computed by install_peripheral_curves.
|
66
|
+
for perm in Perm4.A4():
|
67
|
+
if perm.image(simplex.V0) == s0 and perm.image(simplex.V1) == s1:
|
68
|
+
return perm
|
69
|
+
|
70
|
+
def mark_subtetrahedra_about_edge(tet0 : Tetrahedron, perm0 : Perm4, orientation : int = 1):
|
71
|
+
"""
|
72
|
+
Given a subtetrahedron in the barycentric subdivision parametrized
|
73
|
+
by a tetrahedron and permutation, find all subtetrahedra adjacent to the
|
74
|
+
same edge in the original triangulation and mark them in
|
75
|
+
Tetrahedron.marked_subtetrahedra.
|
76
|
+
|
77
|
+
By default (orientation = 1), the subtetrahedra are marked by +/-1 according
|
78
|
+
to whether each is parallel or anti-parallel to the given edge.
|
79
|
+
Subtetrahedra can be unmarked by forcing orientation = 0.
|
80
|
+
"""
|
81
|
+
|
82
|
+
tet = tet0
|
83
|
+
perm = perm0
|
84
|
+
|
85
|
+
while True:
|
86
|
+
# All subtetrahedra touching the same edge in the current
|
87
|
+
# tetrahedron.
|
88
|
+
for edge_perm in [ perm,
|
89
|
+
perm * transpositions[2] ]:
|
90
|
+
for marked_subtet, subtet_perm in [
|
91
|
+
(+orientation, edge_perm),
|
92
|
+
(-orientation, edge_perm * transpositions[0]) ]:
|
93
|
+
j = perm_to_index(subtet_perm)
|
94
|
+
tet.marked_subtetrahedra[j] = marked_subtet
|
95
|
+
|
96
|
+
# Find the next "edge embedding"
|
97
|
+
face = perm.image(simplex.F3)
|
98
|
+
tet, perm = (
|
99
|
+
tet.Neighbor[face],
|
100
|
+
tet.Gluing[face] * perm * transpositions[2])
|
101
|
+
# Stop if back at the first "edge embedding"
|
102
|
+
if tet is tet0 and perm.tuple() == perm0.tuple():
|
103
|
+
return
|