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
|
Binary file
|
|
Binary file
|
snappy/SnapPy.ico
ADDED
|
Binary file
|
snappy/SnapPy.png
ADDED
|
Binary file
|
|
Binary file
|
snappy/__init__.py
ADDED
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
# import the SnapPy bindings
|
|
2
|
+
# import logging
|
|
3
|
+
# logging.basicConfig(filename='example.log',level=logging.DEBUG)
|
|
4
|
+
# logging.debug('This message should go to the log file')
|
|
5
|
+
import sys
|
|
6
|
+
from .SnapPy import (AbelianGroup,
|
|
7
|
+
FundamentalGroup,
|
|
8
|
+
SymmetryGroup,
|
|
9
|
+
Isometry,
|
|
10
|
+
AlternatingKnotExteriors,
|
|
11
|
+
NonalternatingKnotExteriors,
|
|
12
|
+
pari)
|
|
13
|
+
from .SnapPy import DirichletDomain
|
|
14
|
+
from .SnapPyHP import DirichletDomain as DirichletDomainHP
|
|
15
|
+
from .SnapPy import CuspNeighborhood
|
|
16
|
+
from .SnapPyHP import CuspNeighborhood as CuspNeighborhoodHP
|
|
17
|
+
from .SnapPy import HolonomyGroup
|
|
18
|
+
from .SnapPyHP import HolonomyGroup as HolonomyGroupHP
|
|
19
|
+
|
|
20
|
+
# seed the kernel's random number generator.
|
|
21
|
+
import time
|
|
22
|
+
from .SnapPy import set_rand_seed
|
|
23
|
+
set_rand_seed(int(time.time()))
|
|
24
|
+
|
|
25
|
+
from .exceptions import (SnapPeaFatalError,
|
|
26
|
+
InsufficientPrecisionError,
|
|
27
|
+
NonorientableManifoldError)
|
|
28
|
+
|
|
29
|
+
from typing import Union, Tuple, List, Optional
|
|
30
|
+
|
|
31
|
+
# Subclass to be able to monkey-patch
|
|
32
|
+
class Triangulation(SnapPy.Triangulation):
|
|
33
|
+
__doc__ = SnapPy.Triangulation.__doc__
|
|
34
|
+
|
|
35
|
+
# Subclass to be able to monkey-patch
|
|
36
|
+
class TriangulationHP(SnapPyHP.Triangulation):
|
|
37
|
+
__doc__ = SnapPyHP.Triangulation.__doc__
|
|
38
|
+
|
|
39
|
+
# We want Manifold to be a subclass of Triangulation.
|
|
40
|
+
# Unfortunately, that introduces a diamond pattern here.
|
|
41
|
+
# Luckily, the python resolves methods and bases classes
|
|
42
|
+
# in the presence of a diamond pattern seem to work just
|
|
43
|
+
# fine. In particular, we do not double allocate the underlying
|
|
44
|
+
# C structures.
|
|
45
|
+
class Manifold(SnapPy.Manifold, Triangulation):
|
|
46
|
+
__doc__ = SnapPy.Manifold.__doc__
|
|
47
|
+
|
|
48
|
+
def identify(self, extends_to_link=False):
|
|
49
|
+
"""
|
|
50
|
+
Looks for the manifold in all of the SnapPy databases.
|
|
51
|
+
For hyperbolic manifolds this is done by searching for isometries:
|
|
52
|
+
|
|
53
|
+
>>> M = Manifold('m125')
|
|
54
|
+
>>> M.identify()
|
|
55
|
+
[m125(0,0)(0,0), L13n5885(0,0)(0,0), ooct01_00000(0,0)(0,0)]
|
|
56
|
+
|
|
57
|
+
By default, there is no restriction on the isometries. One can
|
|
58
|
+
require that the isometry take meridians to meridians. This
|
|
59
|
+
might return fewer results:
|
|
60
|
+
|
|
61
|
+
>>> M.identify(extends_to_link=True)
|
|
62
|
+
[m125(0,0)(0,0), ooct01_00000(0,0)(0,0)]
|
|
63
|
+
|
|
64
|
+
For closed manifolds, extends_to_link doesn't make sense
|
|
65
|
+
because of how the kernel code works:
|
|
66
|
+
|
|
67
|
+
>>> C = Manifold("m015(1,2)")
|
|
68
|
+
>>> C.identify()
|
|
69
|
+
[m006(-5,2)]
|
|
70
|
+
>>> C.identify(True)
|
|
71
|
+
[]
|
|
72
|
+
"""
|
|
73
|
+
return self._identify(extends_to_link)
|
|
74
|
+
|
|
75
|
+
def high_precision(self):
|
|
76
|
+
"""
|
|
77
|
+
Return a high precision version of this manifold.
|
|
78
|
+
|
|
79
|
+
>>> M = Manifold('m004')
|
|
80
|
+
>>> type(M.high_precision())
|
|
81
|
+
<class 'snappy.ManifoldHP'>
|
|
82
|
+
"""
|
|
83
|
+
HP = ManifoldHP('empty')
|
|
84
|
+
HP._from_string(self._to_string(), initialize_structure=False)
|
|
85
|
+
fillings = [self.cusp_info(n).filling for n in range(self.num_cusps())]
|
|
86
|
+
filled = self._get_tetrahedra_shapes('filled')
|
|
87
|
+
complete = self._get_tetrahedra_shapes('complete')
|
|
88
|
+
HP.set_tetrahedra_shapes(filled, complete, fillings)
|
|
89
|
+
HP._polish_hyperbolic_structures()
|
|
90
|
+
HP.set_name(self.name())
|
|
91
|
+
DT = self.DT_code(flips=True)
|
|
92
|
+
if DT:
|
|
93
|
+
HP._set_DTcode(DTcodec(*DT))
|
|
94
|
+
return HP
|
|
95
|
+
|
|
96
|
+
def low_precision(self):
|
|
97
|
+
return self.copy()
|
|
98
|
+
|
|
99
|
+
# We want ManifoldHP to be a subclass of TriangulationHP.
|
|
100
|
+
# See comment about Manifold and the diamond pattern.
|
|
101
|
+
class ManifoldHP(SnapPyHP.Manifold, TriangulationHP):
|
|
102
|
+
__doc__ = SnapPyHP.Manifold.__doc__
|
|
103
|
+
|
|
104
|
+
def low_precision(self):
|
|
105
|
+
"""
|
|
106
|
+
Return a low precision version of this high precision manifold.
|
|
107
|
+
|
|
108
|
+
>>> M = ManifoldHP('m004')
|
|
109
|
+
>>> type(M.low_precision())
|
|
110
|
+
<class 'snappy.Manifold'>
|
|
111
|
+
|
|
112
|
+
"""
|
|
113
|
+
LP = Manifold('empty')
|
|
114
|
+
LP._from_string(self._to_string(), initialize_structure=False)
|
|
115
|
+
fillings = [self.cusp_info(n).filling for n in range(self.num_cusps())]
|
|
116
|
+
filled = [complex(z) for z in self._get_tetrahedra_shapes('filled')]
|
|
117
|
+
complete = [complex(z) for z in self._get_tetrahedra_shapes('complete')]
|
|
118
|
+
LP.set_tetrahedra_shapes(filled, complete, fillings)
|
|
119
|
+
LP._polish_hyperbolic_structures()
|
|
120
|
+
LP.set_name(self.name())
|
|
121
|
+
DT = self.DT_code(flips=True)
|
|
122
|
+
if DT:
|
|
123
|
+
LP._set_DTcode(DTcodec(*DT))
|
|
124
|
+
return LP
|
|
125
|
+
|
|
126
|
+
def high_precision(self):
|
|
127
|
+
return self.copy()
|
|
128
|
+
|
|
129
|
+
def identify(self, extends_to_link=False):
|
|
130
|
+
"""
|
|
131
|
+
Looks for the manifold in all of the SnapPy databases.
|
|
132
|
+
For hyperbolic manifolds this is done by searching for isometries:
|
|
133
|
+
|
|
134
|
+
>>> M = ManifoldHP('m125')
|
|
135
|
+
>>> M.identify()
|
|
136
|
+
[m125(0,0)(0,0), L13n5885(0,0)(0,0), ooct01_00000(0,0)(0,0)]
|
|
137
|
+
|
|
138
|
+
By default, there is no restriction on the isometries. One can require
|
|
139
|
+
that the isometry take meridians to meridians. This might return
|
|
140
|
+
fewer results:
|
|
141
|
+
|
|
142
|
+
>>> M.identify(extends_to_link=True)
|
|
143
|
+
[m125(0,0)(0,0), ooct01_00000(0,0)(0,0)]
|
|
144
|
+
|
|
145
|
+
For closed manifolds, extends_to_link doesn't make sense because
|
|
146
|
+
of how the kernel code works:
|
|
147
|
+
|
|
148
|
+
>>> C = Manifold("m015(1,2)")
|
|
149
|
+
>>> C.identify()
|
|
150
|
+
[m006(-5,2)]
|
|
151
|
+
>>> C.identify(True)
|
|
152
|
+
[]
|
|
153
|
+
|
|
154
|
+
"""
|
|
155
|
+
return self.low_precision()._identify(extends_to_link)
|
|
156
|
+
|
|
157
|
+
SnapPy._manifold_class = Manifold
|
|
158
|
+
SnapPy._triangulation_class = Triangulation
|
|
159
|
+
SnapPyHP._triangulation_class = TriangulationHP
|
|
160
|
+
SnapPyHP._manifold_class = ManifoldHP
|
|
161
|
+
|
|
162
|
+
__all__ = ['Triangulation', 'Manifold', 'ManifoldHP', 'AbelianGroup',
|
|
163
|
+
'FundamentalGroup', 'HolonomyGroup', 'HolonomyGroupHP',
|
|
164
|
+
'DirichletDomain', 'DirichletDomainHP', 'CuspNeighborhood',
|
|
165
|
+
'CuspNeighborhoodHP', 'SymmetryGroup', 'AlternatingKnotExteriors',
|
|
166
|
+
'NonalternatingKnotExteriors', 'SnapPeaFatalError',
|
|
167
|
+
'InsufficientPrecisionError',
|
|
168
|
+
'pari', 'twister', ]
|
|
169
|
+
|
|
170
|
+
def _symmetrize_high_precision_manifold(
|
|
171
|
+
mfd1 : Union[Manifold, ManifoldHP],
|
|
172
|
+
mfd2 : Union[Manifold, ManifoldHP]
|
|
173
|
+
) -> Union[Tuple[Manifold, Manifold],
|
|
174
|
+
Tuple[ManifoldHP, ManifoldHP]]:
|
|
175
|
+
"""
|
|
176
|
+
Given a (potential) mix of two Manifold and ManifoldHP,
|
|
177
|
+
promote one to high precision if necessary and return
|
|
178
|
+
the result as pair.
|
|
179
|
+
"""
|
|
180
|
+
resolved_mfd1 = mfd1
|
|
181
|
+
resolved_mfd2 = mfd2
|
|
182
|
+
high1 = isinstance(mfd1, ManifoldHP)
|
|
183
|
+
high2 = isinstance(mfd2, ManifoldHP)
|
|
184
|
+
if high1 and not high2:
|
|
185
|
+
resolved_mfd2 = ManifoldHP(mfd2)
|
|
186
|
+
if high2 and not high1:
|
|
187
|
+
resolved_mfd1 = ManifoldHP(mfd1)
|
|
188
|
+
return (resolved_mfd1, resolved_mfd2)
|
|
189
|
+
|
|
190
|
+
def _symmetrize_low_precision_triangulation(
|
|
191
|
+
tri1 : Union[Triangulation, TriangulationHP],
|
|
192
|
+
tri2 : Union[Triangulation, TriangulationHP]
|
|
193
|
+
) -> Union[Tuple[Triangulation, Triangulation],
|
|
194
|
+
Tuple[TriangulationHP, TriangulationHP]]:
|
|
195
|
+
"""
|
|
196
|
+
Given a (potential) mix of two Triangulation and TriangulationHP,
|
|
197
|
+
demote one to low precision if necessary and return
|
|
198
|
+
the result as pair.
|
|
199
|
+
"""
|
|
200
|
+
resolved_tri1 = tri1
|
|
201
|
+
resolved_tri2 = tri2
|
|
202
|
+
low1 = isinstance(tri1, Triangulation)
|
|
203
|
+
low2 = isinstance(tri2, Triangulation)
|
|
204
|
+
if low1 and not low2:
|
|
205
|
+
resolved_tri2 = Triangulation(tri2, remove_finite_vertices=False)
|
|
206
|
+
if low2 and not low1:
|
|
207
|
+
resolved_tri1 = Triangulation(tri1, remove_finite_vertices=False)
|
|
208
|
+
return (resolved_tri1, resolved_tri2)
|
|
209
|
+
|
|
210
|
+
def is_isometric_to(self,
|
|
211
|
+
other : Union[Manifold, ManifoldHP],
|
|
212
|
+
return_isometries : bool = False
|
|
213
|
+
) -> Union[bool, List[Isometry]]:
|
|
214
|
+
resolved_self, resolved_other = (
|
|
215
|
+
_symmetrize_high_precision_manifold(
|
|
216
|
+
self, other))
|
|
217
|
+
|
|
218
|
+
return resolved_self._is_isometric_to(
|
|
219
|
+
resolved_other,
|
|
220
|
+
return_isometries=return_isometries)
|
|
221
|
+
|
|
222
|
+
is_isometric_to.__doc__ = SnapPy.Manifold._is_isometric_to.__doc__
|
|
223
|
+
Manifold.is_isometric_to = is_isometric_to
|
|
224
|
+
ManifoldHP.is_isometric_to = is_isometric_to
|
|
225
|
+
|
|
226
|
+
def isomorphisms_to(self,
|
|
227
|
+
other : Union[Triangulation, TriangulationHP]
|
|
228
|
+
) -> List[Isometry]:
|
|
229
|
+
resolved_self, resolved_other = (
|
|
230
|
+
_symmetrize_low_precision_triangulation(
|
|
231
|
+
self, other))
|
|
232
|
+
|
|
233
|
+
return resolved_self._isomorphisms_to(
|
|
234
|
+
resolved_other)
|
|
235
|
+
|
|
236
|
+
isomorphisms_to.__doc__ = SnapPy.Triangulation._isomorphisms_to.__doc__
|
|
237
|
+
Triangulation.isomorphisms_to = isomorphisms_to
|
|
238
|
+
TriangulationHP.isomorphisms_to = isomorphisms_to
|
|
239
|
+
|
|
240
|
+
from . import snap
|
|
241
|
+
snap.add_methods(Manifold)
|
|
242
|
+
snap.add_methods(ManifoldHP)
|
|
243
|
+
snap.add_methods(Triangulation, hyperbolic=False)
|
|
244
|
+
snap.add_methods(TriangulationHP, hyperbolic=False)
|
|
245
|
+
|
|
246
|
+
from . import exterior_to_link
|
|
247
|
+
Triangulation.exterior_to_link = exterior_to_link.exterior_to_link
|
|
248
|
+
TriangulationHP.exterior_to_link = exterior_to_link.exterior_to_link
|
|
249
|
+
|
|
250
|
+
from . import verify
|
|
251
|
+
Manifold.verify_hyperbolicity = verify.verify_hyperbolicity
|
|
252
|
+
ManifoldHP.verify_hyperbolicity = verify.verify_hyperbolicity
|
|
253
|
+
|
|
254
|
+
from . import margulis
|
|
255
|
+
Manifold.margulis = margulis.margulis
|
|
256
|
+
ManifoldHP.margulis = margulis.margulis
|
|
257
|
+
|
|
258
|
+
from . import len_spec
|
|
259
|
+
Manifold.length_spectrum_alt_gen = len_spec.length_spectrum_alt_gen
|
|
260
|
+
ManifoldHP.length_spectrum_alt_gen = len_spec.length_spectrum_alt_gen
|
|
261
|
+
Manifold.length_spectrum_alt = len_spec.length_spectrum_alt
|
|
262
|
+
ManifoldHP.length_spectrum_alt = len_spec.length_spectrum_alt
|
|
263
|
+
|
|
264
|
+
from . import canonical
|
|
265
|
+
Manifold.canonical_retriangulation = canonical.canonical_retriangulation
|
|
266
|
+
ManifoldHP.canonical_retriangulation = canonical.canonical_retriangulation_hp
|
|
267
|
+
|
|
268
|
+
from . import isometry_signature
|
|
269
|
+
|
|
270
|
+
Manifold.isometry_signature = isometry_signature.isometry_signature
|
|
271
|
+
ManifoldHP.isometry_signature = isometry_signature.isometry_signature
|
|
272
|
+
|
|
273
|
+
from .cusps import cusp_area_matrix
|
|
274
|
+
|
|
275
|
+
Manifold.cusp_area_matrix = cusp_area_matrix.cusp_area_matrix
|
|
276
|
+
ManifoldHP.cusp_area_matrix = cusp_area_matrix.cusp_area_matrix
|
|
277
|
+
|
|
278
|
+
from . import cusps
|
|
279
|
+
|
|
280
|
+
Manifold.cusp_areas = cusps.cusp_areas
|
|
281
|
+
ManifoldHP.cusp_areas = cusps.cusp_areas
|
|
282
|
+
Manifold.short_slopes = cusps.short_slopes
|
|
283
|
+
ManifoldHP.short_slopes = cusps.short_slopes
|
|
284
|
+
Manifold.cusp_translations = cusps.cusp_translations
|
|
285
|
+
ManifoldHP.cusp_translations = cusps.cusp_translations
|
|
286
|
+
|
|
287
|
+
def complex_volume(manifold, verified_modulo_2_torsion=False,
|
|
288
|
+
bits_prec=None):
|
|
289
|
+
"""
|
|
290
|
+
Returns the complex volume modulo :math:`i \\pi^2` which is given by
|
|
291
|
+
|
|
292
|
+
.. math::
|
|
293
|
+
\\text{vol} + i \\text{CS}
|
|
294
|
+
|
|
295
|
+
where :math:`\\text{CS}` is the (unnormalized) Chern-Simons invariant.
|
|
296
|
+
|
|
297
|
+
>>> M = Manifold('5_2')
|
|
298
|
+
>>> M.complex_volume() # doctest: +NUMERIC6
|
|
299
|
+
2.82812209 - 3.02412838*I
|
|
300
|
+
|
|
301
|
+
Note that :meth:`chern_simons <snappy.Manifold.chern_simons>`
|
|
302
|
+
normalizes the Chern-Simons invariant by dividing it by
|
|
303
|
+
:math:`2 \\pi^2 = 19.7392...` ::
|
|
304
|
+
|
|
305
|
+
>>> M.chern_simons() # doctest: +NUMERIC6
|
|
306
|
+
-0.153204133297152
|
|
307
|
+
|
|
308
|
+
More examples::
|
|
309
|
+
|
|
310
|
+
>>> M.dehn_fill((1,2))
|
|
311
|
+
>>> M.complex_volume() # doctest: +NUMERIC6
|
|
312
|
+
2.22671790 + 1.52619361*I
|
|
313
|
+
>>> M = Manifold("3_1") # A non-hyperbolic example.
|
|
314
|
+
>>> cvol = M.complex_volume()
|
|
315
|
+
>>> cvol.real() # doctest: +NUMERIC6
|
|
316
|
+
0
|
|
317
|
+
>>> cvol.imag() # doctest: +NUMERIC6
|
|
318
|
+
-1.64493407
|
|
319
|
+
|
|
320
|
+
If no cusp is filled or there is only one cusped (filled or
|
|
321
|
+
unfilled), the complex volume can be verified up to multiples
|
|
322
|
+
of :math:`i \\pi^2 /2` by passing ``verified_modulo_2_torsion = True``
|
|
323
|
+
when inside SageMath. Higher precision can be requested
|
|
324
|
+
with ``bits_prec``::
|
|
325
|
+
|
|
326
|
+
sage: M = Manifold("m015")
|
|
327
|
+
sage: M.complex_volume(verified_modulo_2_torsion=True, bits_prec = 93) # doctest: +NUMERIC21
|
|
328
|
+
2.828122088330783162764? + 1.910673824035377649698?*I
|
|
329
|
+
sage: M = Manifold("m015(3,4)")
|
|
330
|
+
sage: M.complex_volume(verified_modulo_2_torsion=True) # doctest: +NUMERIC6
|
|
331
|
+
2.625051576? - 0.537092383?*I
|
|
332
|
+
|
|
333
|
+
"""
|
|
334
|
+
if verified_modulo_2_torsion:
|
|
335
|
+
return verify.verified_complex_volume_torsion(
|
|
336
|
+
manifold, bits_prec=bits_prec)
|
|
337
|
+
|
|
338
|
+
if bits_prec:
|
|
339
|
+
raise Exception("Arbitrary precision for complex volume only "
|
|
340
|
+
"supported for verified computations and cusped "
|
|
341
|
+
"manifolds.")
|
|
342
|
+
|
|
343
|
+
return manifold._complex_volume()
|
|
344
|
+
|
|
345
|
+
Manifold.complex_volume = complex_volume
|
|
346
|
+
ManifoldHP.complex_volume = complex_volume
|
|
347
|
+
|
|
348
|
+
from . import drilling
|
|
349
|
+
drilling._add_methods(Manifold)
|
|
350
|
+
drilling._add_methods(ManifoldHP, high_precision=True)
|
|
351
|
+
|
|
352
|
+
from . import raytracing
|
|
353
|
+
|
|
354
|
+
Manifold.inside_view = raytracing.inside_view
|
|
355
|
+
ManifoldHP.inside_view = raytracing.inside_view
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
def all_translations(self, verified=False, bits_prec=None):
|
|
359
|
+
"""
|
|
360
|
+
Returns the (complex) Euclidean translations of the meridian
|
|
361
|
+
and longitude for each cusp measured with respect to the cusp neighborhood.
|
|
362
|
+
|
|
363
|
+
The result is a list of pairs, the second entry corresponding to a
|
|
364
|
+
longitude is always real::
|
|
365
|
+
|
|
366
|
+
>>> M = Manifold("v3227")
|
|
367
|
+
>>> N = M.cusp_neighborhood()
|
|
368
|
+
>>> N.all_translations() # doctest: +NUMERIC9
|
|
369
|
+
[(-0.152977162509284 + 0.747697694854404*I, 0.868692062725708), (-0.152977162509284 + 0.747697694854404*I, 0.868692062725708), (0.0961611977895952 + 0.725536253181650*I, 0.895226186134782)]
|
|
370
|
+
|
|
371
|
+
Often, one is interested in making the cusp neighborhoods as large as possible first::
|
|
372
|
+
|
|
373
|
+
>>> N.set_displacement(100,0)
|
|
374
|
+
>>> N.set_displacement(100,1)
|
|
375
|
+
>>> N.set_displacement(100,2)
|
|
376
|
+
>>> N.all_translations() # doctest: +NUMERIC9
|
|
377
|
+
[(-0.477656250512815 + 2.33461303362557*I, 2.71240613125259), (-0.259696455247511 + 1.26930345526993*I, 1.47470541152065), (0.131389112265699 + 0.991330873713731*I, 1.22318540718077)]
|
|
378
|
+
|
|
379
|
+
This can also be achieved by :py:meth:`Manifold.cusp_translations` which
|
|
380
|
+
would have made a different choice of disjoint cusp neighborhoods though::
|
|
381
|
+
|
|
382
|
+
>>> M.cusp_translations() # doctest: +NUMERIC6
|
|
383
|
+
[(-0.315973594129651 + 1.54436599614183*I, 1.79427928161946), (-0.315973594129649 + 1.54436599614182*I, 1.79427928161946), (0.198620491993677 + 1.49859164484929*I, 1.84908538602825)]
|
|
384
|
+
|
|
385
|
+
This method supports arbitrary precision ::
|
|
386
|
+
|
|
387
|
+
>>> from snappy.number import Number
|
|
388
|
+
>>> N.set_displacement(1.125, 0)
|
|
389
|
+
>>> N.set_displacement(0.515625, 1)
|
|
390
|
+
>>> N.set_displacement(0.3125, 2)
|
|
391
|
+
>>> N.all_translations(bits_prec = 120) # doctest: +NUMERIC30
|
|
392
|
+
[(-0.47120283346076781167174343474008914 + 2.3030710375877078211095122873223488*I, 2.6757599281290843845710310925394911), (-0.25618853688042434043044508297577899 + 1.2521580040549576537090841783446072*I, 1.4547854392045669515377748986943560), (0.13143677360753666862808198126761923 + 0.99169047854575721271560179767750893*I, 1.2236291171413362101960100623801910)]
|
|
393
|
+
|
|
394
|
+
and can return verified intervals ::
|
|
395
|
+
|
|
396
|
+
sage: N.all_translations(verified = True) # doctest: +NUMERIC9
|
|
397
|
+
[(-0.47120283346? + 2.30307103759?*I, 2.67575992813?), (-0.256188536881? + 1.252158004055?*I, 1.454785439205?), (0.131436773608? + 0.991690478546?*I, 1.2236291171413?)]
|
|
398
|
+
sage: N.all_translations(verified = True, bits_prec = 120) # doctest: +NUMERIC30
|
|
399
|
+
[(-0.4712028334607678116717434347401? + 2.3030710375877078211095122873224?*I, 2.6757599281290843845710310925395?), (-0.25618853688042434043044508297578? + 1.25215800405495765370908417834461?*I, 1.454785439204566951537774898694356?), (0.131436773607536668628081981267619? + 0.991690478545757212715601797677509?*I, 1.223629117141336210196010062380191?)]
|
|
400
|
+
|
|
401
|
+
that are guaranteed to contain the true translations of disjoint cusp
|
|
402
|
+
neighborhoods (the element corresponding to a longitude is always
|
|
403
|
+
in a ``RealIntervalField``). The verified translations might correspond
|
|
404
|
+
to cusp neighborhoods smaller than the given ones to be able to verify
|
|
405
|
+
that they are disjoint.
|
|
406
|
+
|
|
407
|
+
**Remark:** Since the code is (potentially) non-deterministic, the result of ::
|
|
408
|
+
|
|
409
|
+
[ N.all_translations(verified = True)[i] for i in range(M.num_cusps()) ]
|
|
410
|
+
|
|
411
|
+
is not verified to correspond to disjoint cusp neighborhoods.
|
|
412
|
+
"""
|
|
413
|
+
|
|
414
|
+
if verified or bits_prec:
|
|
415
|
+
# Use the implementation in verify.cusp_translations that uses
|
|
416
|
+
# tetrahedra_shapes and ComplexCuspNeighborhood
|
|
417
|
+
return verify.cusp_translations_for_neighborhood(
|
|
418
|
+
self, verified=verified, bits_prec=bits_prec)
|
|
419
|
+
|
|
420
|
+
# Use the implementation in the SnapPea kernel
|
|
421
|
+
return [ self.translations(i) for i in range(self.num_cusps()) ]
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
CuspNeighborhood.all_translations = all_translations
|
|
425
|
+
CuspNeighborhoodHP.all_translations = all_translations
|
|
426
|
+
|
|
427
|
+
from . import twister
|
|
428
|
+
|
|
429
|
+
# Pass our manifold class down to database and then import the
|
|
430
|
+
# manifold tables themselves from the snappy_manifold package.
|
|
431
|
+
|
|
432
|
+
from . import database
|
|
433
|
+
database.Manifold = Manifold
|
|
434
|
+
database.Triangulation = Triangulation
|
|
435
|
+
snappy_module = sys.modules[__name__]
|
|
436
|
+
database_objects = []
|
|
437
|
+
known_manifold_packages = [('snappy_manifolds', True),
|
|
438
|
+
('snappy_15_knots', False),
|
|
439
|
+
('nonexistent_manifolds', False)]
|
|
440
|
+
|
|
441
|
+
for manifold_package, required in known_manifold_packages:
|
|
442
|
+
table_dict = database.add_tables_from_package(manifold_package, required)
|
|
443
|
+
for name, table in table_dict.items():
|
|
444
|
+
setattr(snappy_module, name, table)
|
|
445
|
+
if name not in database_objects:
|
|
446
|
+
database_objects.append(name)
|
|
447
|
+
|
|
448
|
+
__all__ += database_objects
|
|
449
|
+
|
|
450
|
+
# Monkey patch the link_exterior method into Spherogram.
|
|
451
|
+
|
|
452
|
+
from spherogram.codecs import DTcodec
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def _link_exterior(self, with_hyperbolic_structure=True,
|
|
456
|
+
remove_finite_vertices=True):
|
|
457
|
+
"""
|
|
458
|
+
The exterior or complement of the link L, that is, S^3 minus L.
|
|
459
|
+
|
|
460
|
+
>>> K = Link('4_1')
|
|
461
|
+
>>> M = K.exterior()
|
|
462
|
+
>>> M.volume() # doctest: +NUMERIC6
|
|
463
|
+
2.02988321
|
|
464
|
+
|
|
465
|
+
By default, SnapPy will try to find a hyperbolic structure on the
|
|
466
|
+
exterior. To return a Triangulation instead of a Manifold, set the
|
|
467
|
+
flag with_hyperbolic_structure to False. If you want to get the
|
|
468
|
+
intermediate triangulation with extra vertices above and below the
|
|
469
|
+
projection plane, set the flag remove_finite_vertices to False.
|
|
470
|
+
|
|
471
|
+
>>> M = K.exterior(False, False)
|
|
472
|
+
>>> (M.num_cusps(), M._num_fake_cusps())
|
|
473
|
+
(1, 2)
|
|
474
|
+
|
|
475
|
+
"""
|
|
476
|
+
M = Triangulation('empty')
|
|
477
|
+
M._get_from_link_data(self.KLPProjection(), remove_finite_vertices)
|
|
478
|
+
if with_hyperbolic_structure:
|
|
479
|
+
M = M.with_hyperbolic_structure()
|
|
480
|
+
dt = DTcodec(*self.DT_code(flips=True))
|
|
481
|
+
M._set_DTcode(dt)
|
|
482
|
+
if self.name:
|
|
483
|
+
M.set_name(self.name)
|
|
484
|
+
return M
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
link_objects = []
|
|
488
|
+
|
|
489
|
+
from spherogram.links import (Crossing, Strand, Link, Tangle,
|
|
490
|
+
RationalTangle, ZeroTangle, InfinityTangle, IdentityBraid, random_link)
|
|
491
|
+
|
|
492
|
+
# Monkey-patch the Link class
|
|
493
|
+
Link.exterior = _link_exterior
|
|
494
|
+
link_objects += [
|
|
495
|
+
'Crossing', 'Strand', 'Link', 'Tangle', 'RationalTangle', 'ZeroTangle', 'InfinityTangle',
|
|
496
|
+
'IdentityBraid', 'random_link',
|
|
497
|
+
]
|
|
498
|
+
|
|
499
|
+
# Monkey-patch the DTcodec class
|
|
500
|
+
DTcodec.exterior = _link_exterior
|
|
501
|
+
link_objects += ['DTcodec']
|
|
502
|
+
|
|
503
|
+
__all__ += link_objects
|
|
504
|
+
|
|
505
|
+
# Add spun-normal surface features via FXrays
|
|
506
|
+
import FXrays
|
|
507
|
+
from .snap.t3mlite import spun as _spun
|
|
508
|
+
for mfld_class in [Triangulation, Manifold, ManifoldHP]:
|
|
509
|
+
for method in ['_normal_surface_equations', 'normal_surfaces',
|
|
510
|
+
'normal_boundary_slopes']:
|
|
511
|
+
setattr(mfld_class, method, getattr(_spun, method))
|
|
512
|
+
|
|
513
|
+
import textwrap
|
|
514
|
+
|
|
515
|
+
# Documentation for the module:
|
|
516
|
+
__doc__ = """
|
|
517
|
+
SnapPy is a Cython wrapping of Jeff Weeks' SnapPea kernel.
|
|
518
|
+
|
|
519
|
+
The module defines the following classes:
|
|
520
|
+
%s""" % textwrap.fill(
|
|
521
|
+
', '.join(__all__) + '.',
|
|
522
|
+
width=78,
|
|
523
|
+
initial_indent=' ',
|
|
524
|
+
subsequent_indent=' ')
|
|
525
|
+
|
|
526
|
+
# Add easy way to get the version info
|
|
527
|
+
from .version import version as version_str
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
def version():
|
|
531
|
+
return version_str
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
__version__ = version()
|