snappy 3.1.1__cp39-cp39-win_amd64.whl → 3.2__cp39-cp39-win_amd64.whl
Sign up to get free protection for your applications and to get access to all the features.
- snappy/CyOpenGL.cp39-win_amd64.pyd +0 -0
- snappy/SnapPy.cp39-win_amd64.pyd +0 -0
- snappy/SnapPyHP.cp39-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.cp39-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 +26 -11
- 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-39.pyc +0 -0
- snappy/__pycache__/browser.cpython-39.pyc +0 -0
- snappy/__pycache__/cache.cpython-39.pyc +0 -0
- snappy/__pycache__/database.cpython-39.pyc +0 -0
- snappy/__pycache__/db_utilities.cpython-39.pyc +0 -0
- snappy/__pycache__/decorated_isosig.cpython-39.pyc +0 -0
- snappy/__pycache__/exceptions.cpython-39.pyc +0 -0
- snappy/__pycache__/export_stl.cpython-39.pyc +0 -0
- snappy/__pycache__/filedialog.cpython-39.pyc +0 -0
- snappy/__pycache__/gui.cpython-39.pyc +0 -0
- snappy/__pycache__/horoviewer.cpython-39.pyc +0 -0
- snappy/__pycache__/math_basics.cpython-39.pyc +0 -0
- snappy/__pycache__/matrix.cpython-39.pyc +0 -0
- snappy/__pycache__/number.cpython-39.pyc +0 -0
- snappy/__pycache__/numeric_output_checker.cpython-39.pyc +0 -0
- snappy/__pycache__/pari.cpython-39.pyc +0 -0
- snappy/__pycache__/polyviewer.cpython-39.pyc +0 -0
- snappy/__pycache__/sage_helper.cpython-39.pyc +0 -0
- snappy/__pycache__/version.cpython-39.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-39.pyc +0 -0
- snappy/drilling/__pycache__/constants.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/crush.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/cusps.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/debug.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/epsilons.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/exceptions.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/fixed_points.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_info.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_tube.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/geometric_structure.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/line.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/moves.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/peripheral_curves.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/perturb.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/quotient_space.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/spatial_dict.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/subdivide.cpython-39.pyc +0 -0
- snappy/drilling/__pycache__/tracing.cpython-39.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-39.pyc +0 -0
- snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-39.pyc +0 -0
- snappy/exterior_to_link/__pycache__/exceptions.cpython-39.pyc +0 -0
- snappy/exterior_to_link/__pycache__/hyp_utils.cpython-39.pyc +0 -0
- snappy/exterior_to_link/__pycache__/link_projection.cpython-39.pyc +0 -0
- snappy/exterior_to_link/__pycache__/main.cpython-39.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-39.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-39.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-39.pyc +0 -0
- snappy/exterior_to_link/__pycache__/pl_utils.cpython-39.pyc +0 -0
- snappy/exterior_to_link/__pycache__/put_in_S3.cpython-39.pyc +0 -0
- snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-39.pyc +0 -0
- snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-39.pyc +0 -0
- snappy/exterior_to_link/__pycache__/stored_moves.cpython-39.pyc +0 -0
- snappy/hyperboloid/__pycache__/__init__.cpython-39.pyc +0 -0
- snappy/manifolds/__pycache__/__init__.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/__init__.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/component.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/coordinates.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/fieldExtensions.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/findLoops.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/homology.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/manifoldMethods.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/matrix.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/polynomial.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/processComponents.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileBase.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileDispatch.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/processMagmaFile.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/processRurFile.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVariety.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/rur.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-39.pyc +0 -0
- snappy/ptolemy/__pycache__/utilities.cpython-39.pyc +0 -0
- snappy/snap/__pycache__/__init__.cpython-39.pyc +0 -0
- snappy/snap/__pycache__/character_varieties.cpython-39.pyc +0 -0
- snappy/snap/__pycache__/fundamental_polyhedron.cpython-39.pyc +0 -0
- snappy/snap/__pycache__/interval_reps.cpython-39.pyc +0 -0
- snappy/snap/__pycache__/kernel_structures.cpython-39.pyc +0 -0
- snappy/snap/__pycache__/mcomplex_base.cpython-39.pyc +0 -0
- snappy/snap/__pycache__/nsagetools.cpython-39.pyc +0 -0
- snappy/snap/__pycache__/polished_reps.cpython-39.pyc +0 -0
- snappy/snap/__pycache__/shapes.cpython-39.pyc +0 -0
- snappy/snap/__pycache__/slice_obs_HKL.cpython-39.pyc +0 -0
- snappy/snap/__pycache__/utilities.cpython-39.pyc +0 -0
- snappy/snap/peripheral/__pycache__/__init__.cpython-39.pyc +0 -0
- snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-39.pyc +0 -0
- snappy/snap/peripheral/__pycache__/link.cpython-39.pyc +0 -0
- snappy/snap/peripheral/__pycache__/peripheral.cpython-39.pyc +0 -0
- snappy/snap/peripheral/__pycache__/surface.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/__init__.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/arrow.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/corner.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/edge.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/face.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/files.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/homology.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/linalg.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/mcomplex.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/perm4.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/simplex.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/spun.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/surface.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-39.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/vertex.cpython-39.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-39.pyc +0 -0
- snappy/twister/__pycache__/main.cpython-39.pyc +0 -0
- snappy/upper_halfspace/__pycache__/__init__.cpython-39.pyc +0 -0
- snappy/upper_halfspace/__pycache__/ideal_point.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/__init__.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/cuspCrossSection.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/cuspTranslations.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/cusp_areas.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/cusp_shapes.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/exceptions.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/interval_tree.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/realAlgebra.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/shapes.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/short_slopes.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/squareExtensions.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/verifyCanonical.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/verifyHyperbolicity.cpython-39.pyc +0 -0
- snappy/verify/__pycache__/volume.cpython-39.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/__init__.cpython-39.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-39.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/closed.cpython-39.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-39.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/cusped.cpython-39.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-39.pyc +0 -0
- snappy/verify/cuspCrossSection.py +0 -1422
- snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-39.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-39.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-39.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/__init__.cpython-39.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-39.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-39.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-39.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]
|