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,254 @@
|
|
|
1
|
+
"""
|
|
2
|
+
All final exceptions are deriving from two base classes:
|
|
3
|
+
|
|
4
|
+
- a subclass of VerifyErrorBase to indicate whether a numerical or exact
|
|
5
|
+
verification failed
|
|
6
|
+
- a subclass of EquationType to indicate the type of equation of
|
|
7
|
+
inequality for which the verification failed.
|
|
8
|
+
|
|
9
|
+
Intermediate subclasses (those without __init__) are not supposed to be
|
|
10
|
+
raised.
|
|
11
|
+
|
|
12
|
+
The hierarchy is as follows:
|
|
13
|
+
|
|
14
|
+
- VerifyErrorBase(RuntimeError)
|
|
15
|
+
|
|
16
|
+
- NumericalVerifyError
|
|
17
|
+
|
|
18
|
+
- InequalityNumericalVerifyError
|
|
19
|
+
- LogLiftNumericalVerifyError
|
|
20
|
+
|
|
21
|
+
- ExactVerifyError
|
|
22
|
+
|
|
23
|
+
- IsZeroExactVerifyError
|
|
24
|
+
|
|
25
|
+
- EquationType
|
|
26
|
+
|
|
27
|
+
- EdgeEquationType
|
|
28
|
+
|
|
29
|
+
- EdgeEquationExactVerifyError
|
|
30
|
+
- EdgeEquationLogLiftNumericalVerifyError
|
|
31
|
+
- CuspConsistencyType
|
|
32
|
+
|
|
33
|
+
- CuspEquationType
|
|
34
|
+
|
|
35
|
+
- CuspEquationExactVerifyError
|
|
36
|
+
- CuspEquationLogLiftNumericalVerifyError
|
|
37
|
+
|
|
38
|
+
- TiltType
|
|
39
|
+
|
|
40
|
+
- TiltInequalityNumericalVerifyError
|
|
41
|
+
|
|
42
|
+
- TiltProvenPositiveNumericalVerifyError
|
|
43
|
+
- TiltIsZeroExactVerifyError
|
|
44
|
+
- ShapeType
|
|
45
|
+
|
|
46
|
+
- ShapePositiveImaginaryPartNumericalVerifyError
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class VerifyErrorBase(RuntimeError):
|
|
51
|
+
"""
|
|
52
|
+
The base for all exceptions related to verification.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class NumericalVerifyError(VerifyErrorBase):
|
|
57
|
+
"""
|
|
58
|
+
The base for all exceptions resulting from a failed numerical
|
|
59
|
+
verification of an equality (using some epsilon) or inequality
|
|
60
|
+
(typically by interval arithmetics).
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class InequalityNumericalVerifyError(NumericalVerifyError):
|
|
65
|
+
"""
|
|
66
|
+
The base for all exceptions resulting from a failed numerical
|
|
67
|
+
verification of an inequality (typically by interval arithmetics).
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class LogLiftNumericalVerifyError(NumericalVerifyError):
|
|
72
|
+
"""
|
|
73
|
+
To verify a logarithmic gluing equation, the verify module will usually
|
|
74
|
+
first verify the corresponding polynomial gluing equation.
|
|
75
|
+
This means that the logarithmic gluing equation will be fulfilled up
|
|
76
|
+
to a multiple of 2 Pi I.
|
|
77
|
+
It then computes the logarithms and numerically checks that the result
|
|
78
|
+
is close (by some epsilon) to the right value. Because we already know
|
|
79
|
+
that the difference is a multiple of 2 Pi I, checking closeness is enough.
|
|
80
|
+
|
|
81
|
+
This exception is supposed to be raised if the polynomial gluing equations
|
|
82
|
+
have passed but checking the logarithmic equation is epsilon-close has
|
|
83
|
+
failed.
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class ExactVerifyError(VerifyErrorBase):
|
|
88
|
+
"""
|
|
89
|
+
The base for all exceptions resulting from a failed verification of an
|
|
90
|
+
equation using exact arithmetics.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class IsZeroExactVerifyError(VerifyErrorBase):
|
|
95
|
+
"""
|
|
96
|
+
The base for all exceptions resulting from verifying that a desired
|
|
97
|
+
quantity is zero using exact arithmetics.
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class EquationType():
|
|
102
|
+
"""
|
|
103
|
+
A base class to derive subclasses which indicate what kind of
|
|
104
|
+
equation failed to be verified.
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class EdgeEquationType(EquationType):
|
|
109
|
+
"""
|
|
110
|
+
A base class indicating that an edge equation could not be verified.
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class EdgeEquationExactVerifyError(ExactVerifyError,
|
|
115
|
+
EdgeEquationType):
|
|
116
|
+
"""
|
|
117
|
+
Exception for failed verification of a polynomial edge equation
|
|
118
|
+
using exact arithmetics.
|
|
119
|
+
"""
|
|
120
|
+
|
|
121
|
+
def __init__(self, value):
|
|
122
|
+
self.value = value
|
|
123
|
+
|
|
124
|
+
def __str__(self):
|
|
125
|
+
return ('Verification of a polynomial edge equation using exact '
|
|
126
|
+
'arithmetic failed: %r == 1' % self.value)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class EdgeEquationLogLiftNumericalVerifyError(LogLiftNumericalVerifyError,
|
|
130
|
+
EdgeEquationType):
|
|
131
|
+
"""
|
|
132
|
+
Exception for failed numerical verification that a logarithmic edge
|
|
133
|
+
equation has error bound by epsilon.
|
|
134
|
+
"""
|
|
135
|
+
def __init__(self, value):
|
|
136
|
+
self.value = value
|
|
137
|
+
|
|
138
|
+
def __str__(self):
|
|
139
|
+
return ('Numerical verification that logarthmic edge equation has '
|
|
140
|
+
'small error failed: %r == 2 Pi I' % self.value)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class CuspConsistencyType(EquationType):
|
|
144
|
+
"""
|
|
145
|
+
A base class indicating that verificatin of an equation involving a cusp
|
|
146
|
+
failed.
|
|
147
|
+
"""
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
class CuspEquationType(CuspConsistencyType):
|
|
151
|
+
"""
|
|
152
|
+
A base class indicating that a cusp gluing equation (involving the
|
|
153
|
+
shapes) failed.
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class CuspEquationExactVerifyError(ExactVerifyError,
|
|
158
|
+
CuspEquationType):
|
|
159
|
+
"""
|
|
160
|
+
Exception for failed verification of a polynomial cusp gluing equation
|
|
161
|
+
using exact arithmetics.
|
|
162
|
+
"""
|
|
163
|
+
|
|
164
|
+
def __init__(self, value, expected_value):
|
|
165
|
+
self.value = value
|
|
166
|
+
|
|
167
|
+
def __str__(self):
|
|
168
|
+
return ('Verification of a polynomial cusp equation using exact '
|
|
169
|
+
'arithmetic failed: %r == 1' % self.value)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class CuspEquationLogLiftNumericalVerifyError(LogLiftNumericalVerifyError,
|
|
173
|
+
CuspEquationType):
|
|
174
|
+
"""
|
|
175
|
+
Exception for failed numerical verification that a logarithmic cusp
|
|
176
|
+
equation has error bound by epsilon.
|
|
177
|
+
"""
|
|
178
|
+
def __init__(self, value, expected_value):
|
|
179
|
+
self.value = value
|
|
180
|
+
self.expected_value = expected_value
|
|
181
|
+
|
|
182
|
+
def __str__(self):
|
|
183
|
+
return ('Numerical verification that logarthmic cusp equation has '
|
|
184
|
+
'small error failed: '
|
|
185
|
+
'%r == %r' % (self.value, self.expected_value))
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
class TiltType(EquationType):
|
|
189
|
+
"""
|
|
190
|
+
A base class relating to tilts.
|
|
191
|
+
"""
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
class TiltInequalityNumericalVerifyError(InequalityNumericalVerifyError,
|
|
195
|
+
TiltType):
|
|
196
|
+
"""
|
|
197
|
+
Numerically verifying that a tilt is negative has failed.
|
|
198
|
+
"""
|
|
199
|
+
def __init__(self, value):
|
|
200
|
+
self.value = value
|
|
201
|
+
|
|
202
|
+
def __str__(self):
|
|
203
|
+
return ('Numerical verification that tilt is negative has '
|
|
204
|
+
'failed: %r < 0' % self.value)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
class TiltProvenPositiveNumericalVerifyError(
|
|
208
|
+
TiltInequalityNumericalVerifyError):
|
|
209
|
+
"""
|
|
210
|
+
Numerically verifying that a tilt is negative has not only failed, we
|
|
211
|
+
proved that the tilt is positive and thus that this cannot be a
|
|
212
|
+
proto-canonical triangulation.
|
|
213
|
+
"""
|
|
214
|
+
def __init__(self, value):
|
|
215
|
+
self.value = value
|
|
216
|
+
|
|
217
|
+
def __str__(self):
|
|
218
|
+
return ('Numerical verification that tilt is negative has '
|
|
219
|
+
'failed, tilt is actually positive. This is provably '
|
|
220
|
+
'not the proto-canonical triangulation: %r <= 0' % self.value)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
class TiltIsZeroExactVerifyError(IsZeroExactVerifyError,
|
|
224
|
+
TiltType):
|
|
225
|
+
"""
|
|
226
|
+
Verifying that a tilt is zero has failed using exact arithmetic.
|
|
227
|
+
"""
|
|
228
|
+
def __init__(self, value):
|
|
229
|
+
self.value = value
|
|
230
|
+
|
|
231
|
+
def __str__(self):
|
|
232
|
+
return ('Verification that tilt is zero has failed using exact '
|
|
233
|
+
'arithmetic: %r == 0' % self.value)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
class ShapeType(EquationType):
|
|
237
|
+
"""
|
|
238
|
+
Base class for failed verification of legal shapes.
|
|
239
|
+
"""
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
class ShapePositiveImaginaryPartNumericalVerifyError(
|
|
243
|
+
InequalityNumericalVerifyError,
|
|
244
|
+
ShapeType):
|
|
245
|
+
"""
|
|
246
|
+
Failed numerical verification of a shape having positive imaginary part.
|
|
247
|
+
"""
|
|
248
|
+
def __init__(self, value):
|
|
249
|
+
self.value = value
|
|
250
|
+
|
|
251
|
+
def __str__(self):
|
|
252
|
+
return ('Numerical verification that shape has positive imaginary '
|
|
253
|
+
'part has failed: Im(%r) > 0' % self.value)
|
|
254
|
+
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
from ..sage_helper import _within_sage, sage_method
|
|
2
|
+
from .. import snap
|
|
3
|
+
from . import exceptions
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
'check_logarithmic_gluing_equations_and_positively_oriented_tets',
|
|
7
|
+
'verify_hyperbolicity' ]
|
|
8
|
+
|
|
9
|
+
if _within_sage:
|
|
10
|
+
from sage.symbolic.constants import pi
|
|
11
|
+
from ..sage_helper import I
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class FalseTuple(tuple):
|
|
15
|
+
def __nonzero__(self):
|
|
16
|
+
return False
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class NonIntegralFillingsError(RuntimeError):
|
|
20
|
+
"""
|
|
21
|
+
Exception raised when Manifold has non-integral fillings, e.g.,
|
|
22
|
+
for m004(1.1,1).
|
|
23
|
+
"""
|
|
24
|
+
def __init__(self, manifold):
|
|
25
|
+
self.manifold = manifold
|
|
26
|
+
|
|
27
|
+
def __str__(self):
|
|
28
|
+
return ('Manifold has non-integral Dehn-filings: %s') % self.manifold
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@sage_method
|
|
32
|
+
def check_logarithmic_gluing_equations_and_positively_oriented_tets(
|
|
33
|
+
manifold, shape_intervals):
|
|
34
|
+
"""
|
|
35
|
+
Given a SnapPy manifold manifold and complex intervals for the shapes
|
|
36
|
+
shape_intervals that are certified to contain a solution to the
|
|
37
|
+
rectangular gluing equations, verify that the logarithmic gluing equations
|
|
38
|
+
are also fulfilled and that all shapes have positive imaginary part.
|
|
39
|
+
It will raise an exception if the verification fails.
|
|
40
|
+
This is sufficient to prove that the manifold is indeed hyperbolic.
|
|
41
|
+
|
|
42
|
+
Since the given interval are supposed to contain a true solution of
|
|
43
|
+
the rectangular gluing equations, the logarithmic gluing equations
|
|
44
|
+
are known to be fulfilled up to a multiple of 2 pi i. Thus it is enough
|
|
45
|
+
to certify that the absolute error of the logarithmic gluing
|
|
46
|
+
equations is < 0.1. Using interval arithmetic, this function certifies
|
|
47
|
+
this and positivity of the imaginary parts of the shapes::
|
|
48
|
+
|
|
49
|
+
sage: from snappy import Manifold
|
|
50
|
+
sage: M = Manifold("m019")
|
|
51
|
+
sage: check_logarithmic_gluing_equations_and_positively_oriented_tets(
|
|
52
|
+
... M, M.tetrahedra_shapes('rect', intervals=True))
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
The SnapPy triangulation of the following hyperbolic manifold contains
|
|
56
|
+
actually negatively oriented tetrahedra::
|
|
57
|
+
|
|
58
|
+
sage: M = Manifold("t02774")
|
|
59
|
+
sage: check_logarithmic_gluing_equations_and_positively_oriented_tets(
|
|
60
|
+
... M, M.tetrahedra_shapes('rect', intervals=True)) # doctest: +IGNORE_EXCEPTION_DETAIL
|
|
61
|
+
Traceback (most recent call last):
|
|
62
|
+
...
|
|
63
|
+
ShapePositiveImaginaryPartNumericalVerifyError: Numerical verification that shape has positive imaginary part has failed: Im(0.4800996900657? - 0.0019533695046?*I) > 0
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
for d in manifold.cusp_info():
|
|
69
|
+
m, l = d['filling']
|
|
70
|
+
if not (m.is_integer() and l.is_integer()):
|
|
71
|
+
raise NonIntegralFillingsError(manifold)
|
|
72
|
+
|
|
73
|
+
# Check that the shapes have positive imaginary part.
|
|
74
|
+
for shape in shape_intervals:
|
|
75
|
+
if not shape.imag() > 0:
|
|
76
|
+
raise exceptions.ShapePositiveImaginaryPartNumericalVerifyError(
|
|
77
|
+
shape)
|
|
78
|
+
|
|
79
|
+
# Compute the logarithms of z, z', z''
|
|
80
|
+
logZ = [ z.log() for z in shape_intervals ]
|
|
81
|
+
logZp = [ (1 / (1 - z)).log() for z in shape_intervals ]
|
|
82
|
+
logZpp = [ ((z - 1) / z).log() for z in shape_intervals ]
|
|
83
|
+
|
|
84
|
+
# A list
|
|
85
|
+
# log(z_0) log(z'_0) log(z''_0) log(z_1) log(z'_1) log (z''_1) ...
|
|
86
|
+
logs = [ z for triple in zip(logZ, logZp, logZpp) for z in triple ]
|
|
87
|
+
|
|
88
|
+
# Number of tetrahedra and cusps
|
|
89
|
+
n_tet = manifold.num_tetrahedra()
|
|
90
|
+
n_cusps = manifold.num_cusps()
|
|
91
|
+
|
|
92
|
+
# The gluing equations in logarithmic form
|
|
93
|
+
equations = manifold.gluing_equations()
|
|
94
|
+
|
|
95
|
+
# Compute the LHS of the gluing equations
|
|
96
|
+
# a_0 * log(z_0) + b_0 * log(z'_0) + c_0 * log(z''_0) + ...
|
|
97
|
+
# Also, see manifold.gluing_equations
|
|
98
|
+
LHSs = [
|
|
99
|
+
sum([l * expo for l, expo in zip(logs, equation)])
|
|
100
|
+
for equation in equations ]
|
|
101
|
+
|
|
102
|
+
# Get the ComplexIntervalField of the shape intervals
|
|
103
|
+
CIF = shape_intervals[0].parent()
|
|
104
|
+
RIF = CIF.real_field()
|
|
105
|
+
# 2 pi i in that field
|
|
106
|
+
two_pi_i = CIF(2 * pi * I)
|
|
107
|
+
|
|
108
|
+
# Index of the next gluing equation to check
|
|
109
|
+
LHS_index = 0
|
|
110
|
+
|
|
111
|
+
# The first n_tet gluing equations are edge equations
|
|
112
|
+
for edge_index in range(n_tet):
|
|
113
|
+
# An edge equation should sum up to 2 pi i
|
|
114
|
+
if not abs(LHSs[LHS_index] - two_pi_i) < RIF(0.1):
|
|
115
|
+
raise exceptions.EdgeEquationLogLiftNumericalVerifyError(
|
|
116
|
+
LHSs[LHS_index])
|
|
117
|
+
LHS_index += 1
|
|
118
|
+
|
|
119
|
+
# Then there are one, respectively, two equations per cusp
|
|
120
|
+
for cusp_index in range(n_cusps):
|
|
121
|
+
|
|
122
|
+
# For a complete cusp, we have two equations (meridian
|
|
123
|
+
# and longitude), for both of them the log's add up to 0
|
|
124
|
+
|
|
125
|
+
# For a filled cusp, we have only one equation (for the
|
|
126
|
+
# curve we fill), the log's add up to 2 pi i.
|
|
127
|
+
num_LHSs, value = (
|
|
128
|
+
(2, 0) if manifold.cusp_info(cusp_index)['complete?'] else
|
|
129
|
+
(1, two_pi_i))
|
|
130
|
+
|
|
131
|
+
# Check the one or two equations
|
|
132
|
+
for j in range(num_LHSs):
|
|
133
|
+
if not abs(LHSs[LHS_index] - value) < RIF(0.1):
|
|
134
|
+
raise exceptions.CuspEquationLogLiftNumericalVerifyError(
|
|
135
|
+
LHSs[LHS_index], value)
|
|
136
|
+
# Advance to the next gluing equation
|
|
137
|
+
LHS_index += 1
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@sage_method
|
|
141
|
+
def verify_hyperbolicity(manifold, verbose=False, bits_prec=None,
|
|
142
|
+
holonomy=False, fundamental_group_args=[], lift_to_SL=True):
|
|
143
|
+
"""
|
|
144
|
+
Given an orientable SnapPy Manifold, verifies its hyperbolicity.
|
|
145
|
+
|
|
146
|
+
Similar to HIKMOT's :py:meth:`verify_hyperbolicity`, the result is either
|
|
147
|
+
``(True, listOfShapeIntervals)`` or ``(False, [])`` if verification failed.
|
|
148
|
+
``listOfShapesIntervals`` is a list of complex intervals (elements in
|
|
149
|
+
sage's ``ComplexIntervalField``) certified to contain the true shapes
|
|
150
|
+
for the hyperbolic manifold.
|
|
151
|
+
|
|
152
|
+
Higher precision intervals can be obtained by setting ``bits_prec``::
|
|
153
|
+
|
|
154
|
+
sage: from snappy import Manifold
|
|
155
|
+
sage: M = Manifold("m019")
|
|
156
|
+
sage: M.verify_hyperbolicity() # doctest: +NUMERIC12
|
|
157
|
+
(True, [0.780552527850? + 0.914473662967?*I, 0.780552527850? + 0.91447366296773?*I, 0.4600211755737? + 0.6326241936052?*I])
|
|
158
|
+
|
|
159
|
+
sage: M = Manifold("t02333(3,4)")
|
|
160
|
+
sage: M.verify_hyperbolicity() # doctest: +NUMERIC9
|
|
161
|
+
(True, [2.152188153612? + 0.284940667895?*I, 1.92308491369? + 1.10360701507?*I, 0.014388591584? + 0.143084469681?*I, -2.5493670288? + 3.7453498408?*I, 0.142120333822? + 0.176540027036?*I, 0.504866865874? + 0.82829881681?*I, 0.50479249917? + 0.98036162786?*I, -0.589495705074? + 0.81267480427?*I])
|
|
162
|
+
|
|
163
|
+
One can instead get a holonomy representation associated to the
|
|
164
|
+
verified hyperbolic structure. This representation takes values
|
|
165
|
+
in 2x2 matrices with entries in the ``ComplexIntervalField``::
|
|
166
|
+
|
|
167
|
+
sage: M = Manifold("m004(1,2)")
|
|
168
|
+
sage: success, rho = M.verify_hyperbolicity(holonomy=True)
|
|
169
|
+
sage: success
|
|
170
|
+
True
|
|
171
|
+
sage: trace = rho('aaB').trace(); trace # doctest: +NUMERIC9
|
|
172
|
+
-0.1118628555? + 3.8536121048?*I
|
|
173
|
+
sage: (trace - 2).contains_zero()
|
|
174
|
+
False
|
|
175
|
+
sage: (rho('aBAbaabAB').trace() - 2).contains_zero()
|
|
176
|
+
True
|
|
177
|
+
|
|
178
|
+
Here, there is **provably** a fixed holonomy representation rho0
|
|
179
|
+
from the fundamental group G of M to SL(2, C) so that for each
|
|
180
|
+
element g of G the matrix rho0(g) is contained in rho(g). In
|
|
181
|
+
particular, the above constitutes a proof that the word 'aaB' is
|
|
182
|
+
non-trivial in G. In contrast, the final computation is
|
|
183
|
+
consistent with 'aBAbaabAB' being trivial in G, but *does not prove
|
|
184
|
+
this*.
|
|
185
|
+
|
|
186
|
+
A non-hyperbolic manifold (``False`` indicates that the manifold
|
|
187
|
+
might not be hyperbolic but does **not** certify
|
|
188
|
+
non-hyperbolicity. Sometimes, hyperbolicity can only be verified
|
|
189
|
+
after increasing the precision)::
|
|
190
|
+
|
|
191
|
+
sage: M = Manifold("4_1(1,0)")
|
|
192
|
+
sage: M.verify_hyperbolicity()
|
|
193
|
+
(False, [])
|
|
194
|
+
|
|
195
|
+
Under the hood, the function will call the ``CertifiedShapesEngine`` to produce
|
|
196
|
+
intervals certified to contain a solution to the rectangular gluing equations.
|
|
197
|
+
It then calls ``check_logarithmic_gluing_equations_and_positively_oriented_tets``
|
|
198
|
+
to verify that the logarithmic gluing equations are fulfilled and that all
|
|
199
|
+
tetrahedra are positively oriented.
|
|
200
|
+
"""
|
|
201
|
+
|
|
202
|
+
try:
|
|
203
|
+
shape_intervals = manifold.tetrahedra_shapes(
|
|
204
|
+
'rect', bits_prec=bits_prec, intervals=True)
|
|
205
|
+
except (ValueError, RuntimeError):
|
|
206
|
+
if verbose:
|
|
207
|
+
print("Could not certify solution to rectangular gluing equations")
|
|
208
|
+
return FalseTuple((False, []))
|
|
209
|
+
|
|
210
|
+
try:
|
|
211
|
+
check_logarithmic_gluing_equations_and_positively_oriented_tets(
|
|
212
|
+
manifold, shape_intervals)
|
|
213
|
+
except exceptions.NumericalVerifyError as e:
|
|
214
|
+
if verbose:
|
|
215
|
+
print(e)
|
|
216
|
+
return FalseTuple((False, []))
|
|
217
|
+
|
|
218
|
+
if holonomy:
|
|
219
|
+
hol_rep = snap.interval_reps.holonomy_from_shape_intervals(
|
|
220
|
+
manifold, shape_intervals, fundamental_group_args, lift_to_SL)
|
|
221
|
+
hol_rep.shapes = shape_intervals
|
|
222
|
+
return True, hol_rep
|
|
223
|
+
else:
|
|
224
|
+
return True, shape_intervals
|