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,542 @@
|
|
|
1
|
+
from ..sage_helper import _within_sage, sage_method
|
|
2
|
+
|
|
3
|
+
from ..geometric_structure.cusp_neighborhood.real_cusp_cross_section import RealCuspCrossSection
|
|
4
|
+
from ..snap.t3mlite import simplex
|
|
5
|
+
|
|
6
|
+
from .square_extensions import find_shapes_as_complex_sqrt_lin_combinations
|
|
7
|
+
from . import edge_equations
|
|
8
|
+
from . import hyperbolicity
|
|
9
|
+
from . import exceptions
|
|
10
|
+
from ..exceptions import SnapPeaFatalError
|
|
11
|
+
|
|
12
|
+
if _within_sage:
|
|
13
|
+
from sage.rings.complex_interval_field import ComplexIntervalField
|
|
14
|
+
from ..pari import prec_dec_to_bits, prec_bits_to_dec
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
'FindExactShapesError',
|
|
18
|
+
'interval_checked_canonical_triangulation',
|
|
19
|
+
'exactly_checked_canonical_retriangulation',
|
|
20
|
+
'verified_canonical_retriangulation',
|
|
21
|
+
'default_interval_bits_precs',
|
|
22
|
+
'default_exact_bits_prec_and_degrees']
|
|
23
|
+
|
|
24
|
+
default_interval_bits_precs = [53, 212]
|
|
25
|
+
default_exact_bits_prec_and_degrees = [( 212, 10),
|
|
26
|
+
(1000, 20),
|
|
27
|
+
(2000, 20)]
|
|
28
|
+
|
|
29
|
+
_num_tries_kernel_canonize = 3
|
|
30
|
+
_max_tries_verify_penalty = 9
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class FindExactShapesError(RuntimeError):
|
|
34
|
+
"""
|
|
35
|
+
Raised when snap failed to find the exact shapes using the LLL-algorithm
|
|
36
|
+
for a manifold.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@sage_method
|
|
41
|
+
def interval_checked_canonical_triangulation(M, bits_prec=None):
|
|
42
|
+
"""
|
|
43
|
+
Given a canonical triangulation of a cusped (possibly non-orientable)
|
|
44
|
+
manifold M, return this triangulation if it has tetrahedral cells and can
|
|
45
|
+
be verified using interval arithmetics with the optional, given precision.
|
|
46
|
+
Otherwise, raises an Exception.
|
|
47
|
+
|
|
48
|
+
It fails when we call it on something which is not the canonical
|
|
49
|
+
triangulation::
|
|
50
|
+
|
|
51
|
+
sage: from snappy import Manifold
|
|
52
|
+
sage: M = Manifold("m015")
|
|
53
|
+
sage: interval_checked_canonical_triangulation(M) # doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL
|
|
54
|
+
Traceback (most recent call last):
|
|
55
|
+
...
|
|
56
|
+
TiltProvenPositiveNumericalVerifyError: Numerical verification that tilt is negative has failed, tilt is actually positive. This is provably not the proto-canonical triangulation: 0.164542163...? <= 0
|
|
57
|
+
|
|
58
|
+
It verifies the canonical triangulation::
|
|
59
|
+
|
|
60
|
+
sage: M.canonize()
|
|
61
|
+
sage: K = interval_checked_canonical_triangulation(M)
|
|
62
|
+
sage: K
|
|
63
|
+
m015(0,0)
|
|
64
|
+
|
|
65
|
+
Has a non-tetrahedral canonical cell::
|
|
66
|
+
|
|
67
|
+
sage: M = Manifold("m137")
|
|
68
|
+
sage: M.canonize()
|
|
69
|
+
sage: interval_checked_canonical_triangulation(M) # doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL
|
|
70
|
+
Traceback (most recent call last):
|
|
71
|
+
...
|
|
72
|
+
TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: 0.?e-1... < 0
|
|
73
|
+
|
|
74
|
+
Has a cubical canonical cell::
|
|
75
|
+
|
|
76
|
+
sage: M = Manifold("m412")
|
|
77
|
+
sage: M.canonize()
|
|
78
|
+
sage: interval_checked_canonical_triangulation(M) # doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL
|
|
79
|
+
Traceback (most recent call last):
|
|
80
|
+
...
|
|
81
|
+
TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: 0.?e-1... < 0
|
|
82
|
+
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
# Get verified shape intervals
|
|
86
|
+
shapes = M.tetrahedra_shapes('rect', intervals=True,
|
|
87
|
+
bits_prec=bits_prec)
|
|
88
|
+
|
|
89
|
+
# Compute cusp cross sections
|
|
90
|
+
c = RealCuspCrossSection.fromManifoldAndShapes(M, shapes)
|
|
91
|
+
|
|
92
|
+
# Use interval arithmetics to verify hyperbolicity
|
|
93
|
+
hyperbolicity.check_logarithmic_gluing_equations_and_positively_oriented_tets(
|
|
94
|
+
M, shapes)
|
|
95
|
+
|
|
96
|
+
# Normalize cusp area. This is not needed when only 1 cusp
|
|
97
|
+
if M.num_cusps() > 1:
|
|
98
|
+
c.normalize_cusps()
|
|
99
|
+
|
|
100
|
+
# Compute tilts
|
|
101
|
+
c.compute_tilts()
|
|
102
|
+
|
|
103
|
+
# Make sure all tilts are negative
|
|
104
|
+
for face in c.mcomplex.Faces:
|
|
105
|
+
# Raise different exceptions to indicate whether we have proven
|
|
106
|
+
# that there are positive tilt or whether the intervals couldn't
|
|
107
|
+
# prove that they are negative
|
|
108
|
+
if face.Tilt > 0:
|
|
109
|
+
# If we can prove there is a positive tilt, raise this
|
|
110
|
+
# exception. Clients thus know that this is not a proto-canonical
|
|
111
|
+
# triangulations.
|
|
112
|
+
raise exceptions.TiltProvenPositiveNumericalVerifyError(face.Tilt)
|
|
113
|
+
|
|
114
|
+
if not (face.Tilt < 0):
|
|
115
|
+
# We failed to show it is negative. This might be because a tilt
|
|
116
|
+
# is zero or because we lost precision and even though the true
|
|
117
|
+
# value is negative, the interval we have contains positive
|
|
118
|
+
# numbers as well.
|
|
119
|
+
raise exceptions.TiltInequalityNumericalVerifyError(face.Tilt)
|
|
120
|
+
|
|
121
|
+
# Return M
|
|
122
|
+
return M
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
@sage_method
|
|
126
|
+
def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
|
|
127
|
+
"""
|
|
128
|
+
Given a proto-canonical triangulation of a cusped (possibly non-orientable)
|
|
129
|
+
manifold M, return its canonical retriangulation which is computed from
|
|
130
|
+
exact shapes. The exact shapes are computed using snap (which uses the
|
|
131
|
+
LLL-algorithm). The precision (in bits) and the maximal degree need to be
|
|
132
|
+
specified (here 300 bits precision and polynomials of degree less than 4)::
|
|
133
|
+
|
|
134
|
+
sage: from snappy import Manifold
|
|
135
|
+
sage: M = Manifold("m412")
|
|
136
|
+
sage: M.canonize()
|
|
137
|
+
sage: K = exactly_checked_canonical_retriangulation(M, 300, 4)
|
|
138
|
+
|
|
139
|
+
M's canonical cell decomposition has a cube, so non-tetrahedral::
|
|
140
|
+
|
|
141
|
+
sage: K.has_finite_vertices()
|
|
142
|
+
True
|
|
143
|
+
|
|
144
|
+
Has 12 tetrahedra after the retrianglation::
|
|
145
|
+
|
|
146
|
+
sage: K.num_tetrahedra()
|
|
147
|
+
12
|
|
148
|
+
|
|
149
|
+
Check that it fails on something which is not a proto-canonical
|
|
150
|
+
triangulation::
|
|
151
|
+
|
|
152
|
+
sage: from snappy import Manifold
|
|
153
|
+
sage: M = Manifold("m015")
|
|
154
|
+
sage: exactly_checked_canonical_retriangulation(M, 500, 6) # doctest: +IGNORE_EXCEPTION_DETAIL
|
|
155
|
+
Traceback (most recent call last):
|
|
156
|
+
...
|
|
157
|
+
TiltProvenPositiveNumericalVerifyError: Numerical verification that tilt is negative has failed, tilt is actually positive. This is provably not the proto-canonical triangulation: 0.1645421638874662848910671879? <= 0
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
# Convert to decimal precision
|
|
161
|
+
dec_prec = prec_bits_to_dec(bits_prec)
|
|
162
|
+
|
|
163
|
+
# Try to find the exact shapes
|
|
164
|
+
shapes = find_shapes_as_complex_sqrt_lin_combinations(M, dec_prec, degree)
|
|
165
|
+
if not shapes:
|
|
166
|
+
raise FindExactShapesError()
|
|
167
|
+
|
|
168
|
+
# Build the cusp cross section
|
|
169
|
+
c = RealCuspCrossSection.fromManifoldAndShapes(M, shapes)
|
|
170
|
+
|
|
171
|
+
# Check that the exact solutions form a complete hyperbolic structure
|
|
172
|
+
# We convert to intervals to check that the shapes are positive and
|
|
173
|
+
# the angles add up to 2pi and not some other multiple of 2pi.
|
|
174
|
+
edge_equations.check_polynomial_edge_equations_exactly(c.mcomplex)
|
|
175
|
+
c.check_cusp_development_exactly()
|
|
176
|
+
CIF = ComplexIntervalField(bits_prec)
|
|
177
|
+
edge_equations.check_logarithmic_edge_equations_and_positivity(c.mcomplex, CIF)
|
|
178
|
+
|
|
179
|
+
# Normalize cusp area. This is not needed when only 1 cusp
|
|
180
|
+
if M.num_cusps() > 1:
|
|
181
|
+
c.normalize_cusps()
|
|
182
|
+
|
|
183
|
+
# Compute tilts
|
|
184
|
+
c.compute_tilts()
|
|
185
|
+
|
|
186
|
+
# Get the opacity of a face in the proto-canonical triangulation
|
|
187
|
+
def get_opacity(tilt):
|
|
188
|
+
# Get the tilt of the sign. The sign method is implemented
|
|
189
|
+
# to use exact arithmetic to certify that the sign is 0 and
|
|
190
|
+
# to use interval arithmetic (of increasing precision until a decision
|
|
191
|
+
# can be made) to certify the sign otherwise.
|
|
192
|
+
sign, interval = tilt.sign_with_interval()
|
|
193
|
+
|
|
194
|
+
# Tilt is negative, return True
|
|
195
|
+
if sign < 0:
|
|
196
|
+
return True
|
|
197
|
+
|
|
198
|
+
# Tilt is zero, return False
|
|
199
|
+
if sign == 0:
|
|
200
|
+
return False
|
|
201
|
+
|
|
202
|
+
# Tilt is positive, raise exception
|
|
203
|
+
if sign > 0:
|
|
204
|
+
raise exceptions.TiltProvenPositiveNumericalVerifyError(interval)
|
|
205
|
+
|
|
206
|
+
def index_of_face_corner(corner):
|
|
207
|
+
face_index = simplex.comp(corner.Subsimplex).bit_length() - 1
|
|
208
|
+
return 4 * corner.Tetrahedron.Index + face_index
|
|
209
|
+
|
|
210
|
+
# Opacities of all four faces of each tetrahedron, initialize with None.
|
|
211
|
+
# The format is opacity of face 0, 1, 2, 3 of the first tetrahedron,
|
|
212
|
+
# ... of second tetrahedron, ...
|
|
213
|
+
opacities = (4 * len(c.mcomplex.Tetrahedra)) * [ None ]
|
|
214
|
+
|
|
215
|
+
# For each face of the triangulation
|
|
216
|
+
for face in c.mcomplex.Faces:
|
|
217
|
+
opacity = get_opacity(face.Tilt)
|
|
218
|
+
for corner in face.Corners:
|
|
219
|
+
opacities[index_of_face_corner(corner)] = opacity
|
|
220
|
+
|
|
221
|
+
if None in opacities:
|
|
222
|
+
raise Exception("Mismatch with opacities")
|
|
223
|
+
|
|
224
|
+
# If there are transparent faces, the given triangulation is just the
|
|
225
|
+
# proto-canonical triangulation. We need to call into the SnapPea
|
|
226
|
+
# kernel to retriangulate (introduces finite vertices)
|
|
227
|
+
if not all(opacities):
|
|
228
|
+
return M._canonical_retriangulation(opacities)
|
|
229
|
+
|
|
230
|
+
# No transparent faces, this triangulation itself is the canonical cell
|
|
231
|
+
# decomposition.
|
|
232
|
+
# Return it without introducing finite vertices.
|
|
233
|
+
return M
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def _retrying_canonize(M) -> None:
|
|
237
|
+
"""
|
|
238
|
+
Wrapper for SnapPea kernel's function to compute the proto-canonical
|
|
239
|
+
triangulation in place. It will retry the kernel function if it fails.
|
|
240
|
+
Raises an exception if it did not succeed eventually.
|
|
241
|
+
"""
|
|
242
|
+
err = ValueError('_num_tries_canonize is not positive.')
|
|
243
|
+
|
|
244
|
+
for i in range(_num_tries_kernel_canonize):
|
|
245
|
+
try:
|
|
246
|
+
M.canonize()
|
|
247
|
+
return
|
|
248
|
+
except (RuntimeError, SnapPeaFatalError) as e:
|
|
249
|
+
err = e
|
|
250
|
+
M.randomize()
|
|
251
|
+
raise err
|
|
252
|
+
|
|
253
|
+
def _retrying_high_precision_canonize(M):
|
|
254
|
+
"""
|
|
255
|
+
Wrapper for SnapPea kernel's function to compute the proto-canonical
|
|
256
|
+
triangulation. It will retry the kernel function if it fails, switching
|
|
257
|
+
to the quad-double implementation.
|
|
258
|
+
Returns the proto-canonical triangulation if the kernel function was
|
|
259
|
+
successful eventually. Otherwise, raises an exception.
|
|
260
|
+
The original manifold is unchanged.
|
|
261
|
+
"""
|
|
262
|
+
|
|
263
|
+
from .. import ManifoldHP
|
|
264
|
+
|
|
265
|
+
# Make a copy of the manifold
|
|
266
|
+
Mcopy = M.copy()
|
|
267
|
+
|
|
268
|
+
# Try with the given precision first
|
|
269
|
+
try:
|
|
270
|
+
_retrying_canonize(Mcopy)
|
|
271
|
+
return Mcopy
|
|
272
|
+
except (RuntimeError, SnapPeaFatalError) as e:
|
|
273
|
+
if isinstance(M, ManifoldHP):
|
|
274
|
+
# Already using high precision.
|
|
275
|
+
# Give up.
|
|
276
|
+
raise e
|
|
277
|
+
# Then try with high precision.
|
|
278
|
+
Mhp = M.high_precision()
|
|
279
|
+
_retrying_canonize(Mhp)
|
|
280
|
+
return Mhp.low_precision()
|
|
281
|
+
|
|
282
|
+
def _print_exception(e):
|
|
283
|
+
print('%s: %s' % (type(e).__name__, e))
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
@sage_method
|
|
287
|
+
def verified_canonical_retriangulation(
|
|
288
|
+
M,
|
|
289
|
+
interval_bits_precs=default_interval_bits_precs,
|
|
290
|
+
exact_bits_prec_and_degrees=default_exact_bits_prec_and_degrees,
|
|
291
|
+
verbose=False):
|
|
292
|
+
"""
|
|
293
|
+
Given some triangulation of a cusped (possibly non-orientable) manifold ``M``,
|
|
294
|
+
return its canonical retriangulation. Return ``None`` if it could not certify
|
|
295
|
+
the result.
|
|
296
|
+
|
|
297
|
+
To compute the canonical retriangulation, it first prepares the manifold
|
|
298
|
+
(filling all Dehn-filled cusps and trying to find a proto-canonical
|
|
299
|
+
triangulation).
|
|
300
|
+
It then tries to certify the canonical triangulation using interval
|
|
301
|
+
arithmetics. If this fails, it uses snap (using `LLL-algorithm
|
|
302
|
+
<http://en.wikipedia.org/wiki/Lenstra%E2%80%93Lenstra%E2%80%93Lov%C3%A1sz_lattice_basis_reduction_algorithm>`_)
|
|
303
|
+
to guess
|
|
304
|
+
exact representations of the shapes in the shape field and then certifies
|
|
305
|
+
that it found the proto-canonical triangulation and determines the
|
|
306
|
+
transparent faces to construct the canonical retriangulation.
|
|
307
|
+
|
|
308
|
+
The optional arguments are:
|
|
309
|
+
|
|
310
|
+
- ``interval_bits_precs``:
|
|
311
|
+
a list of precisions used to try to
|
|
312
|
+
certify the canonical triangulation using intervals. By default, it
|
|
313
|
+
first tries to certify using 53 bits precision. If it failed, it tries
|
|
314
|
+
212 bits precision next. If it failed again, it moves on to trying exact
|
|
315
|
+
arithmetics.
|
|
316
|
+
|
|
317
|
+
- ``exact_bits_prec_and_degrees``:
|
|
318
|
+
a list of pairs (precision, maximal degree) used when the LLL-algorithm
|
|
319
|
+
is trying to find the defining polynomial of the shape field.
|
|
320
|
+
Similar to ``interval_bits_precs``, each pair is tried until we succeed.
|
|
321
|
+
|
|
322
|
+
- ``verbose``:
|
|
323
|
+
If ``True``, print out additional information.
|
|
324
|
+
|
|
325
|
+
The exact arithmetics can take a long time. To circumvent it, use
|
|
326
|
+
``exact_bits_prec_and_degrees = None``.
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
Canonical cell decomposition of ``m004`` has 2 tetrahedral cells::
|
|
330
|
+
|
|
331
|
+
sage: from snappy import Manifold
|
|
332
|
+
sage: M = Manifold("m004")
|
|
333
|
+
sage: K = verified_canonical_retriangulation(M)
|
|
334
|
+
sage: K.has_finite_vertices()
|
|
335
|
+
False
|
|
336
|
+
sage: K.num_tetrahedra()
|
|
337
|
+
2
|
|
338
|
+
|
|
339
|
+
Canonical cell decomposition of ``m137`` is not tetrahedral::
|
|
340
|
+
|
|
341
|
+
sage: M = Manifold("m137")
|
|
342
|
+
sage: K = verified_canonical_retriangulation(M)
|
|
343
|
+
sage: K.has_finite_vertices()
|
|
344
|
+
True
|
|
345
|
+
sage: K.num_tetrahedra()
|
|
346
|
+
18
|
|
347
|
+
|
|
348
|
+
Canonical cell decomposition of ``m412`` is a cube and has exactly 8
|
|
349
|
+
symmetries::
|
|
350
|
+
|
|
351
|
+
sage: M = Manifold("m412")
|
|
352
|
+
sage: K = verified_canonical_retriangulation(M)
|
|
353
|
+
sage: K.has_finite_vertices()
|
|
354
|
+
True
|
|
355
|
+
sage: K.num_tetrahedra()
|
|
356
|
+
12
|
|
357
|
+
sage: len(K.isomorphisms_to(K))
|
|
358
|
+
8
|
|
359
|
+
|
|
360
|
+
`Burton's example <http://arxiv.org/abs/1311.7615>`_ of ``x101`` and ``x103`` which are actually isometric but
|
|
361
|
+
SnapPea fails to show so. We certify the canonical retriangulation and
|
|
362
|
+
find them isomorphic::
|
|
363
|
+
|
|
364
|
+
sage: M = Manifold('x101'); K = verified_canonical_retriangulation(M)
|
|
365
|
+
sage: N = Manifold('x103'); L = verified_canonical_retriangulation(N)
|
|
366
|
+
sage: len(K.isomorphisms_to(L)) > 0
|
|
367
|
+
True
|
|
368
|
+
|
|
369
|
+
Avoid potentially expensive exact arithmetics (return ``None`` because it has
|
|
370
|
+
non-tetrahedral cells so interval arithmetics can't certify it)::
|
|
371
|
+
|
|
372
|
+
sage: M = Manifold("m412")
|
|
373
|
+
sage: verified_canonical_retriangulation(M, exact_bits_prec_and_degrees = None) # doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL
|
|
374
|
+
Traceback (most recent call last):
|
|
375
|
+
...
|
|
376
|
+
snappy.verify.exceptions.TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: ... < 0
|
|
377
|
+
|
|
378
|
+
"""
|
|
379
|
+
|
|
380
|
+
# This is the "outer" retry loop: it catches those verification
|
|
381
|
+
# failures that can probably be fixed by taking a different
|
|
382
|
+
# triangulation
|
|
383
|
+
|
|
384
|
+
tries_penalty_left = _max_tries_verify_penalty
|
|
385
|
+
|
|
386
|
+
err = ValueError("_max_tries_verify_penalty is not positive.")
|
|
387
|
+
|
|
388
|
+
while tries_penalty_left > 0:
|
|
389
|
+
try:
|
|
390
|
+
# The "inner" retry loop: it catches those verification
|
|
391
|
+
# failures that can probably be fixed by using higher
|
|
392
|
+
# precision intervals or by switching to exact
|
|
393
|
+
# arithmetics because we have transparent faces in the
|
|
394
|
+
# proto-canonical triangulation (i.e., non-tetrahedral
|
|
395
|
+
# canonical cells)
|
|
396
|
+
|
|
397
|
+
return _verified_canonical_retriangulation(
|
|
398
|
+
M, interval_bits_precs, exact_bits_prec_and_degrees,
|
|
399
|
+
verbose)
|
|
400
|
+
|
|
401
|
+
except (ZeroDivisionError,
|
|
402
|
+
exceptions.TiltProvenPositiveNumericalVerifyError,
|
|
403
|
+
exceptions.EdgeEquationExactVerifyError) as e:
|
|
404
|
+
|
|
405
|
+
err = e
|
|
406
|
+
|
|
407
|
+
# These three exceptions are probably raised due to the
|
|
408
|
+
# SnapPea kernel failures:
|
|
409
|
+
# - flat tetrahedra in the proto-canonical triangulation
|
|
410
|
+
# - this provably not being the proto-canonical triangulation
|
|
411
|
+
# Snap failures:
|
|
412
|
+
# - the wrong number field
|
|
413
|
+
|
|
414
|
+
# These failures can most of the time be fixed by trying
|
|
415
|
+
# a different triangulation of the same manifold
|
|
416
|
+
|
|
417
|
+
if verbose:
|
|
418
|
+
_print_exception(e)
|
|
419
|
+
print("Failure: In verification of result of SnapPea "
|
|
420
|
+
"kernel's proto_canonize", end="")
|
|
421
|
+
if isinstance(e, ZeroDivisionError):
|
|
422
|
+
print(" probably due to flat tetrahedra.")
|
|
423
|
+
if isinstance(
|
|
424
|
+
e, exceptions.TiltProvenPositiveNumericalVerifyError):
|
|
425
|
+
print(" due to provably positive tilts.")
|
|
426
|
+
if isinstance(
|
|
427
|
+
e, exceptions.EdgeEquationExactVerifyError):
|
|
428
|
+
print(" probably due to snap giving wrong number field.")
|
|
429
|
+
|
|
430
|
+
print("Next step: Retrying with randomized triangulation.")
|
|
431
|
+
|
|
432
|
+
M = M.copy()
|
|
433
|
+
M.randomize()
|
|
434
|
+
|
|
435
|
+
if isinstance(e, ZeroDivisionError):
|
|
436
|
+
# If there is a flat-tetrahedron, experience shows that enough
|
|
437
|
+
# randomization will yield a geometric triangulation eventually
|
|
438
|
+
# so keep going longer.
|
|
439
|
+
tries_penalty_left -= 1
|
|
440
|
+
else:
|
|
441
|
+
# But the other cases are more obscure, so give up faster.
|
|
442
|
+
tries_penalty_left -= 3
|
|
443
|
+
|
|
444
|
+
except exceptions.VerifyErrorBase as e:
|
|
445
|
+
# Failures we don't know how to recover from
|
|
446
|
+
if verbose:
|
|
447
|
+
_print_exception(e)
|
|
448
|
+
print("Failure: In verification of result of SnapPea kernel's "
|
|
449
|
+
"proto_canonize.")
|
|
450
|
+
print("Next step: Give up.")
|
|
451
|
+
|
|
452
|
+
raise e
|
|
453
|
+
|
|
454
|
+
raise err
|
|
455
|
+
|
|
456
|
+
def _verified_canonical_retriangulation(
|
|
457
|
+
M, interval_bits_precs, exact_bits_prec_and_degrees,
|
|
458
|
+
verbose):
|
|
459
|
+
"""
|
|
460
|
+
Implements the "inner" retry loop of verified_canonical_retriangulation
|
|
461
|
+
|
|
462
|
+
Returns retriangulation or raises exception.
|
|
463
|
+
|
|
464
|
+
Some exceptions are caught by the "outer" loop to retry, using that
|
|
465
|
+
the SnapPea kernel uses a randomized algorithm to fill incomplete cusps
|
|
466
|
+
(if applicable) and perform the flips to find the proto-canonical
|
|
467
|
+
triangulation.
|
|
468
|
+
"""
|
|
469
|
+
|
|
470
|
+
if all(M.cusp_info('complete?')):
|
|
471
|
+
Mfilled = M
|
|
472
|
+
else:
|
|
473
|
+
# Dehn-fill manifold first
|
|
474
|
+
Mfilled = M.filled_triangulation()
|
|
475
|
+
if not all(Mfilled.cusp_info('complete?')):
|
|
476
|
+
raise ValueError(
|
|
477
|
+
'Could not compute filled triangulation. '
|
|
478
|
+
'Are the filling coefficients co-prime integers?')
|
|
479
|
+
|
|
480
|
+
# Try to compute proto-canonical triangulation
|
|
481
|
+
Mcopy = _retrying_high_precision_canonize(Mfilled)
|
|
482
|
+
|
|
483
|
+
err = ValueError(
|
|
484
|
+
'Neither interval_bits_precs nor exact_bits_prec_and_degrees was '
|
|
485
|
+
'non-empty.')
|
|
486
|
+
|
|
487
|
+
# First try interval arithmetics to verify
|
|
488
|
+
if interval_bits_precs:
|
|
489
|
+
for interval_bits_prec in interval_bits_precs:
|
|
490
|
+
if verbose:
|
|
491
|
+
print(("Method: Intervals with "
|
|
492
|
+
"interval_bits_prec = %d") % interval_bits_prec)
|
|
493
|
+
try:
|
|
494
|
+
return interval_checked_canonical_triangulation(
|
|
495
|
+
Mcopy, interval_bits_prec)
|
|
496
|
+
except (RuntimeError,
|
|
497
|
+
ValueError, # Manifold.tetrahedra_shapes,
|
|
498
|
+
# KrawczykShapesEngine.log_gluing_LHSs
|
|
499
|
+
exceptions.NumericalVerifyError) as e:
|
|
500
|
+
err = e
|
|
501
|
+
if verbose:
|
|
502
|
+
_print_exception(e)
|
|
503
|
+
if isinstance(e, exceptions.NumericalVerifyError):
|
|
504
|
+
print("Failure: Could not verify proto-canonical "
|
|
505
|
+
"triangulation.")
|
|
506
|
+
else:
|
|
507
|
+
print("Failure: Could not find verified interval.")
|
|
508
|
+
print("Next step: trying different method/precision.")
|
|
509
|
+
|
|
510
|
+
# Then using exact arithmetics
|
|
511
|
+
if exact_bits_prec_and_degrees:
|
|
512
|
+
for bits_prec, degree in exact_bits_prec_and_degrees:
|
|
513
|
+
if verbose:
|
|
514
|
+
print(("Method: Exact, using LLL with "
|
|
515
|
+
"bits_prec = %d, degree = %d") % (bits_prec, degree))
|
|
516
|
+
try:
|
|
517
|
+
return exactly_checked_canonical_retriangulation(
|
|
518
|
+
Mcopy, bits_prec, degree)
|
|
519
|
+
except FindExactShapesError as e:
|
|
520
|
+
err = e
|
|
521
|
+
if verbose:
|
|
522
|
+
_print_exception(e)
|
|
523
|
+
print("Failure: Could not find exact shapes.")
|
|
524
|
+
print("Next step: trying different method/precision")
|
|
525
|
+
|
|
526
|
+
raise err
|
|
527
|
+
|
|
528
|
+
_known_canonical_retriangulations = [
|
|
529
|
+
('m004', '\x02\x0e\x01\x01\x01-\x1b\x87'),
|
|
530
|
+
('m412', '\x0c\x80\xac\xff\x07\x05\x07\t\n\t\x08\t\n\x0b\x0b\n\x0b\xe4\xe4\xe4\xe4\xe4\xe1\xe1\xe1\xe1\xe1\xe1\xe1\xe1'),
|
|
531
|
+
('m137', '\x12\x00\xb0\xfa\xaf\x0f\x04\t\x0b\x08\x07\x07\n\x0c\x0e\r\n\x0f\x0f\r\x11\x11\x10\x10\x11\xb4\xe4\xe1\xe1\xe1\xb4\xe1\xe1\xb1\xe1\xb4\xe4\xe4\xe1\xb1\xe1\xe1\xb4\xe1') ]
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
def _test_against_known_canonical_retriangulations():
|
|
535
|
+
from snappy import Manifold
|
|
536
|
+
for name, bytes_ in _known_canonical_retriangulations:
|
|
537
|
+
M = Manifold(name)
|
|
538
|
+
K = verified_canonical_retriangulation(M)
|
|
539
|
+
L = Manifold('empty')
|
|
540
|
+
L._from_bytes(bytes_)
|
|
541
|
+
if not K.isomorphisms_to(L):
|
|
542
|
+
raise Exception('%s failed' % name)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from ...sage_helper import sage_method
|
|
2
|
+
|
|
3
|
+
from .cusped import *
|
|
4
|
+
from .closed import *
|
|
5
|
+
|
|
6
|
+
__all__ = ['verified_complex_volume_torsion']
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@sage_method
|
|
10
|
+
def verified_complex_volume_torsion(manifold, bits_prec=None):
|
|
11
|
+
|
|
12
|
+
completeness = [
|
|
13
|
+
cusp_info['complete?'] for cusp_info in manifold.cusp_info() ]
|
|
14
|
+
|
|
15
|
+
if False in completeness:
|
|
16
|
+
return verified_complex_volume_closed_torsion(manifold, bits_prec)
|
|
17
|
+
else:
|
|
18
|
+
return verified_complex_volume_cusped_torsion(manifold, bits_prec)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
from ...sage_helper import _within_sage, sage_method
|
|
2
|
+
if _within_sage:
|
|
3
|
+
from sage.symbolic.constants import pi
|
|
4
|
+
|
|
5
|
+
from .extended_bloch import *
|
|
6
|
+
from ...snap import t3mlite as t3m
|
|
7
|
+
|
|
8
|
+
__all__ = ['verified_complex_volume_from_lifted_ptolemys',
|
|
9
|
+
'normalize_by_pi_square_over_two']
|
|
10
|
+
|
|
11
|
+
_move_to_three = {
|
|
12
|
+
t3m.F0 : t3m.Perm4((3,0,1,2)),
|
|
13
|
+
t3m.F1 : t3m.Perm4((0,3,1,2)),
|
|
14
|
+
t3m.F2 : t3m.Perm4((0,1,3,2)),
|
|
15
|
+
t3m.F3 : t3m.Perm4((0,1,2,3))
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
_move_from_three = {
|
|
19
|
+
k : ~p for k, p in _move_to_three.items()
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _perm_for_q_tet(F, gluing):
|
|
24
|
+
return _move_to_three[gluing.image(F)] * gluing * _move_from_three[F]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _compute_adjustment_for_face(face):
|
|
28
|
+
canonical_corner = face.Corners[0]
|
|
29
|
+
tet = canonical_corner.Tetrahedron
|
|
30
|
+
F = canonical_corner.Subsimplex
|
|
31
|
+
gluing = tet.Gluing[F]
|
|
32
|
+
other_F = gluing.image(F)
|
|
33
|
+
|
|
34
|
+
return -2 * _perm_for_q_tet(F, gluing)[0] * (-1) ** t3m.FaceIndex[other_F]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _compute_adjustment(mcomplex):
|
|
38
|
+
"""
|
|
39
|
+
Given an mcomplex, compute the adjustment term to account for the
|
|
40
|
+
triangulation not being ordered.
|
|
41
|
+
|
|
42
|
+
So far, only solves for the 3-torsion but 2-torsion remains
|
|
43
|
+
"""
|
|
44
|
+
return sum([ _compute_adjustment_for_face(face)
|
|
45
|
+
for face in mcomplex.Faces ])
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@sage_method
|
|
49
|
+
def verified_complex_volume_from_lifted_ptolemys(mcomplex, ptolemys):
|
|
50
|
+
"""
|
|
51
|
+
Given lifted Ptolemy coordinates for a triangulation (as dictionary)
|
|
52
|
+
and the number of tetrahedra, compute the complex volume (where
|
|
53
|
+
the real part is the Chern-Simons and the imaginary part is the
|
|
54
|
+
volume).
|
|
55
|
+
|
|
56
|
+
The result is correct modulo pi^2/2.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
# Simply add Neumann's dilog over all simplicies as if the triangulation
|
|
60
|
+
# was ordered
|
|
61
|
+
result = compute_complex_volume_from_lifted_ptolemys_no_torsion_adjustment(
|
|
62
|
+
len(mcomplex.Tetrahedra), ptolemys)
|
|
63
|
+
|
|
64
|
+
# Add suitable multiple of pi^2/6 to the result to account for the fact
|
|
65
|
+
# that the triangulation was probably not ordered
|
|
66
|
+
CIF = result.parent()
|
|
67
|
+
return result + _compute_adjustment(mcomplex) * CIF(pi ** 2 / 6)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@sage_method
|
|
71
|
+
def normalize_by_pi_square_over_two(z):
|
|
72
|
+
"""
|
|
73
|
+
Add multiples of pi^2/2 to the real part to try to bring the
|
|
74
|
+
real part between -pi^2/4 and pi^2/4.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
CIF = z.parent()
|
|
78
|
+
RIF = CIF.real_field()
|
|
79
|
+
|
|
80
|
+
pi_square_over_two = RIF(pi**2 / 2)
|
|
81
|
+
|
|
82
|
+
# Round to integer
|
|
83
|
+
q = (z.real().center() / pi_square_over_two.center()).round()
|
|
84
|
+
|
|
85
|
+
# Subtract multiple of pi^2/6
|
|
86
|
+
return z - q * pi_square_over_two
|