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
@@ -1,366 +0,0 @@
|
|
1
|
-
from .line import R13LineWithMatrix
|
2
|
-
|
3
|
-
from ..verify.shapes import compute_hyperbolic_shapes # type: ignore
|
4
|
-
from ..snap.fundamental_polyhedron import FundamentalPolyhedronEngine # type: ignore
|
5
|
-
from ..snap.kernel_structures import TransferKernelStructuresEngine # type: ignore
|
6
|
-
from ..snap.t3mlite import simplex, Mcomplex, Tetrahedron, Vertex # type: ignore
|
7
|
-
from ..SnapPy import word_as_list # type: ignore
|
8
|
-
|
9
|
-
from ..hyperboloid import (o13_inverse, # type: ignore
|
10
|
-
space_r13_normalise,
|
11
|
-
r13_dot,
|
12
|
-
unnormalised_plane_eqn_from_r13_points)
|
13
|
-
from ..upper_halfspace import sl2c_inverse, psl2c_to_o13 # type: ignore
|
14
|
-
from ..upper_halfspace.ideal_point import ideal_point_to_r13 # type: ignore
|
15
|
-
from ..matrix import vector, matrix, mat_solve # type: ignore
|
16
|
-
from ..math_basics import prod, xgcd # type: ignore
|
17
|
-
|
18
|
-
from collections import deque
|
19
|
-
|
20
|
-
from typing import Tuple, Sequence, Optional, Any
|
21
|
-
|
22
|
-
Filling = Tuple[int, int]
|
23
|
-
FillingMatrix = Tuple[Filling, Filling]
|
24
|
-
|
25
|
-
|
26
|
-
def compute_r13_planes_for_tet(tet : Tetrahedron):
|
27
|
-
"""
|
28
|
-
Computes outward facing normals/plane equations from the vertices of
|
29
|
-
positively oriented tetrahedra - all in the hyperboloid model.
|
30
|
-
"""
|
31
|
-
|
32
|
-
tet.R13_unnormalised_planes = {
|
33
|
-
f: unnormalised_plane_eqn_from_r13_points(
|
34
|
-
[ tet.R13_vertices[v] for v in verts ])
|
35
|
-
for f, verts in simplex.VerticesOfFaceCounterclockwise.items() }
|
36
|
-
tet.R13_planes = {
|
37
|
-
f : space_r13_normalise(plane)
|
38
|
-
for f, plane in tet.R13_unnormalised_planes.items() }
|
39
|
-
|
40
|
-
|
41
|
-
def word_to_psl2c_matrix(mcomplex : Mcomplex, word : str):
|
42
|
-
"""
|
43
|
-
Given a triangulation with a R13 geometric structure (that is
|
44
|
-
the structure attached by calling add_r13_geometry) and a word
|
45
|
-
in the simplified fundamental group (given as string), returns
|
46
|
-
the corresponding PSL(2,C)-matrix.
|
47
|
-
"""
|
48
|
-
|
49
|
-
return word_list_to_psl2c_matrix(
|
50
|
-
mcomplex, word_as_list(word, mcomplex.num_generators))
|
51
|
-
|
52
|
-
|
53
|
-
def word_list_to_psl2c_matrix(mcomplex : Mcomplex, word_list : Sequence[int]):
|
54
|
-
"""
|
55
|
-
Like word_to_psl2c_matrix, but taking the word as a sequence of
|
56
|
-
non-zero integers with positive integers corresponding to generators and
|
57
|
-
negative integers corresponding to their inverses.
|
58
|
-
"""
|
59
|
-
|
60
|
-
return prod([mcomplex.GeneratorMatrices[g]
|
61
|
-
for g in word_list])
|
62
|
-
|
63
|
-
|
64
|
-
def add_r13_geometry(
|
65
|
-
mcomplex : Mcomplex,
|
66
|
-
manifold,
|
67
|
-
verified : bool = False,
|
68
|
-
bits_prec : Optional[int] = None):
|
69
|
-
"""
|
70
|
-
Given the same triangulation once as Mcomplex and once as SnapPy Manifold,
|
71
|
-
develops the vertices of the tetrahedra (using the same fundamental
|
72
|
-
polyhedron as the SnapPea kernel), computes the face-pairing matrices and
|
73
|
-
the matrices corresponding to the generators of the unsimplified
|
74
|
-
fundamental group, computes the incenter of the base tetrahedron and
|
75
|
-
the core curve for each vertex of each tetrahedron corresponding to a
|
76
|
-
filled cusp.
|
77
|
-
|
78
|
-
The precision can be given by bits_prec (if not given, the precision of
|
79
|
-
the Manifold type is used, i.e., 53 for Manifold and 212 for ManifoldHP).
|
80
|
-
|
81
|
-
If verified is True, intervals will be computed for all the above
|
82
|
-
information.
|
83
|
-
"""
|
84
|
-
|
85
|
-
shapes = compute_hyperbolic_shapes(
|
86
|
-
manifold, verified=verified, bits_prec=bits_prec)
|
87
|
-
z = shapes[0]
|
88
|
-
RF = z.real().parent()
|
89
|
-
|
90
|
-
# Develop the vertices in the upper half space model - we will
|
91
|
-
# convert them to the hyperboloid model later.
|
92
|
-
poly = FundamentalPolyhedronEngine.from_manifold_and_shapes(
|
93
|
-
manifold, shapes, normalize_matrices=True)
|
94
|
-
|
95
|
-
# Match the order of the mcomplex.Vertices to the one the SnapPea
|
96
|
-
# kernel sees and copy meridians and longitudes to tet.PeripheralCurves.
|
97
|
-
TransferKernelStructuresEngine(
|
98
|
-
mcomplex, manifold).reindex_cusps_and_transfer_peripheral_curves()
|
99
|
-
mcomplex.verified = verified
|
100
|
-
mcomplex.RF = RF
|
101
|
-
# PSL(2,C)-matrices corresponding to generators of fundamental group.
|
102
|
-
# Positive integers map to the generators, negative integrs to their
|
103
|
-
# inverses and 0 to the identity.
|
104
|
-
mcomplex.GeneratorMatrices = {
|
105
|
-
g : _to_matrix(m)
|
106
|
-
for g, m in poly.mcomplex.GeneratorMatrices.items() }
|
107
|
-
# Number of generators of the fundamental group.
|
108
|
-
mcomplex.num_generators = len(mcomplex.GeneratorMatrices) // 2
|
109
|
-
|
110
|
-
for tet, developed_tet in zip(mcomplex.Tetrahedra, poly.mcomplex):
|
111
|
-
# Shape for each edge, keys are simplex.OneSubsimplices
|
112
|
-
tet.ShapeParameters = developed_tet.ShapeParameters
|
113
|
-
# Vertices in C union infinity on the boundary of
|
114
|
-
# upper halfspace model
|
115
|
-
tet.ideal_vertices = {
|
116
|
-
V: developed_tet.Class[V].IdealPoint
|
117
|
-
for V in simplex.ZeroSubsimplices }
|
118
|
-
# Vertices in hyperboloid model
|
119
|
-
tet.R13_vertices = {
|
120
|
-
V: ideal_point_to_r13(z, RF)
|
121
|
-
for V, z in tet.ideal_vertices.items() }
|
122
|
-
# Add plane equations for faces
|
123
|
-
compute_r13_planes_for_tet(tet)
|
124
|
-
# Compute face-pairing matrices for hyperboloid model
|
125
|
-
tet.O13_matrices = {
|
126
|
-
F : psl2c_to_o13(mcomplex.GeneratorMatrices.get(-g))
|
127
|
-
for F, g in developed_tet.GeneratorsInfo.items() }
|
128
|
-
# Dict, keys are a subset of simplex.ZeroSubsimplices
|
129
|
-
#
|
130
|
-
# If a vertex of a tet corresponds to a filled cusp, this dictionary
|
131
|
-
# will contain the appropriate lift of the core curve in the
|
132
|
-
# hyperboloid model.
|
133
|
-
tet.core_curves = { }
|
134
|
-
|
135
|
-
# Set base tetrahedron and compute its in-radius and center.
|
136
|
-
mcomplex.baseTet = mcomplex.Tetrahedra[
|
137
|
-
poly.mcomplex.ChooseGenInitialTet.Index]
|
138
|
-
mcomplex.baseTetInRadius, mcomplex.R13_baseTetInCenter = (
|
139
|
-
_compute_inradius_and_incenter_from_planes(
|
140
|
-
[ mcomplex.baseTet.R13_planes[f]
|
141
|
-
for f in simplex.TwoSubsimplices]))
|
142
|
-
|
143
|
-
# For each cusp, a pair of words for the meridian and longitude as
|
144
|
-
# sequence of non-zero integers.
|
145
|
-
#
|
146
|
-
# Only computed when needed.
|
147
|
-
all_peripheral_words : Optional[Sequence[Sequence[Sequence[int]]]] = None
|
148
|
-
|
149
|
-
# For each cusp
|
150
|
-
for v, info in zip(mcomplex.Vertices, manifold.cusp_info()):
|
151
|
-
# v.filling_matrix is a matrix of integers (as list of lists) such that
|
152
|
-
# v.filling_matrix[0] contains the filling coefficients
|
153
|
-
# (e.g., [3,4] for m004(3,4)) and the determinant is 1 if the cusp is
|
154
|
-
# filled. That is, v.filling_matrix[1] determines a curve intersecting
|
155
|
-
# the filling curve once (as sum of a multiple of meridian and
|
156
|
-
# longitude) and that is thus parallel to the core curve.
|
157
|
-
# For an unfilled cusp, v.filling_matrix is ((0,0), (0,0))
|
158
|
-
|
159
|
-
v.filling_matrix = _filling_matrix(info)
|
160
|
-
if v.filling_matrix[0] != (0,0):
|
161
|
-
if all_peripheral_words is None:
|
162
|
-
# Make the SnapPea kernel compute peripheral curves the first
|
163
|
-
# time when we need them.
|
164
|
-
G = manifold.fundamental_group(False)
|
165
|
-
all_peripheral_words = G.peripheral_curves(as_int_list=True)
|
166
|
-
# Note that a cusp only determines the words for the meridian
|
167
|
-
# and longitude only up to conjugacy, we need to pick a lift of the
|
168
|
-
# cusp and a path from the basepoint to the lift.
|
169
|
-
#
|
170
|
-
# Similarly, the lift of the core curve of a filled cusp to the
|
171
|
-
# hyperboloid model depends on a lift of a cusp a path from the
|
172
|
-
# basepoint to the lift.
|
173
|
-
#
|
174
|
-
# We compute the lift for each vertex of each tetrahedron in the
|
175
|
-
# fundamental domain corresponding to the cusp (with the path
|
176
|
-
# connecting the basepoint to the vertex being the one contained
|
177
|
-
# in the fundamental domain).
|
178
|
-
#
|
179
|
-
# Starting with the one choice the SnapPea kernel did and computing
|
180
|
-
# the resulting lift of the core curve, we need to transfer it
|
181
|
-
# to the other choices of vertices of tetrahedra corresponding to
|
182
|
-
# the cusp by "developing" the cusp.
|
183
|
-
#
|
184
|
-
_develop_core_curve_cusp(
|
185
|
-
mcomplex,
|
186
|
-
v,
|
187
|
-
_compute_core_curve(
|
188
|
-
mcomplex,
|
189
|
-
all_peripheral_words[v.Index],
|
190
|
-
v.filling_matrix[1]))
|
191
|
-
|
192
|
-
return mcomplex
|
193
|
-
|
194
|
-
###############################################################################
|
195
|
-
# Helpers
|
196
|
-
|
197
|
-
|
198
|
-
def _to_matrix(m):
|
199
|
-
"""
|
200
|
-
Necesssary conversion when not SageMath.
|
201
|
-
|
202
|
-
This is needed because we have two matrix types outside of Sage:
|
203
|
-
SimpleMatrix and Matrix2x2. Convert to the former.
|
204
|
-
"""
|
205
|
-
return matrix([[m[0,0],m[0,1]],
|
206
|
-
[m[1,0],m[1,1]]])
|
207
|
-
|
208
|
-
|
209
|
-
def _compute_core_curve(
|
210
|
-
mcomplex : Mcomplex,
|
211
|
-
peripheral_words : Sequence[Sequence[int]],
|
212
|
-
core_curve_coefficients : Filling) -> R13LineWithMatrix:
|
213
|
-
"""
|
214
|
-
Compute core curve given words for meridian and longitude and
|
215
|
-
the integers determining a curve (as sum of a multiple of meridian
|
216
|
-
and longitude) that is parallel to the core curve.
|
217
|
-
"""
|
218
|
-
|
219
|
-
result = mcomplex.GeneratorMatrices[0]
|
220
|
-
|
221
|
-
for word, f in zip(peripheral_words, core_curve_coefficients):
|
222
|
-
if f != 0:
|
223
|
-
m = word_list_to_psl2c_matrix(mcomplex, word)
|
224
|
-
if f < 0:
|
225
|
-
m = sl2c_inverse(m)
|
226
|
-
for i in range(abs(f)):
|
227
|
-
result = result * m
|
228
|
-
|
229
|
-
return R13LineWithMatrix.from_psl2c_matrix(result)
|
230
|
-
|
231
|
-
|
232
|
-
def _find_standard_basepoint(mcomplex : Mcomplex,
|
233
|
-
vertex : Vertex) -> Tuple[Tetrahedron, int]:
|
234
|
-
"""
|
235
|
-
Reimplements find_standard_basepoint in fundamental_group.c.
|
236
|
-
|
237
|
-
That is, it finds the same tetrahedron and vertex of that tetrahedron
|
238
|
-
in the fundamental domain that the SnapPea kernel used to compute the
|
239
|
-
words for the meridian and longitude of the given cusp.
|
240
|
-
|
241
|
-
The SnapPea kernel picks the first vertex it finds where the meridian
|
242
|
-
and longitude intersect.
|
243
|
-
"""
|
244
|
-
|
245
|
-
# Traverse tets and their vertices in the same order the SnapPea kernel
|
246
|
-
# does
|
247
|
-
for tet in mcomplex.Tetrahedra:
|
248
|
-
for v in simplex.ZeroSubsimplices:
|
249
|
-
# Only consider vertices corresponding to the given cusp
|
250
|
-
if tet.Class[v] is vertex:
|
251
|
-
for f in simplex.TwoSubsimplices:
|
252
|
-
# Check that the meridian and longitude both
|
253
|
-
# go through the same leg of the spine of the cusp
|
254
|
-
# triangle.
|
255
|
-
#
|
256
|
-
# Note that we only support orientable manifolds,
|
257
|
-
# so we only consider the 0-sheet of the orientation
|
258
|
-
# double-cover of the cusp triangulation.
|
259
|
-
if (tet.PeripheralCurves[0][0][v][f] != 0 and
|
260
|
-
tet.PeripheralCurves[1][0][v][f] != 0):
|
261
|
-
return tet, v
|
262
|
-
|
263
|
-
raise Exception("Could not find basepoint for cusp. This is a bug.")
|
264
|
-
|
265
|
-
|
266
|
-
def _develop_core_curve_cusp(
|
267
|
-
mcomplex : Mcomplex,
|
268
|
-
v : Vertex,
|
269
|
-
core_curve : R13LineWithMatrix) -> None:
|
270
|
-
"""
|
271
|
-
Given the core curve computed from the SnapPea kernel's given
|
272
|
-
words for the meridian and longitude for the given cusp,
|
273
|
-
compute the lift of the core curve for all vertices of the
|
274
|
-
tetrahedra corresponding to the given cusp.
|
275
|
-
"""
|
276
|
-
|
277
|
-
# Start with the tet and vertex that the SnapPea kernel used
|
278
|
-
# to compute the words.
|
279
|
-
tet, vertex = _find_standard_basepoint(mcomplex, v)
|
280
|
-
|
281
|
-
tet.core_curves[vertex] = core_curve
|
282
|
-
pending_tet_verts = deque([ (tet, vertex, core_curve) ])
|
283
|
-
|
284
|
-
# Breadth-first traversal of cusp triangles to compute appropriate
|
285
|
-
# transform of core curve.
|
286
|
-
while pending_tet_verts:
|
287
|
-
tet, vertex, core_curve = pending_tet_verts.popleft()
|
288
|
-
for f in simplex.FacesAroundVertexCounterclockwise[vertex]:
|
289
|
-
new_tet = tet.Neighbor[f]
|
290
|
-
new_vertex = tet.Gluing[f].image(vertex)
|
291
|
-
if new_vertex in new_tet.core_curves:
|
292
|
-
continue
|
293
|
-
new_core_curve = core_curve.transformed(tet.O13_matrices[f])
|
294
|
-
new_tet.core_curves[new_vertex] = new_core_curve
|
295
|
-
pending_tet_verts.append(
|
296
|
-
(new_tet, new_vertex, new_core_curve))
|
297
|
-
|
298
|
-
# Depending on whether we are using SnapPy inside SageMath or not, we
|
299
|
-
# use different python classes to represent numbers, vectors and matrices.
|
300
|
-
# Thus, using Any as type annotation for now :(
|
301
|
-
|
302
|
-
|
303
|
-
def _compute_inradius_and_incenter_from_planes(planes) -> Tuple[Any, Any]:
|
304
|
-
"""
|
305
|
-
Given outside-facing normals for the four faces of a
|
306
|
-
tetrahedron, compute the hyperbolic inradius and the
|
307
|
-
incenter (as unit time vector) of the tetrahedron (in the
|
308
|
-
hyperboloid model).
|
309
|
-
"""
|
310
|
-
|
311
|
-
# We need to c and r such that
|
312
|
-
# * r13_dot(c, c) = -1 and
|
313
|
-
# * r13_dot(plane, c) = -sinh(r) for every plane
|
314
|
-
#
|
315
|
-
# We instead solve for the following system of linear equations:
|
316
|
-
# * r13_dot(plane, pt) = -1 for every plane
|
317
|
-
|
318
|
-
RF = planes[0][0].parent()
|
319
|
-
m = matrix([[-plane[0], plane[1], plane[2], plane[3]]
|
320
|
-
for plane in planes])
|
321
|
-
v = vector([RF(-1), RF(-1), RF(-1), RF(-1)])
|
322
|
-
|
323
|
-
pt = mat_solve(m, v)
|
324
|
-
|
325
|
-
# And then use the inverse length of pt to scale pt to be
|
326
|
-
# a unit time vector and to compute the r.
|
327
|
-
scale = 1 / (-r13_dot(pt, pt)).sqrt()
|
328
|
-
|
329
|
-
return scale.arcsinh(), scale * pt
|
330
|
-
|
331
|
-
|
332
|
-
def _filling_matrix(cusp_info : dict) -> FillingMatrix:
|
333
|
-
"""
|
334
|
-
Given one of the dictionaries returned by Manifold.cusp_info(),
|
335
|
-
returns the "filling matrix" filling_matrix.
|
336
|
-
|
337
|
-
filling_matrix is a matrix of integers (as list of lists) such that
|
338
|
-
filling_matrix[0] contains the filling coefficients
|
339
|
-
(e.g., [3,4] for m004(3,4)) and the determinant is 1 if the cusp is
|
340
|
-
filled. That is, filling_matrix[1] determines a curve intersecting
|
341
|
-
the filling curve once (as sum of a multiple of meridian and
|
342
|
-
longitude) and that is thus parallel to the core curve.
|
343
|
-
|
344
|
-
For an unfilled cusp, filling_matrix is ((0,0), (0,0))
|
345
|
-
|
346
|
-
Raises an exception if the filling coefficients are non-integral or
|
347
|
-
not coprime.
|
348
|
-
"""
|
349
|
-
|
350
|
-
float_m, float_l = cusp_info['filling']
|
351
|
-
m = int(float_m)
|
352
|
-
l = int(float_l)
|
353
|
-
if float_m != m or float_l != l:
|
354
|
-
raise ValueError("Filling coefficients (%r,%r) are not integral." % (
|
355
|
-
float_m, float_l))
|
356
|
-
if (m, l) == (0,0):
|
357
|
-
return ((0,0),
|
358
|
-
(0,0))
|
359
|
-
|
360
|
-
n, a, b = xgcd(m, l)
|
361
|
-
if n != 1:
|
362
|
-
raise ValueError("Filling coefficients (%d,%d) are not co-prime." % (
|
363
|
-
m, l))
|
364
|
-
|
365
|
-
return(( m, l),
|
366
|
-
(-b, a))
|
snappy/drilling/line.py
DELETED
@@ -1,122 +0,0 @@
|
|
1
|
-
from .fixed_points import r13_fixed_points_of_psl2c_matrix # type: ignore
|
2
|
-
|
3
|
-
from ..hyperboloid import r13_dot, o13_inverse # type: ignore
|
4
|
-
from ..upper_halfspace import psl2c_to_o13 # type: ignore
|
5
|
-
from ..math_basics import is_RealIntervalFieldElement # type: ignore
|
6
|
-
from ..sage_helper import _within_sage # type: ignore
|
7
|
-
|
8
|
-
if _within_sage:
|
9
|
-
import sage.all # type: ignore
|
10
|
-
|
11
|
-
__all__ = [ 'R13Line',
|
12
|
-
'distance_r13_lines',
|
13
|
-
'R13LineWithMatrix' ]
|
14
|
-
|
15
|
-
def _safe_sqrt(p):
|
16
|
-
"""
|
17
|
-
Compute the sqrt of a number that is known to be non-negative
|
18
|
-
though might not be non-negative because of floating point
|
19
|
-
issues. When using interval arithmetic, this means that
|
20
|
-
while the upper bound will be non-negative, the lower bound
|
21
|
-
we computed might be negative because it is too conservative.
|
22
|
-
|
23
|
-
Example of a quantity that can be given to this function:
|
24
|
-
negative inner product of two vectors in the positive
|
25
|
-
light cone. This is because we know that the inner product
|
26
|
-
of two such vectors is always non-positive.
|
27
|
-
"""
|
28
|
-
|
29
|
-
if is_RealIntervalFieldElement(p):
|
30
|
-
RIF = p.parent()
|
31
|
-
p = p.intersection(RIF(0, sage.all.Infinity))
|
32
|
-
else:
|
33
|
-
if p < 0:
|
34
|
-
RF = p.parent()
|
35
|
-
return RF(0)
|
36
|
-
return p.sqrt()
|
37
|
-
|
38
|
-
class R13Line:
|
39
|
-
"""
|
40
|
-
A line in the hyperboloid model - represented by two
|
41
|
-
like-like vectors spanning the line.
|
42
|
-
|
43
|
-
For distance computations, the inner product between the two
|
44
|
-
vectors is stored as well.
|
45
|
-
"""
|
46
|
-
|
47
|
-
def __init__(self,
|
48
|
-
points, # Two light-like vectors
|
49
|
-
inner_product=None): # Optional: their inner product
|
50
|
-
"""
|
51
|
-
inner_product can be given if known, otherwise, will be computed.
|
52
|
-
"""
|
53
|
-
self.points = points
|
54
|
-
if inner_product is None:
|
55
|
-
self.inner_product = r13_dot(points[0], points[1])
|
56
|
-
else:
|
57
|
-
self.inner_product = inner_product
|
58
|
-
|
59
|
-
def transformed(self,
|
60
|
-
m): # O13-matrix
|
61
|
-
"""
|
62
|
-
Returns image of the line under given O13-matrix m.
|
63
|
-
"""
|
64
|
-
|
65
|
-
return R13Line(
|
66
|
-
[ m * point for point in self.points],
|
67
|
-
self.inner_product)
|
68
|
-
|
69
|
-
|
70
|
-
def distance_r13_lines(line0 : R13Line, line1 : R13Line):
|
71
|
-
"""
|
72
|
-
Computes distance between two hyperbolic lines.
|
73
|
-
"""
|
74
|
-
|
75
|
-
p00 = r13_dot(line0.points[0], line1.points[0])
|
76
|
-
p01 = r13_dot(line0.points[0], line1.points[1])
|
77
|
-
p10 = r13_dot(line0.points[1], line1.points[0])
|
78
|
-
p11 = r13_dot(line0.points[1], line1.points[1])
|
79
|
-
|
80
|
-
pp = line0.inner_product * line1.inner_product
|
81
|
-
|
82
|
-
t0 = _safe_sqrt((p00 * p11) / pp)
|
83
|
-
t1 = _safe_sqrt((p01 * p10) / pp)
|
84
|
-
|
85
|
-
p = (t0 + t1 - 1) / 2
|
86
|
-
|
87
|
-
return 2 * _safe_sqrt(p).arcsinh()
|
88
|
-
|
89
|
-
|
90
|
-
class R13LineWithMatrix:
|
91
|
-
"""
|
92
|
-
A line in the hyperboloid model together with a O(1,3)-matrix fixing
|
93
|
-
the line (set-wise).
|
94
|
-
"""
|
95
|
-
def __init__(self,
|
96
|
-
r13_line : R13Line,
|
97
|
-
o13_matrix):
|
98
|
-
self.r13_line = r13_line
|
99
|
-
self.o13_matrix = o13_matrix
|
100
|
-
|
101
|
-
@staticmethod
|
102
|
-
def from_psl2c_matrix(m):
|
103
|
-
"""
|
104
|
-
Given a loxodromic PSL(2,C)-matrix m, returns the line (together
|
105
|
-
with the O(1,3)-matrix corresponding to m) fixed by m in
|
106
|
-
the hyperboloid model.
|
107
|
-
"""
|
108
|
-
|
109
|
-
return R13LineWithMatrix(
|
110
|
-
R13Line(r13_fixed_points_of_psl2c_matrix(m)),
|
111
|
-
psl2c_to_o13(m))
|
112
|
-
|
113
|
-
def transformed(self, m):
|
114
|
-
"""
|
115
|
-
Returns image of line with matrix under given O13-matrix m.
|
116
|
-
|
117
|
-
That is, the matrix will be conjugated by m so that the new
|
118
|
-
matrix will fix the image of the line (set-wise).
|
119
|
-
"""
|
120
|
-
return R13LineWithMatrix(
|
121
|
-
self.r13_line.transformed(m),
|
122
|
-
m * self.o13_matrix * o13_inverse(m))
|
@@ -1,94 +0,0 @@
|
|
1
|
-
from .spatial_dict import SpatialDict, floor_as_integers
|
2
|
-
from .line import R13Line, R13LineWithMatrix
|
3
|
-
from .geodesic_info import LiftedTetrahedron
|
4
|
-
|
5
|
-
from ..hyperboloid import ( # type: ignore
|
6
|
-
r13_dot, o13_inverse, distance_unit_time_r13_points)
|
7
|
-
from ..snap.t3mlite import Mcomplex # type: ignore
|
8
|
-
from ..matrix import matrix # type: ignore
|
9
|
-
|
10
|
-
|
11
|
-
def balance_end_points_of_line(line_with_matrix : R13LineWithMatrix,
|
12
|
-
point) -> R13LineWithMatrix:
|
13
|
-
return R13LineWithMatrix(
|
14
|
-
R13Line(
|
15
|
-
[ endpoint / -r13_dot(point, endpoint)
|
16
|
-
for endpoint in line_with_matrix.r13_line.points]),
|
17
|
-
line_with_matrix.o13_matrix)
|
18
|
-
|
19
|
-
|
20
|
-
class ZQuotientLiftedTetrahedronSet:
|
21
|
-
def __init__(self,
|
22
|
-
mcomplex : Mcomplex,
|
23
|
-
line_with_matrix : R13LineWithMatrix):
|
24
|
-
self._dict = _ZQuotientDict(mcomplex, line_with_matrix)
|
25
|
-
self._mcomplex = mcomplex
|
26
|
-
|
27
|
-
def add(self, lifted_tetrahedron : LiftedTetrahedron) -> bool:
|
28
|
-
tets = self._dict.setdefault(
|
29
|
-
lifted_tetrahedron.o13_matrix * self._mcomplex.R13_baseTetInCenter,
|
30
|
-
set())
|
31
|
-
if lifted_tetrahedron.tet in tets:
|
32
|
-
return False
|
33
|
-
tets.add(lifted_tetrahedron.tet)
|
34
|
-
return True
|
35
|
-
|
36
|
-
|
37
|
-
class _ZQuotientDict(SpatialDict):
|
38
|
-
def __init__(self,
|
39
|
-
mcomplex : Mcomplex,
|
40
|
-
line_with_matrix : R13LineWithMatrix):
|
41
|
-
super().__init__(mcomplex.baseTetInRadius, mcomplex.verified)
|
42
|
-
|
43
|
-
self._line = line_with_matrix.r13_line
|
44
|
-
self._power_cache = _O13MatrixPowerCache(line_with_matrix.o13_matrix)
|
45
|
-
|
46
|
-
a = self._line.points[0][0]
|
47
|
-
b = (line_with_matrix.o13_matrix * self._line.points[0])[0]
|
48
|
-
|
49
|
-
self._log_scale_factor = 2 * (b / a).log()
|
50
|
-
|
51
|
-
RF = a.parent()
|
52
|
-
self._weights = [ RF(1.2003), RF(0.94553), RF(1.431112)]
|
53
|
-
|
54
|
-
def distance(self, point_0, point_1):
|
55
|
-
return distance_unit_time_r13_points(point_0, point_1)
|
56
|
-
|
57
|
-
def representatives(self, point):
|
58
|
-
|
59
|
-
a = r13_dot(point, self._line.points[0])
|
60
|
-
b = r13_dot(point, self._line.points[1])
|
61
|
-
|
62
|
-
r = (a / b).log() / self._log_scale_factor
|
63
|
-
|
64
|
-
return [ self._power_cache.power(i) * point
|
65
|
-
for i in floor_as_integers(r) ]
|
66
|
-
|
67
|
-
def float_hash(self, pt):
|
68
|
-
return (pt[0] * self._weights[0] +
|
69
|
-
pt[1] * self._weights[1] +
|
70
|
-
pt[2] * self._weights[2])
|
71
|
-
|
72
|
-
|
73
|
-
class _O13MatrixPowerCache:
|
74
|
-
def __init__(self, m):
|
75
|
-
self._positive_cache = _MatrixNonNegativePowerCache(m)
|
76
|
-
self._negative_cache = _MatrixNonNegativePowerCache(o13_inverse(m))
|
77
|
-
|
78
|
-
def power(self, i):
|
79
|
-
if i >= 0:
|
80
|
-
return self._positive_cache.power( i)
|
81
|
-
else:
|
82
|
-
return self._negative_cache.power(-i)
|
83
|
-
|
84
|
-
|
85
|
-
class _MatrixNonNegativePowerCache:
|
86
|
-
def __init__(self, m):
|
87
|
-
self._m = m
|
88
|
-
self._powers = [ matrix.identity(ring=m.base_ring(),
|
89
|
-
n=m.dimensions()[0]) ]
|
90
|
-
|
91
|
-
def power(self, i):
|
92
|
-
while not i < len(self._powers):
|
93
|
-
self._powers.append(self._m * self._powers[-1])
|
94
|
-
return self._powers[i]
|