snappy 3.3__cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.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.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.ico +0 -0
- snappy/SnapPy.png +0 -0
- snappy/SnapPyHP.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/__init__.py +534 -0
- snappy/app.py +604 -0
- snappy/app_menus.py +372 -0
- snappy/browser.py +998 -0
- snappy/cache.py +25 -0
- snappy/canonical.py +249 -0
- snappy/cusps/__init__.py +280 -0
- snappy/cusps/cusp_area_matrix.py +98 -0
- snappy/cusps/cusp_areas_from_matrix.py +96 -0
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/short_slopes_for_cusp.py +217 -0
- snappy/cusps/test.py +22 -0
- snappy/cusps/trig_cusp_area_matrix.py +63 -0
- snappy/database.py +454 -0
- snappy/db_utilities.py +79 -0
- snappy/decorated_isosig.py +717 -0
- snappy/dev/__init__.py +0 -0
- snappy/dev/extended_ptolemy/__init__.py +8 -0
- snappy/dev/extended_ptolemy/closed.py +106 -0
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
- snappy/dev/extended_ptolemy/direct.py +42 -0
- snappy/dev/extended_ptolemy/extended.py +406 -0
- snappy/dev/extended_ptolemy/giac_helper.py +43 -0
- snappy/dev/extended_ptolemy/giac_rur.py +129 -0
- snappy/dev/extended_ptolemy/gluing.py +46 -0
- snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
- snappy/dev/extended_ptolemy/printMatrices.py +70 -0
- snappy/dev/vericlosed/__init__.py +1 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
- snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
- snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
- snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
- snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
- snappy/dev/vericlosed/orb/__init__.py +1 -0
- snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
- snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
- snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
- snappy/dev/vericlosed/test.py +54 -0
- snappy/dev/vericlosed/truncatedComplex.py +176 -0
- snappy/dev/vericlosed/verificationError.py +58 -0
- snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
- snappy/doc/_images/SnapPy-196.png +0 -0
- snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
- snappy/doc/_images/m125_paper_plane.jpg +0 -0
- snappy/doc/_images/mac.png +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/_images/plink-action.png +0 -0
- snappy/doc/_images/ubuntu.png +0 -0
- snappy/doc/_images/win7.png +0 -0
- snappy/doc/_sources/additional_classes.rst.txt +40 -0
- snappy/doc/_sources/bugs.rst.txt +14 -0
- snappy/doc/_sources/censuses.rst.txt +52 -0
- snappy/doc/_sources/credits.rst.txt +81 -0
- snappy/doc/_sources/development.rst.txt +261 -0
- snappy/doc/_sources/index.rst.txt +215 -0
- snappy/doc/_sources/installing.rst.txt +249 -0
- snappy/doc/_sources/manifold.rst.txt +6 -0
- snappy/doc/_sources/manifoldhp.rst.txt +46 -0
- snappy/doc/_sources/news.rst.txt +425 -0
- snappy/doc/_sources/other.rst.txt +25 -0
- snappy/doc/_sources/platonic_census.rst.txt +20 -0
- snappy/doc/_sources/plink.rst.txt +102 -0
- snappy/doc/_sources/ptolemy.rst.txt +66 -0
- snappy/doc/_sources/ptolemy_classes.rst.txt +42 -0
- snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -0
- snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -0
- snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -0
- snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -0
- snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -0
- snappy/doc/_sources/screenshots.rst.txt +21 -0
- snappy/doc/_sources/snap.rst.txt +87 -0
- snappy/doc/_sources/snappy.rst.txt +28 -0
- snappy/doc/_sources/spherogram.rst.txt +103 -0
- snappy/doc/_sources/todo.rst.txt +47 -0
- snappy/doc/_sources/triangulation.rst.txt +11 -0
- snappy/doc/_sources/tutorial.rst.txt +49 -0
- snappy/doc/_sources/verify.rst.txt +210 -0
- snappy/doc/_sources/verify_internals.rst.txt +79 -0
- snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
- snappy/doc/_static/SnapPy.ico +0 -0
- snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
- snappy/doc/_static/basic.css +906 -0
- snappy/doc/_static/css/badge_only.css +1 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
- snappy/doc/_static/css/theme.css +4 -0
- snappy/doc/_static/doctools.js +149 -0
- snappy/doc/_static/documentation_options.js +13 -0
- snappy/doc/_static/file.png +0 -0
- 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/jquery.js +2 -0
- snappy/doc/_static/js/badge_only.js +1 -0
- snappy/doc/_static/js/theme.js +1 -0
- snappy/doc/_static/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +192 -0
- snappy/doc/_static/minus.png +0 -0
- snappy/doc/_static/plus.png +0 -0
- snappy/doc/_static/pygments.css +75 -0
- snappy/doc/_static/searchtools.js +635 -0
- snappy/doc/_static/snappy_furo.css +33 -0
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
- snappy/doc/_static/sphinx_highlight.js +154 -0
- snappy/doc/additional_classes.html +1500 -0
- snappy/doc/bugs.html +132 -0
- snappy/doc/censuses.html +453 -0
- snappy/doc/credits.html +184 -0
- snappy/doc/development.html +385 -0
- snappy/doc/doc-latest/additional_classes.html +1500 -0
- snappy/doc/doc-latest/bugs.html +132 -0
- snappy/doc/doc-latest/censuses.html +453 -0
- snappy/doc/doc-latest/credits.html +184 -0
- snappy/doc/doc-latest/development.html +385 -0
- snappy/doc/doc-latest/genindex.html +1349 -0
- snappy/doc/doc-latest/index.html +287 -0
- snappy/doc/doc-latest/installing.html +346 -0
- snappy/doc/doc-latest/manifold.html +3632 -0
- snappy/doc/doc-latest/manifoldhp.html +180 -0
- snappy/doc/doc-latest/news.html +438 -0
- snappy/doc/doc-latest/objects.inv +0 -0
- snappy/doc/doc-latest/other.html +160 -0
- snappy/doc/doc-latest/platonic_census.html +376 -0
- snappy/doc/doc-latest/plink.html +210 -0
- snappy/doc/doc-latest/ptolemy.html +253 -0
- snappy/doc/doc-latest/ptolemy_classes.html +1144 -0
- snappy/doc/doc-latest/ptolemy_examples1.html +409 -0
- snappy/doc/doc-latest/ptolemy_examples2.html +471 -0
- snappy/doc/doc-latest/ptolemy_examples3.html +414 -0
- snappy/doc/doc-latest/ptolemy_examples4.html +195 -0
- snappy/doc/doc-latest/ptolemy_prelim.html +248 -0
- snappy/doc/doc-latest/py-modindex.html +165 -0
- snappy/doc/doc-latest/screenshots.html +141 -0
- snappy/doc/doc-latest/search.html +135 -0
- snappy/doc/doc-latest/searchindex.js +1 -0
- snappy/doc/doc-latest/snap.html +202 -0
- snappy/doc/doc-latest/snappy.html +181 -0
- snappy/doc/doc-latest/spherogram.html +1346 -0
- snappy/doc/doc-latest/todo.html +166 -0
- snappy/doc/doc-latest/triangulation.html +1676 -0
- snappy/doc/doc-latest/tutorial.html +159 -0
- snappy/doc/doc-latest/verify.html +330 -0
- snappy/doc/doc-latest/verify_internals.html +1235 -0
- snappy/doc/genindex.html +1349 -0
- snappy/doc/index.html +287 -0
- snappy/doc/installing.html +346 -0
- snappy/doc/manifold.html +3632 -0
- snappy/doc/manifoldhp.html +180 -0
- snappy/doc/news.html +438 -0
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +160 -0
- snappy/doc/platonic_census.html +376 -0
- snappy/doc/plink.html +210 -0
- snappy/doc/ptolemy.html +253 -0
- snappy/doc/ptolemy_classes.html +1144 -0
- snappy/doc/ptolemy_examples1.html +409 -0
- snappy/doc/ptolemy_examples2.html +471 -0
- snappy/doc/ptolemy_examples3.html +414 -0
- snappy/doc/ptolemy_examples4.html +195 -0
- snappy/doc/ptolemy_prelim.html +248 -0
- snappy/doc/py-modindex.html +165 -0
- snappy/doc/screenshots.html +141 -0
- snappy/doc/search.html +135 -0
- snappy/doc/searchindex.js +1 -0
- snappy/doc/snap.html +202 -0
- snappy/doc/snappy.html +181 -0
- snappy/doc/spherogram.html +1346 -0
- snappy/doc/todo.html +166 -0
- snappy/doc/triangulation.html +1676 -0
- snappy/doc/tutorial.html +159 -0
- snappy/doc/verify.html +330 -0
- snappy/doc/verify_internals.html +1235 -0
- snappy/drilling/__init__.py +456 -0
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +5 -0
- snappy/drilling/crush.py +270 -0
- snappy/drilling/cusps.py +125 -0
- snappy/drilling/debug.py +242 -0
- snappy/drilling/epsilons.py +6 -0
- snappy/drilling/exceptions.py +55 -0
- snappy/drilling/moves.py +620 -0
- snappy/drilling/peripheral_curves.py +210 -0
- snappy/drilling/perturb.py +188 -0
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +274 -0
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +132 -0
- snappy/drilling/tracing.py +351 -0
- snappy/exceptions.py +26 -0
- snappy/export_stl.py +120 -0
- snappy/exterior_to_link/__init__.py +2 -0
- snappy/exterior_to_link/barycentric_geometry.py +463 -0
- snappy/exterior_to_link/exceptions.py +6 -0
- snappy/exterior_to_link/geodesic_map.json +14408 -0
- snappy/exterior_to_link/hyp_utils.py +112 -0
- snappy/exterior_to_link/link_projection.py +323 -0
- snappy/exterior_to_link/main.py +198 -0
- snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
- snappy/exterior_to_link/mcomplex_with_link.py +687 -0
- snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
- snappy/exterior_to_link/pl_utils.py +491 -0
- snappy/exterior_to_link/put_in_S3.py +156 -0
- snappy/exterior_to_link/rational_linear_algebra.py +130 -0
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
- snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
- snappy/exterior_to_link/stored_moves.py +475 -0
- snappy/exterior_to_link/test.py +31 -0
- snappy/filedialog.py +28 -0
- 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 +691 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +480 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +41 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +294 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +156 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +35 -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_representatives.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/geometric_structure/geodesic/fixed_points.py +106 -0
- snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
- 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 +128 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +121 -0
- snappy/horoviewer.py +443 -0
- snappy/hyperboloid/__init__.py +212 -0
- snappy/hyperboloid/distances.py +259 -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/info_icon.gif +0 -0
- snappy/infowindow.py +65 -0
- snappy/isometry_signature.py +389 -0
- snappy/len_spec/__init__.py +609 -0
- snappy/len_spec/geodesic_info.py +129 -0
- snappy/len_spec/geodesic_key_info_dict.py +116 -0
- snappy/len_spec/geodesic_piece.py +146 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +136 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +185 -0
- snappy/len_spec/spine.py +128 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +276 -0
- snappy/len_spec/word.py +86 -0
- snappy/manifolds/HTWKnots/alternating.gz +0 -0
- snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
- snappy/manifolds/__init__.py +3 -0
- snappy/margulis/__init__.py +332 -0
- snappy/margulis/cusp_neighborhood_neighborhood.py +66 -0
- snappy/margulis/geodesic_neighborhood.py +152 -0
- snappy/margulis/margulis_info.py +21 -0
- snappy/margulis/mu_from_neighborhood_pair.py +175 -0
- snappy/margulis/neighborhood.py +29 -0
- snappy/margulis/test.py +22 -0
- snappy/math_basics.py +187 -0
- snappy/matrix.py +525 -0
- snappy/number.py +657 -0
- snappy/numeric_output_checker.py +345 -0
- snappy/pari.py +41 -0
- snappy/phone_home.py +57 -0
- snappy/polyviewer.py +259 -0
- snappy/ptolemy/__init__.py +17 -0
- snappy/ptolemy/component.py +103 -0
- snappy/ptolemy/coordinates.py +2290 -0
- snappy/ptolemy/fieldExtensions.py +153 -0
- snappy/ptolemy/findLoops.py +473 -0
- snappy/ptolemy/geometricRep.py +59 -0
- snappy/ptolemy/homology.py +165 -0
- snappy/ptolemy/magma/default.magma_template +229 -0
- snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
- snappy/ptolemy/manifoldMethods.py +395 -0
- snappy/ptolemy/matrix.py +350 -0
- snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
- snappy/ptolemy/polynomial.py +856 -0
- snappy/ptolemy/processComponents.py +173 -0
- snappy/ptolemy/processFileBase.py +247 -0
- snappy/ptolemy/processFileDispatch.py +46 -0
- snappy/ptolemy/processMagmaFile.py +392 -0
- snappy/ptolemy/processRurFile.py +150 -0
- snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
- snappy/ptolemy/ptolemyObstructionClass.py +64 -0
- snappy/ptolemy/ptolemyVariety.py +995 -0
- snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
- snappy/ptolemy/reginaWrapper.py +698 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/rur.py +545 -0
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
- snappy/ptolemy/test.py +1126 -0
- snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
- snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
- snappy/ptolemy/utilities.py +236 -0
- 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 +197 -0
- snappy/raytracing/eyeball.py +124 -0
- snappy/raytracing/finite_raytracing_data.py +237 -0
- snappy/raytracing/finite_viewer.py +590 -0
- snappy/raytracing/geodesic_tube_info.py +174 -0
- snappy/raytracing/geodesics.py +246 -0
- snappy/raytracing/geodesics_window.py +258 -0
- snappy/raytracing/gui_utilities.py +293 -0
- snappy/raytracing/hyperboloid_navigation.py +556 -0
- snappy/raytracing/hyperboloid_utilities.py +234 -0
- snappy/raytracing/ideal_raytracing_data.py +592 -0
- snappy/raytracing/inside_viewer.py +974 -0
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +126 -0
- snappy/raytracing/raytracing_view.py +454 -0
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +101 -0
- snappy/raytracing/shaders/fragment.glsl +1744 -0
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +98 -0
- snappy/raytracing/view_scale_controller.py +98 -0
- snappy/raytracing/zoom_slider/__init__.py +263 -0
- snappy/raytracing/zoom_slider/inward.png +0 -0
- snappy/raytracing/zoom_slider/inward18.png +0 -0
- snappy/raytracing/zoom_slider/outward.png +0 -0
- snappy/raytracing/zoom_slider/outward18.png +0 -0
- snappy/raytracing/zoom_slider/test.py +20 -0
- snappy/sage_helper.py +119 -0
- snappy/settings.py +407 -0
- snappy/shell.py +53 -0
- snappy/snap/__init__.py +117 -0
- snappy/snap/character_varieties.py +375 -0
- snappy/snap/find_field.py +372 -0
- snappy/snap/fox_milnor.py +271 -0
- snappy/snap/fundamental_polyhedron.py +569 -0
- snappy/snap/generators.py +39 -0
- snappy/snap/interval_reps.py +81 -0
- snappy/snap/kernel_structures.py +128 -0
- snappy/snap/mcomplex_base.py +18 -0
- snappy/snap/nsagetools.py +716 -0
- snappy/snap/peripheral/__init__.py +1 -0
- snappy/snap/peripheral/dual_cellulation.py +219 -0
- snappy/snap/peripheral/link.py +127 -0
- snappy/snap/peripheral/peripheral.py +159 -0
- snappy/snap/peripheral/surface.py +522 -0
- snappy/snap/peripheral/test.py +35 -0
- snappy/snap/polished_reps.py +335 -0
- snappy/snap/shapes.py +152 -0
- snappy/snap/slice_obs_HKL/__init__.py +194 -0
- snappy/snap/slice_obs_HKL/basics.py +236 -0
- snappy/snap/slice_obs_HKL/direct.py +217 -0
- snappy/snap/slice_obs_HKL/poly_norm.py +212 -0
- snappy/snap/slice_obs_HKL/rep_theory.py +424 -0
- snappy/snap/t3mlite/__init__.py +2 -0
- snappy/snap/t3mlite/arrow.py +243 -0
- snappy/snap/t3mlite/corner.py +22 -0
- snappy/snap/t3mlite/edge.py +172 -0
- snappy/snap/t3mlite/face.py +37 -0
- snappy/snap/t3mlite/files.py +211 -0
- snappy/snap/t3mlite/homology.py +53 -0
- snappy/snap/t3mlite/linalg.py +419 -0
- snappy/snap/t3mlite/mcomplex.py +1499 -0
- snappy/snap/t3mlite/perm4.py +320 -0
- snappy/snap/t3mlite/setup.py +12 -0
- snappy/snap/t3mlite/simplex.py +199 -0
- snappy/snap/t3mlite/spun.py +297 -0
- snappy/snap/t3mlite/surface.py +519 -0
- snappy/snap/t3mlite/test.py +20 -0
- snappy/snap/t3mlite/test_vs_regina.py +86 -0
- snappy/snap/t3mlite/tetrahedron.py +109 -0
- snappy/snap/t3mlite/vertex.py +42 -0
- snappy/snap/test.py +139 -0
- snappy/snap/utilities.py +288 -0
- snappy/test.py +213 -0
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -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/quotient_dict.py +70 -0
- snappy/tiling/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +224 -0
- snappy/tiling/triangle.py +33 -0
- snappy/tkterminal.py +920 -0
- snappy/twister/__init__.py +20 -0
- snappy/twister/main.py +646 -0
- snappy/twister/surfaces/S_0_1 +3 -0
- snappy/twister/surfaces/S_0_2 +3 -0
- snappy/twister/surfaces/S_0_4 +7 -0
- snappy/twister/surfaces/S_0_4_Lantern +8 -0
- snappy/twister/surfaces/S_1 +3 -0
- snappy/twister/surfaces/S_1_1 +4 -0
- snappy/twister/surfaces/S_1_2 +5 -0
- snappy/twister/surfaces/S_1_2_5 +6 -0
- snappy/twister/surfaces/S_2 +6 -0
- snappy/twister/surfaces/S_2_1 +8 -0
- snappy/twister/surfaces/S_2_heeg +10 -0
- snappy/twister/surfaces/S_3 +8 -0
- snappy/twister/surfaces/S_3_1 +10 -0
- snappy/twister/surfaces/S_4_1 +12 -0
- snappy/twister/surfaces/S_5_1 +14 -0
- snappy/twister/surfaces/heeg_fig8 +9 -0
- snappy/twister/twister_core.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/upper_halfspace/__init__.py +146 -0
- snappy/upper_halfspace/ideal_point.py +29 -0
- snappy/verify/__init__.py +13 -0
- snappy/verify/canonical.py +542 -0
- snappy/verify/complex_volume/__init__.py +18 -0
- snappy/verify/complex_volume/adjust_torsion.py +86 -0
- snappy/verify/complex_volume/closed.py +168 -0
- snappy/verify/complex_volume/compute_ptolemys.py +90 -0
- snappy/verify/complex_volume/cusped.py +56 -0
- snappy/verify/complex_volume/extended_bloch.py +201 -0
- snappy/verify/cusp_translations.py +85 -0
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +254 -0
- snappy/verify/hyperbolicity.py +224 -0
- snappy/verify/interval_newton_shapes_engine.py +523 -0
- snappy/verify/interval_tree.py +400 -0
- snappy/verify/krawczyk_shapes_engine.py +518 -0
- snappy/verify/real_algebra.py +286 -0
- snappy/verify/shapes.py +25 -0
- snappy/verify/square_extensions.py +1005 -0
- snappy/verify/test.py +72 -0
- snappy/verify/volume.py +128 -0
- snappy/version.py +2 -0
- snappy-3.3.dist-info/METADATA +58 -0
- snappy-3.3.dist-info/RECORD +541 -0
- snappy-3.3.dist-info/WHEEL +6 -0
- snappy-3.3.dist-info/entry_points.txt +2 -0
- snappy-3.3.dist-info/top_level.txt +28 -0
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
from .neighborhood import Neighborhood
|
|
2
|
+
from .geodesic_neighborhood import GeodesicNeighborhood
|
|
3
|
+
from .cusp_neighborhood_neighborhood import CuspNeighborhoodNeighborhood
|
|
4
|
+
from .mu_from_neighborhood_pair import mu_from_neighborhood_pair
|
|
5
|
+
from .margulis_info import MargulisInfo
|
|
6
|
+
|
|
7
|
+
from ..verify.shapes import compute_hyperbolic_shapes
|
|
8
|
+
from ..geometric_structure.cusp_neighborhood.tiles_for_cusp_neighborhood import (
|
|
9
|
+
mcomplex_for_tiling_cusp_neighborhoods)
|
|
10
|
+
from ..geometric_structure.cusp_neighborhood.complex_cusp_cross_section import (
|
|
11
|
+
ComplexCuspCrossSection)
|
|
12
|
+
from ..geometric_structure.geodesic.add_core_curves import add_r13_core_curves
|
|
13
|
+
from ..geometric_structure import (
|
|
14
|
+
add_r13_geometry, add_filling_information)
|
|
15
|
+
from ..hyperboloid.distances import (
|
|
16
|
+
distance_r13_horoballs, distance_r13_lines, distance_r13_horoball_line)
|
|
17
|
+
from ..hyperboloid.horoball import R13Horoball
|
|
18
|
+
from ..hyperboloid.line import R13Line
|
|
19
|
+
from ..math_basics import correct_min
|
|
20
|
+
from ..len_spec.length_spectrum_geodesic_info import LengthSpectrumGeodesicInfo
|
|
21
|
+
from ..snap.t3mlite import Mcomplex
|
|
22
|
+
from ..tiling.tile import Tile
|
|
23
|
+
from ..sage_helper import _within_sage
|
|
24
|
+
|
|
25
|
+
if _within_sage:
|
|
26
|
+
from ..sage_helper import Infinity
|
|
27
|
+
|
|
28
|
+
import heapq
|
|
29
|
+
|
|
30
|
+
from typing import Iterable, Union, List, Tuple, Optional
|
|
31
|
+
|
|
32
|
+
def distance_r13_objects(object1 : Union[R13Line, R13Horoball],
|
|
33
|
+
object2 : Union[R13Line, R13Horoball]):
|
|
34
|
+
is_horoball1 = isinstance(object1, R13Horoball)
|
|
35
|
+
is_horoball2 = isinstance(object2, R13Horoball)
|
|
36
|
+
if is_horoball1:
|
|
37
|
+
if is_horoball2:
|
|
38
|
+
return distance_r13_horoballs(
|
|
39
|
+
object1.defining_vec, object2.defining_vec)
|
|
40
|
+
else:
|
|
41
|
+
return distance_r13_horoball_line(
|
|
42
|
+
object1.defining_vec, object2)
|
|
43
|
+
else:
|
|
44
|
+
if is_horoball2:
|
|
45
|
+
return distance_r13_horoball_line(
|
|
46
|
+
object2.defining_vec, object1)
|
|
47
|
+
else:
|
|
48
|
+
return distance_r13_lines(
|
|
49
|
+
object1, object2)
|
|
50
|
+
|
|
51
|
+
def distance_tiles(tile1 : Tile, tile2 : Tile):
|
|
52
|
+
return distance_r13_objects(
|
|
53
|
+
tile1.inverse_lifted_geometric_object,
|
|
54
|
+
tile2.inverse_lifted_geometric_object)
|
|
55
|
+
|
|
56
|
+
class NeighborhoodPair:
|
|
57
|
+
def __init__(self, infinity):
|
|
58
|
+
self.distance_lifts = infinity
|
|
59
|
+
self.finished : bool = False
|
|
60
|
+
self.mu = None
|
|
61
|
+
|
|
62
|
+
class Neighborhoods:
|
|
63
|
+
def __init__(self, mcomplex : Mcomplex, stopper):
|
|
64
|
+
if stopper:
|
|
65
|
+
self.mu = mcomplex.RF(stopper)
|
|
66
|
+
else:
|
|
67
|
+
self.mu = mcomplex.infinity
|
|
68
|
+
self.neighborhoods : List[Neighborhood] = []
|
|
69
|
+
self._indices_to_neighborhood_pair : List[List[NeighborhoodPair]] = []
|
|
70
|
+
self.mcomplex : Mcomplex = mcomplex
|
|
71
|
+
|
|
72
|
+
def add_neighborhood(
|
|
73
|
+
self,
|
|
74
|
+
neighborhood : Neighborhood
|
|
75
|
+
) -> None:
|
|
76
|
+
self.neighborhoods.append(neighborhood)
|
|
77
|
+
self._indices_to_neighborhood_pair.append(
|
|
78
|
+
[ NeighborhoodPair(self.mcomplex.infinity)
|
|
79
|
+
for index in range(len(self.neighborhoods)) ])
|
|
80
|
+
|
|
81
|
+
def get_neighborhood_pair(
|
|
82
|
+
self,
|
|
83
|
+
neighborhood1 : Neighborhood,
|
|
84
|
+
neighborhood2 : Neighborhood
|
|
85
|
+
) -> NeighborhoodPair:
|
|
86
|
+
i = neighborhood1.index
|
|
87
|
+
j = neighborhood2.index
|
|
88
|
+
if i >= j:
|
|
89
|
+
return self._indices_to_neighborhood_pair[i][j]
|
|
90
|
+
else:
|
|
91
|
+
return self._indices_to_neighborhood_pair[j][i]
|
|
92
|
+
|
|
93
|
+
def thin_part(self) -> List[MargulisInfo]:
|
|
94
|
+
return [ neighborhood.info_for_epsilon(self.mu)
|
|
95
|
+
for neighborhood in self.neighborhoods ]
|
|
96
|
+
|
|
97
|
+
def collisions(self) -> List[Tuple[int, int]]:
|
|
98
|
+
if self.mcomplex.verified:
|
|
99
|
+
err_epsilon = 0
|
|
100
|
+
else:
|
|
101
|
+
err_epsilon = self.mcomplex.RF(1e-6)
|
|
102
|
+
|
|
103
|
+
result = []
|
|
104
|
+
for neighborhood1, neighborhood_pairs in zip(
|
|
105
|
+
self.neighborhoods, self._indices_to_neighborhood_pair):
|
|
106
|
+
for neighborhood2, neighborhood_pair in zip(
|
|
107
|
+
self.neighborhoods, neighborhood_pairs):
|
|
108
|
+
if neighborhood_pair.mu is None:
|
|
109
|
+
continue
|
|
110
|
+
if neighborhood_pair.mu > self.mu + err_epsilon:
|
|
111
|
+
continue
|
|
112
|
+
result.append((neighborhood2.index,neighborhood1.index))
|
|
113
|
+
return result
|
|
114
|
+
|
|
115
|
+
def compute_cusp_shapes(M, *, bits_prec, verified):
|
|
116
|
+
shapes = compute_hyperbolic_shapes(
|
|
117
|
+
M, verified=verified, bits_prec=bits_prec)
|
|
118
|
+
c = ComplexCuspCrossSection.fromManifoldAndShapes(M, shapes)
|
|
119
|
+
return [
|
|
120
|
+
ComplexCuspCrossSection.cusp_shape(v) if v.is_complete else None
|
|
121
|
+
for v in c.mcomplex.Vertices ]
|
|
122
|
+
|
|
123
|
+
def mcomplex_for_margulis_number(M, bits_prec, *, verified):
|
|
124
|
+
mcomplex = mcomplex_for_tiling_cusp_neighborhoods(
|
|
125
|
+
M, bits_prec=bits_prec, verified=verified)
|
|
126
|
+
add_filling_information(mcomplex, M)
|
|
127
|
+
add_r13_core_curves(mcomplex, M)
|
|
128
|
+
|
|
129
|
+
if verified:
|
|
130
|
+
mcomplex.infinity = mcomplex.RF(Infinity)
|
|
131
|
+
else:
|
|
132
|
+
mcomplex.infinity = mcomplex.RF(1e20)
|
|
133
|
+
|
|
134
|
+
return mcomplex
|
|
135
|
+
|
|
136
|
+
def add_cusp_to_queue_and_neighborhoods(
|
|
137
|
+
neighborhood_queue : List[Neighborhood],
|
|
138
|
+
neighborhoods : Neighborhoods,
|
|
139
|
+
vertex,
|
|
140
|
+
cusp_shape
|
|
141
|
+
) -> None:
|
|
142
|
+
index = len(neighborhoods.neighborhoods)
|
|
143
|
+
neighborhood = CuspNeighborhoodNeighborhood(
|
|
144
|
+
neighborhoods.mcomplex, index, vertex, cusp_shape)
|
|
145
|
+
heapq.heappush(neighborhood_queue, neighborhood)
|
|
146
|
+
neighborhoods.add_neighborhood(neighborhood)
|
|
147
|
+
|
|
148
|
+
def add_geodesic_to_queue(
|
|
149
|
+
neighborhood_queue : List[Neighborhood],
|
|
150
|
+
neighborhoods : Neighborhoods,
|
|
151
|
+
geodesic_info : LengthSpectrumGeodesicInfo
|
|
152
|
+
) -> None:
|
|
153
|
+
index = len(neighborhoods.neighborhoods)
|
|
154
|
+
neighborhood = GeodesicNeighborhood(
|
|
155
|
+
neighborhoods.mcomplex, index, geodesic_info)
|
|
156
|
+
heapq.heappush(neighborhood_queue, neighborhood)
|
|
157
|
+
|
|
158
|
+
def expand_next_neighborhood(
|
|
159
|
+
neighborhood_queue : List[Neighborhood],
|
|
160
|
+
neighborhoods : Neighborhoods,
|
|
161
|
+
len_spec : Iterable[LengthSpectrumGeodesicInfo]
|
|
162
|
+
) -> bool:
|
|
163
|
+
|
|
164
|
+
neighborhood = heapq.heappop(neighborhood_queue)
|
|
165
|
+
|
|
166
|
+
if neighborhoods.mcomplex.verified:
|
|
167
|
+
err_epsilon = 0
|
|
168
|
+
else:
|
|
169
|
+
err_epsilon = neighborhoods.mcomplex.RF(1e-6)
|
|
170
|
+
|
|
171
|
+
if neighborhood.epsilon > neighborhoods.mu + err_epsilon:
|
|
172
|
+
return False
|
|
173
|
+
|
|
174
|
+
if isinstance(neighborhood, GeodesicNeighborhood):
|
|
175
|
+
if neighborhood.geodesic_info._is_intermediate:
|
|
176
|
+
neighborhood.geodesic_info = next(len_spec)
|
|
177
|
+
neighborhood.epsilon = neighborhood.geodesic_info.length.real()
|
|
178
|
+
heapq.heappush(neighborhood_queue, neighborhood)
|
|
179
|
+
return True
|
|
180
|
+
|
|
181
|
+
if not neighborhood.added:
|
|
182
|
+
neighborhoods.add_neighborhood(neighborhood)
|
|
183
|
+
neighborhood.added = True
|
|
184
|
+
add_geodesic_to_queue(
|
|
185
|
+
neighborhood_queue, neighborhoods, next(len_spec))
|
|
186
|
+
|
|
187
|
+
next_tile : Tile = neighborhood.get_next_tile()
|
|
188
|
+
neighborhood.update_radius_and_epsilon(next_tile)
|
|
189
|
+
tet_index = next_tile.lifted_tetrahedron.tet.Index
|
|
190
|
+
|
|
191
|
+
for other_neighborhood in neighborhoods.neighborhoods:
|
|
192
|
+
neighborhood_pair = neighborhoods.get_neighborhood_pair(
|
|
193
|
+
neighborhood, other_neighborhood)
|
|
194
|
+
if neighborhood_pair.finished:
|
|
195
|
+
continue
|
|
196
|
+
|
|
197
|
+
for other_tile in other_neighborhood.tet_to_tiles[tet_index]:
|
|
198
|
+
neighborhood_pair.distance_lifts = correct_min([
|
|
199
|
+
neighborhood_pair.distance_lifts,
|
|
200
|
+
distance_tiles(next_tile, other_tile)])
|
|
201
|
+
|
|
202
|
+
total_radius = neighborhood.radius + other_neighborhood.radius
|
|
203
|
+
|
|
204
|
+
if total_radius < neighborhood_pair.distance_lifts:
|
|
205
|
+
continue
|
|
206
|
+
|
|
207
|
+
if neighborhoods.mcomplex.verified:
|
|
208
|
+
distance_objects = neighborhoods.mcomplex.RF(
|
|
209
|
+
min(total_radius.lower(),
|
|
210
|
+
neighborhood_pair.distance_lifts.lower()),
|
|
211
|
+
neighborhood_pair.distance_lifts.upper())
|
|
212
|
+
else:
|
|
213
|
+
distance_objects = neighborhood_pair.distance_lifts
|
|
214
|
+
|
|
215
|
+
neighborhood_pair.mu = mu_from_neighborhood_pair(
|
|
216
|
+
neighborhood, other_neighborhood,
|
|
217
|
+
distance_objects,
|
|
218
|
+
verified=neighborhoods.mcomplex.verified)
|
|
219
|
+
neighborhoods.mu = correct_min(
|
|
220
|
+
[neighborhoods.mu, neighborhood_pair.mu])
|
|
221
|
+
|
|
222
|
+
neighborhood_pair.finished = True
|
|
223
|
+
|
|
224
|
+
neighborhood.add_next_tile(next_tile)
|
|
225
|
+
heapq.heappush(neighborhood_queue, neighborhood)
|
|
226
|
+
|
|
227
|
+
return True
|
|
228
|
+
|
|
229
|
+
def margulis(
|
|
230
|
+
M,
|
|
231
|
+
bits_prec:Optional[int]=None,
|
|
232
|
+
verified:bool=False,
|
|
233
|
+
include_thin_part:bool=False,
|
|
234
|
+
stopper=None):
|
|
235
|
+
"""
|
|
236
|
+
Returns the optimal Margulis number :math:`\\mu(M)`::
|
|
237
|
+
|
|
238
|
+
>>> Manifold("m004").margulis() # doctest: +NUMERIC9
|
|
239
|
+
0.962423650119202
|
|
240
|
+
|
|
241
|
+
If :attr:`include_thin_part=True`, returns a triple
|
|
242
|
+
(:math:`\\mu(M)`, :math:`\\mu(M)`-thin part, collisions). Recall that the
|
|
243
|
+
:math:`\\mu(M)`-thin part is the union of all essential loops of length
|
|
244
|
+
less than :math:`\\mu(M)`. It is a disjoint union of embedded cusp
|
|
245
|
+
neighborhoods and embedded tubes about geodesics. We encode it as list
|
|
246
|
+
of objects pertaining information about each component. The collisions are
|
|
247
|
+
pairs of indices into the thin part indicating which cusp neighborhoods and
|
|
248
|
+
tubes are touching::
|
|
249
|
+
|
|
250
|
+
>>> Manifold("m003").margulis(include_thin_part=True) # doctest: +SKIP
|
|
251
|
+
(0.962423650119189,
|
|
252
|
+
[Cusp Neighborhood for cusp 0 of area 0.866025403784405,
|
|
253
|
+
Tube about geodesic aC of radius 0.211824465096784,
|
|
254
|
+
Tube about geodesic a of radius 0.211824465096782,
|
|
255
|
+
Tube about geodesic bC of radius 0.211824465096782,
|
|
256
|
+
Tube about geodesic b of radius 0.211824465096782],
|
|
257
|
+
[(2, 3), (1, 4)])
|
|
258
|
+
|
|
259
|
+
Note that the method fails on some manifolds with incomplete cusps
|
|
260
|
+
such as ``s479(-3,1)`` where the boundary of the thin part is intersecting
|
|
261
|
+
a core curve. In such cases (or in order to improve performance), we can
|
|
262
|
+
use :attr:`stopper` to show that :math:`\\mu(M)` is larger than a given
|
|
263
|
+
number. Here is an example to prove that :math:`\\mu(M)>0.8`::
|
|
264
|
+
|
|
265
|
+
sage: M=ManifoldHP("s479(-3,1)")
|
|
266
|
+
sage: from sage.all import RealIntervalField
|
|
267
|
+
sage: M.margulis(verified=True, stopper=0.9)>RealIntervalField()('0.8')
|
|
268
|
+
True
|
|
269
|
+
|
|
270
|
+
**Verified computations**
|
|
271
|
+
|
|
272
|
+
The method also supports :ref:`verified computations <verify-primer>`::
|
|
273
|
+
|
|
274
|
+
sage: Manifold("m003").margulis(verified=True,bits_prec=100) # doctest: +NUMERIC15
|
|
275
|
+
0.9624236501192068949955?
|
|
276
|
+
|
|
277
|
+
If :attr:`verified=True` and :attr:`include_thin_part=True` are used
|
|
278
|
+
together, the method returns (not necessarily proper) supersets for the
|
|
279
|
+
true thin part and the true collisions. For example, assume there is a
|
|
280
|
+
geodesic of real length equal to (or really close to) :math:`\\mu(M)`.
|
|
281
|
+
Numerically, we cannot decide whether the limiting constituent of
|
|
282
|
+
:math:`\\mu(M)` is the geodesic or some other neighborhood or pair of
|
|
283
|
+
neighborhoods. In such a case, we conservatively add the tube about the
|
|
284
|
+
geodesic to the thin part (with lower bound on the radius being 0) and to
|
|
285
|
+
the collisions.
|
|
286
|
+
|
|
287
|
+
:param bits_prec:
|
|
288
|
+
Precision used for the computation. Increase if computation did
|
|
289
|
+
not succeed.
|
|
290
|
+
:param verified:
|
|
291
|
+
Use :ref:`verified computation <verify-primer>`.
|
|
292
|
+
:param include_thin_part:
|
|
293
|
+
Return triple
|
|
294
|
+
(:math:`\\mu(M)`, :math:`\\mu(M)`-thin part, collisions) instead
|
|
295
|
+
of only the optimal Margulis number :math:`\\mu(M)`.
|
|
296
|
+
:param stopper:
|
|
297
|
+
Return the minimum of :attr:`stopper` and the optimal Margulis
|
|
298
|
+
number :math:`\\mu(M)` (and the corresponding thin part if
|
|
299
|
+
:attr:`include_thin_part=True`).
|
|
300
|
+
:return:
|
|
301
|
+
Optimal Margulis number :math:`\\mu(M)` or triple
|
|
302
|
+
(:math:`\\mu(M)`, :math:`\\mu(M)`-thin part, collisions).
|
|
303
|
+
"""
|
|
304
|
+
|
|
305
|
+
mcomplex = mcomplex_for_margulis_number(
|
|
306
|
+
M, bits_prec=bits_prec, verified=verified)
|
|
307
|
+
|
|
308
|
+
neighborhoods = Neighborhoods(mcomplex, stopper)
|
|
309
|
+
neighborhood_queue : List[Neighborhood] = []
|
|
310
|
+
|
|
311
|
+
cusp_shapes = compute_cusp_shapes(
|
|
312
|
+
M, bits_prec = bits_prec, verified = verified)
|
|
313
|
+
|
|
314
|
+
for vertex, cusp_shape in zip(mcomplex.Vertices, cusp_shapes):
|
|
315
|
+
if vertex.is_complete:
|
|
316
|
+
add_cusp_to_queue_and_neighborhoods(
|
|
317
|
+
neighborhood_queue, neighborhoods, vertex, cusp_shape)
|
|
318
|
+
|
|
319
|
+
len_spec = M.length_spectrum_alt_gen(
|
|
320
|
+
bits_prec=bits_prec, verified=verified, include_intermediates=True)
|
|
321
|
+
add_geodesic_to_queue(neighborhood_queue, neighborhoods, next(len_spec))
|
|
322
|
+
|
|
323
|
+
while expand_next_neighborhood(
|
|
324
|
+
neighborhood_queue, neighborhoods, len_spec):
|
|
325
|
+
pass
|
|
326
|
+
|
|
327
|
+
if include_thin_part:
|
|
328
|
+
return (neighborhoods.mu,
|
|
329
|
+
neighborhoods.thin_part(),
|
|
330
|
+
neighborhoods.collisions())
|
|
331
|
+
else:
|
|
332
|
+
return neighborhoods.mu
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from .neighborhood import Neighborhood
|
|
2
|
+
from .margulis_info import MargulisCuspNeighborhoodInfo
|
|
3
|
+
|
|
4
|
+
from ..snap.t3mlite import Mcomplex
|
|
5
|
+
from ..tiling.tile import Tile
|
|
6
|
+
from ..tiling.floor import floor_as_integers
|
|
7
|
+
from ..math_basics import correct_min
|
|
8
|
+
|
|
9
|
+
import itertools
|
|
10
|
+
|
|
11
|
+
from typing import Iterable
|
|
12
|
+
|
|
13
|
+
class CuspNeighborhoodNeighborhood(Neighborhood):
|
|
14
|
+
def __init__(self, mcomplex : Mcomplex, index : int, vertex, cusp_shape):
|
|
15
|
+
super().__init__(mcomplex, index)
|
|
16
|
+
self.vertex = vertex
|
|
17
|
+
self.euclidean_length = length_shortest_slope_from_cusp_area_and_shape(
|
|
18
|
+
self.vertex.cusp_area, cusp_shape)
|
|
19
|
+
self.epsilon = mcomplex.RF(0)
|
|
20
|
+
|
|
21
|
+
def epsilon_from_radius(self, radius):
|
|
22
|
+
h = self.euclidean_length * radius.exp()
|
|
23
|
+
return 2 * (h/2).arcsinh()
|
|
24
|
+
|
|
25
|
+
def _get_tile_stream(self) -> Iterable[Tile]:
|
|
26
|
+
return iter(self.vertex.tiles())
|
|
27
|
+
|
|
28
|
+
def radius_from_epsilon(self, epsilon):
|
|
29
|
+
h = 2 * (epsilon/2).sinh()
|
|
30
|
+
return (h / self.euclidean_length).log()
|
|
31
|
+
|
|
32
|
+
def radius_derivative_from_epsilon(self, epsilon):
|
|
33
|
+
return 1 / (2 * (epsilon/2).tanh())
|
|
34
|
+
|
|
35
|
+
def radius_and_derivative_from_epsilon(self, epsilon):
|
|
36
|
+
return (
|
|
37
|
+
self.radius_from_epsilon(epsilon),
|
|
38
|
+
self.radius_derivative_from_epsilon(epsilon))
|
|
39
|
+
|
|
40
|
+
def info_for_epsilon(self, epsilon) -> MargulisCuspNeighborhoodInfo:
|
|
41
|
+
radius = self.radius_from_epsilon(epsilon)
|
|
42
|
+
area = self.vertex.cusp_area * (2 * radius).exp()
|
|
43
|
+
return MargulisCuspNeighborhoodInfo(
|
|
44
|
+
cusp_index=self.vertex.Index,
|
|
45
|
+
cusp_area=area)
|
|
46
|
+
|
|
47
|
+
def __repr__(self):
|
|
48
|
+
return "Cusp neighborhood neighborhood with Euclidean length %r" % self.euclidean_length
|
|
49
|
+
|
|
50
|
+
def length_shortest_slope_from_cusp_shape(cusp_shape):
|
|
51
|
+
RF = cusp_shape.real().parent()
|
|
52
|
+
|
|
53
|
+
one = RF(1)
|
|
54
|
+
half = one / 2
|
|
55
|
+
|
|
56
|
+
result = one
|
|
57
|
+
for q in itertools.count(start=1):
|
|
58
|
+
if abs(q * cusp_shape.imag()) > result:
|
|
59
|
+
return result
|
|
60
|
+
z = q * cusp_shape
|
|
61
|
+
for p in floor_as_integers(z.real() + half):
|
|
62
|
+
result = correct_min([result, (z - p).abs()])
|
|
63
|
+
|
|
64
|
+
def length_shortest_slope_from_cusp_area_and_shape(cusp_area, cusp_shape):
|
|
65
|
+
l = length_shortest_slope_from_cusp_shape(cusp_shape)
|
|
66
|
+
return (cusp_area / cusp_shape.imag()).sqrt() * l
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
from .neighborhood import Neighborhood
|
|
2
|
+
from .margulis_info import MargulisTubeInfo
|
|
3
|
+
|
|
4
|
+
from ..snap.t3mlite import Mcomplex
|
|
5
|
+
from ..geometric_structure.geodesic.tiles_for_geodesic import (
|
|
6
|
+
compute_tiles_for_geodesic, compute_tiles_for_core_curve)
|
|
7
|
+
from ..geometric_structure.geodesic.geodesic_start_point_info import (
|
|
8
|
+
GeodesicStartPointInfo, compute_geodesic_start_point_info)
|
|
9
|
+
from ..math_basics import correct_min, correct_max, is_RealIntervalFieldElement
|
|
10
|
+
from ..len_spec.length_spectrum_geodesic_info import LengthSpectrumGeodesicInfo
|
|
11
|
+
from ..tiling.tile import Tile
|
|
12
|
+
|
|
13
|
+
from typing import Iterable
|
|
14
|
+
import itertools
|
|
15
|
+
|
|
16
|
+
class GeodesicNeighborhood(Neighborhood):
|
|
17
|
+
def __init__(self, mcomplex : Mcomplex,
|
|
18
|
+
index : int,
|
|
19
|
+
geodesic_info : LengthSpectrumGeodesicInfo):
|
|
20
|
+
super().__init__(mcomplex, index)
|
|
21
|
+
self.mcomplex = mcomplex
|
|
22
|
+
self.geodesic_info = geodesic_info
|
|
23
|
+
self.epsilon = geodesic_info.length.real()
|
|
24
|
+
self.added = False
|
|
25
|
+
|
|
26
|
+
def _get_tile_stream(self) -> Iterable[Tile]:
|
|
27
|
+
if self.geodesic_info.core_curve is None:
|
|
28
|
+
return compute_tiles_for_geodesic(
|
|
29
|
+
self.mcomplex,
|
|
30
|
+
compute_geodesic_start_point_info(
|
|
31
|
+
self.mcomplex, self.geodesic_info.word))
|
|
32
|
+
else:
|
|
33
|
+
return compute_tiles_for_core_curve(
|
|
34
|
+
self.mcomplex,
|
|
35
|
+
self.geodesic_info.core_curve)
|
|
36
|
+
|
|
37
|
+
def epsilon_from_radius(self, radius):
|
|
38
|
+
return epsilon_from_tube_radius(
|
|
39
|
+
radius,
|
|
40
|
+
self.geodesic_info.length)
|
|
41
|
+
|
|
42
|
+
def radius_from_epsilon(self, epsilon):
|
|
43
|
+
return tube_radius_and_derivative_from_epsilon(
|
|
44
|
+
epsilon,
|
|
45
|
+
self.geodesic_info.length,
|
|
46
|
+
include_derivative=False,
|
|
47
|
+
verified=self.mcomplex.verified)[0]
|
|
48
|
+
|
|
49
|
+
def radius_derivative_from_epsilon(self, epsilon):
|
|
50
|
+
return tube_radius_and_derivative_from_epsilon(
|
|
51
|
+
epsilon,
|
|
52
|
+
self.geodesic_info.length,
|
|
53
|
+
include_derivative=True,
|
|
54
|
+
verified=self.mcomplex.verified)[1]
|
|
55
|
+
|
|
56
|
+
def radius_and_derivative_from_epsilon(self, epsilon):
|
|
57
|
+
return tube_radius_and_derivative_from_epsilon(
|
|
58
|
+
epsilon,
|
|
59
|
+
self.geodesic_info.length,
|
|
60
|
+
include_derivative=True,
|
|
61
|
+
verified=self.mcomplex.verified)
|
|
62
|
+
|
|
63
|
+
def info_for_epsilon(self, epsilon) -> MargulisTubeInfo:
|
|
64
|
+
radius = self.radius_from_epsilon(epsilon)
|
|
65
|
+
return MargulisTubeInfo(
|
|
66
|
+
word=self.geodesic_info.word,
|
|
67
|
+
radius=radius,
|
|
68
|
+
core_curve=self.geodesic_info.core_curve,
|
|
69
|
+
type_='tube')
|
|
70
|
+
|
|
71
|
+
def __repr__(self):
|
|
72
|
+
return "Geodesic tube with length %r" % self.geodesic_info.length
|
|
73
|
+
|
|
74
|
+
def epsilon_from_tube_radius(radius, lambda_):
|
|
75
|
+
if radius < 0:
|
|
76
|
+
return lambda_.real()
|
|
77
|
+
|
|
78
|
+
RF = radius.parent()
|
|
79
|
+
sqr_cosh_radius = correct_max([RF(0), radius]).cosh() ** 2
|
|
80
|
+
|
|
81
|
+
min_cosh_candidate = None
|
|
82
|
+
for n in itertools.count(1):
|
|
83
|
+
nlambda = n * lambda_
|
|
84
|
+
cos_term = nlambda.imag().cos()
|
|
85
|
+
cosh_term = nlambda.real().cosh()
|
|
86
|
+
|
|
87
|
+
cosh_candidate = ((cosh_term - cos_term) * sqr_cosh_radius) + cos_term
|
|
88
|
+
if min_cosh_candidate is None:
|
|
89
|
+
min_cosh_candidate = cosh_candidate
|
|
90
|
+
else:
|
|
91
|
+
min_cosh_candidate = correct_min([min_cosh_candidate, cosh_candidate])
|
|
92
|
+
if min_cosh_candidate < ((cosh_term - 1) * sqr_cosh_radius) + 1:
|
|
93
|
+
return min_cosh_candidate.arccosh()
|
|
94
|
+
|
|
95
|
+
def candidate_tube_radius_from_cosh_epsilon(cosh_epsilon, lambda_):
|
|
96
|
+
cos_term = lambda_.imag().cos()
|
|
97
|
+
f = ((cosh_epsilon - cos_term) /
|
|
98
|
+
(lambda_.real().cosh() - cos_term))
|
|
99
|
+
RIF = f.parent()
|
|
100
|
+
return correct_max([f, RIF(1)]).sqrt().arccosh()
|
|
101
|
+
|
|
102
|
+
def candidate_derivative_tube_radius_from_cosh_sinh_epsilon(cosh_epsilon, sinh_epsilon, lambda_):
|
|
103
|
+
cos_term = lambda_.imag().cos()
|
|
104
|
+
n = cosh_epsilon - cos_term
|
|
105
|
+
d = lambda_.real().cosh() - cos_term
|
|
106
|
+
f = n / d
|
|
107
|
+
ff = f * (f - 1)
|
|
108
|
+
|
|
109
|
+
RF = ff.parent()
|
|
110
|
+
|
|
111
|
+
safe_ff = correct_max([RF(0), ff])
|
|
112
|
+
try:
|
|
113
|
+
return sinh_epsilon / (2 * safe_ff.sqrt() * d)
|
|
114
|
+
except Exception as e:
|
|
115
|
+
print("lambda_", lambda_)
|
|
116
|
+
raise e
|
|
117
|
+
|
|
118
|
+
def _floor(v):
|
|
119
|
+
if is_RealIntervalFieldElement(v):
|
|
120
|
+
return v.floor().upper().round()
|
|
121
|
+
else:
|
|
122
|
+
return int(v.floor())
|
|
123
|
+
|
|
124
|
+
def tube_radius_and_derivative_from_epsilon(epsilon, lambda_, include_derivative, verified):
|
|
125
|
+
cosh_epsilon = epsilon.cosh()
|
|
126
|
+
sinh_epsilon = epsilon.sinh()
|
|
127
|
+
max_power = _floor(epsilon / lambda_.real())
|
|
128
|
+
|
|
129
|
+
candidates = [
|
|
130
|
+
candidate_tube_radius_from_cosh_epsilon(cosh_epsilon, n * lambda_)
|
|
131
|
+
for n in range(1, max_power + 1) ]
|
|
132
|
+
|
|
133
|
+
radius = correct_max(candidates)
|
|
134
|
+
|
|
135
|
+
if not include_derivative:
|
|
136
|
+
return radius, None
|
|
137
|
+
|
|
138
|
+
indices = [ i + 1
|
|
139
|
+
for i in range(0, max_power)
|
|
140
|
+
if not candidates[i] < radius ]
|
|
141
|
+
|
|
142
|
+
index = indices[0]
|
|
143
|
+
d = candidate_derivative_tube_radius_from_cosh_sinh_epsilon(
|
|
144
|
+
cosh_epsilon, sinh_epsilon, index * lambda_)
|
|
145
|
+
|
|
146
|
+
if verified:
|
|
147
|
+
for index in indices[1:]:
|
|
148
|
+
d = d.union(
|
|
149
|
+
candidate_derivative_tube_radius_from_cosh_sinh_epsilon(
|
|
150
|
+
cosh_epsilon, sinh_epsilon, index * lambda_))
|
|
151
|
+
|
|
152
|
+
return radius, d
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from ..SnapPy import Info
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
class MargulisInfo(Info):
|
|
6
|
+
pass
|
|
7
|
+
|
|
8
|
+
class MargulisTubeInfo(MargulisInfo):
|
|
9
|
+
def __repr__(self):
|
|
10
|
+
return "Tube about geodesic %s%s of radius %r" % (
|
|
11
|
+
self.word, _format_core_curve(self.core_curve), self.radius)
|
|
12
|
+
|
|
13
|
+
class MargulisCuspNeighborhoodInfo(MargulisInfo):
|
|
14
|
+
def __repr__(self):
|
|
15
|
+
return "Cusp Neighborhood for cusp %d of area %r" % (
|
|
16
|
+
self.cusp_index, self.cusp_area)
|
|
17
|
+
|
|
18
|
+
def _format_core_curve(core_curve : Optional[int]):
|
|
19
|
+
if core_curve is None:
|
|
20
|
+
return ''
|
|
21
|
+
return ' (Core curve of cusp %d)' % core_curve
|