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,103 @@
|
|
|
1
|
+
.. Documentation of the Spherogram part of SnapPy
|
|
2
|
+
|
|
3
|
+
.. automodule:: spherogram
|
|
4
|
+
|
|
5
|
+
Links: planar diagrams and invariants
|
|
6
|
+
=======================================
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
Tutorial
|
|
11
|
+
--------
|
|
12
|
+
|
|
13
|
+
SnapPy includes the `Spherogram
|
|
14
|
+
<https://github.com/3-manifolds/Spherogram>`_ module which allows one to
|
|
15
|
+
create links programmatically. The graphical conventions used are
|
|
16
|
+
`summarized here
|
|
17
|
+
<https://github.com/3-manifolds/Spherogram/raw/master/spherogram_src/links/doc.pdf>`_.
|
|
18
|
+
|
|
19
|
+
First, here is the figure-8 knot assembled manually from four crossings, with conventions similar to those used by `KnotTheory <http://katlas.org/wiki/Planar_Diagrams>`_::
|
|
20
|
+
|
|
21
|
+
>>> a, b, c, d = [Crossing(x) for x in 'abcd']
|
|
22
|
+
>>> a[0], a[1], a[2], a[3] = c[1], d[0], b[1], b[0]
|
|
23
|
+
>>> b[2], b[3] = d[3], c[2]
|
|
24
|
+
>>> c[3], c[0] = d[2], d[1]
|
|
25
|
+
>>> L = Link([a,b,c,d])
|
|
26
|
+
>>> E = L.exterior()
|
|
27
|
+
>>> E.volume()
|
|
28
|
+
2.029883212819
|
|
29
|
+
>>> Manifold('4_1').is_isometric_to(E)
|
|
30
|
+
True
|
|
31
|
+
|
|
32
|
+
We can also give the same knot as a rational tangle::
|
|
33
|
+
|
|
34
|
+
>>> L = RationalTangle(3,5).denominator_closure()
|
|
35
|
+
>>> L.PD_code()
|
|
36
|
+
[[6, 3, 7, 4], [4, 2, 5, 1], [0, 6, 1, 5], [2, 7, 3, 0]]
|
|
37
|
+
>>> L.DT_code(True)
|
|
38
|
+
'DT[dadCDAB]'
|
|
39
|
+
|
|
40
|
+
The natural algebra of tangles `shown here
|
|
41
|
+
<https://github.com/3-manifolds/Spherogram/raw/master/spherogram_src/links/doc.pdf>`_
|
|
42
|
+
all works. For instance, we can build the (-2, 3, 7) pretzel knot by
|
|
43
|
+
adding together three rational tangles::
|
|
44
|
+
|
|
45
|
+
>>> T = RationalTangle(-1, 2) + RationalTangle(1, 3) + RationalTangle(1, 7)
|
|
46
|
+
>>> L = T.numerator_closure()
|
|
47
|
+
>>> Manifold('m016').is_isometric_to(L.exterior())
|
|
48
|
+
True
|
|
49
|
+
|
|
50
|
+
To create the figure-8 knot as a closed braid, we first mash tangles
|
|
51
|
+
together horizontally using "|" to make the standard braid generators;
|
|
52
|
+
then multiplication in the braid group is just tangle multiplication::
|
|
53
|
+
|
|
54
|
+
>>> C, Id = RationalTangle(1), IdentityBraid(1)
|
|
55
|
+
>>> x = sigma_1 = C | Id
|
|
56
|
+
>>> y = sigma_2_inverse = Id | -C
|
|
57
|
+
>>> L = (x*y*x*y).denominator_closure()
|
|
58
|
+
>>> E = L.exterior()
|
|
59
|
+
>>> Manifold('4_1').is_isometric_to(E)
|
|
60
|
+
True
|
|
61
|
+
|
|
62
|
+
Here's the minimally-twisted five chain from Figure 2 of `this paper
|
|
63
|
+
<http://arxiv.org/abs/math.GT/0209214>`_::
|
|
64
|
+
|
|
65
|
+
def twisted_chain(n, k):
|
|
66
|
+
T = RationalTangle(1, 2)
|
|
67
|
+
m = (n+1)//2
|
|
68
|
+
base = (m*[T, -T])[:n]
|
|
69
|
+
tangles = base + [RationalTangle(k)]
|
|
70
|
+
return sum(tangles, RationalTangle(0) ).bridge_closure()
|
|
71
|
+
|
|
72
|
+
>>> L = twisted_chain(5, -1)
|
|
73
|
+
>>> L.exterior().volume()
|
|
74
|
+
10.14941606410
|
|
75
|
+
|
|
76
|
+
Spherogram includes ways to create very large random links, see below.
|
|
77
|
+
When used inside `Sage <http://sagemath.org>`_, one can compute many
|
|
78
|
+
basic link invariants, including the Jones polynomial. See the
|
|
79
|
+
complete list of Link methods below.
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
Random Links
|
|
83
|
+
------------
|
|
84
|
+
|
|
85
|
+
.. autofunction:: spherogram.random_link
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
The Link class
|
|
89
|
+
--------------
|
|
90
|
+
|
|
91
|
+
.. autoclass:: spherogram.Link
|
|
92
|
+
:members:
|
|
93
|
+
:inherited-members:
|
|
94
|
+
:undoc-members:
|
|
95
|
+
|
|
96
|
+
The ClosedBraid class
|
|
97
|
+
---------------------
|
|
98
|
+
|
|
99
|
+
The ClosedBraid class provides an alternative way to construct links
|
|
100
|
+
as closed braids. It is a subclass of Link, and currently defines
|
|
101
|
+
the same methods and attributes.
|
|
102
|
+
|
|
103
|
+
.. autoclass:: spherogram.ClosedBraid
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
To Do List
|
|
2
|
+
==========
|
|
3
|
+
|
|
4
|
+
- For a more current list, see the GitHub `issues list
|
|
5
|
+
<https://github.com/3-manifolds/SnapPy/issues>`_.
|
|
6
|
+
|
|
7
|
+
- GUI
|
|
8
|
+
|
|
9
|
+
- Allow you to get the info (position, radius) of a horoball by clicking it.
|
|
10
|
+
|
|
11
|
+
- Documentation
|
|
12
|
+
|
|
13
|
+
- More hyperlinks
|
|
14
|
+
|
|
15
|
+
- Expand tutorial
|
|
16
|
+
|
|
17
|
+
- Make more screencasts
|
|
18
|
+
|
|
19
|
+
- snappy
|
|
20
|
+
|
|
21
|
+
- Kernel
|
|
22
|
+
|
|
23
|
+
- Minor
|
|
24
|
+
|
|
25
|
+
- dual_curves should really cache its result and have this used by
|
|
26
|
+
drill
|
|
27
|
+
|
|
28
|
+
- One should be able to convert a SymmetryGroup to a Sage permutation group.
|
|
29
|
+
|
|
30
|
+
- Also, the SymmetryGroup presentation function should be wrapped.
|
|
31
|
+
There is code for this in the old SnapPeaPython.
|
|
32
|
+
|
|
33
|
+
- Ambitious
|
|
34
|
+
|
|
35
|
+
- A new basic (sub)class: S3Knot (and/or S3Link).
|
|
36
|
+
|
|
37
|
+
- Consider adding a HeegaardSplitting class
|
|
38
|
+
|
|
39
|
+
- Consider merging our t3m project and normal surface code into
|
|
40
|
+
SnapPy.
|
|
41
|
+
|
|
42
|
+
- Redo much of Snap in the context of Sage/SnapPy.
|
|
43
|
+
|
|
44
|
+
- Add a method for computing tetrahedron shapes to arbitrary precision.
|
|
45
|
+
|
|
46
|
+
- Add methods for computing invariant trace fields and related number
|
|
47
|
+
fields.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
========
|
|
2
|
+
Tutorial
|
|
3
|
+
========
|
|
4
|
+
|
|
5
|
+
The easiest way to learn to use SnapPy is to watch the screencasts
|
|
6
|
+
available on `YouTube <http://youtube.com/user/NathanDunfield>`_:
|
|
7
|
+
|
|
8
|
+
- Intro and quickstart: an 11 minute video with the basics: `Part I
|
|
9
|
+
<http://www.youtube.com/watch?v=ezo19L-JTTI>`_ and `Part II
|
|
10
|
+
<http://www.youtube.com/watch?v=Js4qwyIs-Oo>`_.
|
|
11
|
+
|
|
12
|
+
- An hour-long demo `Practical computation with hyperbolic
|
|
13
|
+
3-manifolds <http://youtu.be/j8enbAkAvdY>`_, recorded at the Thurston Memorial
|
|
14
|
+
Conference.
|
|
15
|
+
|
|
16
|
+
- The SnapPy 2.0 `new feature demo <http://youtu.be/bCYe_a48viA>`_.
|
|
17
|
+
|
|
18
|
+
- `SnapPy, SageMath, and Docker are friends
|
|
19
|
+
<https://icerm.brown.edu/video_archive/?play=1992>`_ with associated
|
|
20
|
+
`materials (4 pages), including homework
|
|
21
|
+
<https://icerm.brown.edu/materials/Abstracts/tw19-3-pods/Computation_Demonstration_2_]_Nathan_Dunfield,_University_of_Illinois,_Urbana-Champaign.pdf>`_.
|
|
22
|
+
|
|
23
|
+
- `Notes, problem sheets, and references
|
|
24
|
+
<http://dunfield.info/warwick2017/>`_ from the LMS-CMI Research
|
|
25
|
+
School in Warwick in 2017.
|
|
26
|
+
|
|
27
|
+
- Another hour-long demo `Practical computations with hyperbolic
|
|
28
|
+
3-manifolds <https://icerm.brown.edu/video_archive/?play=1856>`_
|
|
29
|
+
given at ICERM in 2019.
|
|
30
|
+
|
|
31
|
+
The **key** thing to remember when using the SnapPy command shell window is
|
|
32
|
+
that you can explore objects using introspection and tab-completion::
|
|
33
|
+
|
|
34
|
+
In [1]: Manifold? <hit return-key>
|
|
35
|
+
...instructions for creating a manifold...
|
|
36
|
+
|
|
37
|
+
So now we create a manifold::
|
|
38
|
+
|
|
39
|
+
In [2]: M = Manifold("m004")
|
|
40
|
+
|
|
41
|
+
But what can we do with it? ::
|
|
42
|
+
|
|
43
|
+
In [3]: M.<hit tab-key>
|
|
44
|
+
...list of methods...
|
|
45
|
+
|
|
46
|
+
What does the "cover" method do? ::
|
|
47
|
+
|
|
48
|
+
In [4]: M.cover? <hit return-key>
|
|
49
|
+
...description of cover method..
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
Verified computations
|
|
2
|
+
========================================
|
|
3
|
+
|
|
4
|
+
.. _verify-primer:
|
|
5
|
+
|
|
6
|
+
Introduction
|
|
7
|
+
------------
|
|
8
|
+
|
|
9
|
+
Several SnapPy methods use numerical computations with floating point
|
|
10
|
+
approximations and can potentially result in incorrect results. This even
|
|
11
|
+
applies to methods whose output is purely combinatorial such as
|
|
12
|
+
:meth:`~snappy.Manifold.canonical_retriangulation`.
|
|
13
|
+
|
|
14
|
+
Many of these SnapPy methods can be supplied with a :attr:`verified` flag to
|
|
15
|
+
ensure that the result is provably correct. Note that verified computations are
|
|
16
|
+
only available when using SnapPy inside `SageMath <http://sagemath.org>`_.
|
|
17
|
+
If the flag :attr:`verified=True` is specified, an incorrect result is
|
|
18
|
+
never returned. Instead the method clearly indicates a failure, usually through
|
|
19
|
+
an exception::
|
|
20
|
+
|
|
21
|
+
sage: M=Manifold("m004")
|
|
22
|
+
sage: M.drill_word('abc', verified=True, bits_prec = 40)
|
|
23
|
+
...
|
|
24
|
+
InsufficientPrecisionError: When re-tracing the geodesic, the intersection with the next tetrahedron face was too close to the previous to tell them apart. Increasing the precision will probably avoid this problem.
|
|
25
|
+
|
|
26
|
+
Often, such a failure can be advoided by increasing the precision. In
|
|
27
|
+
particular, this applies if the exception is a (subclass of)
|
|
28
|
+
:class:`InsufficientPrecisionError`::
|
|
29
|
+
|
|
30
|
+
sage: M.drill_word('abc', verified=True, bits_prec = 60)
|
|
31
|
+
m004_drilled(0,0)(0,0)
|
|
32
|
+
|
|
33
|
+
Note that, :meth:`~snappy.Manifold.verify_hyperbolicity` is different though
|
|
34
|
+
and does not throw an exception. Instead, it returns a bool indicating success
|
|
35
|
+
as part of its output. This is for compatibility with
|
|
36
|
+
`HIKMOT <http://www.oishi.info.waseda.ac.jp/~takayasu/hikmot/>`_'s
|
|
37
|
+
``verify_hyperbolicty``::
|
|
38
|
+
|
|
39
|
+
sage: M.verify_hyperbolicity(bits_prec=10)
|
|
40
|
+
(False, [])
|
|
41
|
+
sage: M.verify_hyperbolicity()
|
|
42
|
+
(True,
|
|
43
|
+
[0.50000000000000? + 0.86602540378444?*I,
|
|
44
|
+
0.50000000000000? + 0.86602540378444?*I])
|
|
45
|
+
|
|
46
|
+
As illustrated above, the result consists of intervals
|
|
47
|
+
(of type SageMath's ``RealIntervalField`` or
|
|
48
|
+
``ComplexIntervalField``) if the output of a computation is numerical
|
|
49
|
+
and :attr:`verified=True` is specified. These intervals contain the true
|
|
50
|
+
value.
|
|
51
|
+
|
|
52
|
+
Overview
|
|
53
|
+
--------
|
|
54
|
+
|
|
55
|
+
Some examples of verified computations are:
|
|
56
|
+
|
|
57
|
+
* Verify the hyperbolicity
|
|
58
|
+
of an orientable 3-manifold giving complex intervals for the
|
|
59
|
+
shapes corresponding to a hyperbolic structure or holonomy representation with
|
|
60
|
+
:meth:`~snappy.Manifold.verify_hyperbolicity`::
|
|
61
|
+
|
|
62
|
+
sage: M = Manifold("m015")
|
|
63
|
+
sage: M.verify_hyperbolicity()
|
|
64
|
+
(True,
|
|
65
|
+
[0.6623589786224? + 0.5622795120623?*I,
|
|
66
|
+
0.6623589786224? + 0.5622795120623?*I,
|
|
67
|
+
0.6623589786224? + 0.5622795120623?*I])
|
|
68
|
+
sage: M.verify_hyperbolicity(holonomy=True)[1].SL2C('a')
|
|
69
|
+
[-0.324717957? - 1.124559024?*I -0.704807293? + 0.398888830?*I]
|
|
70
|
+
[ 1.409614585? - 0.797777659?*I -1.000000000? + 0.?e-9*I]
|
|
71
|
+
|
|
72
|
+
* Intervals for the volume and complex volume of a hyperbolic orientable 3-manifold::
|
|
73
|
+
|
|
74
|
+
sage: M = Manifold("m003(-3,1)")
|
|
75
|
+
sage: M.volume(verified=True, bits_prec = 100)
|
|
76
|
+
0.942707362776927720921299603?
|
|
77
|
+
sage: M = Manifold("m015")
|
|
78
|
+
sage: M.complex_volume(verified_modulo_2_torsion=True)
|
|
79
|
+
2.8281220883? + 1.9106738240?*I
|
|
80
|
+
|
|
81
|
+
(Note that when using verified computation, the Chern-Simons invariant is only computed
|
|
82
|
+
modulo pi^2/2 even though it is defined modulo pi^2.)
|
|
83
|
+
|
|
84
|
+
* Give the (a close relative to the canonical cell decomposition) of a cusped
|
|
85
|
+
hyperbolic manifold using intervals or exact arithmetic if necessary with
|
|
86
|
+
:meth:`~snappy.Manifold.canonical_retriangulation`::
|
|
87
|
+
|
|
88
|
+
sage: M = Manifold("m412")
|
|
89
|
+
sage: K = M.canonical_retriangulation(verified = True)
|
|
90
|
+
sage: len(K.isomorphisms_to(K)) # Certified size of isometry group
|
|
91
|
+
8
|
|
92
|
+
|
|
93
|
+
**Remark:** For the case of non-tetrahedral canonical cell, exact values
|
|
94
|
+
are used which are found
|
|
95
|
+
using the `LLL-algorithm
|
|
96
|
+
<http://en.wikipedia.org/wiki/Lenstra%E2%80%93Lenstra%E2%80%93Lov%C3%A1sz_lattice_basis_reduction_algorithm>`_
|
|
97
|
+
and then verified using exact computations. These computations can be slow. A massive speed-up was achieved by
|
|
98
|
+
recent improvements so that the computation of the isometry signature of any manifold in ``OrientableCuspedCensus``
|
|
99
|
+
takes at most a couple of seconds, typically, far less. Manifolds with more simplices might require setting
|
|
100
|
+
a higher value for
|
|
101
|
+
:attr:`exact_bits_prec_and_degrees`.
|
|
102
|
+
|
|
103
|
+
* The isometry signature which is a complete invariant of the isometry type
|
|
104
|
+
of a cusped hyperbolic manifold (i.e., two manifolds are isometric if and only
|
|
105
|
+
if they have the same isometry signature)::
|
|
106
|
+
|
|
107
|
+
sage: M = Manifold("m412")
|
|
108
|
+
sage: M.isometry_signature(verified = True)
|
|
109
|
+
'mvvLALQQQhfghjjlilkjklaaaaaffffffff'
|
|
110
|
+
|
|
111
|
+
The isometry signature can be strengthened to include the peripheral curves
|
|
112
|
+
such that it is a complete invariant of a hyperbolic link::
|
|
113
|
+
|
|
114
|
+
sage: M = Manifold("L5a1")
|
|
115
|
+
sage: M.isometry_signature(of_link = True, verified = True)
|
|
116
|
+
'eLPkbdcddhgggb_baCbbaCb'
|
|
117
|
+
|
|
118
|
+
See :meth:`~snappy.Manifold.isometry_signature` for details.
|
|
119
|
+
|
|
120
|
+
**Remark:** The isometry signature is based on the canonical
|
|
121
|
+
retriangulation so the same warning applies.
|
|
122
|
+
|
|
123
|
+
* The maximal cusp area matrix which characterizes the configuration
|
|
124
|
+
space of disjoint cusp neighborhoods with
|
|
125
|
+
:meth:`~snappy.Manifold.cusp_area_matrix`::
|
|
126
|
+
|
|
127
|
+
sage: M=Manifold("m203")
|
|
128
|
+
sage: M.cusp_area_matrix(method='maximal', verified=True)
|
|
129
|
+
[ 27.000000? 9.0000000000?]
|
|
130
|
+
[9.0000000000? 27.0000000?]
|
|
131
|
+
|
|
132
|
+
In this example, the cusp neighborhood about cusp 0 or 1 is only
|
|
133
|
+
embedded if and only if its area is less than sqrt(27). The cusp
|
|
134
|
+
neighborhood about cusp 0 is only disjoint from the one about cusp 1
|
|
135
|
+
if and only if the product of their areas is less than 9.
|
|
136
|
+
|
|
137
|
+
* Compute areas for disjoint cusp neighborhoods with
|
|
138
|
+
:meth:`~snappy.Manifold.cusp_areas`::
|
|
139
|
+
|
|
140
|
+
sage: M=Manifold("m203")
|
|
141
|
+
sage: M.cusp_areas(policy = 'unbiased', method='maximal', verified = True)
|
|
142
|
+
[3.00000000000?, 3.00000000000?]
|
|
143
|
+
|
|
144
|
+
With the above parameters, the result is intrinsic to the hyperbolic
|
|
145
|
+
manifold with labeled cusped.
|
|
146
|
+
|
|
147
|
+
* Find all slopes of length less or equal to 6 when measured on the boundary
|
|
148
|
+
of disjoint cusp neighborhoods::
|
|
149
|
+
|
|
150
|
+
sage: M=Manifold("m203")
|
|
151
|
+
sage: M.short_slopes(policy = 'unbiased', method='maximal', verified = True)
|
|
152
|
+
[[(1, 0), ..., (1, 2)], [(1, 0), ..., (1, 2)]]
|
|
153
|
+
|
|
154
|
+
First block has all short slopes for first cusp, ..., see
|
|
155
|
+
:meth:`~snappy.Manifold.short_slopes` for details.
|
|
156
|
+
|
|
157
|
+
By `Agol's <http://arxiv.org/abs/math/9906183>`_ and `Lackenby's
|
|
158
|
+
<http://arxiv.org/abs/math/9808120>`_ 6-Theorem any Dehn-filling
|
|
159
|
+
resulting in a non-hyperbolic manifold must contain one of the above
|
|
160
|
+
slopes. Thus, :meth:`~snappy.Manifold.short_slopes` can be used
|
|
161
|
+
to implement the techniques to find exceptional Dehn surgeries
|
|
162
|
+
(`arXiv:1109.0903 <https://arxiv.org/abs/1109.0903>`_ and
|
|
163
|
+
`arXiv:1310.3472 <https://arxiv.org/abs/1310.3472>`_).
|
|
164
|
+
|
|
165
|
+
* An example of finding all geodesics up to length 1::
|
|
166
|
+
|
|
167
|
+
sage: from sage.all import RIF
|
|
168
|
+
sage: L = RIF(1)
|
|
169
|
+
sage: M = Manifold("m003")
|
|
170
|
+
sage: spec = M.length_spectrum_alt_gen(verified=True)
|
|
171
|
+
sage: n = 0
|
|
172
|
+
sage: for g in spec:
|
|
173
|
+
... if g.length.real() > L:
|
|
174
|
+
... break # Done! All subsequent geodesics will be longer.
|
|
175
|
+
... if g.length.real() < L:
|
|
176
|
+
... n += 1
|
|
177
|
+
... continue
|
|
178
|
+
... raise Exception("Interval too large. Increase precision.")
|
|
179
|
+
sage: n
|
|
180
|
+
4
|
|
181
|
+
|
|
182
|
+
Additionally, we can compute complex intervals for the shapes that are
|
|
183
|
+
guaranteed to contain a true solution to the rectangular gluing equations
|
|
184
|
+
that is not necessarily a geometric solution (specify :attr:`bits_prec`
|
|
185
|
+
or :attr:`dec_prec` for higher precision intervals.)::
|
|
186
|
+
|
|
187
|
+
sage: M = Manifold("m015(3,1)")
|
|
188
|
+
sage: M.tetrahedra_shapes('rect', intervals=True)
|
|
189
|
+
[0.625222762246? + 3.177940133813?*I,
|
|
190
|
+
-0.0075523593782? + 0.5131157955971?*I,
|
|
191
|
+
0.6515818912107? - 0.1955023488930?*I]
|
|
192
|
+
|
|
193
|
+
This is all based on a reimplementation of `HIKMOT
|
|
194
|
+
<http://www.oishi.info.waseda.ac.jp/~takayasu/hikmot/>`_ which
|
|
195
|
+
pioneered the use of interval methods for hyperbolic manifolds (also see
|
|
196
|
+
`Zgliczynski's notes <http://ww2.ii.uj.edu.pl/~zgliczyn/cap07/krawczyk.pdf>`_). It
|
|
197
|
+
can be used in a way very similar to HIKMOT, but uses Sage's complex
|
|
198
|
+
interval types for certification. It furthermore makes use of code by
|
|
199
|
+
`Dunfield, Hoffman, Licata <http://arxiv.org/abs/1407.7827/>`_.
|
|
200
|
+
|
|
201
|
+
This verification code was contributed by Matthias Goerner.
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
Verified computation topics
|
|
205
|
+
---------------------------
|
|
206
|
+
|
|
207
|
+
.. toctree::
|
|
208
|
+
:maxdepth: 1
|
|
209
|
+
|
|
210
|
+
verify_internals
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
Internals of verified computations
|
|
2
|
+
==================================
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
Naming
|
|
7
|
+
------
|
|
8
|
+
|
|
9
|
+
The names of methods containing ``check`` will raise an exception if
|
|
10
|
+
the desired property cannot be certified. There are different types of
|
|
11
|
+
Exceptions to indicate how the certification failed. This type can be
|
|
12
|
+
used by other methods to perform some action such as changing the
|
|
13
|
+
triangulation or increasing precision or to give up.
|
|
14
|
+
|
|
15
|
+
The user-facing methods have names starting with ``verify`` or
|
|
16
|
+
``verified`` and will fail more gracefully returning ``False`` or
|
|
17
|
+
``None`` in such a case.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
Generating certified shape intervals
|
|
22
|
+
------------------------------------
|
|
23
|
+
|
|
24
|
+
The recommended way to obtain certified intervals for the shapes is via
|
|
25
|
+
``manifold.tetrahedra_shapes(intervals=True)`` as :doc:`described
|
|
26
|
+
earlier <verify>`. Here we document the ``KrawczykShapesEngine`` and
|
|
27
|
+
``IntervalNewtonShapesEngine`` which is implemented internally to
|
|
28
|
+
generate the intervals. It is of interest for those users who want to
|
|
29
|
+
understand the underlying interval math and experiment with the Newton
|
|
30
|
+
interval method or the Krawczyk test. ``CertifiedShapesEngine`` is an
|
|
31
|
+
alias of either ``KrawczykShapesEngine`` or
|
|
32
|
+
``IntervalNewtonShapesEngine`` to determine the default method used by
|
|
33
|
+
verify.
|
|
34
|
+
|
|
35
|
+
.. automodule:: snappy.verify
|
|
36
|
+
.. autoclass:: CertifiedShapesEngine
|
|
37
|
+
:members:
|
|
38
|
+
:inherited-members:
|
|
39
|
+
|
|
40
|
+
.. autoclass:: IntervalNewtonShapesEngine
|
|
41
|
+
:members:
|
|
42
|
+
:inherited-members:
|
|
43
|
+
|
|
44
|
+
.. autoclass:: KrawczykShapesEngine
|
|
45
|
+
:members:
|
|
46
|
+
:inherited-members:
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
Verification of hyperbolicity
|
|
50
|
+
-----------------------------
|
|
51
|
+
|
|
52
|
+
Methods containing ``check`` will raise an exception if the desired property
|
|
53
|
+
cannot be certified. Methods containing ``verify`` or ``verified`` will fail
|
|
54
|
+
more gracefully returning ``False`` or ``None`` in such a case.
|
|
55
|
+
|
|
56
|
+
.. autofunction:: snappy.verify.hyperbolicity.check_logarithmic_gluing_equations_and_positively_oriented_tets
|
|
57
|
+
|
|
58
|
+
Verified canonical cell decompositions
|
|
59
|
+
--------------------------------------
|
|
60
|
+
|
|
61
|
+
.. autofunction:: snappy.verify.canonical.interval_checked_canonical_triangulation
|
|
62
|
+
.. autofunction:: snappy.verify.canonical.exactly_checked_canonical_retriangulation
|
|
63
|
+
|
|
64
|
+
Exact computations for cusp cross sections
|
|
65
|
+
------------------------------------------
|
|
66
|
+
|
|
67
|
+
.. automodule:: snappy.verify.square_extensions
|
|
68
|
+
|
|
69
|
+
.. autofunction:: snappy.verify.square_extensions.find_shapes_as_complex_sqrt_lin_combinations
|
|
70
|
+
.. autoclass:: SqrtLinCombination
|
|
71
|
+
:members:
|
|
72
|
+
.. autoclass:: ComplexSqrtLinCombination
|
|
73
|
+
:members:
|
|
74
|
+
|
|
75
|
+
Exceptions
|
|
76
|
+
----------
|
|
77
|
+
|
|
78
|
+
.. automodule:: snappy.verify.exceptions
|
|
79
|
+
:members:
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/* Compatability shim for jQuery and underscores.js.
|
|
2
|
+
*
|
|
3
|
+
* Copyright Sphinx contributors
|
|
4
|
+
* Released under the two clause BSD licence
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* small helper function to urldecode strings
|
|
9
|
+
*
|
|
10
|
+
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
|
|
11
|
+
*/
|
|
12
|
+
jQuery.urldecode = function(x) {
|
|
13
|
+
if (!x) {
|
|
14
|
+
return x
|
|
15
|
+
}
|
|
16
|
+
return decodeURIComponent(x.replace(/\+/g, ' '));
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* small helper function to urlencode strings
|
|
21
|
+
*/
|
|
22
|
+
jQuery.urlencode = encodeURIComponent;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* This function returns the parsed url parameters of the
|
|
26
|
+
* current request. Multiple values per key are supported,
|
|
27
|
+
* it will always return arrays of strings for the value parts.
|
|
28
|
+
*/
|
|
29
|
+
jQuery.getQueryParameters = function(s) {
|
|
30
|
+
if (typeof s === 'undefined')
|
|
31
|
+
s = document.location.search;
|
|
32
|
+
var parts = s.substr(s.indexOf('?') + 1).split('&');
|
|
33
|
+
var result = {};
|
|
34
|
+
for (var i = 0; i < parts.length; i++) {
|
|
35
|
+
var tmp = parts[i].split('=', 2);
|
|
36
|
+
var key = jQuery.urldecode(tmp[0]);
|
|
37
|
+
var value = jQuery.urldecode(tmp[1]);
|
|
38
|
+
if (key in result)
|
|
39
|
+
result[key].push(value);
|
|
40
|
+
else
|
|
41
|
+
result[key] = [value];
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* highlight a given string on a jquery object by wrapping it in
|
|
48
|
+
* span elements with the given class name.
|
|
49
|
+
*/
|
|
50
|
+
jQuery.fn.highlightText = function(text, className) {
|
|
51
|
+
function highlight(node, addItems) {
|
|
52
|
+
if (node.nodeType === 3) {
|
|
53
|
+
var val = node.nodeValue;
|
|
54
|
+
var pos = val.toLowerCase().indexOf(text);
|
|
55
|
+
if (pos >= 0 &&
|
|
56
|
+
!jQuery(node.parentNode).hasClass(className) &&
|
|
57
|
+
!jQuery(node.parentNode).hasClass("nohighlight")) {
|
|
58
|
+
var span;
|
|
59
|
+
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
|
|
60
|
+
if (isInSVG) {
|
|
61
|
+
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
|
|
62
|
+
} else {
|
|
63
|
+
span = document.createElement("span");
|
|
64
|
+
span.className = className;
|
|
65
|
+
}
|
|
66
|
+
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
|
|
67
|
+
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
|
|
68
|
+
document.createTextNode(val.substr(pos + text.length)),
|
|
69
|
+
node.nextSibling));
|
|
70
|
+
node.nodeValue = val.substr(0, pos);
|
|
71
|
+
if (isInSVG) {
|
|
72
|
+
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
|
|
73
|
+
var bbox = node.parentElement.getBBox();
|
|
74
|
+
rect.x.baseVal.value = bbox.x;
|
|
75
|
+
rect.y.baseVal.value = bbox.y;
|
|
76
|
+
rect.width.baseVal.value = bbox.width;
|
|
77
|
+
rect.height.baseVal.value = bbox.height;
|
|
78
|
+
rect.setAttribute('class', className);
|
|
79
|
+
addItems.push({
|
|
80
|
+
"parent": node.parentNode,
|
|
81
|
+
"target": rect});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else if (!jQuery(node).is("button, select, textarea")) {
|
|
86
|
+
jQuery.each(node.childNodes, function() {
|
|
87
|
+
highlight(this, addItems);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
var addItems = [];
|
|
92
|
+
var result = this.each(function() {
|
|
93
|
+
highlight(this, addItems);
|
|
94
|
+
});
|
|
95
|
+
for (var i = 0; i < addItems.length; ++i) {
|
|
96
|
+
jQuery(addItems[i].parent).before(addItems[i].target);
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
/*
|
|
102
|
+
* backward compatibility for jQuery.browser
|
|
103
|
+
* This will be supported until firefox bug is fixed.
|
|
104
|
+
*/
|
|
105
|
+
if (!jQuery.browser) {
|
|
106
|
+
jQuery.uaMatch = function(ua) {
|
|
107
|
+
ua = ua.toLowerCase();
|
|
108
|
+
|
|
109
|
+
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
|
|
110
|
+
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
|
|
111
|
+
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
|
|
112
|
+
/(msie) ([\w.]+)/.exec(ua) ||
|
|
113
|
+
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
|
|
114
|
+
[];
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
browser: match[ 1 ] || "",
|
|
118
|
+
version: match[ 2 ] || "0"
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
jQuery.browser = {};
|
|
122
|
+
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
|
|
123
|
+
}
|