snappy 3.2__cp310-cp310-macosx_10_12_x86_64.whl
Sign up to get free protection for your applications and to get access to all the features.
- snappy/CyOpenGL.cpython-310-darwin.so +0 -0
- snappy/SnapPy.cpython-310-darwin.so +0 -0
- snappy/SnapPy.ico +0 -0
- snappy/SnapPy.png +0 -0
- snappy/SnapPyHP.cpython-310-darwin.so +0 -0
- snappy/__init__.py +760 -0
- snappy/app.py +605 -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 +38 -0
- snappy/cusps/cusp_area_matrix.py +101 -0
- snappy/cusps/cusp_areas_from_matrix.py +173 -0
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/test.py +21 -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 +710 -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/geodesics.jpg +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 +51 -0
- snappy/doc/_sources/credits.rst.txt +75 -0
- snappy/doc/_sources/development.rst.txt +259 -0
- snappy/doc/_sources/index.rst.txt +182 -0
- snappy/doc/_sources/installing.rst.txt +247 -0
- snappy/doc/_sources/manifold.rst.txt +6 -0
- snappy/doc/_sources/manifoldhp.rst.txt +46 -0
- snappy/doc/_sources/news.rst.txt +355 -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 +925 -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 +156 -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 +199 -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 +620 -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 +427 -0
- snappy/doc/credits.html +181 -0
- snappy/doc/development.html +384 -0
- snappy/doc/genindex.html +1331 -0
- snappy/doc/index.html +262 -0
- snappy/doc/installing.html +346 -0
- snappy/doc/manifold.html +3452 -0
- snappy/doc/manifoldhp.html +180 -0
- snappy/doc/news.html +388 -0
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +161 -0
- snappy/doc/platonic_census.html +375 -0
- snappy/doc/plink.html +210 -0
- snappy/doc/ptolemy.html +254 -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 +1211 -0
- snappy/doc/todo.html +166 -0
- snappy/doc/triangulation.html +1584 -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 +126 -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 +197 -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 +123 -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 +697 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -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_keys.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 +93 -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 +101 -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 +245 -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 +382 -0
- snappy/len_spec/__init__.py +596 -0
- snappy/len_spec/geodesic_info.py +110 -0
- snappy/len_spec/geodesic_key_info_dict.py +117 -0
- snappy/len_spec/geodesic_piece.py +143 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +80 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
- snappy/len_spec/spine.py +206 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +275 -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/math_basics.py +176 -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 +857 -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 +1029 -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 +123 -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 +117 -0
- snappy/settings.py +409 -0
- snappy/shell.py +53 -0
- snappy/snap/__init__.py +114 -0
- snappy/snap/character_varieties.py +375 -0
- snappy/snap/find_field.py +372 -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 +702 -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.py +668 -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 +134 -0
- snappy/snap/utilities.py +288 -0
- snappy/test.py +209 -0
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -0
- snappy/tiling/canonical_key_dict.py +59 -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/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +215 -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-darwin.so +0 -0
- snappy/upper_halfspace/__init__.py +146 -0
- snappy/upper_halfspace/ideal_point.py +26 -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/maximal_cusp_area_matrix/__init__.py +46 -0
- snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +419 -0
- snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +153 -0
- snappy/verify/real_algebra.py +286 -0
- snappy/verify/shapes.py +25 -0
- snappy/verify/short_slopes.py +200 -0
- snappy/verify/square_extensions.py +1005 -0
- snappy/verify/test.py +78 -0
- snappy/verify/upper_halfspace/__init__.py +9 -0
- snappy/verify/upper_halfspace/extended_matrix.py +100 -0
- snappy/verify/upper_halfspace/finite_point.py +283 -0
- snappy/verify/upper_halfspace/ideal_point.py +426 -0
- snappy/verify/volume.py +128 -0
- snappy/version.py +2 -0
- snappy-3.2.dist-info/METADATA +58 -0
- snappy-3.2.dist-info/RECORD +503 -0
- snappy-3.2.dist-info/WHEEL +5 -0
- snappy-3.2.dist-info/entry_points.txt +2 -0
- snappy-3.2.dist-info/top_level.txt +28 -0
snappy/__init__.py
ADDED
@@ -0,0 +1,760 @@
|
|
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
|
+
from .SnapPy import Triangulation as _TriangulationLP
|
21
|
+
from .SnapPy import Manifold as _ManifoldLP
|
22
|
+
from .SnapPyHP import Triangulation as _TriangulationHP
|
23
|
+
from .SnapPyHP import Manifold as _ManifoldHP
|
24
|
+
|
25
|
+
# seed the kernel's random number generator.
|
26
|
+
import time
|
27
|
+
from .SnapPy import set_rand_seed
|
28
|
+
set_rand_seed(int(time.time()))
|
29
|
+
|
30
|
+
from .exceptions import (SnapPeaFatalError,
|
31
|
+
InsufficientPrecisionError,
|
32
|
+
NonorientableManifoldError)
|
33
|
+
|
34
|
+
from typing import Union, Tuple, List, Optional
|
35
|
+
|
36
|
+
# Subclass to be able to monkey-patch
|
37
|
+
class Triangulation(_TriangulationLP):
|
38
|
+
__doc__ = _TriangulationLP.__doc__
|
39
|
+
|
40
|
+
# Subclass to be able to monkey-patch
|
41
|
+
class TriangulationHP(_TriangulationHP):
|
42
|
+
__doc__ = _TriangulationHP.__doc__
|
43
|
+
|
44
|
+
# We want Manifold to be a subclass of Triangulation.
|
45
|
+
# Unfortunately, that introduces a diamond pattern here.
|
46
|
+
# Luckily, the python resolves methods and bases classes
|
47
|
+
# in the presence of a diamond pattern seem to work just
|
48
|
+
# fine. In particular, we do not double allocate the underlying
|
49
|
+
# C structures.
|
50
|
+
class Manifold(_ManifoldLP, Triangulation):
|
51
|
+
__doc__ = _ManifoldLP.__doc__
|
52
|
+
|
53
|
+
def identify(self, extends_to_link=False):
|
54
|
+
"""
|
55
|
+
Looks for the manifold in all of the SnapPy databases.
|
56
|
+
For hyperbolic manifolds this is done by searching for isometries:
|
57
|
+
|
58
|
+
>>> M = Manifold('m125')
|
59
|
+
>>> M.identify()
|
60
|
+
[m125(0,0)(0,0), L13n5885(0,0)(0,0), ooct01_00000(0,0)(0,0)]
|
61
|
+
|
62
|
+
By default, there is no restriction on the isometries. One can
|
63
|
+
require that the isometry take meridians to meridians. This
|
64
|
+
might return fewer results:
|
65
|
+
|
66
|
+
>>> M.identify(extends_to_link=True)
|
67
|
+
[m125(0,0)(0,0), ooct01_00000(0,0)(0,0)]
|
68
|
+
|
69
|
+
For closed manifolds, extends_to_link doesn't make sense
|
70
|
+
because of how the kernel code works:
|
71
|
+
|
72
|
+
>>> C = Manifold("m015(1,2)")
|
73
|
+
>>> C.identify()
|
74
|
+
[m006(-5,2)]
|
75
|
+
>>> C.identify(True)
|
76
|
+
[]
|
77
|
+
"""
|
78
|
+
return self._identify(extends_to_link)
|
79
|
+
|
80
|
+
def high_precision(self):
|
81
|
+
"""
|
82
|
+
Return a high precision version of this manifold.
|
83
|
+
|
84
|
+
>>> M = Manifold('m004')
|
85
|
+
>>> type(M.high_precision())
|
86
|
+
<class 'snappy.ManifoldHP'>
|
87
|
+
"""
|
88
|
+
HP = ManifoldHP('empty')
|
89
|
+
HP._from_string(self._to_string(), initialize_structure=False)
|
90
|
+
fillings = [self.cusp_info(n).filling for n in range(self.num_cusps())]
|
91
|
+
filled = self._get_tetrahedra_shapes('filled')
|
92
|
+
complete = self._get_tetrahedra_shapes('complete')
|
93
|
+
HP.set_tetrahedra_shapes(filled, complete, fillings)
|
94
|
+
HP._polish_hyperbolic_structures()
|
95
|
+
HP.set_name(self.name())
|
96
|
+
DT = self.DT_code(flips=True)
|
97
|
+
if DT:
|
98
|
+
HP._set_DTcode(DTcodec(*DT))
|
99
|
+
return HP
|
100
|
+
|
101
|
+
def low_precision(self):
|
102
|
+
return self.copy()
|
103
|
+
|
104
|
+
# We want ManifoldHP to be a subclass of TriangulationHP.
|
105
|
+
# See comment about Manifold and the diamond pattern.
|
106
|
+
class ManifoldHP(_ManifoldHP, TriangulationHP):
|
107
|
+
__doc__ = _ManifoldHP.__doc__
|
108
|
+
|
109
|
+
def low_precision(self):
|
110
|
+
"""
|
111
|
+
Return a low precision version of this high precision manifold.
|
112
|
+
|
113
|
+
>>> M = ManifoldHP('m004')
|
114
|
+
>>> type(M.low_precision())
|
115
|
+
<class 'snappy.Manifold'>
|
116
|
+
|
117
|
+
"""
|
118
|
+
LP = Manifold('empty')
|
119
|
+
LP._from_string(self._to_string(), initialize_structure=False)
|
120
|
+
fillings = [self.cusp_info(n).filling for n in range(self.num_cusps())]
|
121
|
+
filled = [complex(z) for z in self._get_tetrahedra_shapes('filled')]
|
122
|
+
complete = [complex(z) for z in self._get_tetrahedra_shapes('complete')]
|
123
|
+
LP.set_tetrahedra_shapes(filled, complete, fillings)
|
124
|
+
LP._polish_hyperbolic_structures()
|
125
|
+
LP.set_name(self.name())
|
126
|
+
DT = self.DT_code(flips=True)
|
127
|
+
if DT:
|
128
|
+
LP._set_DTcode(DTcodec(*DT))
|
129
|
+
return LP
|
130
|
+
|
131
|
+
def high_precision(self):
|
132
|
+
return self.copy()
|
133
|
+
|
134
|
+
def identify(self, extends_to_link=False):
|
135
|
+
"""
|
136
|
+
Looks for the manifold in all of the SnapPy databases.
|
137
|
+
For hyperbolic manifolds this is done by searching for isometries:
|
138
|
+
|
139
|
+
>>> M = ManifoldHP('m125')
|
140
|
+
>>> M.identify()
|
141
|
+
[m125(0,0)(0,0), L13n5885(0,0)(0,0), ooct01_00000(0,0)(0,0)]
|
142
|
+
|
143
|
+
By default, there is no restriction on the isometries. One can require
|
144
|
+
that the isometry take meridians to meridians. This might return
|
145
|
+
fewer results:
|
146
|
+
|
147
|
+
>>> M.identify(extends_to_link=True)
|
148
|
+
[m125(0,0)(0,0), ooct01_00000(0,0)(0,0)]
|
149
|
+
|
150
|
+
For closed manifolds, extends_to_link doesn't make sense because
|
151
|
+
of how the kernel code works:
|
152
|
+
|
153
|
+
>>> C = Manifold("m015(1,2)")
|
154
|
+
>>> C.identify()
|
155
|
+
[m006(-5,2)]
|
156
|
+
>>> C.identify(True)
|
157
|
+
[]
|
158
|
+
|
159
|
+
"""
|
160
|
+
return self.low_precision()._identify(extends_to_link)
|
161
|
+
|
162
|
+
|
163
|
+
SnapPy._manifold_class = Manifold
|
164
|
+
SnapPy._triangulation_class = Triangulation
|
165
|
+
SnapPyHP._triangulation_class = TriangulationHP
|
166
|
+
SnapPyHP._manifold_class = ManifoldHP
|
167
|
+
|
168
|
+
__all__ = ['Triangulation', 'Manifold', 'ManifoldHP', 'AbelianGroup',
|
169
|
+
'FundamentalGroup', 'HolonomyGroup', 'HolonomyGroupHP',
|
170
|
+
'DirichletDomain', 'DirichletDomainHP', 'CuspNeighborhood',
|
171
|
+
'CuspNeighborhoodHP', 'SymmetryGroup', 'AlternatingKnotExteriors',
|
172
|
+
'NonalternatingKnotExteriors', 'SnapPeaFatalError',
|
173
|
+
'InsufficientPrecisionError',
|
174
|
+
'pari', 'twister', ]
|
175
|
+
|
176
|
+
def _symmetrize_high_precision_manifold(
|
177
|
+
mfd1 : Union[Manifold, ManifoldHP],
|
178
|
+
mfd2 : Union[Manifold, ManifoldHP]
|
179
|
+
) -> Union[Tuple[Manifold, Manifold],
|
180
|
+
Tuple[ManifoldHP, ManifoldHP]]:
|
181
|
+
"""
|
182
|
+
Given a (potential) mix of two Manifold and ManifoldHP,
|
183
|
+
promote one to high precision if necessary and return
|
184
|
+
the result as pair.
|
185
|
+
"""
|
186
|
+
resolved_mfd1 = mfd1
|
187
|
+
resolved_mfd2 = mfd2
|
188
|
+
high1 = isinstance(mfd1, ManifoldHP)
|
189
|
+
high2 = isinstance(mfd2, ManifoldHP)
|
190
|
+
if high1 and not high2:
|
191
|
+
resolved_mfd2 = ManifoldHP(mfd2)
|
192
|
+
if high2 and not high1:
|
193
|
+
resolved_mfd1 = ManifoldHP(mfd1)
|
194
|
+
return (resolved_mfd1, resolved_mfd2)
|
195
|
+
|
196
|
+
def _symmetrize_low_precision_triangulation(
|
197
|
+
tri1 : Union[Triangulation, TriangulationHP],
|
198
|
+
tri2 : Union[Triangulation, TriangulationHP]
|
199
|
+
) -> Union[Tuple[Triangulation, Triangulation],
|
200
|
+
Tuple[TriangulationHP, TriangulationHP]]:
|
201
|
+
"""
|
202
|
+
Given a (potential) mix of two Triangulation and TriangulationHP,
|
203
|
+
demote one to low precision if necessary and return
|
204
|
+
the result as pair.
|
205
|
+
"""
|
206
|
+
resolved_tri1 = tri1
|
207
|
+
resolved_tri2 = tri2
|
208
|
+
low1 = isinstance(tri1, Triangulation)
|
209
|
+
low2 = isinstance(tri2, Triangulation)
|
210
|
+
if low1 and not low2:
|
211
|
+
resolved_tri2 = Triangulation(tri2, remove_finite_vertices=False)
|
212
|
+
if low2 and not low1:
|
213
|
+
resolved_tri1 = Triangulation(tri1, remove_finite_vertices=False)
|
214
|
+
return (resolved_tri1, resolved_tri2)
|
215
|
+
|
216
|
+
def is_isometric_to(self,
|
217
|
+
other : Union[Manifold, ManifoldHP],
|
218
|
+
return_isometries : bool = False
|
219
|
+
) -> Union[bool, List[Isometry]]:
|
220
|
+
resolved_self, resolved_other = (
|
221
|
+
_symmetrize_high_precision_manifold(
|
222
|
+
self, other))
|
223
|
+
|
224
|
+
return resolved_self._is_isometric_to(
|
225
|
+
resolved_other,
|
226
|
+
return_isometries=return_isometries)
|
227
|
+
|
228
|
+
is_isometric_to.__doc__ = _ManifoldLP._is_isometric_to.__doc__
|
229
|
+
Manifold.is_isometric_to = is_isometric_to
|
230
|
+
ManifoldHP.is_isometric_to = is_isometric_to
|
231
|
+
|
232
|
+
def isomorphisms_to(self,
|
233
|
+
other : Union[Triangulation, TriangulationHP]
|
234
|
+
) -> List[Isometry]:
|
235
|
+
resolved_self, resolved_other = (
|
236
|
+
_symmetrize_low_precision_triangulation(
|
237
|
+
self, other))
|
238
|
+
|
239
|
+
return resolved_self._isomorphisms_to(
|
240
|
+
resolved_other)
|
241
|
+
|
242
|
+
isomorphisms_to.__doc__ = _TriangulationLP._isomorphisms_to.__doc__
|
243
|
+
Triangulation.isomorphisms_to = isomorphisms_to
|
244
|
+
TriangulationHP.isomorphisms_to = isomorphisms_to
|
245
|
+
|
246
|
+
from . import snap
|
247
|
+
snap.add_methods(Manifold)
|
248
|
+
snap.add_methods(ManifoldHP)
|
249
|
+
snap.add_methods(Triangulation, hyperbolic=False)
|
250
|
+
snap.add_methods(TriangulationHP, hyperbolic=False)
|
251
|
+
|
252
|
+
from . import exterior_to_link
|
253
|
+
Triangulation.exterior_to_link = exterior_to_link.exterior_to_link
|
254
|
+
TriangulationHP.exterior_to_link = exterior_to_link.exterior_to_link
|
255
|
+
Manifold.exterior_to_link = exterior_to_link.exterior_to_link
|
256
|
+
ManifoldHP.exterior_to_link = exterior_to_link.exterior_to_link
|
257
|
+
|
258
|
+
from . import verify
|
259
|
+
Manifold.verify_hyperbolicity = verify.verify_hyperbolicity
|
260
|
+
ManifoldHP.verify_hyperbolicity = verify.verify_hyperbolicity
|
261
|
+
|
262
|
+
from . import len_spec
|
263
|
+
Manifold.length_spectrum_alt_gen = len_spec.length_spectrum_alt_gen
|
264
|
+
ManifoldHP.length_spectrum_alt_gen = len_spec.length_spectrum_alt_gen
|
265
|
+
Manifold.length_spectrum_alt = len_spec.length_spectrum_alt
|
266
|
+
ManifoldHP.length_spectrum_alt = len_spec.length_spectrum_alt
|
267
|
+
|
268
|
+
from . import canonical
|
269
|
+
Manifold.canonical_retriangulation = canonical.canonical_retriangulation
|
270
|
+
ManifoldHP.canonical_retriangulation = canonical.canonical_retriangulation_hp
|
271
|
+
|
272
|
+
from . import isometry_signature
|
273
|
+
|
274
|
+
Manifold.isometry_signature = isometry_signature.isometry_signature
|
275
|
+
ManifoldHP.isometry_signature = isometry_signature.isometry_signature
|
276
|
+
|
277
|
+
from .cusps import cusp_area_matrix
|
278
|
+
|
279
|
+
Manifold.cusp_area_matrix = cusp_area_matrix.cusp_area_matrix
|
280
|
+
ManifoldHP.cusp_area_matrix = cusp_area_matrix.cusp_area_matrix
|
281
|
+
|
282
|
+
from .cusps import cusp_areas_from_matrix
|
283
|
+
|
284
|
+
def cusp_areas(manifold,
|
285
|
+
policy : str = 'unbiased',
|
286
|
+
method : str = 'maximal',
|
287
|
+
verified : bool = False,
|
288
|
+
bits_prec : Optional[int] = None,
|
289
|
+
first_cusps : List[int] = []):
|
290
|
+
"""
|
291
|
+
Returns a list of areas, one for each cusp. The cusp neighborhoods
|
292
|
+
defined by these areas are embedded and disjoint. Furthermore, these
|
293
|
+
neighborhoods are maximal in that they fail to be embedded or
|
294
|
+
disjoint if any cusp neighborhood is enlarged (unless :attr:`method`
|
295
|
+
is set to a value different from the default).
|
296
|
+
|
297
|
+
There are different policies how these cusp neighborhoods are found.
|
298
|
+
|
299
|
+
The default :attr:`policy` is ``unbiased``. This means that the
|
300
|
+
cusp neighborhoods are blown up simultaneously and a cusp neighborhood
|
301
|
+
stops growing when it touches any cusp neighborhood including itself::
|
302
|
+
|
303
|
+
>>> M = Manifold("s776")
|
304
|
+
>>> M.cusp_areas() # doctest: +NUMERIC9
|
305
|
+
[2.64575131106459, 2.64575131106459, 2.64575131106459]
|
306
|
+
|
307
|
+
Alternatively, :attr:`policy='greedy'` can be specified. This means
|
308
|
+
that the first cusp neighborhood is blown up until it touches itself,
|
309
|
+
then the second cusp neighborhood is blown up until it touches itself
|
310
|
+
or the first cusp neighborhood, and so on::
|
311
|
+
|
312
|
+
>>> M.cusp_areas(policy='greedy') # doctest: +NUMERIC9
|
313
|
+
[5.29150262212918, 1.32287565553230, 1.32287565553229]
|
314
|
+
|
315
|
+
Use :attr:`first_cusps` to specify the order in which the cusp
|
316
|
+
neighborhoods are blown up::
|
317
|
+
|
318
|
+
>>> M.cusp_areas(policy='greedy', first_cusps=[1,0,2]) # doctest: +NUMERIC9
|
319
|
+
[1.32287565553230, 5.29150262212918, 1.32287565553229]
|
320
|
+
|
321
|
+
An incomplete list can be given to :attr:`first_cusps`. In this case,
|
322
|
+
the list is automatically completed by appending the remaining cusps in
|
323
|
+
order. Thus, the above call is equivalent to::
|
324
|
+
|
325
|
+
>>> M.cusp_areas(policy='greedy', first_cusps=[1]) # doctest: +NUMERIC9
|
326
|
+
[1.32287565553230, 5.29150262212918, 1.32287565553229]
|
327
|
+
|
328
|
+
Under the hood, this method is using
|
329
|
+
:meth:`~snappy.Manifold.cusp_area_matrix`.
|
330
|
+
|
331
|
+
**Verified computation**
|
332
|
+
|
333
|
+
If :attr:`verified = False`, floating-point issues can arise resulting in
|
334
|
+
incorrect values. The method can be made
|
335
|
+
:ref:`verified <verify-primer>` by passing :attr:`verified = True`::
|
336
|
+
|
337
|
+
sage: M=Manifold("s776")
|
338
|
+
sage: M.cusp_areas(verified=True) # doctest: +NUMERIC9
|
339
|
+
[2.64575131107?, 2.64575131107?, 2.64575131107?]
|
340
|
+
|
341
|
+
:param verified:
|
342
|
+
Use :ref:`verified computation <verify-primer>`.
|
343
|
+
:param bits_prec:
|
344
|
+
Precision used for computation. Increase if computation
|
345
|
+
did not succeed or a more precise result is desired.
|
346
|
+
:param method:
|
347
|
+
Passed to :meth:`~snappy.Manifold.cusp_area_matrix`. If set
|
348
|
+
to a value different from the default ``maximal``, the cusp
|
349
|
+
neighborhoods stop growing when the corresponding value
|
350
|
+
in the computed cusp area matrix is exceeded. At this point,
|
351
|
+
the cusp neighborhood might not necessarily touch any other
|
352
|
+
cusp neighborhood since we do not use the maximal cusp area
|
353
|
+
matrix.
|
354
|
+
:param policy:
|
355
|
+
Specifies process of choosing cusp neighborhoods.
|
356
|
+
Either ``unbiased`` or ``greedy``, see above.
|
357
|
+
:param first_cusps:
|
358
|
+
Preference order of cusps.
|
359
|
+
Only relevant if :attr:`policy='greedy'`, see above.
|
360
|
+
:return:
|
361
|
+
Areas of maximal embedded and disjoint cusp neighborhoods
|
362
|
+
(default). Or areas of some embedded and disjoint cusp
|
363
|
+
neighborhoods (if :attr:`method` switches to older algorithm).
|
364
|
+
"""
|
365
|
+
if policy not in ['unbiased', 'greedy']:
|
366
|
+
raise ValueError("policy passed to cusp_areas must be 'unbiased' "
|
367
|
+
"or 'greedy'.")
|
368
|
+
|
369
|
+
m = manifold.cusp_area_matrix(
|
370
|
+
method=method, verified=verified, bits_prec=bits_prec)
|
371
|
+
|
372
|
+
if policy == 'unbiased':
|
373
|
+
return cusp_areas_from_matrix.unbiased_cusp_areas_from_cusp_area_matrix(m)
|
374
|
+
else:
|
375
|
+
return cusp_areas_from_matrix.greedy_cusp_areas_from_cusp_area_matrix(m, first_cusps=first_cusps)
|
376
|
+
|
377
|
+
Manifold.cusp_areas = cusp_areas
|
378
|
+
ManifoldHP.cusp_areas = cusp_areas
|
379
|
+
|
380
|
+
from .verify import short_slopes as verify_short_slopes
|
381
|
+
|
382
|
+
|
383
|
+
def short_slopes(manifold,
|
384
|
+
length=6,
|
385
|
+
policy : str = 'unbiased',
|
386
|
+
method : str = 'maximal',
|
387
|
+
verified : bool = False,
|
388
|
+
bits_prec : Optional[int] = None,
|
389
|
+
first_cusps : List[int] = []):
|
390
|
+
"""
|
391
|
+
Returns a list of short slopes (for Dehn-fillings) for each cusp.
|
392
|
+
|
393
|
+
That is, the method uses :meth:`~snappy.Manifold.cusp_areas` to find
|
394
|
+
(maximal) embedded and disjoint cusp neighborhoods. It uses the boundaries
|
395
|
+
of these cusp neighborhoods to measure the length of a peripheral curve.
|
396
|
+
For each cusp, it determines all simple peripheral curves shorter than
|
397
|
+
the given :attr:`length` (which defaults to 6). The result is a list
|
398
|
+
of the corresponding slopes for each cusp::
|
399
|
+
|
400
|
+
>>> M = Manifold("otet20_00022")
|
401
|
+
>>> M.short_slopes()
|
402
|
+
[[(1, 0), (-1, 1), (0, 1)], [(1, 0)]]
|
403
|
+
|
404
|
+
It takes the same arguments as :meth:`~snappy.Manifold.cusp_areas`::
|
405
|
+
|
406
|
+
>>> M.short_slopes(policy = 'greedy')
|
407
|
+
[[(1, 0)], [(1, 0)]]
|
408
|
+
|
409
|
+
The ten exceptional slopes of the figure-eight knot::
|
410
|
+
|
411
|
+
>>> M = Manifold("4_1")
|
412
|
+
>>> M.short_slopes()
|
413
|
+
[[(1, 0), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]
|
414
|
+
|
415
|
+
Two more slopes appear when increasing length to :math:`2\\pi`::
|
416
|
+
|
417
|
+
>>> M.short_slopes(length = 6.283185307179586)
|
418
|
+
[[(1, 0), (-5, 1), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]]
|
419
|
+
|
420
|
+
**Verified computation**
|
421
|
+
|
422
|
+
If :attr:`verified = False`, floating-point issues can arise resulting in
|
423
|
+
incorrect values. The method can be made
|
424
|
+
:ref:`verified <verify-primer>` by passing :attr:`verified = True`::
|
425
|
+
|
426
|
+
sage: M = Manifold("4_1")
|
427
|
+
sage: M.short_slopes(verified = True)
|
428
|
+
[[(1, 0), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]
|
429
|
+
|
430
|
+
If :attr:`verified = True`, the result is guaranteed to contain all short
|
431
|
+
slopes and might contain additional slopes (with lengths slightly longer
|
432
|
+
than the given :attr:`length` but this could not be proven using the
|
433
|
+
interval estimates).
|
434
|
+
|
435
|
+
The given :attr:`length` is cast to a SageMath ``RealIntervalField`` of the
|
436
|
+
given precision if :attr:`verified = True`::
|
437
|
+
|
438
|
+
sage: from sage.all import pi
|
439
|
+
sage: M.short_slopes(length = 2 * pi, verified = True, bits_prec = 100)
|
440
|
+
[[(1, 0), (-5, 1), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]]
|
441
|
+
|
442
|
+
"""
|
443
|
+
|
444
|
+
return [
|
445
|
+
verify_short_slopes.short_slopes_from_cusp_shape_and_area(
|
446
|
+
shape, area, length=length)
|
447
|
+
for shape, area
|
448
|
+
in zip(manifold.cusp_info(
|
449
|
+
'shape', verified=verified, bits_prec=bits_prec),
|
450
|
+
manifold.cusp_areas(
|
451
|
+
policy=policy, method=method,
|
452
|
+
verified=verified, bits_prec=bits_prec, first_cusps=first_cusps)) ]
|
453
|
+
|
454
|
+
|
455
|
+
Manifold.short_slopes = short_slopes
|
456
|
+
ManifoldHP.short_slopes = short_slopes
|
457
|
+
|
458
|
+
|
459
|
+
def cusp_translations(manifold,
|
460
|
+
policy : str = 'unbiased',
|
461
|
+
method : str = 'maximal',
|
462
|
+
verified : bool = False,
|
463
|
+
bits_prec : Optional[int] = None,
|
464
|
+
first_cusps : List[int] = []):
|
465
|
+
"""
|
466
|
+
Returns a list of the (complex) Euclidean translations corresponding to the
|
467
|
+
meridian and longitude of each cusp.
|
468
|
+
|
469
|
+
That is, the method uses :meth:`~snappy.Manifold.cusp_areas` to find
|
470
|
+
(maximal) embedded and disjoint cusp neighborhoods. It then uses the
|
471
|
+
boundaries of these cusp neighborhoods to measure the meridian and
|
472
|
+
longitude of each cusp. The result is a pair for each cusp. The first
|
473
|
+
entry of the pair corresponds to the meridian and is complex. The
|
474
|
+
second entry corresponds to the longitude and is always real::
|
475
|
+
|
476
|
+
>>> M = Manifold("s776")
|
477
|
+
>>> M.cusp_translations() # doctest: +NUMERIC9
|
478
|
+
[(0.500000000000000 + 1.32287565553230*I, 2.00000000000000), (0.500000000000000 + 1.32287565553230*I, 2.00000000000000), (0.499999999999999 + 1.32287565553230*I, 2.00000000000000)]
|
479
|
+
|
480
|
+
It takes the same arguments as :meth:`~snappy.Manifold.cusp_areas`::
|
481
|
+
|
482
|
+
>>> M.cusp_translations(policy = 'greedy') # doctest: +NUMERIC9
|
483
|
+
[(0.70710678118654752440084436210 + 1.8708286933869706927918743662*I, 2.8284271247461900976033774484), (0.35355339059327376220042218105 + 0.93541434669348534639593718308*I, 1.4142135623730950488016887242), (0.35355339059327376220042218105 + 0.93541434669348534639593718308*I, 1.4142135623730950488016887242)]
|
484
|
+
|
485
|
+
**Verified computations**
|
486
|
+
|
487
|
+
If :attr:`verified = False`, floating-point issues can arise resulting in
|
488
|
+
incorrect values. The method can be made
|
489
|
+
:ref:`verified <verify-primer>` by passing :attr:`verified = True`::
|
490
|
+
|
491
|
+
sage: M.cusp_translations(verified = True) # doctest: +NUMERIC9
|
492
|
+
[(0.50000000000? + 1.32287565553?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?)]
|
493
|
+
|
494
|
+
Note that the first element of each pair is a SageMath ``ComplexIntervalField`` and
|
495
|
+
the second element a ``RealIntervalField``.
|
496
|
+
"""
|
497
|
+
|
498
|
+
return [
|
499
|
+
verify_short_slopes.translations_from_cusp_shape_and_area(
|
500
|
+
shape, area, kernel_convention=True)
|
501
|
+
for shape, area
|
502
|
+
in zip(manifold.cusp_info(
|
503
|
+
'shape', verified=verified, bits_prec=bits_prec),
|
504
|
+
manifold.cusp_areas(
|
505
|
+
policy=policy, method=method,
|
506
|
+
verified=verified, bits_prec=bits_prec, first_cusps=first_cusps)) ]
|
507
|
+
|
508
|
+
|
509
|
+
Manifold.cusp_translations = cusp_translations
|
510
|
+
ManifoldHP.cusp_translations = cusp_translations
|
511
|
+
|
512
|
+
|
513
|
+
def complex_volume(manifold, verified_modulo_2_torsion=False,
|
514
|
+
bits_prec=None):
|
515
|
+
"""
|
516
|
+
Returns the complex volume modulo :math:`i \\pi^2` which is given by
|
517
|
+
|
518
|
+
.. math::
|
519
|
+
\\text{vol} + i \\text{CS}
|
520
|
+
|
521
|
+
where :math:`\\text{CS}` is the (unnormalized) Chern-Simons invariant.
|
522
|
+
|
523
|
+
>>> M = Manifold('5_2')
|
524
|
+
>>> M.complex_volume() # doctest: +NUMERIC6
|
525
|
+
2.82812209 - 3.02412838*I
|
526
|
+
|
527
|
+
Note that :meth:`chern_simons <snappy.Manifold.chern_simons>`
|
528
|
+
normalizes the Chern-Simons invariant by dividing it by
|
529
|
+
:math:`2 \\pi^2 = 19.7392...` ::
|
530
|
+
|
531
|
+
>>> M.chern_simons() # doctest: +NUMERIC6
|
532
|
+
-0.153204133297152
|
533
|
+
|
534
|
+
More examples::
|
535
|
+
|
536
|
+
>>> M.dehn_fill((1,2))
|
537
|
+
>>> M.complex_volume() # doctest: +NUMERIC6
|
538
|
+
2.22671790 + 1.52619361*I
|
539
|
+
>>> M = Manifold("3_1") # A non-hyperbolic example.
|
540
|
+
>>> cvol = M.complex_volume()
|
541
|
+
>>> cvol.real() # doctest: +NUMERIC6
|
542
|
+
0
|
543
|
+
>>> cvol.imag() # doctest: +NUMERIC6
|
544
|
+
-1.64493407
|
545
|
+
|
546
|
+
If no cusp is filled or there is only one cusped (filled or
|
547
|
+
unfilled), the complex volume can be verified up to multiples
|
548
|
+
of :math:`i \\pi^2 /2` by passing ``verified_modulo_2_torsion = True``
|
549
|
+
when inside SageMath. Higher precision can be requested
|
550
|
+
with ``bits_prec``::
|
551
|
+
|
552
|
+
sage: M = Manifold("m015")
|
553
|
+
sage: M.complex_volume(verified_modulo_2_torsion=True, bits_prec = 93) # doctest: +NUMERIC21
|
554
|
+
2.828122088330783162764? + 1.910673824035377649698?*I
|
555
|
+
sage: M = Manifold("m015(3,4)")
|
556
|
+
sage: M.complex_volume(verified_modulo_2_torsion=True) # doctest: +NUMERIC6
|
557
|
+
2.625051576? - 0.537092383?*I
|
558
|
+
|
559
|
+
"""
|
560
|
+
if verified_modulo_2_torsion:
|
561
|
+
return verify.verified_complex_volume_torsion(
|
562
|
+
manifold, bits_prec=bits_prec)
|
563
|
+
|
564
|
+
if bits_prec:
|
565
|
+
raise Exception("Arbitrary precision for complex volume only "
|
566
|
+
"supported for verified computations and cusped "
|
567
|
+
"manifolds.")
|
568
|
+
|
569
|
+
return manifold._complex_volume()
|
570
|
+
|
571
|
+
Manifold.complex_volume = complex_volume
|
572
|
+
ManifoldHP.complex_volume = complex_volume
|
573
|
+
|
574
|
+
from . import drilling
|
575
|
+
drilling._add_methods(Manifold)
|
576
|
+
drilling._add_methods(ManifoldHP, high_precision=True)
|
577
|
+
|
578
|
+
from . import raytracing
|
579
|
+
|
580
|
+
Manifold.inside_view = raytracing.inside_view
|
581
|
+
ManifoldHP.inside_view = raytracing.inside_view
|
582
|
+
|
583
|
+
|
584
|
+
def all_translations(self, verified=False, bits_prec=None):
|
585
|
+
"""
|
586
|
+
Returns the (complex) Euclidean translations of the meridian
|
587
|
+
and longitude for each cusp measured with respect to the cusp neighborhood.
|
588
|
+
|
589
|
+
The result is a list of pairs, the second entry corresponding to a
|
590
|
+
longitude is always real::
|
591
|
+
|
592
|
+
>>> M = Manifold("v3227")
|
593
|
+
>>> N = M.cusp_neighborhood()
|
594
|
+
>>> N.all_translations() # doctest: +NUMERIC9
|
595
|
+
[(-0.152977162509284 + 0.747697694854404*I, 0.868692062725708), (-0.152977162509284 + 0.747697694854404*I, 0.868692062725708), (0.0961611977895952 + 0.725536253181650*I, 0.895226186134782)]
|
596
|
+
|
597
|
+
Often, one is interested in making the cusp neighborhoods as large as possible first::
|
598
|
+
|
599
|
+
>>> N.set_displacement(100,0)
|
600
|
+
>>> N.set_displacement(100,1)
|
601
|
+
>>> N.set_displacement(100,2)
|
602
|
+
>>> N.all_translations() # doctest: +NUMERIC9
|
603
|
+
[(-0.477656250512815 + 2.33461303362557*I, 2.71240613125259), (-0.259696455247511 + 1.26930345526993*I, 1.47470541152065), (0.131389112265699 + 0.991330873713731*I, 1.22318540718077)]
|
604
|
+
|
605
|
+
This can also be achieved by :py:meth:`Manifold.cusp_translations` which
|
606
|
+
would have made a different choice of disjoint cusp neighborhoods though::
|
607
|
+
|
608
|
+
>>> M.cusp_translations() # doctest: +NUMERIC6
|
609
|
+
[(-0.315973594129651 + 1.54436599614183*I, 1.79427928161946), (-0.315973594129649 + 1.54436599614182*I, 1.79427928161946), (0.198620491993677 + 1.49859164484929*I, 1.84908538602825)]
|
610
|
+
|
611
|
+
This method supports arbitrary precision ::
|
612
|
+
|
613
|
+
>>> from snappy.number import Number
|
614
|
+
>>> N.set_displacement(1.125, 0)
|
615
|
+
>>> N.set_displacement(0.515625, 1)
|
616
|
+
>>> N.set_displacement(0.3125, 2)
|
617
|
+
>>> N.all_translations(bits_prec = 120) # doctest: +NUMERIC30
|
618
|
+
[(-0.47120283346076781167174343474008914 + 2.3030710375877078211095122873223488*I, 2.6757599281290843845710310925394911), (-0.25618853688042434043044508297577899 + 1.2521580040549576537090841783446072*I, 1.4547854392045669515377748986943560), (0.13143677360753666862808198126761923 + 0.99169047854575721271560179767750893*I, 1.2236291171413362101960100623801910)]
|
619
|
+
|
620
|
+
and can return verified intervals ::
|
621
|
+
|
622
|
+
sage: N.all_translations(verified = True) # doctest: +NUMERIC9
|
623
|
+
[(-0.47120283346? + 2.30307103759?*I, 2.67575992813?), (-0.256188536881? + 1.252158004055?*I, 1.454785439205?), (0.131436773608? + 0.991690478546?*I, 1.2236291171413?)]
|
624
|
+
sage: N.all_translations(verified = True, bits_prec = 120) # doctest: +NUMERIC30
|
625
|
+
[(-0.4712028334607678116717434347401? + 2.3030710375877078211095122873224?*I, 2.6757599281290843845710310925395?), (-0.25618853688042434043044508297578? + 1.25215800405495765370908417834461?*I, 1.454785439204566951537774898694356?), (0.131436773607536668628081981267619? + 0.991690478545757212715601797677509?*I, 1.223629117141336210196010062380191?)]
|
626
|
+
|
627
|
+
that are guaranteed to contain the true translations of disjoint cusp
|
628
|
+
neighborhoods (the element corresponding to a longitude is always
|
629
|
+
in a ``RealIntervalField``). The verified translations might correspond
|
630
|
+
to cusp neighborhoods smaller than the given ones to be able to verify
|
631
|
+
that they are disjoint.
|
632
|
+
|
633
|
+
**Remark:** Since the code is (potentially) non-deterministic, the result of ::
|
634
|
+
|
635
|
+
[ N.all_translations(verified = True)[i] for i in range(M.num_cusps()) ]
|
636
|
+
|
637
|
+
is not verified to correspond to disjoint cusp neighborhoods.
|
638
|
+
"""
|
639
|
+
|
640
|
+
if verified or bits_prec:
|
641
|
+
# Use the implementation in verify.cusp_translations that uses
|
642
|
+
# tetrahedra_shapes and ComplexCuspNeighborhood
|
643
|
+
return verify.cusp_translations_for_neighborhood(
|
644
|
+
self, verified=verified, bits_prec=bits_prec)
|
645
|
+
|
646
|
+
# Use the implementation in the SnapPea kernel
|
647
|
+
return [ self.translations(i) for i in range(self.num_cusps()) ]
|
648
|
+
|
649
|
+
|
650
|
+
CuspNeighborhood.all_translations = all_translations
|
651
|
+
CuspNeighborhoodHP.all_translations = all_translations
|
652
|
+
|
653
|
+
from . import twister
|
654
|
+
|
655
|
+
# Pass our manifold class down to database and then import the
|
656
|
+
# manifold tables themselves from the snappy_manifold package.
|
657
|
+
|
658
|
+
from . import database
|
659
|
+
database.Manifold = Manifold
|
660
|
+
database.Triangulation = Triangulation
|
661
|
+
snappy_module = sys.modules[__name__]
|
662
|
+
database_objects = []
|
663
|
+
known_manifold_packages = [('snappy_manifolds', True),
|
664
|
+
('snappy_15_knots', False),
|
665
|
+
('nonexistent_manifolds', False)]
|
666
|
+
|
667
|
+
for manifold_package, required in known_manifold_packages:
|
668
|
+
table_dict = database.add_tables_from_package(manifold_package, required)
|
669
|
+
for name, table in table_dict.items():
|
670
|
+
setattr(snappy_module, name, table)
|
671
|
+
if name not in database_objects:
|
672
|
+
database_objects.append(name)
|
673
|
+
|
674
|
+
__all__ += database_objects
|
675
|
+
|
676
|
+
# Monkey patch the link_exterior method into Spherogram.
|
677
|
+
|
678
|
+
from spherogram.codecs import DTcodec
|
679
|
+
|
680
|
+
|
681
|
+
def _link_exterior(self, with_hyperbolic_structure=True,
|
682
|
+
remove_finite_vertices=True):
|
683
|
+
"""
|
684
|
+
The exterior or complement of the link L, that is, S^3 minus L.
|
685
|
+
|
686
|
+
>>> K = Link('4_1')
|
687
|
+
>>> M = K.exterior()
|
688
|
+
>>> M.volume() # doctest: +NUMERIC6
|
689
|
+
2.02988321
|
690
|
+
|
691
|
+
By default, SnapPy will try to find a hyperbolic structure on the
|
692
|
+
exterior. To return a Triangulation instead of a Manifold, set the
|
693
|
+
flag with_hyperbolic_structure to False. If you want to get the
|
694
|
+
intermediate triangulation with extra vertices above and below the
|
695
|
+
projection plane, set the flag remove_finite_vertices to False.
|
696
|
+
|
697
|
+
>>> M = K.exterior(False, False)
|
698
|
+
>>> (M.num_cusps(), M._num_fake_cusps())
|
699
|
+
(1, 2)
|
700
|
+
|
701
|
+
"""
|
702
|
+
M = Triangulation('empty')
|
703
|
+
M._get_from_link_data(self.KLPProjection(), remove_finite_vertices)
|
704
|
+
if with_hyperbolic_structure:
|
705
|
+
M = M.with_hyperbolic_structure()
|
706
|
+
dt = DTcodec(*self.DT_code(flips=True))
|
707
|
+
M._set_DTcode(dt)
|
708
|
+
if self.name:
|
709
|
+
M.set_name(self.name)
|
710
|
+
return M
|
711
|
+
|
712
|
+
|
713
|
+
link_objects = []
|
714
|
+
|
715
|
+
from spherogram.links import (Crossing, Strand, Link, Tangle,
|
716
|
+
RationalTangle, ZeroTangle, InfinityTangle, IdentityBraid, random_link)
|
717
|
+
|
718
|
+
# Monkey-patch the Link class
|
719
|
+
Link.exterior = _link_exterior
|
720
|
+
link_objects += [
|
721
|
+
'Crossing', 'Strand', 'Link', 'Tangle', 'RationalTangle', 'ZeroTangle', 'InfinityTangle',
|
722
|
+
'IdentityBraid', 'random_link',
|
723
|
+
]
|
724
|
+
|
725
|
+
# Monkey-patch the DTcodec class
|
726
|
+
DTcodec.exterior = _link_exterior
|
727
|
+
link_objects += ['DTcodec']
|
728
|
+
|
729
|
+
__all__ += link_objects
|
730
|
+
|
731
|
+
# Add spun-normal surface features via FXrays
|
732
|
+
import FXrays
|
733
|
+
from .snap.t3mlite import spun as _spun
|
734
|
+
for mfld_class in [Triangulation, Manifold, ManifoldHP]:
|
735
|
+
for method in ['_normal_surface_equations', 'normal_surfaces',
|
736
|
+
'normal_boundary_slopes']:
|
737
|
+
setattr(mfld_class, method, getattr(_spun, method))
|
738
|
+
|
739
|
+
import textwrap
|
740
|
+
|
741
|
+
# Documentation for the module:
|
742
|
+
__doc__ = """
|
743
|
+
SnapPy is a Cython wrapping of Jeff Weeks' SnapPea kernel.
|
744
|
+
|
745
|
+
The module defines the following classes:
|
746
|
+
%s""" % textwrap.fill(
|
747
|
+
', '.join(__all__) + '.',
|
748
|
+
width=78,
|
749
|
+
initial_indent=' ',
|
750
|
+
subsequent_indent=' ')
|
751
|
+
|
752
|
+
# Add easy way to get the version info
|
753
|
+
from .version import version as release_info
|
754
|
+
|
755
|
+
|
756
|
+
def version():
|
757
|
+
return release_info
|
758
|
+
|
759
|
+
|
760
|
+
__version__ = version()
|