snappy 3.2__cp313-cp313-macosx_11_0_arm64.whl
Sign up to get free protection for your applications and to get access to all the features.
- snappy/CyOpenGL.cpython-313-darwin.so +0 -0
- snappy/SnapPy.cpython-313-darwin.so +0 -0
- snappy/SnapPy.ico +0 -0
- snappy/SnapPy.png +0 -0
- snappy/SnapPyHP.cpython-313-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-313-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/doc/manifold.html
ADDED
@@ -0,0 +1,3452 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
<!DOCTYPE html>
|
4
|
+
<html class="writer-html5" lang="en" data-content_root="./">
|
5
|
+
<head>
|
6
|
+
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
|
7
|
+
|
8
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
9
|
+
<title>Manifold: the main class — SnapPy 3.2 documentation</title>
|
10
|
+
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
11
|
+
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
|
12
|
+
<link rel="stylesheet" type="text/css" href="_static/snappy_sphinx_rtd_theme.css?v=1b8ec2a8" />
|
13
|
+
|
14
|
+
|
15
|
+
<link rel="shortcut icon" href="_static/SnapPy.ico"/>
|
16
|
+
<script src="_static/jquery.js?v=5d32c60e"></script>
|
17
|
+
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
18
|
+
<script src="_static/documentation_options.js?v=828ea960"></script>
|
19
|
+
<script src="_static/doctools.js?v=9a2dae69"></script>
|
20
|
+
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
21
|
+
<script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
|
22
|
+
<script src="_static/js/theme.js"></script>
|
23
|
+
<link rel="index" title="Index" href="genindex.html" />
|
24
|
+
<link rel="search" title="Search" href="search.html" />
|
25
|
+
<link rel="next" title="ManifoldHP: High-precision variant" href="manifoldhp.html" />
|
26
|
+
<link rel="prev" title="The snappy module and its classes" href="snappy.html" />
|
27
|
+
</head>
|
28
|
+
|
29
|
+
<body class="wy-body-for-nav">
|
30
|
+
<div class="wy-grid-for-nav">
|
31
|
+
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
32
|
+
<div class="wy-side-scroll">
|
33
|
+
<div class="wy-side-nav-search" >
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
<a href="index.html" class="icon icon-home">
|
38
|
+
SnapPy
|
39
|
+
<img src="_static/SnapPy-horizontal-128.png" class="logo" alt="Logo"/>
|
40
|
+
</a>
|
41
|
+
<div role="search">
|
42
|
+
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
|
43
|
+
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
|
44
|
+
<input type="hidden" name="check_keywords" value="yes" />
|
45
|
+
<input type="hidden" name="area" value="default" />
|
46
|
+
</form>
|
47
|
+
</div>
|
48
|
+
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
49
|
+
<ul class="current">
|
50
|
+
<li class="toctree-l1"><a class="reference internal" href="installing.html">Installing SnapPy</a></li>
|
51
|
+
<li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots: SnapPy in action</a></li>
|
52
|
+
<li class="toctree-l1"><a class="reference internal" href="tutorial.html">Tutorial</a></li>
|
53
|
+
<li class="toctree-l1 current"><a class="reference internal" href="snappy.html">The snappy module and its classes</a><ul class="current">
|
54
|
+
<li class="toctree-l2 current"><a class="current reference internal" href="#">Manifold: the main class</a><ul>
|
55
|
+
<li class="toctree-l3"><a class="reference internal" href="#snappy.Manifold"><code class="docutils literal notranslate"><span class="pre">Manifold</span></code></a><ul>
|
56
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.DT_code"><code class="docutils literal notranslate"><span class="pre">Manifold.DT_code()</span></code></a></li>
|
57
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.alexander_polynomial"><code class="docutils literal notranslate"><span class="pre">Manifold.alexander_polynomial()</span></code></a></li>
|
58
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.browse"><code class="docutils literal notranslate"><span class="pre">Manifold.browse()</span></code></a></li>
|
59
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.canonical_retriangulation"><code class="docutils literal notranslate"><span class="pre">Manifold.canonical_retriangulation()</span></code></a></li>
|
60
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.canonize"><code class="docutils literal notranslate"><span class="pre">Manifold.canonize()</span></code></a></li>
|
61
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.chern_simons"><code class="docutils literal notranslate"><span class="pre">Manifold.chern_simons()</span></code></a></li>
|
62
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.complex_volume"><code class="docutils literal notranslate"><span class="pre">Manifold.complex_volume()</span></code></a></li>
|
63
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.copy"><code class="docutils literal notranslate"><span class="pre">Manifold.copy()</span></code></a></li>
|
64
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cover"><code class="docutils literal notranslate"><span class="pre">Manifold.cover()</span></code></a></li>
|
65
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cover_info"><code class="docutils literal notranslate"><span class="pre">Manifold.cover_info()</span></code></a></li>
|
66
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.covers"><code class="docutils literal notranslate"><span class="pre">Manifold.covers()</span></code></a></li>
|
67
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cusp_area_matrix"><code class="docutils literal notranslate"><span class="pre">Manifold.cusp_area_matrix()</span></code></a></li>
|
68
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cusp_areas"><code class="docutils literal notranslate"><span class="pre">Manifold.cusp_areas()</span></code></a></li>
|
69
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cusp_info"><code class="docutils literal notranslate"><span class="pre">Manifold.cusp_info()</span></code></a></li>
|
70
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cusp_neighborhood"><code class="docutils literal notranslate"><span class="pre">Manifold.cusp_neighborhood()</span></code></a></li>
|
71
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cusp_translations"><code class="docutils literal notranslate"><span class="pre">Manifold.cusp_translations()</span></code></a></li>
|
72
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.dehn_fill"><code class="docutils literal notranslate"><span class="pre">Manifold.dehn_fill()</span></code></a></li>
|
73
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.dirichlet_domain"><code class="docutils literal notranslate"><span class="pre">Manifold.dirichlet_domain()</span></code></a></li>
|
74
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.drill"><code class="docutils literal notranslate"><span class="pre">Manifold.drill()</span></code></a></li>
|
75
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.drill_word"><code class="docutils literal notranslate"><span class="pre">Manifold.drill_word()</span></code></a></li>
|
76
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.drill_words"><code class="docutils literal notranslate"><span class="pre">Manifold.drill_words()</span></code></a></li>
|
77
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.dual_curves"><code class="docutils literal notranslate"><span class="pre">Manifold.dual_curves()</span></code></a></li>
|
78
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.edge_valences"><code class="docutils literal notranslate"><span class="pre">Manifold.edge_valences()</span></code></a></li>
|
79
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.exterior_to_link"><code class="docutils literal notranslate"><span class="pre">Manifold.exterior_to_link()</span></code></a></li>
|
80
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.filled_triangulation"><code class="docutils literal notranslate"><span class="pre">Manifold.filled_triangulation()</span></code></a></li>
|
81
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.fundamental_group"><code class="docutils literal notranslate"><span class="pre">Manifold.fundamental_group()</span></code></a></li>
|
82
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.gluing_equations"><code class="docutils literal notranslate"><span class="pre">Manifold.gluing_equations()</span></code></a></li>
|
83
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.gluing_equations_pgl"><code class="docutils literal notranslate"><span class="pre">Manifold.gluing_equations_pgl()</span></code></a></li>
|
84
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.has_finite_vertices"><code class="docutils literal notranslate"><span class="pre">Manifold.has_finite_vertices()</span></code></a></li>
|
85
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.high_precision"><code class="docutils literal notranslate"><span class="pre">Manifold.high_precision()</span></code></a></li>
|
86
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.holonomy_matrix_entries"><code class="docutils literal notranslate"><span class="pre">Manifold.holonomy_matrix_entries()</span></code></a></li>
|
87
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.homological_longitude"><code class="docutils literal notranslate"><span class="pre">Manifold.homological_longitude()</span></code></a></li>
|
88
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.homology"><code class="docutils literal notranslate"><span class="pre">Manifold.homology()</span></code></a></li>
|
89
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.hyperbolic_SLN_torsion"><code class="docutils literal notranslate"><span class="pre">Manifold.hyperbolic_SLN_torsion()</span></code></a></li>
|
90
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.hyperbolic_adjoint_torsion"><code class="docutils literal notranslate"><span class="pre">Manifold.hyperbolic_adjoint_torsion()</span></code></a></li>
|
91
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.hyperbolic_torsion"><code class="docutils literal notranslate"><span class="pre">Manifold.hyperbolic_torsion()</span></code></a></li>
|
92
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.identify"><code class="docutils literal notranslate"><span class="pre">Manifold.identify()</span></code></a></li>
|
93
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.inside_view"><code class="docutils literal notranslate"><span class="pre">Manifold.inside_view()</span></code></a></li>
|
94
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.invariant_trace_field_gens"><code class="docutils literal notranslate"><span class="pre">Manifold.invariant_trace_field_gens()</span></code></a></li>
|
95
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.is_isometric_to"><code class="docutils literal notranslate"><span class="pre">Manifold.is_isometric_to()</span></code></a></li>
|
96
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.is_orientable"><code class="docutils literal notranslate"><span class="pre">Manifold.is_orientable()</span></code></a></li>
|
97
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.is_two_bridge"><code class="docutils literal notranslate"><span class="pre">Manifold.is_two_bridge()</span></code></a></li>
|
98
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.isometry_signature"><code class="docutils literal notranslate"><span class="pre">Manifold.isometry_signature()</span></code></a></li>
|
99
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.isomorphisms_to"><code class="docutils literal notranslate"><span class="pre">Manifold.isomorphisms_to()</span></code></a></li>
|
100
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.length_spectrum"><code class="docutils literal notranslate"><span class="pre">Manifold.length_spectrum()</span></code></a></li>
|
101
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.length_spectrum_alt"><code class="docutils literal notranslate"><span class="pre">Manifold.length_spectrum_alt()</span></code></a></li>
|
102
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.length_spectrum_alt_gen"><code class="docutils literal notranslate"><span class="pre">Manifold.length_spectrum_alt_gen()</span></code></a></li>
|
103
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.link"><code class="docutils literal notranslate"><span class="pre">Manifold.link()</span></code></a></li>
|
104
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.name"><code class="docutils literal notranslate"><span class="pre">Manifold.name()</span></code></a></li>
|
105
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.normal_boundary_slopes"><code class="docutils literal notranslate"><span class="pre">Manifold.normal_boundary_slopes()</span></code></a></li>
|
106
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.normal_surfaces"><code class="docutils literal notranslate"><span class="pre">Manifold.normal_surfaces()</span></code></a></li>
|
107
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.num_cusps"><code class="docutils literal notranslate"><span class="pre">Manifold.num_cusps()</span></code></a></li>
|
108
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.num_tetrahedra"><code class="docutils literal notranslate"><span class="pre">Manifold.num_tetrahedra()</span></code></a></li>
|
109
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.orientation_cover"><code class="docutils literal notranslate"><span class="pre">Manifold.orientation_cover()</span></code></a></li>
|
110
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.plink"><code class="docutils literal notranslate"><span class="pre">Manifold.plink()</span></code></a></li>
|
111
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.polished_holonomy"><code class="docutils literal notranslate"><span class="pre">Manifold.polished_holonomy()</span></code></a></li>
|
112
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.ptolemy_generalized_obstruction_classes"><code class="docutils literal notranslate"><span class="pre">Manifold.ptolemy_generalized_obstruction_classes()</span></code></a></li>
|
113
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.ptolemy_obstruction_classes"><code class="docutils literal notranslate"><span class="pre">Manifold.ptolemy_obstruction_classes()</span></code></a></li>
|
114
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.ptolemy_variety"><code class="docutils literal notranslate"><span class="pre">Manifold.ptolemy_variety()</span></code></a></li>
|
115
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.randomize"><code class="docutils literal notranslate"><span class="pre">Manifold.randomize()</span></code></a></li>
|
116
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.reverse_orientation"><code class="docutils literal notranslate"><span class="pre">Manifold.reverse_orientation()</span></code></a></li>
|
117
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.save"><code class="docutils literal notranslate"><span class="pre">Manifold.save()</span></code></a></li>
|
118
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.set_name"><code class="docutils literal notranslate"><span class="pre">Manifold.set_name()</span></code></a></li>
|
119
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.set_peripheral_curves"><code class="docutils literal notranslate"><span class="pre">Manifold.set_peripheral_curves()</span></code></a></li>
|
120
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.set_target_holonomy"><code class="docutils literal notranslate"><span class="pre">Manifold.set_target_holonomy()</span></code></a></li>
|
121
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.set_tetrahedra_shapes"><code class="docutils literal notranslate"><span class="pre">Manifold.set_tetrahedra_shapes()</span></code></a></li>
|
122
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.short_slopes"><code class="docutils literal notranslate"><span class="pre">Manifold.short_slopes()</span></code></a></li>
|
123
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.simplify"><code class="docutils literal notranslate"><span class="pre">Manifold.simplify()</span></code></a></li>
|
124
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.slice_obstruction_HKL"><code class="docutils literal notranslate"><span class="pre">Manifold.slice_obstruction_HKL()</span></code></a></li>
|
125
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.solution_type"><code class="docutils literal notranslate"><span class="pre">Manifold.solution_type()</span></code></a></li>
|
126
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.split"><code class="docutils literal notranslate"><span class="pre">Manifold.split()</span></code></a></li>
|
127
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.splitting_surfaces"><code class="docutils literal notranslate"><span class="pre">Manifold.splitting_surfaces()</span></code></a></li>
|
128
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.symmetric_triangulation"><code class="docutils literal notranslate"><span class="pre">Manifold.symmetric_triangulation()</span></code></a></li>
|
129
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.symmetry_group"><code class="docutils literal notranslate"><span class="pre">Manifold.symmetry_group()</span></code></a></li>
|
130
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.symplectic_basis"><code class="docutils literal notranslate"><span class="pre">Manifold.symplectic_basis()</span></code></a></li>
|
131
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.tetrahedra_field_gens"><code class="docutils literal notranslate"><span class="pre">Manifold.tetrahedra_field_gens()</span></code></a></li>
|
132
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.tetrahedra_shapes"><code class="docutils literal notranslate"><span class="pre">Manifold.tetrahedra_shapes()</span></code></a></li>
|
133
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.trace_field_gens"><code class="docutils literal notranslate"><span class="pre">Manifold.trace_field_gens()</span></code></a></li>
|
134
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.triangulation_isosig"><code class="docutils literal notranslate"><span class="pre">Manifold.triangulation_isosig()</span></code></a></li>
|
135
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.use_field_conversion"><code class="docutils literal notranslate"><span class="pre">Manifold.use_field_conversion()</span></code></a></li>
|
136
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.verify_hyperbolicity"><code class="docutils literal notranslate"><span class="pre">Manifold.verify_hyperbolicity()</span></code></a></li>
|
137
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.volume"><code class="docutils literal notranslate"><span class="pre">Manifold.volume()</span></code></a></li>
|
138
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.with_hyperbolic_structure"><code class="docutils literal notranslate"><span class="pre">Manifold.with_hyperbolic_structure()</span></code></a></li>
|
139
|
+
<li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.without_hyperbolic_structure"><code class="docutils literal notranslate"><span class="pre">Manifold.without_hyperbolic_structure()</span></code></a></li>
|
140
|
+
</ul>
|
141
|
+
</li>
|
142
|
+
</ul>
|
143
|
+
</li>
|
144
|
+
<li class="toctree-l2"><a class="reference internal" href="manifoldhp.html">ManifoldHP: High-precision variant</a></li>
|
145
|
+
<li class="toctree-l2"><a class="reference internal" href="triangulation.html">Triangulation</a></li>
|
146
|
+
<li class="toctree-l2"><a class="reference internal" href="additional_classes.html">Additional Classes</a></li>
|
147
|
+
<li class="toctree-l2"><a class="reference internal" href="censuses.html">Census manifolds</a></li>
|
148
|
+
</ul>
|
149
|
+
</li>
|
150
|
+
<li class="toctree-l1"><a class="reference internal" href="plink.html">Using SnapPy’s link editor</a></li>
|
151
|
+
<li class="toctree-l1"><a class="reference internal" href="spherogram.html">Links: planar diagrams and invariants</a></li>
|
152
|
+
<li class="toctree-l1"><a class="reference internal" href="snap.html">Number theory of hyperbolic 3-manifolds</a></li>
|
153
|
+
<li class="toctree-l1"><a class="reference internal" href="verify.html">Verified computations</a></li>
|
154
|
+
<li class="toctree-l1"><a class="reference internal" href="other.html">Other components</a></li>
|
155
|
+
<li class="toctree-l1"><a class="reference internal" href="news.html">News</a></li>
|
156
|
+
<li class="toctree-l1"><a class="reference internal" href="credits.html">Credits</a></li>
|
157
|
+
<li class="toctree-l1"><a class="reference internal" href="bugs.html">Reporting bugs and other problems</a></li>
|
158
|
+
<li class="toctree-l1"><a class="reference internal" href="todo.html">To Do List</a></li>
|
159
|
+
<li class="toctree-l1"><a class="reference internal" href="development.html">Development Basics</a></li>
|
160
|
+
</ul>
|
161
|
+
|
162
|
+
</div>
|
163
|
+
</div>
|
164
|
+
</nav>
|
165
|
+
|
166
|
+
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
|
167
|
+
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
168
|
+
<a href="index.html">SnapPy</a>
|
169
|
+
</nav>
|
170
|
+
|
171
|
+
<div class="wy-nav-content">
|
172
|
+
<div class="rst-content">
|
173
|
+
<div role="navigation" aria-label="Page navigation">
|
174
|
+
<ul class="wy-breadcrumbs">
|
175
|
+
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
|
176
|
+
<li class="breadcrumb-item"><a href="snappy.html">The snappy module and its classes</a></li>
|
177
|
+
<li class="breadcrumb-item active">Manifold: the main class</li>
|
178
|
+
<li class="wy-breadcrumbs-aside">
|
179
|
+
</li>
|
180
|
+
</ul>
|
181
|
+
<hr/>
|
182
|
+
</div>
|
183
|
+
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
184
|
+
<div itemprop="articleBody">
|
185
|
+
|
186
|
+
<section id="manifold-the-main-class">
|
187
|
+
<h1>Manifold: the main class<a class="headerlink" href="#manifold-the-main-class" title="Link to this heading"></a></h1>
|
188
|
+
<dl class="py class">
|
189
|
+
<dt class="sig sig-object py" id="snappy.Manifold">
|
190
|
+
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">snappy.</span></span><span class="sig-name descname"><span class="pre">Manifold</span></span><a class="headerlink" href="#snappy.Manifold" title="Link to this definition"></a></dt>
|
191
|
+
<dd><p>A Manifold is a <a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><code class="xref py py-class docutils literal notranslate"><span class="pre">Triangulation</span></code></a> together with a geometric structure.
|
192
|
+
That is, a Manifold is an ideal triangulation of the interior of a
|
193
|
+
compact 3-manifold with torus and Klein-bottle boundary components, where
|
194
|
+
each tetrahedron has been assigned the geometry of an ideal tetrahedron
|
195
|
+
in hyperbolic 3-space. A Dehn-filling can be specified for each
|
196
|
+
boundary component, allowing the description of closed 3-manifolds,
|
197
|
+
some orbifolds and cone 3-manifolds. Here’s a quick example:</p>
|
198
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'9_42'</span><span class="p">)</span>
|
199
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
|
200
|
+
<span class="go">4.05686022</span>
|
201
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="s1">'shape'</span><span class="p">)</span>
|
202
|
+
<span class="go">[-4.278936315 + 1.95728679*I]</span>
|
203
|
+
</pre></div>
|
204
|
+
</div>
|
205
|
+
<p>This is an example for running SnapPy inside Sage:</p>
|
206
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">snappy</span>
|
207
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">snappy</span><span class="o">.</span><span class="n">Manifold</span><span class="p">(</span><span class="s1">'m125(1,2)(4,5)'</span><span class="p">)</span>
|
208
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">is_orientable</span><span class="p">()</span>
|
209
|
+
<span class="kc">True</span>
|
210
|
+
</pre></div>
|
211
|
+
</div>
|
212
|
+
<p>An alternative way of running SnapPy inside Sage:</p>
|
213
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">snappy</span> <span class="kn">import</span> <span class="o">*</span>
|
214
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m123'</span><span class="p">)</span>
|
215
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">()</span>
|
216
|
+
<span class="mi">1</span>
|
217
|
+
</pre></div>
|
218
|
+
</div>
|
219
|
+
<p>A Manifold can be specified in a number of ways, e.g.</p>
|
220
|
+
<ul class="simple">
|
221
|
+
<li><p>Manifold(‘9_42’) : The complement of the knot 9_42 in S^3.</p></li>
|
222
|
+
<li><p>Manifold(‘m125(1,2)(4,5)’) : The SnapPea census manifold m125
|
223
|
+
where the first cusp has Dehn filling (1,2) and the second cusp has
|
224
|
+
filling (4,5).</p></li>
|
225
|
+
<li><p>Manifold() : Opens a link editor window where can you
|
226
|
+
specify a link complement.</p></li>
|
227
|
+
</ul>
|
228
|
+
<p>In general, the specification can be from among the below, with
|
229
|
+
information on Dehn fillings added.</p>
|
230
|
+
<ul>
|
231
|
+
<li><p>SnapPea cusped census manifolds: e.g. ‘m123’, ‘s123’, ‘v123’.</p></li>
|
232
|
+
<li><p>Link complements:</p>
|
233
|
+
<blockquote>
|
234
|
+
<div><ul class="simple">
|
235
|
+
<li><p>Rolfsen’s table: e.g. ‘4_1’, ‘04_1’, ‘5^2_6’, ‘6_4^7’, ‘L20935’, ‘l104001’.</p></li>
|
236
|
+
<li><p>Hoste-Thistlethwaite Knotscape table: e.g. ‘11a17’ or ‘12n345’</p></li>
|
237
|
+
<li><p>Callahan-Dean-Weeks-Champanerkar-Kofman-Patterson knots: e.g. ‘K6_21’.</p></li>
|
238
|
+
<li><p>Dowker-Thistlethwaite code: e.g. ‘DT:[(6,8,2,4)]’</p></li>
|
239
|
+
</ul>
|
240
|
+
</div></blockquote>
|
241
|
+
</li>
|
242
|
+
<li><p>Once-punctured torus bundles: e.g. ‘b++LLR’, ‘b+-llR’, ‘bo-RRL’, ‘bn+LRLR’</p></li>
|
243
|
+
<li><p>Fibered manifold associated to a braid: ‘Braid[1,2,-3,4]’</p>
|
244
|
+
<p>Here, the braid is thought of as a mapping class of the
|
245
|
+
punctured disc, and this manifold is the corresponding
|
246
|
+
mapping torus. If you want the braid closure, do (1,0) filling
|
247
|
+
of the last cusp.</p>
|
248
|
+
</li>
|
249
|
+
<li><p>From mapping class group data using Twister:</p>
|
250
|
+
<p>‘Bundle(S_{1,1}, [a0, B1])’ or ‘Splitting(S_{1,0}, [b1, A0], [a0,B1])’</p>
|
251
|
+
<p>See the help for the ‘twister’ module for more.</p>
|
252
|
+
</li>
|
253
|
+
<li><p>A SnapPea triangulation or link projection file: ‘filename’</p>
|
254
|
+
<p>The file will be loaded if found in the current directory or the
|
255
|
+
path given by the shell variable <code class="docutils literal notranslate"><span class="pre">SNAPPEA_MANIFOLD_DIRECTORY</span></code>.
|
256
|
+
See <a class="reference internal" href="#snappy.Manifold.save" title="snappy.Manifold.save"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Manifold.save()</span></code></a> for details.</p>
|
257
|
+
</li>
|
258
|
+
<li><p>A string containing the contents of a SnapPea triangulation or link
|
259
|
+
projection file.</p></li>
|
260
|
+
</ul>
|
261
|
+
<dl class="py method">
|
262
|
+
<dt class="sig sig-object py" id="snappy.Manifold.DT_code">
|
263
|
+
<span class="sig-name descname"><span class="pre">DT_code</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">alpha</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">flips</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.DT_code" title="Link to this definition"></a></dt>
|
264
|
+
<dd><p>Return the Dowker-Thistlethwaite code of this link complement,
|
265
|
+
if it is a link complement. The DT code is intended to be an
|
266
|
+
immutable attribute, for use with knot and link exteriors
|
267
|
+
only, which is set only when the manifold was created.</p>
|
268
|
+
<p>Here is the Whitehead link:</p>
|
269
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'L5a1'</span><span class="p">)</span>
|
270
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">DT_code</span><span class="p">()</span>
|
271
|
+
<span class="go">[(6, 8), (2, 10, 4)]</span>
|
272
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">DT_code</span><span class="p">(</span><span class="n">alpha</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
273
|
+
<span class="go">'ebbccdaeb'</span>
|
274
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">DT_code</span><span class="p">(</span><span class="n">alpha</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">flips</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
275
|
+
<span class="go">'ebbccdaeb.01110'</span>
|
276
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">DT_code</span><span class="p">(</span><span class="n">flips</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
277
|
+
<span class="go">([(6, 8), (2, 10, 4)], [0, 1, 1, 1, 0])</span>
|
278
|
+
</pre></div>
|
279
|
+
</div>
|
280
|
+
</dd></dl>
|
281
|
+
|
282
|
+
<dl class="py method">
|
283
|
+
<dt class="sig sig-object py" id="snappy.Manifold.alexander_polynomial">
|
284
|
+
<span class="sig-name descname"><span class="pre">alexander_polynomial</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.alexander_polynomial" title="Link to this definition"></a></dt>
|
285
|
+
<dd><p>Computes the multivariable Alexander polynomial of the manifold:</p>
|
286
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'K12n123'</span><span class="p">)</span>
|
287
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">alexander_polynomial</span><span class="p">()</span>
|
288
|
+
<span class="mi">2</span><span class="o">*</span><span class="n">a</span><span class="o">^</span><span class="mi">6</span> <span class="o">-</span> <span class="mi">14</span><span class="o">*</span><span class="n">a</span><span class="o">^</span><span class="mi">5</span> <span class="o">+</span> <span class="mi">34</span><span class="o">*</span><span class="n">a</span><span class="o">^</span><span class="mi">4</span> <span class="o">-</span> <span class="mi">45</span><span class="o">*</span><span class="n">a</span><span class="o">^</span><span class="mi">3</span> <span class="o">+</span> <span class="mi">34</span><span class="o">*</span><span class="n">a</span><span class="o">^</span><span class="mi">2</span> <span class="o">-</span> <span class="mi">14</span><span class="o">*</span><span class="n">a</span> <span class="o">+</span> <span class="mi">2</span>
|
289
|
+
|
290
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">N</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'v1539(5,1)'</span><span class="p">)</span>
|
291
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">N</span><span class="o">.</span><span class="n">alexander_polynomial</span><span class="p">()</span>
|
292
|
+
<span class="n">a</span><span class="o">^</span><span class="mi">2</span><span class="o">*</span><span class="n">b</span> <span class="o">+</span> <span class="n">a</span><span class="o">*</span><span class="n">b</span><span class="o">^</span><span class="mi">2</span> <span class="o">+</span> <span class="n">a</span><span class="o">*</span><span class="n">b</span> <span class="o">+</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
|
293
|
+
</pre></div>
|
294
|
+
</div>
|
295
|
+
<p>Any provided keyword arguments are passed to
|
296
|
+
<a class="reference internal" href="triangulation.html#snappy.Triangulation.fundamental_group" title="snappy.Triangulation.fundamental_group"><code class="xref py py-meth docutils literal notranslate"><span class="pre">fundamental_group</span></code></a> and
|
297
|
+
so affect the group presentation used in the computation.</p>
|
298
|
+
</dd></dl>
|
299
|
+
|
300
|
+
<dl class="py method">
|
301
|
+
<dt class="sig sig-object py" id="snappy.Manifold.browse">
|
302
|
+
<span class="sig-name descname"><span class="pre">browse</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.browse" title="Link to this definition"></a></dt>
|
303
|
+
<dd><p>Opens browser window with a graphical interface, which allows to
|
304
|
+
explore the manifold and interact with it.
|
305
|
+
This includes: invariants, Dirichlet domain, cusp neighborhoods,
|
306
|
+
inside view, symmetry, Dehn filling, drilling, etc.</p>
|
307
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m125'</span><span class="p">)</span>
|
308
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">browse</span><span class="p">()</span>
|
309
|
+
</pre></div>
|
310
|
+
</div>
|
311
|
+
<p>This does not work when using SnapPy in a Docker container.</p>
|
312
|
+
</dd></dl>
|
313
|
+
|
314
|
+
<dl class="py method">
|
315
|
+
<dt class="sig sig-object py" id="snappy.Manifold.canonical_retriangulation">
|
316
|
+
<span class="sig-name descname"><span class="pre">canonical_retriangulation</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">interval_bits_precs</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Sequence</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">[53,</span> <span class="pre">212]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exact_bits_prec_and_degrees</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Sequence</span><span class="p"><span class="pre">[</span></span><span class="pre">Tuple</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">int</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">[(212,</span> <span class="pre">10),</span> <span class="pre">(1000,</span> <span class="pre">20),</span> <span class="pre">(2000,</span> <span class="pre">20)]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><span class="pre">Triangulation</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">Manifold</span></a></span></span><a class="headerlink" href="#snappy.Manifold.canonical_retriangulation" title="Link to this definition"></a></dt>
|
317
|
+
<dd><p>Returns a triangulation canonically associated to the hyperbolic manifold.
|
318
|
+
That is, the triangulation is (up to combinatorial isomorphism relabeling
|
319
|
+
the tetrahedra and vertices) completely determined by the isometry type of
|
320
|
+
the hyperbolic manifold.</p>
|
321
|
+
<p>Manifolds with incomplete cusps are rejected (unlike in the case of
|
322
|
+
<a class="reference internal" href="#snappy.Manifold.isometry_signature" title="snappy.Manifold.isometry_signature"><code class="xref py py-meth docutils literal notranslate"><span class="pre">isometry_signature</span></code></a>).</p>
|
323
|
+
<p>We now describe the canonical retriangulation. If all cells of
|
324
|
+
the canonical cell decomposition (defined by <a class="reference external" href="https://projecteuclid.org/euclid.jdg/1214441650">Epstein and Penner ‘88</a>) are tetrahedral,
|
325
|
+
<a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation</span></code></a>
|
326
|
+
simply returns that ideal triangulation as a
|
327
|
+
<a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><code class="xref py py-class docutils literal notranslate"><span class="pre">Manifold</span></code></a>. Here is an example:</p>
|
328
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m015"</span><span class="p">)</span>
|
329
|
+
<span class="gp">>>> </span><span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
|
330
|
+
<span class="gp">>>> </span><span class="n">K</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span>
|
331
|
+
<span class="go">False</span>
|
332
|
+
<span class="gp">>>> </span><span class="n">K</span><span class="o">.</span><span class="n">solution_type</span><span class="p">()</span>
|
333
|
+
<span class="go">'all tetrahedra positively oriented'</span>
|
334
|
+
</pre></div>
|
335
|
+
</div>
|
336
|
+
<p>If there are non-tetrahedral cells,
|
337
|
+
<a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation</span></code></a>
|
338
|
+
subdivides the canonical cell decomposition. It introduces a finite vertex
|
339
|
+
for each canonical cell resulting in a
|
340
|
+
<a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><code class="xref py py-class docutils literal notranslate"><span class="pre">Triangulation</span></code></a>. Here is an example where the
|
341
|
+
canonical cell is a cube:</p>
|
342
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m412"</span><span class="p">)</span>
|
343
|
+
<span class="gp">>>> </span><span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
|
344
|
+
<span class="gp">>>> </span><span class="n">K</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span>
|
345
|
+
<span class="go">True</span>
|
346
|
+
</pre></div>
|
347
|
+
</div>
|
348
|
+
<p>The canonical retriangulation can be used to find the symmetries of a
|
349
|
+
single manifold. It also can compute the isometries between two
|
350
|
+
manifolds. We do this using
|
351
|
+
<a class="reference internal" href="triangulation.html#snappy.Triangulation.isomorphisms_to" title="snappy.Triangulation.isomorphisms_to"><code class="xref py py-meth docutils literal notranslate"><span class="pre">isomorphisms_to</span></code></a>:</p>
|
352
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"5_2"</span><span class="p">)</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
|
353
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m015"</span><span class="p">)</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
|
354
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">isomorphisms_to</span><span class="p">(</span><span class="n">M</span><span class="p">)</span>
|
355
|
+
<span class="go">[0 -> 0</span>
|
356
|
+
<span class="go">[1 0]</span>
|
357
|
+
<span class="go">[0 1]</span>
|
358
|
+
<span class="go">...</span>
|
359
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">isomorphisms_to</span><span class="p">(</span><span class="n">N</span><span class="p">)</span>
|
360
|
+
<span class="go">[0 -> 0</span>
|
361
|
+
<span class="go">[-1 2]</span>
|
362
|
+
<span class="go">[ 0 -1]</span>
|
363
|
+
<span class="go">...</span>
|
364
|
+
</pre></div>
|
365
|
+
</div>
|
366
|
+
<p>The canonical retriangulation is also the basis for the
|
367
|
+
<a class="reference internal" href="#snappy.Manifold.isometry_signature" title="snappy.Manifold.isometry_signature"><code class="xref py py-meth docutils literal notranslate"><span class="pre">isometry_signature</span></code></a>.</p>
|
368
|
+
<p><strong>Subdivision</strong></p>
|
369
|
+
<p>If the canonical cell decomposition has a non-tetrahedral cell, the method
|
370
|
+
subdivides. You can think of the subdivision in either of the following
|
371
|
+
(equivalent) ways:</p>
|
372
|
+
<ul class="simple">
|
373
|
+
<li><p>A coarsening of the barycentric subdivision with only a quarter of the
|
374
|
+
number of tetrahedra. That is, take the barycentric subdivision and
|
375
|
+
merge the four tetrahedra adjacent to a barycentric edge connecting
|
376
|
+
an edge midpoint to a face midpoint.</p></li>
|
377
|
+
<li><p>Taking the double suspension of each face (which is an ideal n-gon)
|
378
|
+
about the centers of the two neighboring 3-cells. Then split each
|
379
|
+
such topological “lens” into n tetrahedra along its central axis.</p></li>
|
380
|
+
</ul>
|
381
|
+
<p><strong>Verified computations</strong></p>
|
382
|
+
<p>While the canonical retriangulation is combinatorial, some intermediate
|
383
|
+
computations are numerical. Thus, if <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>,
|
384
|
+
floating-point issues can arise.
|
385
|
+
(Arguably this gave rise to a mistake in the
|
386
|
+
non-orientable census. <code class="docutils literal notranslate"><span class="pre">x101</span></code> and <code class="docutils literal notranslate"><span class="pre">x103</span></code> were later identified as
|
387
|
+
the same by <a class="reference external" href="http://arxiv.org/abs/1311.7615">Burton ‘14</a>.)</p>
|
388
|
+
<p>The method can be made <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing
|
389
|
+
<code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
|
390
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"v2986"</span><span class="p">)</span>
|
391
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">(</span><span class="n">verified</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
|
392
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">K</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span> <span class="c1"># Cell decomposition verified to be tetrahedral</span>
|
393
|
+
<span class="kc">False</span>
|
394
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">K</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="c1"># Verified isometry signature.</span>
|
395
|
+
<span class="s1">'jvLALQQdeefgihihiokcmmwwswg'</span>
|
396
|
+
<span class="n">sage</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">K</span><span class="o">.</span><span class="n">isomorphisms_to</span><span class="p">(</span><span class="n">K</span><span class="p">))</span> <span class="c1"># Verified to have no (non-trivial) symmetries.</span>
|
397
|
+
<span class="mi">1</span>
|
398
|
+
</pre></div>
|
399
|
+
</div>
|
400
|
+
<p>Interval arithmetic can only be used to verify the canonical cell decomposition
|
401
|
+
if all cells are tetrahedral. For non-tetrahedral cells, the method
|
402
|
+
automatically switches to
|
403
|
+
exact methods to verify the canonical cell decomposition. That is, it uses
|
404
|
+
snap-like methods
|
405
|
+
(<a class="reference external" href="http://en.wikipedia.org/wiki/Lenstra%E2%80%93Lenstra%E2%80%93Lov%C3%A1sz_lattice_basis_reduction_algorithm">LLL-algorithm</a>)
|
406
|
+
to guess a representation of the
|
407
|
+
shapes in the shape field. It then uses exact arithmetic to verify the
|
408
|
+
shapes form a valid geometric structure and compute the necessary tilts
|
409
|
+
to verify the canonical cell decomposition. Note that this can take a
|
410
|
+
long time!</p>
|
411
|
+
<p>Here is an example where exact methods are used:</p>
|
412
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m412"</span><span class="p">)</span>
|
413
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">(</span><span class="n">verified</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
|
414
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">K</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span> <span class="c1"># Has non-tetrahedral cell</span>
|
415
|
+
<span class="kc">True</span>
|
416
|
+
</pre></div>
|
417
|
+
</div>
|
418
|
+
<p>If the canonical retriangulation cannot be verified, an exception will be
|
419
|
+
raised. (Note that this is new (and safer) in Version 3.2. Prior to that
|
420
|
+
version, <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Manifold.canonical_retriangulation()</span></code></a> could return <code class="docutils literal notranslate"><span class="pre">None</span></code>
|
421
|
+
instead.)</p>
|
422
|
+
<p>Here is an example where we skip the (potentially lengthy) exact methods
|
423
|
+
needed to verify a non-tetrahedral cell. The method fails (early
|
424
|
+
and with an exception) since the cells are actually tetrahedral:</p>
|
425
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m412"</span><span class="p">)</span>
|
426
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">(</span><span class="n">verified</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">exact_bits_prec_and_degrees</span> <span class="o">=</span> <span class="p">[])</span> <span class="c1"># doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL</span>
|
427
|
+
<span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
|
428
|
+
<span class="o">...</span>
|
429
|
+
<span class="n">snappy</span><span class="o">.</span><span class="n">verify</span><span class="o">.</span><span class="n">exceptions</span><span class="o">.</span><span class="n">TiltInequalityNumericalVerifyError</span><span class="p">:</span> <span class="n">Numerical</span> <span class="n">verification</span> <span class="n">that</span> <span class="n">tilt</span> <span class="ow">is</span> <span class="n">negative</span> <span class="n">has</span> <span class="n">failed</span><span class="p">:</span> <span class="o">...</span> <span class="o"><</span> <span class="mi">0</span>
|
430
|
+
</pre></div>
|
431
|
+
</div>
|
432
|
+
<dl class="field-list simple">
|
433
|
+
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
|
434
|
+
<dd class="field-odd"><ul class="simple">
|
435
|
+
<li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
|
436
|
+
<li><p><strong>interval_bits_precs</strong> – Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>.
|
437
|
+
A list of (increasing) precisions used to try to
|
438
|
+
certify the canonical cell decomposition using intervals. Each
|
439
|
+
precision is tried until we succeed. If none succeeded, we move on
|
440
|
+
to exact methods.</p></li>
|
441
|
+
<li><p><strong>exact_bits_prec_and_degrees</strong> – Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>.
|
442
|
+
A list of pairs (precision, max degree) used when the
|
443
|
+
LLL-algorithm is trying to find the defining
|
444
|
+
polynomial of the shape field with
|
445
|
+
<code class="docutils literal notranslate"><span class="pre">ListOfApproximateAlgebraicNumbers.find_field</span></code>.
|
446
|
+
Each pair is tried until we succeed.</p></li>
|
447
|
+
<li><p><strong>verbose</strong> – Print information about the methods tried to compute and verify the
|
448
|
+
canonical retriangulation.</p></li>
|
449
|
+
</ul>
|
450
|
+
</dd>
|
451
|
+
<dt class="field-even">Returns<span class="colon">:</span></dt>
|
452
|
+
<dd class="field-even"><p>If the canonical cell decomposition exists entirely of
|
453
|
+
(hyperbolic ideal) tetrahedra, a <a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><code class="xref py py-class docutils literal notranslate"><span class="pre">Manifold</span></code></a> with those
|
454
|
+
tetrahedra.
|
455
|
+
Otherwise, a <a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><code class="xref py py-class docutils literal notranslate"><span class="pre">Triangulation</span></code></a> that is a subdivision of the
|
456
|
+
canonical cell decomposition.</p>
|
457
|
+
</dd>
|
458
|
+
</dl>
|
459
|
+
</dd></dl>
|
460
|
+
|
461
|
+
<dl class="py method">
|
462
|
+
<dt class="sig sig-object py" id="snappy.Manifold.canonize">
|
463
|
+
<span class="sig-name descname"><span class="pre">canonize</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#snappy.Manifold.canonize" title="Link to this definition"></a></dt>
|
464
|
+
<dd><p>Change the triangulation to an arbitrary retriangulation of
|
465
|
+
the canonical cell decomposition. See
|
466
|
+
<a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation</span></code></a>
|
467
|
+
to get the actual canonical cell decomposition.</p>
|
468
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m007'</span><span class="p">)</span>
|
469
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">num_tetrahedra</span><span class="p">()</span>
|
470
|
+
<span class="go">3</span>
|
471
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">canonize</span><span class="p">()</span>
|
472
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">num_tetrahedra</span><span class="p">()</span>
|
473
|
+
<span class="go">4</span>
|
474
|
+
</pre></div>
|
475
|
+
</div>
|
476
|
+
<p>Note: Due to rounding error, it is possible that this is actually
|
477
|
+
not a retriangulation of the canonical cell decomposition.</p>
|
478
|
+
</dd></dl>
|
479
|
+
|
480
|
+
<dl class="py method">
|
481
|
+
<dt class="sig sig-object py" id="snappy.Manifold.chern_simons">
|
482
|
+
<span class="sig-name descname"><span class="pre">chern_simons</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">accuracy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.chern_simons" title="Link to this definition"></a></dt>
|
483
|
+
<dd><p>Returns the Chern-Simons invariant of the manifold (normalized by
|
484
|
+
dividing it by <span class="math notranslate nohighlight">\(2 \pi^2\)</span>), if it is known.</p>
|
485
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m015'</span><span class="p">)</span>
|
486
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">()</span>
|
487
|
+
<span class="go">-0.15320413</span>
|
488
|
+
</pre></div>
|
489
|
+
</div>
|
490
|
+
<p>The return value has an extra attribute, accuracy, which
|
491
|
+
is the number of digits of accuracy as <em>estimated</em> by SnapPea.</p>
|
492
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">cs</span><span class="p">,</span> <span class="n">accuracy</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">(</span><span class="n">accuracy</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
|
493
|
+
<span class="gp">>>> </span><span class="n">accuracy</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">56</span><span class="p">)</span> <span class="c1"># Low and High precision</span>
|
494
|
+
<span class="go">True</span>
|
495
|
+
</pre></div>
|
496
|
+
</div>
|
497
|
+
<p>By default, when the manifold has at least one cusp, Zickert’s
|
498
|
+
algorithm is used; when the manifold is closed we use SnapPea’s
|
499
|
+
original algorithm, which is based on Meyerhoff-Hodgson-Neumann.</p>
|
500
|
+
<p>Note: When computing the Chern-Simons invariant of a closed
|
501
|
+
manifold, one must sometimes compute it first for the unfilled
|
502
|
+
manifold so as to initialize SnapPea’s internals. For instance,</p>
|
503
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'5_2'</span><span class="p">)</span>
|
504
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">()</span>
|
505
|
+
<span class="go">-0.15320413</span>
|
506
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">(</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span> <span class="p">)</span>
|
507
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">()</span>
|
508
|
+
<span class="go">0.07731787</span>
|
509
|
+
</pre></div>
|
510
|
+
</div>
|
511
|
+
<p>works, but will fail with
|
512
|
+
<code class="docutils literal notranslate"><span class="pre">ValueError:</span> <span class="pre">The</span> <span class="pre">Chern-Simons</span> <span class="pre">invariant</span> <span class="pre">isn't</span> <span class="pre">currently</span> <span class="pre">known.</span></code>
|
513
|
+
if the first call to chern_simons is not made.</p>
|
514
|
+
</dd></dl>
|
515
|
+
|
516
|
+
<dl class="py method">
|
517
|
+
<dt class="sig sig-object py" id="snappy.Manifold.complex_volume">
|
518
|
+
<span class="sig-name descname"><span class="pre">complex_volume</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">verified_modulo_2_torsion</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.complex_volume" title="Link to this definition"></a></dt>
|
519
|
+
<dd><p>Returns the complex volume modulo <span class="math notranslate nohighlight">\(i \pi^2\)</span> which is given by</p>
|
520
|
+
<div class="math notranslate nohighlight">
|
521
|
+
\[\text{vol} + i \text{CS}\]</div>
|
522
|
+
<p>where <span class="math notranslate nohighlight">\(\text{CS}\)</span> is the (unnormalized) Chern-Simons invariant.</p>
|
523
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'5_2'</span><span class="p">)</span>
|
524
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">complex_volume</span><span class="p">()</span>
|
525
|
+
<span class="go">2.82812209 - 3.02412838*I</span>
|
526
|
+
</pre></div>
|
527
|
+
</div>
|
528
|
+
<p>Note that <a class="reference internal" href="#snappy.Manifold.chern_simons" title="snappy.Manifold.chern_simons"><code class="xref py py-meth docutils literal notranslate"><span class="pre">chern_simons</span></code></a>
|
529
|
+
normalizes the Chern-Simons invariant by dividing it by
|
530
|
+
<span class="math notranslate nohighlight">\(2 \pi^2 = 19.7392...\)</span></p>
|
531
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">()</span>
|
532
|
+
<span class="go">-0.153204133297152</span>
|
533
|
+
</pre></div>
|
534
|
+
</div>
|
535
|
+
<p>More examples:</p>
|
536
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span>
|
537
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">complex_volume</span><span class="p">()</span>
|
538
|
+
<span class="go">2.22671790 + 1.52619361*I</span>
|
539
|
+
<span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"3_1"</span><span class="p">)</span> <span class="c1"># A non-hyperbolic example.</span>
|
540
|
+
<span class="gp">>>> </span><span class="n">cvol</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">complex_volume</span><span class="p">()</span>
|
541
|
+
<span class="gp">>>> </span><span class="n">cvol</span><span class="o">.</span><span class="n">real</span><span class="p">()</span>
|
542
|
+
<span class="go">0</span>
|
543
|
+
<span class="gp">>>> </span><span class="n">cvol</span><span class="o">.</span><span class="n">imag</span><span class="p">()</span>
|
544
|
+
<span class="go">-1.64493407</span>
|
545
|
+
</pre></div>
|
546
|
+
</div>
|
547
|
+
<p>If no cusp is filled or there is only one cusped (filled or
|
548
|
+
unfilled), the complex volume can be verified up to multiples
|
549
|
+
of <span class="math notranslate nohighlight">\(i \pi^2 /2\)</span> by passing <code class="docutils literal notranslate"><span class="pre">verified_modulo_2_torsion</span> <span class="pre">=</span> <span class="pre">True</span></code>
|
550
|
+
when inside SageMath. Higher precision can be requested
|
551
|
+
with <code class="docutils literal notranslate"><span class="pre">bits_prec</span></code>:</p>
|
552
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>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
|
+
</pre></div>
|
559
|
+
</div>
|
560
|
+
</dd></dl>
|
561
|
+
|
562
|
+
<dl class="py method">
|
563
|
+
<dt class="sig sig-object py" id="snappy.Manifold.copy">
|
564
|
+
<span class="sig-name descname"><span class="pre">copy</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.copy" title="Link to this definition"></a></dt>
|
565
|
+
<dd><p>Returns a copy of the manifold</p>
|
566
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m015'</span><span class="p">)</span>
|
567
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
568
|
+
</pre></div>
|
569
|
+
</div>
|
570
|
+
</dd></dl>
|
571
|
+
|
572
|
+
<dl class="py method">
|
573
|
+
<dt class="sig sig-object py" id="snappy.Manifold.cover">
|
574
|
+
<span class="sig-name descname"><span class="pre">cover</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">permutation_rep</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">snappy.Manifold</span></a></span></span><a class="headerlink" href="#snappy.Manifold.cover" title="Link to this definition"></a></dt>
|
575
|
+
<dd><p>Returns a <a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><code class="xref py py-class docutils literal notranslate"><span class="pre">Manifold</span></code></a> representing the finite cover specified by a
|
576
|
+
transitive permutation representation. The representation is
|
577
|
+
specified by a list of permutations, one for each generator of the
|
578
|
+
simplified presentation of the fundamental group. Each permutation is
|
579
|
+
specified as a list <code class="docutils literal notranslate"><span class="pre">P</span></code> such such that <code class="docutils literal notranslate"><span class="pre">set(P)</span> <span class="pre">==</span> <span class="pre">set(range(d))</span></code>
|
580
|
+
where <code class="docutils literal notranslate"><span class="pre">d</span></code> is the degree of the cover.</p>
|
581
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
582
|
+
<span class="gp">>>> </span><span class="n">N0</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">3</span><span class="p">]])</span>
|
583
|
+
<span class="gp">>>> </span><span class="nb">abs</span><span class="p">(</span><span class="n">N0</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span><span class="o">/</span><span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span> <span class="o">-</span> <span class="mi">5</span><span class="p">)</span> <span class="o"><</span> <span class="mf">0.0000000001</span>
|
584
|
+
<span class="go">True</span>
|
585
|
+
</pre></div>
|
586
|
+
</div>
|
587
|
+
<p>If within SageMath, the permutations can also be of type
|
588
|
+
<code class="docutils literal notranslate"><span class="pre">PermutationGroupElement</span></code>, in which case they act on the set
|
589
|
+
<code class="docutils literal notranslate"><span class="pre">range(1,</span> <span class="pre">d</span> <span class="pre">+</span> <span class="pre">1)</span></code>. Or, you can specify a GAP or Magma subgroup
|
590
|
+
of the fundamental group. Some examples:</p>
|
591
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
592
|
+
</pre></div>
|
593
|
+
</div>
|
594
|
+
<p>The basic method:</p>
|
595
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">N0</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">3</span><span class="p">]])</span>
|
596
|
+
</pre></div>
|
597
|
+
</div>
|
598
|
+
<p>From a Gap subgroup:</p>
|
599
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">G</span> <span class="o">=</span> <span class="n">gap</span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">())</span>
|
600
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">H</span> <span class="o">=</span> <span class="n">G</span><span class="o">.</span><span class="n">LowIndexSubgroupsFpGroup</span><span class="p">(</span><span class="mi">5</span><span class="p">)[</span><span class="mi">9</span><span class="p">]</span>
|
601
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">N1</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">(</span><span class="n">H</span><span class="p">)</span>
|
602
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">N0</span> <span class="o">==</span> <span class="n">N1</span>
|
603
|
+
<span class="kc">True</span>
|
604
|
+
</pre></div>
|
605
|
+
</div>
|
606
|
+
<p>Or a homomorphism to a permutation group:</p>
|
607
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">f</span> <span class="o">=</span> <span class="n">G</span><span class="o">.</span><span class="n">GQuotients</span><span class="p">(</span><span class="n">PSL</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">7</span><span class="p">))[</span><span class="mi">1</span><span class="p">]</span>
|
608
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">N2</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
609
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">N2</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span><span class="o">/</span><span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span> <span class="c1"># doctest: +NUMERIC9</span>
|
610
|
+
<span class="mf">8.00000000</span>
|
611
|
+
</pre></div>
|
612
|
+
</div>
|
613
|
+
<p>Or maybe we want larger cover coming from the kernel of this:</p>
|
614
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">N3</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">Kernel</span><span class="p">())</span>
|
615
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">N3</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span><span class="o">/</span><span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span> <span class="c1"># doctest: +NUMERIC9</span>
|
616
|
+
<span class="mf">168.00000000</span>
|
617
|
+
</pre></div>
|
618
|
+
</div>
|
619
|
+
<p>Check the homology against what Gap computes directly:</p>
|
620
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">N3</span><span class="o">.</span><span class="n">homology</span><span class="p">()</span><span class="o">.</span><span class="n">betti_number</span><span class="p">()</span>
|
621
|
+
<span class="mi">32</span>
|
622
|
+
<span class="n">sage</span><span class="p">:</span> <span class="nb">len</span><span class="p">([</span> <span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">f</span><span class="o">.</span><span class="n">Kernel</span><span class="p">()</span><span class="o">.</span><span class="n">AbelianInvariants</span><span class="p">()</span><span class="o">.</span><span class="n">sage</span><span class="p">()</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">0</span><span class="p">])</span>
|
623
|
+
<span class="mi">32</span>
|
624
|
+
</pre></div>
|
625
|
+
</div>
|
626
|
+
<p>We can do the same for Magma:</p>
|
627
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">G</span> <span class="o">=</span> <span class="n">magma</span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">())</span> <span class="c1">#doctest: +SKIP</span>
|
628
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">Q</span><span class="p">,</span> <span class="n">f</span> <span class="o">=</span> <span class="n">G</span><span class="o">.</span><span class="n">pQuotient</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">nvals</span> <span class="o">=</span> <span class="mi">2</span><span class="p">)</span> <span class="c1">#doctest: +SKIP</span>
|
629
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">Kernel</span><span class="p">())</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span> <span class="c1">#doctest: +SKIP</span>
|
630
|
+
<span class="mf">10.14941606</span>
|
631
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">h</span> <span class="o">=</span> <span class="n">G</span><span class="o">.</span><span class="n">SimpleQuotients</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)[</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">]</span> <span class="c1">#doctest: +SKIP</span>
|
632
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">N4</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">(</span><span class="n">h</span><span class="p">)</span> <span class="c1">#doctest: +SKIP</span>
|
633
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">N2</span> <span class="o">==</span> <span class="n">N4</span> <span class="c1">#doctest: +SKIP</span>
|
634
|
+
<span class="kc">True</span>
|
635
|
+
</pre></div>
|
636
|
+
</div>
|
637
|
+
</dd></dl>
|
638
|
+
|
639
|
+
<dl class="py method">
|
640
|
+
<dt class="sig sig-object py" id="snappy.Manifold.cover_info">
|
641
|
+
<span class="sig-name descname"><span class="pre">cover_info</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.cover_info" title="Link to this definition"></a></dt>
|
642
|
+
<dd><p>If this is a manifold or triangulation which was constructed as
|
643
|
+
a covering space, return a dictionary describing the cover. Otherwise
|
644
|
+
return 0. The dictionary keys are ‘base’, ‘type’ and ‘degree’.</p>
|
645
|
+
</dd></dl>
|
646
|
+
|
647
|
+
<dl class="py method">
|
648
|
+
<dt class="sig sig-object py" id="snappy.Manifold.covers">
|
649
|
+
<span class="sig-name descname"><span class="pre">covers</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">degree</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">method</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cover_type</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'all'</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">list</span><span class="p"><span class="pre">[</span></span><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">snappy.Manifold</span></a><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#snappy.Manifold.covers" title="Link to this definition"></a></dt>
|
650
|
+
<dd><p>Returns a list of <a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><code class="xref py py-class docutils literal notranslate"><span class="pre">Manifold</span></code></a>s corresponding to all of the
|
651
|
+
finite covers of the given degree. The default method is
|
652
|
+
‘low_index’ for general covers and ‘snappea’ for cyclic
|
653
|
+
covers. The former uses Sim’s algorithm while the latter
|
654
|
+
uses the original Snappea algorithm.</p>
|
655
|
+
<p>WARNING: If the degree is large this might take a very, very,
|
656
|
+
very long time.</p>
|
657
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m003'</span><span class="p">)</span>
|
658
|
+
<span class="gp">>>> </span><span class="n">covers</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">covers</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
|
659
|
+
<span class="gp">>>> </span><span class="nb">sorted</span><span class="p">(</span><span class="n">N</span><span class="o">.</span><span class="n">homology</span><span class="p">()</span> <span class="k">for</span> <span class="n">N</span> <span class="ow">in</span> <span class="n">covers</span><span class="p">)</span>
|
660
|
+
<span class="go">[Z/3 + Z/15 + Z, Z/5 + Z + Z]</span>
|
661
|
+
</pre></div>
|
662
|
+
</div>
|
663
|
+
<p>It is faster to look just at cyclic covers.</p>
|
664
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">covers</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">covers</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="n">cover_type</span><span class="o">=</span><span class="s1">'cyclic'</span><span class="p">)</span>
|
665
|
+
<span class="gp">>>> </span><span class="p">[(</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="o">.</span><span class="n">homology</span><span class="p">())</span> <span class="k">for</span> <span class="n">N</span> <span class="ow">in</span> <span class="n">covers</span><span class="p">]</span>
|
666
|
+
<span class="go">[(m003~cyc~0(0,0), Z/3 + Z/15 + Z)]</span>
|
667
|
+
</pre></div>
|
668
|
+
</div>
|
669
|
+
<p>Here we check that we get the same number of covers with the
|
670
|
+
‘snappea’ and ‘low_index’ methods.</p>
|
671
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m125'</span><span class="p">)</span>
|
672
|
+
<span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">covers</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span>
|
673
|
+
<span class="go">19</span>
|
674
|
+
<span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">covers</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">'snappea'</span><span class="p">))</span>
|
675
|
+
<span class="go">19</span>
|
676
|
+
</pre></div>
|
677
|
+
</div>
|
678
|
+
<p>If you are using Sage, you can use GAP to find the subgroups,
|
679
|
+
which is often much faster, by specifying the optional
|
680
|
+
argument method = ‘gap’ If you have Magma installed, you can
|
681
|
+
used it to do the heavy lifting by specifying method=’magma’.</p>
|
682
|
+
</dd></dl>
|
683
|
+
|
684
|
+
<dl class="py method">
|
685
|
+
<dt class="sig sig-object py" id="snappy.Manifold.cusp_area_matrix">
|
686
|
+
<span class="sig-name descname"><span class="pre">cusp_area_matrix</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">method</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'maximal'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.cusp_area_matrix" title="Link to this definition"></a></dt>
|
687
|
+
<dd><p>Returns the maximal cusp area matrix <span class="math notranslate nohighlight">\((A_{ij})\)</span> where
|
688
|
+
<span class="math notranslate nohighlight">\(A_{ij}\)</span> is defined as follows.
|
689
|
+
Let <span class="math notranslate nohighlight">\(C_i\)</span> and <span class="math notranslate nohighlight">\(C_j\)</span> be the (open) cusp neighborhoods about cusp
|
690
|
+
<span class="math notranslate nohighlight">\(i\)</span> and <span class="math notranslate nohighlight">\(j\)</span>. Let <span class="math notranslate nohighlight">\(A(C_i)\)</span> and <span class="math notranslate nohighlight">\(A(C_j)\)</span> be the
|
691
|
+
areas of <span class="math notranslate nohighlight">\(C_i\)</span> and <span class="math notranslate nohighlight">\(C_j\)</span>, respectively. Then, <span class="math notranslate nohighlight">\(C_i\)</span>
|
692
|
+
and <span class="math notranslate nohighlight">\(C_j\)</span> are embedded (if <span class="math notranslate nohighlight">\(i = j\)</span>) or disjoint (otherwise)
|
693
|
+
if and only if <span class="math notranslate nohighlight">\(A(C_i)A(C_j) \leq A_{ij}\)</span>.</p>
|
694
|
+
<p>Here is an example:</p>
|
695
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"L6a5"</span><span class="p">)</span>
|
696
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_area_matrix</span><span class="p">()</span>
|
697
|
+
<span class="go">[27.9999999999996 7.00000000000000 7.00000000000000]</span>
|
698
|
+
<span class="go">[7.00000000000000 27.9999999999999 7.00000000000000]</span>
|
699
|
+
<span class="go">[7.00000000000000 7.00000000000000 28.0000000000001]</span>
|
700
|
+
</pre></div>
|
701
|
+
</div>
|
702
|
+
<p><strong>Faster lower bounds</strong></p>
|
703
|
+
<p>This section can be skipped by most users!</p>
|
704
|
+
<p>Prior to SnapPy version 3.2, the algorithm to compute the maximal cusp
|
705
|
+
area matrix was much slower and required <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code> and
|
706
|
+
SageMath. Thus, in prior versions, <code class="xref py py-attr docutils literal notranslate"><span class="pre">method</span></code> defaulted to
|
707
|
+
<code class="docutils literal notranslate"><span class="pre">trigDependentTryCanonize</span></code>. This meant, that, by default,
|
708
|
+
<a class="reference internal" href="#snappy.Manifold.cusp_area_matrix" title="snappy.Manifold.cusp_area_matrix"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_area_matrix()</span></code></a> only returned
|
709
|
+
(some) lower bounds for the maximal cusp area matrix entries.</p>
|
710
|
+
<p>These lower bounds can still be accessed:</p>
|
711
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_area_matrix</span><span class="p">(</span><span class="n">method</span> <span class="o">=</span> <span class="s1">'trigDependentTryCanonize'</span><span class="p">)</span>
|
712
|
+
<span class="go">[21.4375000000000 7.00000000000000 7.00000000000000]</span>
|
713
|
+
<span class="go">[7.00000000000000 28.0000000000000 7.00000000000000]</span>
|
714
|
+
<span class="go">[7.00000000000000 7.00000000000000 28.0000000000000]</span>
|
715
|
+
</pre></div>
|
716
|
+
</div>
|
717
|
+
<p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">method</span> <span class="pre">=</span> <span class="pre">'trigDependent'</span></code> or
|
718
|
+
<code class="xref py py-attr docutils literal notranslate"><span class="pre">method</span> <span class="pre">=</span> <span class="pre">'trigDependenyTryCanonize'</span></code>, the result is triangulation
|
719
|
+
dependent or not even deterministic, respectively.
|
720
|
+
Furthermore, if <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code> is also set, while the left
|
721
|
+
endpoints of the intervals are lower bounds for the maximal cusp area
|
722
|
+
matrix entries, the right endpoints are meaningless and could be smaller
|
723
|
+
or larger than the maximal cusp area matrix entries.</p>
|
724
|
+
<p><strong>Verified computation</strong></p>
|
725
|
+
<p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>, floating-point issues can arise resulting in
|
726
|
+
incorrect values. The method can be made
|
727
|
+
<a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
|
728
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M.cusp_area_matrix(verified=True) # doctest: +NUMERIC3
|
729
|
+
[ 28.0000? 7.000000000000? 7.00000000000?]
|
730
|
+
[7.000000000000? 28.000000? 7.00000000000?]
|
731
|
+
[ 7.00000000000? 7.00000000000? 28.00000?]
|
732
|
+
</pre></div>
|
733
|
+
</div>
|
734
|
+
<dl class="field-list simple">
|
735
|
+
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
|
736
|
+
<dd class="field-odd"><ul class="simple">
|
737
|
+
<li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
|
738
|
+
<li><p><strong>bits_prec</strong> – Precision used for computation. Increase if computation
|
739
|
+
did not succeed or a more precise result is desired.</p></li>
|
740
|
+
<li><p><strong>method</strong> – Switches to older algorithms giving lower bounds when
|
741
|
+
<code class="docutils literal notranslate"><span class="pre">trigDependentTryCanonize</span></code> and <code class="docutils literal notranslate"><span class="pre">trigDependent</span></code>.</p></li>
|
742
|
+
</ul>
|
743
|
+
</dd>
|
744
|
+
<dt class="field-even">Returns<span class="colon">:</span></dt>
|
745
|
+
<dd class="field-even"><p>Maximal cusp area matrix (default) or lower bounds
|
746
|
+
(if <code class="xref py py-attr docutils literal notranslate"><span class="pre">method</span></code> switches to older algorithm).</p>
|
747
|
+
</dd>
|
748
|
+
</dl>
|
749
|
+
</dd></dl>
|
750
|
+
|
751
|
+
<dl class="py method">
|
752
|
+
<dt class="sig sig-object py" id="snappy.Manifold.cusp_areas">
|
753
|
+
<span class="sig-name descname"><span class="pre">cusp_areas</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">policy</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'unbiased'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">method</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'maximal'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">first_cusps</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">[]</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.cusp_areas" title="Link to this definition"></a></dt>
|
754
|
+
<dd><p>Returns a list of areas, one for each cusp. The cusp neighborhoods
|
755
|
+
defined by these areas are embedded and disjoint. Furthermore, these
|
756
|
+
neighborhoods are maximal in that they fail to be embedded or
|
757
|
+
disjoint if any cusp neighborhood is enlarged (unless <code class="xref py py-attr docutils literal notranslate"><span class="pre">method</span></code>
|
758
|
+
is set to a value different from the default).</p>
|
759
|
+
<p>There are different policies how these cusp neighborhoods are found.</p>
|
760
|
+
<p>The default <code class="xref py py-attr docutils literal notranslate"><span class="pre">policy</span></code> is <code class="docutils literal notranslate"><span class="pre">unbiased</span></code>. This means that the
|
761
|
+
cusp neighborhoods are blown up simultaneously and a cusp neighborhood
|
762
|
+
stops growing when it touches any cusp neighborhood including itself:</p>
|
763
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"s776"</span><span class="p">)</span>
|
764
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_areas</span><span class="p">()</span>
|
765
|
+
<span class="go">[2.64575131106459, 2.64575131106459, 2.64575131106459]</span>
|
766
|
+
</pre></div>
|
767
|
+
</div>
|
768
|
+
<p>Alternatively, <code class="xref py py-attr docutils literal notranslate"><span class="pre">policy='greedy'</span></code> can be specified. This means
|
769
|
+
that the first cusp neighborhood is blown up until it touches itself,
|
770
|
+
then the second cusp neighborhood is blown up until it touches itself
|
771
|
+
or the first cusp neighborhood, and so on:</p>
|
772
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_areas</span><span class="p">(</span><span class="n">policy</span><span class="o">=</span><span class="s1">'greedy'</span><span class="p">)</span>
|
773
|
+
<span class="go">[5.29150262212918, 1.32287565553230, 1.32287565553229]</span>
|
774
|
+
</pre></div>
|
775
|
+
</div>
|
776
|
+
<p>Use <code class="xref py py-attr docutils literal notranslate"><span class="pre">first_cusps</span></code> to specify the order in which the cusp
|
777
|
+
neighborhoods are blown up:</p>
|
778
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_areas</span><span class="p">(</span><span class="n">policy</span><span class="o">=</span><span class="s1">'greedy'</span><span class="p">,</span> <span class="n">first_cusps</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">])</span>
|
779
|
+
<span class="go">[1.32287565553230, 5.29150262212918, 1.32287565553229]</span>
|
780
|
+
</pre></div>
|
781
|
+
</div>
|
782
|
+
<p>An incomplete list can be given to <code class="xref py py-attr docutils literal notranslate"><span class="pre">first_cusps</span></code>. In this case,
|
783
|
+
the list is automatically completed by appending the remaining cusps in
|
784
|
+
order. Thus, the above call is equivalent to:</p>
|
785
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_areas</span><span class="p">(</span><span class="n">policy</span><span class="o">=</span><span class="s1">'greedy'</span><span class="p">,</span> <span class="n">first_cusps</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
786
|
+
<span class="go">[1.32287565553230, 5.29150262212918, 1.32287565553229]</span>
|
787
|
+
</pre></div>
|
788
|
+
</div>
|
789
|
+
<p>Under the hood, this method is using
|
790
|
+
<a class="reference internal" href="#snappy.Manifold.cusp_area_matrix" title="snappy.Manifold.cusp_area_matrix"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_area_matrix()</span></code></a>.</p>
|
791
|
+
<p><strong>Verified computation</strong></p>
|
792
|
+
<p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>, floating-point issues can arise resulting in
|
793
|
+
incorrect values. The method can be made
|
794
|
+
<a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
|
795
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M=Manifold("s776")
|
796
|
+
sage: M.cusp_areas(verified=True) # doctest: +NUMERIC9
|
797
|
+
[2.64575131107?, 2.64575131107?, 2.64575131107?]
|
798
|
+
</pre></div>
|
799
|
+
</div>
|
800
|
+
<dl class="field-list simple">
|
801
|
+
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
|
802
|
+
<dd class="field-odd"><ul class="simple">
|
803
|
+
<li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
|
804
|
+
<li><p><strong>bits_prec</strong> – Precision used for computation. Increase if computation
|
805
|
+
did not succeed or a more precise result is desired.</p></li>
|
806
|
+
<li><p><strong>method</strong> – Passed to <a class="reference internal" href="#snappy.Manifold.cusp_area_matrix" title="snappy.Manifold.cusp_area_matrix"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_area_matrix()</span></code></a>. If set
|
807
|
+
to a value different from the default <code class="docutils literal notranslate"><span class="pre">maximal</span></code>, the cusp
|
808
|
+
neighborhoods stop growing when the corresponding value
|
809
|
+
in the computed cusp area matrix is exceeded. At this point,
|
810
|
+
the cusp neighborhood might not necessarily touch any other
|
811
|
+
cusp neighborhood since we do not use the maximal cusp area
|
812
|
+
matrix.</p></li>
|
813
|
+
<li><p><strong>policy</strong> – Specifies process of choosing cusp neighborhoods.
|
814
|
+
Either <code class="docutils literal notranslate"><span class="pre">unbiased</span></code> or <code class="docutils literal notranslate"><span class="pre">greedy</span></code>, see above.</p></li>
|
815
|
+
<li><p><strong>first_cusps</strong> – Preference order of cusps.
|
816
|
+
Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">policy='greedy'</span></code>, see above.</p></li>
|
817
|
+
</ul>
|
818
|
+
</dd>
|
819
|
+
<dt class="field-even">Returns<span class="colon">:</span></dt>
|
820
|
+
<dd class="field-even"><p>Areas of maximal embedded and disjoint cusp neighborhoods
|
821
|
+
(default). Or areas of some embedded and disjoint cusp
|
822
|
+
neighborhoods (if <code class="xref py py-attr docutils literal notranslate"><span class="pre">method</span></code> switches to older algorithm).</p>
|
823
|
+
</dd>
|
824
|
+
</dl>
|
825
|
+
</dd></dl>
|
826
|
+
|
827
|
+
<dl class="py method">
|
828
|
+
<dt class="sig sig-object py" id="snappy.Manifold.cusp_info">
|
829
|
+
<span class="sig-name descname"><span class="pre">cusp_info</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data_spec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.cusp_info" title="Link to this definition"></a></dt>
|
830
|
+
<dd><p>Returns an info object containing information about the given
|
831
|
+
cusp. Usage:</p>
|
832
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'v3227(0,0)(1,2)(3,2)'</span><span class="p">)</span>
|
833
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
834
|
+
<span class="go">Cusp 1 : torus cusp with Dehn filling coefficients (M, L) = (1.0, 2.0)</span>
|
835
|
+
</pre></div>
|
836
|
+
</div>
|
837
|
+
<p>To get more detailed information about the cusp, we do</p>
|
838
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">c</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
839
|
+
<span class="gp">>>> </span><span class="n">c</span><span class="o">.</span><span class="n">shape</span>
|
840
|
+
<span class="go">0.11044502 + 0.94677098*I</span>
|
841
|
+
<span class="gp">>>> </span><span class="n">c</span><span class="o">.</span><span class="n">modulus</span>
|
842
|
+
<span class="go">-0.12155872 + 1.04204128*I</span>
|
843
|
+
<span class="gp">>>> </span><span class="nb">sorted</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
|
844
|
+
<span class="go">['filling', 'holonomies', 'holonomy_accuracy', 'index', 'is_complete', 'modulus', 'shape', 'shape_accuracy', 'topology']</span>
|
845
|
+
</pre></div>
|
846
|
+
</div>
|
847
|
+
<p>Here ‘shape’ is the shape of the cusp, i.e.
|
848
|
+
(longitude/meridian)
|
849
|
+
and ‘modulus’ is its shape in the geometrically preferred
|
850
|
+
basis, i.e.
|
851
|
+
( (second shortest translation)/(shortest translation)).
|
852
|
+
For cusps that are filled, one instead cares about the
|
853
|
+
holonomies:</p>
|
854
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)[</span><span class="s1">'holonomies'</span><span class="p">]</span>
|
855
|
+
<span class="go">(-0.59883089 + 1.09812548*I, 0.89824633 + 1.49440443*I)</span>
|
856
|
+
</pre></div>
|
857
|
+
</div>
|
858
|
+
<p>The complex numbers returned for the shape and for the two
|
859
|
+
holonomies have an extra attribute, accuracy, which is
|
860
|
+
SnapPea’s <em>estimate</em> of their accuracy.</p>
|
861
|
+
<p>You can also get information about multiple cusps at once:</p>
|
862
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">()</span>
|
863
|
+
<span class="go">[Cusp 0 : complete torus cusp of shape 0.11044502 + 0.94677098*I,</span>
|
864
|
+
<span class="go"> Cusp 1 : torus cusp with Dehn filling coefficients (M, L) = (1.0, 2.0),</span>
|
865
|
+
<span class="go"> Cusp 2 : torus cusp with Dehn filling coefficients (M, L) = (3.0, 2.0)]</span>
|
866
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="s1">'is_complete'</span><span class="p">)</span>
|
867
|
+
<span class="go">[True, False, False]</span>
|
868
|
+
</pre></div>
|
869
|
+
</div>
|
870
|
+
<p>The cusp shapes can be verified:</p>
|
871
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M = Manifold('m292')
|
872
|
+
sage: M.cusp_info('shape', verified = True, bits_prec = 60) # doctest: +NUMERIC12
|
873
|
+
[-0.1766049820997? + 1.2028208192855?*I,
|
874
|
+
-0.1766049820997? + 1.2028208192855?*I]
|
875
|
+
</pre></div>
|
876
|
+
</div>
|
877
|
+
</dd></dl>
|
878
|
+
|
879
|
+
<dl class="py method">
|
880
|
+
<dt class="sig sig-object py" id="snappy.Manifold.cusp_neighborhood">
|
881
|
+
<span class="sig-name descname"><span class="pre">cusp_neighborhood</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><a class="reference internal" href="additional_classes.html#snappy.CuspNeighborhood" title="SnapPy.CuspNeighborhood"><span class="pre">CuspNeighborhood</span></a></span></span><a class="headerlink" href="#snappy.Manifold.cusp_neighborhood" title="Link to this definition"></a></dt>
|
882
|
+
<dd><p>Returns information about the cusp neighborhoods of the
|
883
|
+
manifold, in the form of data about the corresponding horoball
|
884
|
+
diagrams in hyperbolic 3-space.</p>
|
885
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'s000'</span><span class="p">)</span>
|
886
|
+
<span class="gp">>>> </span><span class="n">CN</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cusp_neighborhood</span><span class="p">()</span>
|
887
|
+
<span class="gp">>>> </span><span class="n">CN</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
|
888
|
+
<span class="go">0.32475953</span>
|
889
|
+
<span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="n">CN</span><span class="o">.</span><span class="n">horoballs</span><span class="p">(</span><span class="mf">0.01</span><span class="p">))</span>
|
890
|
+
<span class="go">178</span>
|
891
|
+
<span class="gp">>>> </span><span class="n">CN</span><span class="o">.</span><span class="n">view</span><span class="p">()</span> <span class="c1"># Opens picture of the horoballs </span>
|
892
|
+
</pre></div>
|
893
|
+
</div>
|
894
|
+
</dd></dl>
|
895
|
+
|
896
|
+
<dl class="py method">
|
897
|
+
<dt class="sig sig-object py" id="snappy.Manifold.cusp_translations">
|
898
|
+
<span class="sig-name descname"><span class="pre">cusp_translations</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">policy</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'unbiased'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">method</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'maximal'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">first_cusps</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">[]</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.cusp_translations" title="Link to this definition"></a></dt>
|
899
|
+
<dd><p>Returns a list of the (complex) Euclidean translations corresponding to the
|
900
|
+
meridian and longitude of each cusp.</p>
|
901
|
+
<p>That is, the method uses <a class="reference internal" href="#snappy.Manifold.cusp_areas" title="snappy.Manifold.cusp_areas"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_areas()</span></code></a> to find
|
902
|
+
(maximal) embedded and disjoint cusp neighborhoods. It then uses the
|
903
|
+
boundaries of these cusp neighborhoods to measure the meridian and
|
904
|
+
longitude of each cusp. The result is a pair for each cusp. The first
|
905
|
+
entry of the pair corresponds to the meridian and is complex. The
|
906
|
+
second entry corresponds to the longitude and is always real:</p>
|
907
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"s776"</span><span class="p">)</span>
|
908
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_translations</span><span class="p">()</span>
|
909
|
+
<span class="go">[(0.500000000000000 + 1.32287565553230*I, 2.00000000000000), (0.500000000000000 + 1.32287565553230*I, 2.00000000000000), (0.499999999999999 + 1.32287565553230*I, 2.00000000000000)]</span>
|
910
|
+
</pre></div>
|
911
|
+
</div>
|
912
|
+
<p>It takes the same arguments as <a class="reference internal" href="#snappy.Manifold.cusp_areas" title="snappy.Manifold.cusp_areas"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_areas()</span></code></a>:</p>
|
913
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_translations</span><span class="p">(</span><span class="n">policy</span> <span class="o">=</span> <span class="s1">'greedy'</span><span class="p">)</span>
|
914
|
+
<span class="go">[(0.70710678118654752440084436210 + 1.8708286933869706927918743662*I, 2.8284271247461900976033774484), (0.35355339059327376220042218105 + 0.93541434669348534639593718308*I, 1.4142135623730950488016887242), (0.35355339059327376220042218105 + 0.93541434669348534639593718308*I, 1.4142135623730950488016887242)]</span>
|
915
|
+
</pre></div>
|
916
|
+
</div>
|
917
|
+
<p><strong>Verified computations</strong></p>
|
918
|
+
<p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>, floating-point issues can arise resulting in
|
919
|
+
incorrect values. The method can be made
|
920
|
+
<a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
|
921
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M.cusp_translations(verified = True) # doctest: +NUMERIC9
|
922
|
+
[(0.50000000000? + 1.32287565553?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?)]
|
923
|
+
</pre></div>
|
924
|
+
</div>
|
925
|
+
<p>Note that the first element of each pair is a SageMath <code class="docutils literal notranslate"><span class="pre">ComplexIntervalField</span></code> and
|
926
|
+
the second element a <code class="docutils literal notranslate"><span class="pre">RealIntervalField</span></code>.</p>
|
927
|
+
</dd></dl>
|
928
|
+
|
929
|
+
<dl class="py method">
|
930
|
+
<dt class="sig sig-object py" id="snappy.Manifold.dehn_fill">
|
931
|
+
<span class="sig-name descname"><span class="pre">dehn_fill</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filling_data</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">which_cusp</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#snappy.Manifold.dehn_fill" title="Link to this definition"></a></dt>
|
932
|
+
<dd><p>Set the Dehn filling coefficients of the cusps. This can be
|
933
|
+
specified in the following ways, where the cusps are numbered
|
934
|
+
by 0,1,…,(num_cusps - 1).</p>
|
935
|
+
<ul>
|
936
|
+
<li><p>Fill cusp 2:</p>
|
937
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'8^4_1'</span><span class="p">)</span>
|
938
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span> <span class="mi">2</span><span class="p">)</span>
|
939
|
+
<span class="gp">>>> </span><span class="n">M</span>
|
940
|
+
<span class="go">8^4_1(0,0)(0,0)(2,3)(0,0)</span>
|
941
|
+
</pre></div>
|
942
|
+
</div>
|
943
|
+
</li>
|
944
|
+
<li><p>Fill the last cusp:</p>
|
945
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">5</span><span class="p">),</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
946
|
+
<span class="gp">>>> </span><span class="n">M</span>
|
947
|
+
<span class="go">8^4_1(0,0)(0,0)(2,3)(1,5)</span>
|
948
|
+
</pre></div>
|
949
|
+
</div>
|
950
|
+
</li>
|
951
|
+
<li><p>Fill the first two cusps:</p>
|
952
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">(</span> <span class="p">[</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">4</span><span class="p">)</span> <span class="p">])</span>
|
953
|
+
<span class="gp">>>> </span><span class="n">M</span>
|
954
|
+
<span class="go">8^4_1(3,0)(1,-4)(2,3)(1,5)</span>
|
955
|
+
</pre></div>
|
956
|
+
</div>
|
957
|
+
</li>
|
958
|
+
<li><p>When there is only one cusp, there’s a shortcut</p>
|
959
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
960
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">(</span> <span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">)</span> <span class="p">)</span>
|
961
|
+
<span class="gp">>>> </span><span class="n">N</span>
|
962
|
+
<span class="go">m004(-3,4)</span>
|
963
|
+
</pre></div>
|
964
|
+
</div>
|
965
|
+
</li>
|
966
|
+
</ul>
|
967
|
+
<p>Does not return a new Manifold.</p>
|
968
|
+
</dd></dl>
|
969
|
+
|
970
|
+
<dl class="py method">
|
971
|
+
<dt class="sig sig-object py" id="snappy.Manifold.dirichlet_domain">
|
972
|
+
<span class="sig-name descname"><span class="pre">dirichlet_domain</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">vertex_epsilon</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1e-08</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">displacement</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">(0.0,</span> <span class="pre">0.0,</span> <span class="pre">0.0)</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">centroid_at_origin</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">maximize_injectivity_radius</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">include_words</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><a class="reference internal" href="additional_classes.html#snappy.DirichletDomain" title="SnapPy.DirichletDomain"><span class="pre">DirichletDomain</span></a></span></span><a class="headerlink" href="#snappy.Manifold.dirichlet_domain" title="Link to this definition"></a></dt>
|
973
|
+
<dd><p>Returns a <a class="reference internal" href="additional_classes.html#snappy.DirichletDomain" title="snappy.DirichletDomain"><code class="xref py py-class docutils literal notranslate"><span class="pre">DirichletDomain</span></code></a> object representing a Dirichlet
|
974
|
+
domain of the hyperbolic manifold, typically centered at a
|
975
|
+
point which is a local maximum of injectivity radius. It will
|
976
|
+
have ideal vertices if the manifold is not closed.</p>
|
977
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m015'</span><span class="p">)</span>
|
978
|
+
<span class="gp">>>> </span><span class="n">D</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">dirichlet_domain</span><span class="p">()</span>
|
979
|
+
<span class="gp">>>> </span><span class="n">D</span>
|
980
|
+
<span class="go">32 finite vertices, 2 ideal vertices; 54 edges; 22 faces</span>
|
981
|
+
<span class="gp">>>> </span><span class="n">D</span><span class="o">.</span><span class="n">view</span><span class="p">()</span> <span class="c1">#Shows 3d-graphical view. </span>
|
982
|
+
</pre></div>
|
983
|
+
</div>
|
984
|
+
<p>The group elements for the face-pairings of the Dirichlet domain
|
985
|
+
can be given as words in the original generators of the
|
986
|
+
(unsimplified) fundamental group by setting <code class="xref py py-attr docutils literal notranslate"><span class="pre">include_words</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
|
987
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">sorted</span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">dirichlet_domain</span><span class="p">(</span><span class="n">include_words</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span><span class="o">.</span><span class="n">pairing_words</span><span class="p">())</span>
|
988
|
+
<span class="go">['A', ...]</span>
|
989
|
+
</pre></div>
|
990
|
+
</div>
|
991
|
+
<p>Other options can be provided to customize the computation;
|
992
|
+
the default choices are shown below:</p>
|
993
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">dirichlet_domain</span><span class="p">(</span><span class="n">vertex_epsilon</span><span class="o">=</span><span class="mf">10.0</span><span class="o">**-</span><span class="mi">8</span><span class="p">,</span>
|
994
|
+
<span class="gp">... </span> <span class="n">displacement</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">],</span>
|
995
|
+
<span class="gp">... </span> <span class="n">centroid_at_origin</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">maximize_injectivity_radius</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
996
|
+
<span class="go">32 finite vertices, 2 ideal vertices; 54 edges; 22 faces</span>
|
997
|
+
</pre></div>
|
998
|
+
</div>
|
999
|
+
<p>Here’s one with different combinatorics:</p>
|
1000
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">E</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">dirichlet_domain</span><span class="p">(</span><span class="n">displacement</span><span class="o">=</span><span class="p">[</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.3</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.2</span><span class="p">],</span>
|
1001
|
+
<span class="gp">... </span> <span class="n">maximize_injectivity_radius</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
1002
|
+
<span class="gp">>>> </span><span class="n">E</span>
|
1003
|
+
<span class="go">44 finite vertices, 1 ideal vertices; 69 edges; 26 faces</span>
|
1004
|
+
</pre></div>
|
1005
|
+
</div>
|
1006
|
+
</dd></dl>
|
1007
|
+
|
1008
|
+
<dl class="py method">
|
1009
|
+
<dt class="sig sig-object py" id="snappy.Manifold.drill">
|
1010
|
+
<span class="sig-name descname"><span class="pre">drill</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">which_curve</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_segments</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">6</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.drill" title="Link to this definition"></a></dt>
|
1011
|
+
<dd><p>Drills out the specified dual curve from among all dual curves
|
1012
|
+
with at most max_segments, which defaults to 6. The method
|
1013
|
+
dual_curve allows one to see the properties of curves before
|
1014
|
+
choosing which one to drill out.</p>
|
1015
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'v3000'</span><span class="p">)</span>
|
1016
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">max_segments</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
|
1017
|
+
<span class="gp">>>> </span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">(),</span> <span class="n">N</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">())</span>
|
1018
|
+
<span class="go">(1, 2)</span>
|
1019
|
+
</pre></div>
|
1020
|
+
</div>
|
1021
|
+
</dd></dl>
|
1022
|
+
|
1023
|
+
<dl class="py method">
|
1024
|
+
<dt class="sig sig-object py" id="snappy.Manifold.drill_word">
|
1025
|
+
<span class="sig-name descname"><span class="pre">drill_word</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">word</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">Manifold</span></a></span></span><a class="headerlink" href="#snappy.Manifold.drill_word" title="Link to this definition"></a></dt>
|
1026
|
+
<dd><p>Drills the geodesic corresponding to the given word in the unsimplified
|
1027
|
+
fundamental group. Here is an example:</p>
|
1028
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m004"</span><span class="p">)</span>
|
1029
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt</span><span class="p">(</span><span class="n">max_len</span><span class="o">=</span><span class="mf">1.2</span><span class="p">)</span>
|
1030
|
+
<span class="go">[Length Core curve Word</span>
|
1031
|
+
<span class="go"> 1.08707014499574 + 1.72276844987009*I - bC,</span>
|
1032
|
+
<span class="go"> 1.08707014499574 - 1.72276844987009*I - a]</span>
|
1033
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_word</span><span class="p">(</span><span class="s1">'a'</span><span class="p">)</span>
|
1034
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">identify</span><span class="p">()</span>
|
1035
|
+
<span class="go">[m129(0,0)(0,0), 5^2_1(0,0)(0,0), L5a1(0,0)(0,0), ooct01_00001(0,0)(0,0)]</span>
|
1036
|
+
</pre></div>
|
1037
|
+
</div>
|
1038
|
+
<p>The last cusp of the resulting manifold corresponds to the drilled
|
1039
|
+
geodesic. The longitude and meridian for that cusp are chosen such that
|
1040
|
+
<code class="docutils literal notranslate"><span class="pre">(1,0)</span></code>-filling the last cusp results in the given (undrilled) manifold:</p>
|
1041
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
1042
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">N</span><span class="p">)</span>
|
1043
|
+
<span class="go">True</span>
|
1044
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="mi">1</span><span class="p">)[</span><span class="s1">'core_length'</span><span class="p">]</span>
|
1045
|
+
<span class="go">1.08707014499574 - 1.72276844987009*I</span>
|
1046
|
+
</pre></div>
|
1047
|
+
</div>
|
1048
|
+
<p>The orientation of the new longitude is chosen so that it is parallel to
|
1049
|
+
the closed geodesic. That is, the new longitude is homotopic to the closed
|
1050
|
+
geodesic when embedding the drilled manifold into the given manifold.</p>
|
1051
|
+
<p>If the given geodesic coincides with a core curve of a filled cusp, the
|
1052
|
+
cusp is unfilled instead:</p>
|
1053
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m004(2,3)"</span><span class="p">)</span>
|
1054
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
|
1055
|
+
<span class="go">1.73712388065</span>
|
1056
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="mi">0</span><span class="p">)[</span><span class="s1">'core_length'</span><span class="p">]</span>
|
1057
|
+
<span class="go">0.178792491242577 - 2.11983007979743*I</span>
|
1058
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">(</span><span class="n">simplify_presentation</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span><span class="o">.</span><span class="n">complex_length</span><span class="p">(</span><span class="s1">'aBAbbABab'</span><span class="p">)</span>
|
1059
|
+
<span class="go">0.178792491242577 - 2.11983007979743*I</span>
|
1060
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_word</span><span class="p">(</span><span class="s1">'aBAbbABab'</span><span class="p">)</span>
|
1061
|
+
<span class="gp">>>> </span><span class="n">N</span>
|
1062
|
+
<span class="go">m004_drilled(0,0)</span>
|
1063
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">()</span>
|
1064
|
+
<span class="go">1</span>
|
1065
|
+
</pre></div>
|
1066
|
+
</div>
|
1067
|
+
<p>In this case, the peripheral information is also
|
1068
|
+
updated such that the above remark about <code class="docutils literal notranslate"><span class="pre">(1,0)</span></code>-filling applies again:</p>
|
1069
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
1070
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
|
1071
|
+
<span class="go">1.73712388065</span>
|
1072
|
+
</pre></div>
|
1073
|
+
</div>
|
1074
|
+
<p>That is, the longitude and meridian of the unfilled cusps are reinstalled
|
1075
|
+
and the cusps reindexed so that the unfilled cusp becomes the last cusp.</p>
|
1076
|
+
<p>Here is another example where we drill the core geodesic:</p>
|
1077
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"v2986(3,4)"</span><span class="p">)</span>
|
1078
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_word</span><span class="p">(</span><span class="s1">'EdFgabcGEdFgaDcc'</span><span class="p">)</span>
|
1079
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">Manifold</span><span class="p">(</span><span class="s2">"v2986"</span><span class="p">),</span> <span class="n">return_isometries</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
|
1080
|
+
<span class="go">[0 -> 0</span>
|
1081
|
+
<span class="go"> [3 -1]</span>
|
1082
|
+
<span class="go"> [4 -1]</span>
|
1083
|
+
<span class="go"> Does not extend to link]</span>
|
1084
|
+
</pre></div>
|
1085
|
+
</div>
|
1086
|
+
<p>While the result of drilling a geodesic is a triangulation and thus
|
1087
|
+
combinatorial in nature, some intermediate computations (for example,
|
1088
|
+
to compute the intersections of the geodesic with the faces of the
|
1089
|
+
tetrahedra) are numerical. Sometimes, it is necessary to increase the
|
1090
|
+
precision with <code class="xref py py-attr docutils literal notranslate"><span class="pre">bits_prec</span></code> to make the method succeed and produce
|
1091
|
+
the correct result.</p>
|
1092
|
+
<p><strong>Verified computation</strong></p>
|
1093
|
+
<p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>, floating-point issues can arise resulting
|
1094
|
+
in drilling the wrong loop. The method can be made
|
1095
|
+
<a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
|
1096
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m004(2,3)"</span><span class="p">)</span>
|
1097
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_word</span><span class="p">(</span><span class="s1">'caa'</span><span class="p">,</span> <span class="n">verified</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">bits_prec</span> <span class="o">=</span> <span class="mi">100</span><span class="p">)</span>
|
1098
|
+
<span class="n">m004_drilled</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">)(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
|
1099
|
+
</pre></div>
|
1100
|
+
</div>
|
1101
|
+
<p>That is, if the precision is insufficient to prove the result is correct,
|
1102
|
+
the algorithm fails with an exception (most likely
|
1103
|
+
<code class="docutils literal notranslate"><span class="pre">InsufficientPrecisionError</span></code>).</p>
|
1104
|
+
<dl class="field-list simple">
|
1105
|
+
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
|
1106
|
+
<dd class="field-odd"><ul class="simple">
|
1107
|
+
<li><p><strong>word</strong> – The word in the unsimplified fundamental group specifying the
|
1108
|
+
geodesic to be drilled.</p></li>
|
1109
|
+
<li><p><strong>bits_prec</strong> – The precision used in the intermediate computation. Increase
|
1110
|
+
if the computation failed.</p></li>
|
1111
|
+
<li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
|
1112
|
+
<li><p><strong>verbose</strong> – Print intermediate results and statistics.</p></li>
|
1113
|
+
</ul>
|
1114
|
+
</dd>
|
1115
|
+
<dt class="field-even">Returns<span class="colon">:</span></dt>
|
1116
|
+
<dd class="field-even"><p>Manifold obtained by drilling geodesic. <code class="docutils literal notranslate"><span class="pre">(1,0)</span></code>-filling the
|
1117
|
+
last cusp gives the given (undrilled) manifold.</p>
|
1118
|
+
</dd>
|
1119
|
+
</dl>
|
1120
|
+
</dd></dl>
|
1121
|
+
|
1122
|
+
<dl class="py method">
|
1123
|
+
<dt class="sig sig-object py" id="snappy.Manifold.drill_words">
|
1124
|
+
<span class="sig-name descname"><span class="pre">drill_words</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">words</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Sequence</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">Manifold</span></a></span></span><a class="headerlink" href="#snappy.Manifold.drill_words" title="Link to this definition"></a></dt>
|
1125
|
+
<dd><p>A generalization of <a class="reference internal" href="#snappy.Manifold.drill_word" title="snappy.Manifold.drill_word"><code class="xref py py-meth docutils literal notranslate"><span class="pre">drill_word</span></code></a> to drill
|
1126
|
+
several geodesics simultaneously. It takes a list of words in the
|
1127
|
+
unsimplified fundamental group.</p>
|
1128
|
+
<p>Here is an example where we drill two geodesics. One of the geodesics is
|
1129
|
+
the core curve corresponding to the third cusp. The other geodesic is not
|
1130
|
+
a core curve:</p>
|
1131
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">=</span><span class="n">Manifold</span><span class="p">(</span><span class="s2">"t12047(0,0)(1,3)(1,4)(1,5)"</span><span class="p">)</span>
|
1132
|
+
<span class="gp">>>> </span><span class="p">[</span> <span class="n">info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'core_length'</span><span class="p">)</span> <span class="k">for</span> <span class="n">info</span> <span class="ow">in</span> <span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">()</span> <span class="p">]</span>
|
1133
|
+
<span class="go">[None,</span>
|
1134
|
+
<span class="go"> 0.510804267610103 + 1.92397456664239*I,</span>
|
1135
|
+
<span class="go"> 0.317363079597924 + 1.48157893409218*I,</span>
|
1136
|
+
<span class="go"> 0.223574975263386 + 1.26933288854145*I]</span>
|
1137
|
+
<span class="gp">>>> </span><span class="n">G</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">(</span><span class="n">simplify_presentation</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span>
|
1138
|
+
<span class="gp">>>> </span><span class="n">G</span><span class="o">.</span><span class="n">complex_length</span><span class="p">(</span><span class="s1">'c'</span><span class="p">)</span>
|
1139
|
+
<span class="go">0.317363079597924 + 1.48157893409218*I</span>
|
1140
|
+
<span class="gp">>>> </span><span class="n">G</span><span class="o">.</span><span class="n">complex_length</span><span class="p">(</span><span class="s1">'fA'</span><span class="p">)</span>
|
1141
|
+
<span class="go">1.43914411734250 + 2.66246879992795*I</span>
|
1142
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_words</span><span class="p">([</span><span class="s1">'c'</span><span class="p">,</span><span class="s1">'fA'</span><span class="p">])</span>
|
1143
|
+
<span class="gp">>>> </span><span class="n">N</span>
|
1144
|
+
<span class="go">t12047_drilled(0,0)(1,3)(1,5)(0,0)(0,0)</span>
|
1145
|
+
</pre></div>
|
1146
|
+
</div>
|
1147
|
+
<p>Let n be the number of geodesics that were drilled. Then the last n
|
1148
|
+
cusps correspond to the drilled geodesics and appear in the same order than
|
1149
|
+
the geodesics were given as words. Note that in the above example, we expect
|
1150
|
+
six cusps since we started with four cusps and drilled two geodesics. However,
|
1151
|
+
we only obtain five cusps because one geodesic was a core curve. The
|
1152
|
+
corresponding cusp was unfilled (from <code class="docutils literal notranslate"><span class="pre">(1,4)</span></code>) and grouped with the other
|
1153
|
+
cusps coming from drilling.</p>
|
1154
|
+
<p>We obtain the given (undrilled) manifold by <code class="docutils literal notranslate"><span class="pre">(1,0)</span></code>-filling the last n
|
1155
|
+
cusps.</p>
|
1156
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="o">-</span><span class="mi">2</span><span class="p">)</span>
|
1157
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
1158
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">N</span><span class="p">)</span>
|
1159
|
+
<span class="go">True</span>
|
1160
|
+
<span class="gp">>>> </span><span class="p">[</span> <span class="n">info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'core_length'</span><span class="p">)</span> <span class="k">for</span> <span class="n">info</span> <span class="ow">in</span> <span class="n">N</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">()</span> <span class="p">]</span>
|
1161
|
+
<span class="go">[None,</span>
|
1162
|
+
<span class="go"> 0.510804267610103 + 1.92397456664239*I,</span>
|
1163
|
+
<span class="go"> 0.223574975263386 + 1.26933288854145*I,</span>
|
1164
|
+
<span class="go"> 0.317363079597924 + 1.48157893409218*I,</span>
|
1165
|
+
<span class="go"> 1.43914411734251 + 2.66246879992796*I]</span>
|
1166
|
+
</pre></div>
|
1167
|
+
</div>
|
1168
|
+
<dl class="field-list simple">
|
1169
|
+
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
|
1170
|
+
<dd class="field-odd"><ul class="simple">
|
1171
|
+
<li><p><strong>word</strong> – The words in the unsimplified fundamental group specifying the
|
1172
|
+
geodesics to be drilled.</p></li>
|
1173
|
+
<li><p><strong>bits_prec</strong> – The precision used in the intermediate computation. Increase
|
1174
|
+
if the computation failed.</p></li>
|
1175
|
+
<li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
|
1176
|
+
<li><p><strong>verbose</strong> – Print intermediate results and statistics.</p></li>
|
1177
|
+
</ul>
|
1178
|
+
</dd>
|
1179
|
+
<dt class="field-even">Returns<span class="colon">:</span></dt>
|
1180
|
+
<dd class="field-even"><p>Manifold obtained by drilling geodesics. <code class="docutils literal notranslate"><span class="pre">(1,0)</span></code>-filling the
|
1181
|
+
last n cusps gives the given (undrilled) manifold where n is the
|
1182
|
+
number of given words.</p>
|
1183
|
+
</dd>
|
1184
|
+
</dl>
|
1185
|
+
</dd></dl>
|
1186
|
+
|
1187
|
+
<dl class="py method">
|
1188
|
+
<dt class="sig sig-object py" id="snappy.Manifold.dual_curves">
|
1189
|
+
<span class="sig-name descname"><span class="pre">dual_curves</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">max_segments</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">6</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.dual_curves" title="Link to this definition"></a></dt>
|
1190
|
+
<dd><p>Constructs a <em>reasonable</em> selection of simple closed curves in
|
1191
|
+
a manifold’s dual 1-skeleton. In particular, it returns those
|
1192
|
+
that appear to represent geodesics. The resulting curves can
|
1193
|
+
be drilled out.</p>
|
1194
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m015'</span><span class="p">)</span>
|
1195
|
+
<span class="gp">>>> </span><span class="n">curves</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">dual_curves</span><span class="p">()</span>
|
1196
|
+
<span class="gp">>>> </span><span class="n">curves</span>
|
1197
|
+
<span class="go">[ 0: orientation-preserving curve of length 0.56239915 - 2.81543089*I,</span>
|
1198
|
+
<span class="go"> 1: orientation-preserving curve of length 1.12479830 + 0.65232354*I,</span>
|
1199
|
+
<span class="go"> 2: orientation-preserving curve of length 1.26080402 + 1.97804689*I,</span>
|
1200
|
+
<span class="go"> 3: orientation-preserving curve of length 1.58826933 + 1.67347167*I,</span>
|
1201
|
+
<span class="go"> 4: orientation-preserving curve of length 1.68719745 + 2.81543089*I]</span>
|
1202
|
+
</pre></div>
|
1203
|
+
</div>
|
1204
|
+
<p>Each curve is returned as an info object with these keys</p>
|
1205
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">sorted</span><span class="p">(</span><span class="n">curves</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
|
1206
|
+
<span class="go">['complete_length', 'filled_length', 'index', 'max_segments', 'parity']</span>
|
1207
|
+
</pre></div>
|
1208
|
+
</div>
|
1209
|
+
<p>We can drill out any of these curves to get a new manifold
|
1210
|
+
with one more cusp.</p>
|
1211
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill</span><span class="p">(</span><span class="n">curves</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
1212
|
+
<span class="gp">>>> </span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">(),</span> <span class="n">N</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">())</span>
|
1213
|
+
<span class="go">(1, 2)</span>
|
1214
|
+
</pre></div>
|
1215
|
+
</div>
|
1216
|
+
<p>By default, this function only finds curves of length 6; this
|
1217
|
+
can be changed by specifying the optional argument
|
1218
|
+
max_segments</p>
|
1219
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">dual_curves</span><span class="p">(</span><span class="n">max_segments</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
1220
|
+
<span class="go">[ 0: orientation-preserving curve of length 0.56239915 - 2.81543089*I]</span>
|
1221
|
+
</pre></div>
|
1222
|
+
</div>
|
1223
|
+
</dd></dl>
|
1224
|
+
|
1225
|
+
<dl class="py method">
|
1226
|
+
<dt class="sig sig-object py" id="snappy.Manifold.edge_valences">
|
1227
|
+
<span class="sig-name descname"><span class="pre">edge_valences</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.edge_valences" title="Link to this definition"></a></dt>
|
1228
|
+
<dd><p>Returns a dictionary whose keys are the valences of the edges
|
1229
|
+
in the triangulation, and the value associated to a key is the
|
1230
|
+
number of edges of that valence.</p>
|
1231
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'v3227'</span><span class="p">)</span>
|
1232
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">edge_valences</span><span class="p">()</span>
|
1233
|
+
<span class="go">{10: 1, 4: 1, 5: 2, 6: 3}</span>
|
1234
|
+
</pre></div>
|
1235
|
+
</div>
|
1236
|
+
</dd></dl>
|
1237
|
+
|
1238
|
+
<dl class="py method">
|
1239
|
+
<dt class="sig sig-object py" id="snappy.Manifold.exterior_to_link">
|
1240
|
+
<span class="sig-name descname"><span class="pre">exterior_to_link</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">check_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">check_answer</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">careful_perturbation</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">simplify_link</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pachner_search_tries</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">10</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">seed</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><a class="reference internal" href="spherogram.html#spherogram.Link" title="spherogram.Link"><span class="pre">Link</span></a></span></span><a class="headerlink" href="#snappy.Manifold.exterior_to_link" title="Link to this definition"></a></dt>
|
1241
|
+
<dd><p>For a triangulation of the exterior of a link in the 3-sphere,
|
1242
|
+
return a planar diagram for the link. The peripheral curves whose
|
1243
|
+
Dehn filling is the 3-sphere are <strong>part of the input</strong>, specified
|
1244
|
+
by either:</p>
|
1245
|
+
<ol class="loweralpha simple">
|
1246
|
+
<li><p>If no cusp is filled, then they are the meridians of the
|
1247
|
+
current peripheral curves.</p></li>
|
1248
|
+
<li><p>If every cusp is filled, then they are the current Dehn filling
|
1249
|
+
curves.</p></li>
|
1250
|
+
</ol>
|
1251
|
+
<p>In particular, it does <strong>not</strong> try to determine whether there exist
|
1252
|
+
fillings on the input which give the 3-sphere. Example usage:</p>
|
1253
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m016'</span><span class="p">)</span>
|
1254
|
+
<span class="gp">>>> </span><span class="n">L</span> <span class="o">=</span> <span class="n">exterior_to_link</span><span class="p">(</span><span class="n">M</span><span class="p">)</span>
|
1255
|
+
<span class="gp">>>> </span><span class="n">L</span><span class="o">.</span><span class="n">exterior</span><span class="p">()</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">M</span><span class="p">)</span>
|
1256
|
+
<span class="go">True</span>
|
1257
|
+
</pre></div>
|
1258
|
+
</div>
|
1259
|
+
<p>The algorithm used is that of <a class="reference external" href="https://arxiv.org/abs/2112.03251">Dunfield, Obeidin, and Rudd</a>. The optional arguments are
|
1260
|
+
as follows.</p>
|
1261
|
+
<ul class="simple">
|
1262
|
+
<li><p><code class="docutils literal notranslate"><span class="pre">verbose</span></code>: When <code class="docutils literal notranslate"><span class="pre">True</span></code>, prints progress updates as the algorithm
|
1263
|
+
goes along.</p></li>
|
1264
|
+
<li><p><code class="docutils literal notranslate"><span class="pre">check_input</span></code>: When <code class="docutils literal notranslate"><span class="pre">True</span></code> (the default), first checks that the
|
1265
|
+
fundamental group of the specified Dehn filling is trivial. As
|
1266
|
+
it doesn’t try too hard to simplify the group presentation, it
|
1267
|
+
can happen that this check fails but the algorithm still finds a
|
1268
|
+
diagram if you pass <code class="docutils literal notranslate"><span class="pre">check_input=False</span></code>.</p></li>
|
1269
|
+
<li><p><code class="docutils literal notranslate"><span class="pre">check_answer</span></code>: When <code class="docutils literal notranslate"><span class="pre">True</span></code> (the default), take the exterior of
|
1270
|
+
the final link diagram and use <code class="docutils literal notranslate"><span class="pre">Manifold.is_isometric_to</span></code> to
|
1271
|
+
confirm that it is homeomorphic to the input. If the input is
|
1272
|
+
not hyperbolic or is very large, this check may fail even though
|
1273
|
+
the diagram is correct.</p></li>
|
1274
|
+
<li><p><code class="docutils literal notranslate"><span class="pre">careful_perturbation</span></code>: The rational coordinates of the
|
1275
|
+
intermediate PL links are periodically rounded to control the
|
1276
|
+
size of their denominators. When <code class="docutils literal notranslate"><span class="pre">careful_perturbation=True</span></code>
|
1277
|
+
(the default), computations are performed to ensure this
|
1278
|
+
rounding does not change the isotopy class of the link.</p></li>
|
1279
|
+
<li><p><code class="docutils literal notranslate"><span class="pre">simplify_link</span></code>: When <code class="docutils literal notranslate"><span class="pre">True</span></code> (the default), uses
|
1280
|
+
<code class="docutils literal notranslate"><span class="pre">Link.simplify('global')</span></code> to minimize the size of the final
|
1281
|
+
diagram; otherwise, it just does <code class="docutils literal notranslate"><span class="pre">basic</span></code> simplifications, which
|
1282
|
+
can be much faster if the initial link is complicated.</p></li>
|
1283
|
+
<li><p><code class="docutils literal notranslate"><span class="pre">pachner_search_tries</span></code>: Controls how hard to search for a
|
1284
|
+
suitable sequence of Pachner moves from the filled input
|
1285
|
+
triangulation to a standard triangulation of the 3-sphere.</p></li>
|
1286
|
+
<li><p><code class="docutils literal notranslate"><span class="pre">seed</span></code>: The algorithm involves many random choices, and hence
|
1287
|
+
each run typically produces a different diagram of the
|
1288
|
+
underlying link. If you need the same output each time, you can
|
1289
|
+
specify a fixed seed for the various pseudo-random number
|
1290
|
+
generators.</p></li>
|
1291
|
+
</ul>
|
1292
|
+
<p>Note on rigor: Provided at least one of <code class="docutils literal notranslate"><span class="pre">check_answer</span></code> and
|
1293
|
+
<code class="docutils literal notranslate"><span class="pre">careful_perturbation</span></code> is <code class="docutils literal notranslate"><span class="pre">True</span></code>, the exterior of the output
|
1294
|
+
link is guaranteed to match the input (including the choice of
|
1295
|
+
meridians).</p>
|
1296
|
+
<p><strong>Warning:</strong> The order of the link components and the cusps of the
|
1297
|
+
input manifold is only guaranteed to match when
|
1298
|
+
<code class="docutils literal notranslate"><span class="pre">check_answer=True</span></code>. Even then, the implicit orientation along
|
1299
|
+
each component of the link may not be preserved.</p>
|
1300
|
+
</dd></dl>
|
1301
|
+
|
1302
|
+
<dl class="py method">
|
1303
|
+
<dt class="sig sig-object py" id="snappy.Manifold.filled_triangulation">
|
1304
|
+
<span class="sig-name descname"><span class="pre">filled_triangulation</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cusps_to_fill</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'all'</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">snappy.Manifold</span></a></span></span><a class="headerlink" href="#snappy.Manifold.filled_triangulation" title="Link to this definition"></a></dt>
|
1305
|
+
<dd><p>Return a new Manifold where the specified cusps have been
|
1306
|
+
permanently filled in.</p>
|
1307
|
+
<p>Filling all the cusps results in a Triangulation rather
|
1308
|
+
than a Manifold, since SnapPea can’t deal with hyperbolic
|
1309
|
+
structures when there are no cusps.</p>
|
1310
|
+
<p>Examples:</p>
|
1311
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m125(1,2)(3,4)'</span><span class="p">)</span>
|
1312
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">filled_triangulation</span><span class="p">()</span>
|
1313
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">()</span>
|
1314
|
+
<span class="go">0</span>
|
1315
|
+
</pre></div>
|
1316
|
+
</div>
|
1317
|
+
<p>Filling cusps 0 and 2 :</p>
|
1318
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'v3227(1,2)(3,4)(5,6)'</span><span class="p">)</span>
|
1319
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">filled_triangulation</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">])</span>
|
1320
|
+
<span class="go">v3227_filled(3,4)</span>
|
1321
|
+
</pre></div>
|
1322
|
+
</div>
|
1323
|
+
</dd></dl>
|
1324
|
+
|
1325
|
+
<dl class="py method">
|
1326
|
+
<dt class="sig sig-object py" id="snappy.Manifold.fundamental_group">
|
1327
|
+
<span class="sig-name descname"><span class="pre">fundamental_group</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">simplify_presentation</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fillings_may_affect_generators</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">minimize_number_of_generators</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">try_hard_to_shorten_relators</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><a class="reference internal" href="additional_classes.html#snappy.HolonomyGroup" title="SnapPy.HolonomyGroup"><span class="pre">HolonomyGroup</span></a></span></span><a class="headerlink" href="#snappy.Manifold.fundamental_group" title="Link to this definition"></a></dt>
|
1328
|
+
<dd><p>Return a <a class="reference internal" href="additional_classes.html#snappy.HolonomyGroup" title="snappy.HolonomyGroup"><code class="xref py py-class docutils literal notranslate"><span class="pre">HolonomyGroup</span></code></a> representing the fundamental group of
|
1329
|
+
the manifold, together with its holonomy representation. If
|
1330
|
+
integer Dehn surgery parameters have been set, then the
|
1331
|
+
corresponding peripheral elements are killed.</p>
|
1332
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
1333
|
+
<span class="gp">>>> </span><span class="n">G</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">()</span>
|
1334
|
+
<span class="gp">>>> </span><span class="n">G</span>
|
1335
|
+
<span class="go">Generators:</span>
|
1336
|
+
<span class="go"> a,b</span>
|
1337
|
+
<span class="go">Relators:</span>
|
1338
|
+
<span class="go"> aaabABBAb</span>
|
1339
|
+
<span class="gp">>>> </span><span class="n">G</span><span class="o">.</span><span class="n">peripheral_curves</span><span class="p">()</span>
|
1340
|
+
<span class="go">[('ab', 'aBAbABab')]</span>
|
1341
|
+
<span class="gp">>>> </span><span class="n">G</span><span class="o">.</span><span class="n">SL2C</span><span class="p">(</span><span class="s1">'baaBA'</span><span class="p">)</span>
|
1342
|
+
<span class="go">[ 2.50000000 - 2.59807621*I -6.06217783 - 0.50000000*I]</span>
|
1343
|
+
<span class="go">[ 0.86602540 - 2.50000000*I -4.00000000 + 1.73205081*I]</span>
|
1344
|
+
</pre></div>
|
1345
|
+
</div>
|
1346
|
+
<p>There are three optional arguments all of which default to True:</p>
|
1347
|
+
<ul class="simple">
|
1348
|
+
<li><p>simplify_presentation</p></li>
|
1349
|
+
<li><p>fillings_may_affect_generators</p></li>
|
1350
|
+
<li><p>minimize_number_of_generators</p></li>
|
1351
|
+
</ul>
|
1352
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">(</span><span class="kc">False</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
1353
|
+
<span class="go">Generators:</span>
|
1354
|
+
<span class="go"> a,b,c</span>
|
1355
|
+
<span class="go">Relators:</span>
|
1356
|
+
<span class="go"> CbAcB</span>
|
1357
|
+
<span class="go"> BacA</span>
|
1358
|
+
</pre></div>
|
1359
|
+
</div>
|
1360
|
+
</dd></dl>
|
1361
|
+
|
1362
|
+
<dl class="py method">
|
1363
|
+
<dt class="sig sig-object py" id="snappy.Manifold.gluing_equations">
|
1364
|
+
<span class="sig-name descname"><span class="pre">gluing_equations</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">form</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'log'</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.gluing_equations" title="Link to this definition"></a></dt>
|
1365
|
+
<dd><p>In the default mode, this function returns a matrix with rows
|
1366
|
+
of the form</p>
|
1367
|
+
<blockquote>
|
1368
|
+
<div><p>a b c d e f …</p>
|
1369
|
+
</div></blockquote>
|
1370
|
+
<p>which means</p>
|
1371
|
+
<blockquote>
|
1372
|
+
<div><p>a*log(z0) + b*log(1/(1-z0)) + c*log((z0-1)/z0) + d*log(z1) +… = 2 pi i</p>
|
1373
|
+
</div></blockquote>
|
1374
|
+
<p>for an edge equation, and (same) = 0 for a cusp equation.
|
1375
|
+
Here, the cusp equations come at the bottom of the matrix, and
|
1376
|
+
are listed in the form: meridian of cusp 0, longitude of cusp
|
1377
|
+
0, meridian of cusp 1, longitude of cusp 1,…</p>
|
1378
|
+
<p>In terms of the tetrahedra, a is the invariant of the edge
|
1379
|
+
(2,3), b the invariant of the edge (0,2) and c is the
|
1380
|
+
invariant of the edge (1,2). See kernel_code/edge_classes.c
|
1381
|
+
for a detailed account of the convention used.</p>
|
1382
|
+
<p>If the optional argument form=’rect’ is given, then this
|
1383
|
+
function returns a list of tuples of the form:</p>
|
1384
|
+
<blockquote>
|
1385
|
+
<div><p>( [a0, a1,..,a_n], [b_0, b_1,…,b_n], c)</p>
|
1386
|
+
</div></blockquote>
|
1387
|
+
<p>where this corresponds to the equation</p>
|
1388
|
+
<blockquote>
|
1389
|
+
<div><p>z0^a0 (1 - z0)^b0 z1^a1(1 - z1)^b1 … = c</p>
|
1390
|
+
</div></blockquote>
|
1391
|
+
<p>where c = 1 or -1.</p>
|
1392
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'m004(2,3)'</span><span class="p">)</span>
|
1393
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">gluing_equations</span><span class="p">()</span>
|
1394
|
+
<span class="go">[ 2 1 0 1 0 2]</span>
|
1395
|
+
<span class="go">[ 0 1 2 1 2 0]</span>
|
1396
|
+
<span class="go">[ 2 0 0 0 -8 6]</span>
|
1397
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">gluing_equations</span><span class="p">(</span><span class="n">form</span><span class="o">=</span><span class="s1">'rect'</span><span class="p">)</span>
|
1398
|
+
<span class="go">[([2, -1], [-1, 2], 1), ([-2, 1], [1, -2], 1), ([2, -6], [0, 14], 1)]</span>
|
1399
|
+
</pre></div>
|
1400
|
+
</div>
|
1401
|
+
</dd></dl>
|
1402
|
+
|
1403
|
+
<dl class="py method">
|
1404
|
+
<dt class="sig sig-object py" id="snappy.Manifold.gluing_equations_pgl">
|
1405
|
+
<span class="sig-name descname"><span class="pre">gluing_equations_pgl</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">N</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">equation_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'all'</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.gluing_equations_pgl" title="Link to this definition"></a></dt>
|
1406
|
+
<dd><p>Returns a NeumannZagierTypeEquations object that contains a matrix
|
1407
|
+
encoding the gluing equations for boundary-parabolic PGL(N,C)
|
1408
|
+
representations together with explanations of the meaning
|
1409
|
+
of the rows and the columns of the matrix.</p>
|
1410
|
+
<p>This method generalizes gluing_equations() to PGL(N,C)-representations
|
1411
|
+
as described in
|
1412
|
+
Stavros Garoufalidis, Matthias Goerner, Christian K. Zickert:
|
1413
|
+
“Gluing Equations for PGL(n,C)-Representations of 3-Manifolds”
|
1414
|
+
(<a class="reference external" href="http://arxiv.org/abs/1207.6711">http://arxiv.org/abs/1207.6711</a>).</p>
|
1415
|
+
<p>The result of the <a class="reference internal" href="#snappy.Manifold.gluing_equations" title="snappy.Manifold.gluing_equations"><code class="xref py py-meth docutils literal notranslate"><span class="pre">gluing_equations()</span></code></a> can be obtained from
|
1416
|
+
the general method by:</p>
|
1417
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
1418
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">gluing_equations_pgl</span><span class="p">()</span><span class="o">.</span><span class="n">matrix</span>
|
1419
|
+
<span class="go">[ 2 1 0 1 0 2]</span>
|
1420
|
+
<span class="go">[ 0 1 2 1 2 0]</span>
|
1421
|
+
<span class="go">[ 1 0 0 0 -1 0]</span>
|
1422
|
+
<span class="go">[ 0 0 0 0 -2 2]</span>
|
1423
|
+
</pre></div>
|
1424
|
+
</div>
|
1425
|
+
<p>But besides the matrix, the method also returns explanations of
|
1426
|
+
the columns and rows:</p>
|
1427
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s2">"m004"</span><span class="p">)</span>
|
1428
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">gluing_equations_pgl</span><span class="p">()</span>
|
1429
|
+
<span class="go">NeumannZagierTypeEquations(</span>
|
1430
|
+
<span class="go"> [ 2 1 0 1 0 2]</span>
|
1431
|
+
<span class="go"> [ 0 1 2 1 2 0]</span>
|
1432
|
+
<span class="go"> [ 1 0 0 0 -1 0]</span>
|
1433
|
+
<span class="go"> [ 0 0 0 0 -2 2],</span>
|
1434
|
+
<span class="go"> explain_columns = ['z_0000_0', 'zp_0000_0', 'zpp_0000_0', 'z_0000_1', 'zp_0000_1', 'zpp_0000_1'],</span>
|
1435
|
+
<span class="go"> explain_rows = ['edge_0_0', 'edge_0_1', 'meridian_0_0', 'longitude_0_0'])</span>
|
1436
|
+
</pre></div>
|
1437
|
+
</div>
|
1438
|
+
<p>The first row of the matrix means that the edge equation for
|
1439
|
+
edge 0 is</p>
|
1440
|
+
<div class="math notranslate nohighlight">
|
1441
|
+
\[{z_{0000,0}}^2 * z'_{0000,0} * z_{0000,1} * {z''_{0000,1}}^2 = 1.\]</div>
|
1442
|
+
<p>Similarly, the next row encodes the edge equation for the other edge
|
1443
|
+
and the next two rows encode peripheral equations.</p>
|
1444
|
+
<p>Following the SnapPy convention, a <code class="docutils literal notranslate"><span class="pre">z</span></code> denotes the cross ratio
|
1445
|
+
<span class="math notranslate nohighlight">\(z\)</span> at the edge (0,1), a <code class="docutils literal notranslate"><span class="pre">zp</span></code> the cross ratio <span class="math notranslate nohighlight">\(z'\)</span> at
|
1446
|
+
the edge (0,2) and a <code class="docutils literal notranslate"><span class="pre">zpp</span></code> the cross
|
1447
|
+
ratio <span class="math notranslate nohighlight">\(z''\)</span> at the edge (1,2). The entire symbol <code class="docutils literal notranslate"><span class="pre">z_xxxx_y</span></code> then
|
1448
|
+
denotes the cross ratio belonging to the subsimplex at integral
|
1449
|
+
point <code class="docutils literal notranslate"><span class="pre">xxxx</span></code> (always <code class="docutils literal notranslate"><span class="pre">0000</span></code> for <code class="docutils literal notranslate"><span class="pre">N</span> <span class="pre">=</span> <span class="pre">2</span></code>) of the simplex <code class="docutils literal notranslate"><span class="pre">y</span></code>.</p>
|
1450
|
+
<p>Note: the SnapPy convention is different from the paper
|
1451
|
+
mentioned above, e.g., compare
|
1452
|
+
kernel_code/edge_classes.c with Figure 3. We follow the SnapPy
|
1453
|
+
convention here so that all computations done in SnapPy are
|
1454
|
+
consistent.</p>
|
1455
|
+
<p>The explanations of the rows and columns can be obtained explicitly by:</p>
|
1456
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">gluing_equations_pgl</span><span class="p">(</span><span class="n">N</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">equation_type</span> <span class="o">=</span> <span class="s1">'peripheral'</span><span class="p">)</span><span class="o">.</span><span class="n">explain_rows</span>
|
1457
|
+
<span class="go">['meridian_0_0', 'meridian_1_0', 'longitude_0_0', 'longitude_1_0']</span>
|
1458
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">gluing_equations_pgl</span><span class="p">(</span><span class="n">N</span> <span class="o">=</span> <span class="mi">2</span><span class="p">)</span><span class="o">.</span><span class="n">explain_columns</span>
|
1459
|
+
<span class="go">['z_0000_0', 'zp_0000_0', 'zpp_0000_0', 'z_0000_1', 'zp_0000_1', 'zpp_0000_1']</span>
|
1460
|
+
</pre></div>
|
1461
|
+
</div>
|
1462
|
+
<p>A subset of all gluing equations can be obtained by setting the
|
1463
|
+
<code class="docutils literal notranslate"><span class="pre">equation_type</span></code>:</p>
|
1464
|
+
<ul class="simple">
|
1465
|
+
<li><p>all gluing equations: <code class="docutils literal notranslate"><span class="pre">all</span></code></p></li>
|
1466
|
+
<li><p>non-peripheral equations: <code class="docutils literal notranslate"><span class="pre">non_peripheral</span></code></p>
|
1467
|
+
<ul>
|
1468
|
+
<li><p>edge gluing equations: <code class="docutils literal notranslate"><span class="pre">edge</span></code></p></li>
|
1469
|
+
<li><p>face gluing equations: <code class="docutils literal notranslate"><span class="pre">face</span></code></p></li>
|
1470
|
+
<li><p>internal gluing equations: <code class="docutils literal notranslate"><span class="pre">internal</span></code></p></li>
|
1471
|
+
</ul>
|
1472
|
+
</li>
|
1473
|
+
<li><p>cusp gluing equations: <code class="docutils literal notranslate"><span class="pre">peripheral</span></code></p>
|
1474
|
+
<ul>
|
1475
|
+
<li><p>cusp gluing equations for meridians: <code class="docutils literal notranslate"><span class="pre">meridian</span></code></p></li>
|
1476
|
+
<li><p>cusp gluing equations for longitudes: <code class="docutils literal notranslate"><span class="pre">longitude</span></code></p></li>
|
1477
|
+
</ul>
|
1478
|
+
</li>
|
1479
|
+
</ul>
|
1480
|
+
</dd></dl>
|
1481
|
+
|
1482
|
+
<dl class="py method">
|
1483
|
+
<dt class="sig sig-object py" id="snappy.Manifold.has_finite_vertices">
|
1484
|
+
<span class="sig-name descname"><span class="pre">has_finite_vertices</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#snappy.Manifold.has_finite_vertices" title="Link to this definition"></a></dt>
|
1485
|
+
<dd><p>Returns <code class="docutils literal notranslate"><span class="pre">True</span></code> if and only if the triangulation has finite (non-ideal)
|
1486
|
+
vertices.</p>
|
1487
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">T</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s2">"m004"</span><span class="p">)</span>
|
1488
|
+
<span class="gp">>>> </span><span class="n">T</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span>
|
1489
|
+
<span class="go">False</span>
|
1490
|
+
<span class="gp">>>> </span><span class="n">T</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">12</span><span class="p">,</span><span class="mi">13</span><span class="p">))</span>
|
1491
|
+
<span class="gp">>>> </span><span class="n">S</span> <span class="o">=</span> <span class="n">T</span><span class="o">.</span><span class="n">filled_triangulation</span><span class="p">()</span>
|
1492
|
+
<span class="gp">>>> </span><span class="n">S</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span>
|
1493
|
+
<span class="go">True</span>
|
1494
|
+
</pre></div>
|
1495
|
+
</div>
|
1496
|
+
<p>When trying to find a hyperbolic structure, SnapPea will eliminate
|
1497
|
+
finite vertices:</p>
|
1498
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">S</span><span class="o">.</span><span class="n">with_hyperbolic_structure</span><span class="p">()</span>
|
1499
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span>
|
1500
|
+
<span class="go">False</span>
|
1501
|
+
</pre></div>
|
1502
|
+
</div>
|
1503
|
+
</dd></dl>
|
1504
|
+
|
1505
|
+
<dl class="py method">
|
1506
|
+
<dt class="sig sig-object py" id="snappy.Manifold.high_precision">
|
1507
|
+
<span class="sig-name descname"><span class="pre">high_precision</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.high_precision" title="Link to this definition"></a></dt>
|
1508
|
+
<dd><p>Return a high precision version of this manifold.</p>
|
1509
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
1510
|
+
<span class="gp">>>> </span><span class="nb">type</span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">high_precision</span><span class="p">())</span>
|
1511
|
+
<span class="go"><class 'snappy.ManifoldHP'></span>
|
1512
|
+
</pre></div>
|
1513
|
+
</div>
|
1514
|
+
</dd></dl>
|
1515
|
+
|
1516
|
+
<dl class="py method">
|
1517
|
+
<dt class="sig sig-object py" id="snappy.Manifold.holonomy_matrix_entries">
|
1518
|
+
<span class="sig-name descname"><span class="pre">holonomy_matrix_entries</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">fundamental_group_args</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">match_kernel</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.holonomy_matrix_entries" title="Link to this definition"></a></dt>
|
1519
|
+
<dd><p>The entries of the matrices of the holonomy as list of ApproximateAlgebraicNumbers
|
1520
|
+
(four consecutive numbers per matrix). The numbers are guaranteed to lie in the
|
1521
|
+
trace field only if match_kernel = False:</p>
|
1522
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m004"</span><span class="p">)</span>
|
1523
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">mat_entries</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">holonomy_matrix_entries</span><span class="p">(</span><span class="n">match_kernel</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="c1"># doctest: +NORMALIZE_WHITESPACE +NUMERIC9</span>
|
1524
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">mat_entries</span>
|
1525
|
+
<span class="o"><</span><span class="n">SetOfAAN</span><span class="p">:</span> <span class="p">[</span><span class="mf">0.5</span> <span class="o">+</span> <span class="mf">0.8660254037844386</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="mf">0.5</span> <span class="o">-</span> <span class="mf">0.8660254037844386</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="mf">0.5</span> <span class="o">+</span> <span class="mf">0.8660254037844386</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="mf">1.7320508075688772</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="mf">3.4641016151377544</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="o">-</span><span class="mf">2.0</span> <span class="o">+</span> <span class="mf">1.7320508075688772</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="o">-</span><span class="mf">1.0</span> <span class="o">-</span> <span class="mf">1.7320508075688772</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="mf">1.7320508075688772</span><span class="o">*</span><span class="n">I</span><span class="p">]</span><span class="o">></span>
|
1526
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">K</span> <span class="o">=</span> <span class="n">mat_entries</span><span class="o">.</span><span class="n">find_field</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">optimize</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
1527
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">K</span><span class="o">.</span><span class="n">polynomial</span><span class="p">()</span>
|
1528
|
+
<span class="n">x</span><span class="o">^</span><span class="mi">2</span> <span class="o">-</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span>
|
1529
|
+
</pre></div>
|
1530
|
+
</div>
|
1531
|
+
</dd></dl>
|
1532
|
+
|
1533
|
+
<dl class="py method">
|
1534
|
+
<dt class="sig sig-object py" id="snappy.Manifold.homological_longitude">
|
1535
|
+
<span class="sig-name descname"><span class="pre">homological_longitude</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cusp</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.homological_longitude" title="Link to this definition"></a></dt>
|
1536
|
+
<dd><p>Returns the peripheral curve in the given cusp, if any, which is
|
1537
|
+
homologically trivial (with rational coefficients) in the manifold:</p>
|
1538
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m015'</span><span class="p">)</span>
|
1539
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">homological_longitude</span><span class="p">()</span>
|
1540
|
+
<span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
1541
|
+
</pre></div>
|
1542
|
+
</div>
|
1543
|
+
<p>If no cusp is specified, the default is the first unfilled cusp;
|
1544
|
+
if all cusps are filled, the default is the first cusp:</p>
|
1545
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'L5a1(3,4)(0,0)'</span><span class="p">)</span>
|
1546
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">homological_longitude</span><span class="p">()</span>
|
1547
|
+
<span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
1548
|
+
</pre></div>
|
1549
|
+
</div>
|
1550
|
+
<p>The components of the next link have nontrivial linking number
|
1551
|
+
so there is no such curve:</p>
|
1552
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">W</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'L7a2'</span><span class="p">)</span>
|
1553
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">W</span><span class="o">.</span><span class="n">homological_longitude</span><span class="p">(</span><span class="n">cusp</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span>
|
1554
|
+
<span class="kc">True</span>
|
1555
|
+
</pre></div>
|
1556
|
+
</div>
|
1557
|
+
<p>If every curve in the given cusp is trivial in the rational homology of
|
1558
|
+
the manifold, an exception is raised:</p>
|
1559
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'4_1(1,0)'</span><span class="p">)</span>
|
1560
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">homological_longitude</span><span class="p">()</span>
|
1561
|
+
<span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
|
1562
|
+
<span class="o">...</span>
|
1563
|
+
<span class="ne">ValueError</span><span class="p">:</span> <span class="n">Every</span> <span class="n">curve</span> <span class="n">on</span> <span class="n">cusp</span> <span class="ow">is</span> <span class="n">homologically</span> <span class="n">trivial</span>
|
1564
|
+
</pre></div>
|
1565
|
+
</div>
|
1566
|
+
</dd></dl>
|
1567
|
+
|
1568
|
+
<dl class="py method">
|
1569
|
+
<dt class="sig sig-object py" id="snappy.Manifold.homology">
|
1570
|
+
<span class="sig-name descname"><span class="pre">homology</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><a class="reference internal" href="additional_classes.html#snappy.AbelianGroup" title="SnapPy.AbelianGroup"><span class="pre">AbelianGroup</span></a></span></span><a class="headerlink" href="#snappy.Manifold.homology" title="Link to this definition"></a></dt>
|
1571
|
+
<dd><p>Returns an <a class="reference internal" href="additional_classes.html#snappy.AbelianGroup" title="snappy.AbelianGroup"><code class="xref py py-class docutils literal notranslate"><span class="pre">AbelianGroup</span></code></a> representing the first integral
|
1572
|
+
homology group of the underlying (Dehn filled) manifold.</p>
|
1573
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'m003'</span><span class="p">)</span>
|
1574
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">homology</span><span class="p">()</span>
|
1575
|
+
<span class="go">Z/5 + Z</span>
|
1576
|
+
</pre></div>
|
1577
|
+
</div>
|
1578
|
+
</dd></dl>
|
1579
|
+
|
1580
|
+
<dl class="py method">
|
1581
|
+
<dt class="sig sig-object py" id="snappy.Manifold.hyperbolic_SLN_torsion">
|
1582
|
+
<span class="sig-name descname"><span class="pre">hyperbolic_SLN_torsion</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">N</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">100</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.hyperbolic_SLN_torsion" title="Link to this definition"></a></dt>
|
1583
|
+
<dd><p>Compute the torsion polynomial of the holonomy representation lifted
|
1584
|
+
to SL(2, C) and then followed by the irreducible representation
|
1585
|
+
from SL(2, C) -> SL(N, C):</p>
|
1586
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m016'</span><span class="p">)</span>
|
1587
|
+
<span class="n">sage</span><span class="p">:</span> <span class="p">[</span><span class="n">M</span><span class="o">.</span><span class="n">hyperbolic_SLN_torsion</span><span class="p">(</span><span class="n">N</span><span class="p">)</span><span class="o">.</span><span class="n">degree</span><span class="p">()</span> <span class="k">for</span> <span class="n">N</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]]</span>
|
1588
|
+
<span class="p">[</span><span class="mi">18</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">36</span><span class="p">]</span>
|
1589
|
+
</pre></div>
|
1590
|
+
</div>
|
1591
|
+
</dd></dl>
|
1592
|
+
|
1593
|
+
<dl class="py method">
|
1594
|
+
<dt class="sig sig-object py" id="snappy.Manifold.hyperbolic_adjoint_torsion">
|
1595
|
+
<span class="sig-name descname"><span class="pre">hyperbolic_adjoint_torsion</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">100</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.hyperbolic_adjoint_torsion" title="Link to this definition"></a></dt>
|
1596
|
+
<dd><p>Computes the torsion polynomial of the adjoint representation
|
1597
|
+
a la Dubois-Yamaguichi. This is not a sign-refined computation
|
1598
|
+
so the result is only defined up to sign, not to mention a power
|
1599
|
+
of the variable ‘a’:</p>
|
1600
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'K11n42'</span><span class="p">)</span>
|
1601
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">tau</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">hyperbolic_adjoint_torsion</span><span class="p">()</span>
|
1602
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">tau</span><span class="o">.</span><span class="n">parent</span><span class="p">()</span>
|
1603
|
+
<span class="n">Univariate</span> <span class="n">Polynomial</span> <span class="n">Ring</span> <span class="ow">in</span> <span class="n">a</span> <span class="n">over</span> <span class="n">Complex</span> <span class="n">Field</span> <span class="k">with</span> <span class="mi">100</span> <span class="n">bits</span> <span class="n">of</span> <span class="n">precision</span>
|
1604
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">tau</span><span class="o">.</span><span class="n">degree</span><span class="p">()</span>
|
1605
|
+
<span class="mi">7</span>
|
1606
|
+
</pre></div>
|
1607
|
+
</div>
|
1608
|
+
</dd></dl>
|
1609
|
+
|
1610
|
+
<dl class="py method">
|
1611
|
+
<dt class="sig sig-object py" id="snappy.Manifold.hyperbolic_torsion">
|
1612
|
+
<span class="sig-name descname"><span class="pre">hyperbolic_torsion</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">100</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">all_lifts</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">wada_conventions</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">phi</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.hyperbolic_torsion" title="Link to this definition"></a></dt>
|
1613
|
+
<dd><p>Computes the hyperbolic torsion polynomial as defined in
|
1614
|
+
<a class="reference external" href="http://arxiv.org/abs/1108.3045">[DFJ]</a>:</p>
|
1615
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'K11n42'</span><span class="p">)</span>
|
1616
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">alexander_polynomial</span><span class="p">()</span>
|
1617
|
+
<span class="mi">1</span>
|
1618
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">tau</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">hyperbolic_torsion</span><span class="p">(</span><span class="n">bits_prec</span><span class="o">=</span><span class="mi">200</span><span class="p">)</span>
|
1619
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">tau</span><span class="o">.</span><span class="n">degree</span><span class="p">()</span>
|
1620
|
+
<span class="mi">6</span>
|
1621
|
+
</pre></div>
|
1622
|
+
</div>
|
1623
|
+
</dd></dl>
|
1624
|
+
|
1625
|
+
<dl class="py method">
|
1626
|
+
<dt class="sig sig-object py" id="snappy.Manifold.identify">
|
1627
|
+
<span class="sig-name descname"><span class="pre">identify</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">extends_to_link</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.identify" title="Link to this definition"></a></dt>
|
1628
|
+
<dd><p>Looks for the manifold in all of the SnapPy databases.
|
1629
|
+
For hyperbolic manifolds this is done by searching for isometries:</p>
|
1630
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m125'</span><span class="p">)</span>
|
1631
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">identify</span><span class="p">()</span>
|
1632
|
+
<span class="go">[m125(0,0)(0,0), L13n5885(0,0)(0,0), ooct01_00000(0,0)(0,0)]</span>
|
1633
|
+
</pre></div>
|
1634
|
+
</div>
|
1635
|
+
<p>By default, there is no restriction on the isometries. One can
|
1636
|
+
require that the isometry take meridians to meridians. This
|
1637
|
+
might return fewer results:</p>
|
1638
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">identify</span><span class="p">(</span><span class="n">extends_to_link</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
1639
|
+
<span class="go">[m125(0,0)(0,0), ooct01_00000(0,0)(0,0)]</span>
|
1640
|
+
</pre></div>
|
1641
|
+
</div>
|
1642
|
+
<p>For closed manifolds, extends_to_link doesn’t make sense
|
1643
|
+
because of how the kernel code works:</p>
|
1644
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">C</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m015(1,2)"</span><span class="p">)</span>
|
1645
|
+
<span class="gp">>>> </span><span class="n">C</span><span class="o">.</span><span class="n">identify</span><span class="p">()</span>
|
1646
|
+
<span class="go">[m006(-5,2)]</span>
|
1647
|
+
<span class="gp">>>> </span><span class="n">C</span><span class="o">.</span><span class="n">identify</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
|
1648
|
+
<span class="go">[]</span>
|
1649
|
+
</pre></div>
|
1650
|
+
</div>
|
1651
|
+
</dd></dl>
|
1652
|
+
|
1653
|
+
<dl class="py method">
|
1654
|
+
<dt class="sig sig-object py" id="snappy.Manifold.inside_view">
|
1655
|
+
<span class="sig-name descname"><span class="pre">inside_view</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cohomology_class</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">geodesics</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Sequence</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">[]</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.inside_view" title="Link to this definition"></a></dt>
|
1656
|
+
<dd><p>Show raytraced inside view of hyperbolic manifold. See
|
1657
|
+
<a class="reference external" href="https://im.icerm.brown.edu/portfolio/snappy-views/">images</a>
|
1658
|
+
and <a class="reference external" href="https://youtu.be/CAERhmUCkRs">demo video</a>.</p>
|
1659
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m004"</span><span class="p">)</span>
|
1660
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">inside_view</span><span class="p">()</span>
|
1661
|
+
</pre></div>
|
1662
|
+
</div>
|
1663
|
+
<p>Or show the cohomology fractal:</p>
|
1664
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m004"</span><span class="p">)</span>
|
1665
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">inside_view</span><span class="p">(</span><span class="n">cohomology_class</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
|
1666
|
+
</pre></div>
|
1667
|
+
</div>
|
1668
|
+
<p>The cohomology class in <span class="math notranslate nohighlight">\(H^2(M, \partial M; \mathbb{R})\)</span> producing the
|
1669
|
+
cohomology fractal can be specified as a cocycle or using an automatically
|
1670
|
+
computed basis (of, say, length <code class="docutils literal notranslate"><span class="pre">n</span></code>). Thus, <code class="docutils literal notranslate"><span class="pre">cohomology_class</span></code> can be
|
1671
|
+
one of the following.</p>
|
1672
|
+
<ul class="simple">
|
1673
|
+
<li><p>An integer <code class="docutils literal notranslate"><span class="pre">i</span></code> between 0 and <code class="docutils literal notranslate"><span class="pre">n</span></code> - 1 to pick the <code class="docutils literal notranslate"><span class="pre">i</span></code>-th basis
|
1674
|
+
vector.</p></li>
|
1675
|
+
<li><p>An array of length <code class="docutils literal notranslate"><span class="pre">n</span></code> specifying the cohomology class as linear
|
1676
|
+
combination of basis vectors.</p></li>
|
1677
|
+
<li><p>A weight for each face of each tetrahedron.</p></li>
|
1678
|
+
</ul>
|
1679
|
+
<p>Geodesics can be specified as words in the unsimplified fundamental group:</p>
|
1680
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m004"</span><span class="p">)</span>
|
1681
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">inside_view</span><span class="p">(</span><span class="n">geodesics</span><span class="o">=</span><span class="p">[</span><span class="s1">'a'</span><span class="p">,</span> <span class="s1">'bC'</span><span class="p">])</span>
|
1682
|
+
</pre></div>
|
1683
|
+
</div>
|
1684
|
+
</dd></dl>
|
1685
|
+
|
1686
|
+
<dl class="py method">
|
1687
|
+
<dt class="sig sig-object py" id="snappy.Manifold.invariant_trace_field_gens">
|
1688
|
+
<span class="sig-name descname"><span class="pre">invariant_trace_field_gens</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">fundamental_group_args</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[]</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.invariant_trace_field_gens" title="Link to this definition"></a></dt>
|
1689
|
+
<dd><p>The generators of the trace field as ApproximateAlgebraicNumbers. Can be
|
1690
|
+
used to compute the tetrahedra field, where the first two parameters
|
1691
|
+
are bits of precision and maximum degree of the field:</p>
|
1692
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m007(3,1)'</span><span class="p">)</span>
|
1693
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">invariant_trace_field_gens</span><span class="p">()</span><span class="o">.</span><span class="n">find_field</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">optimize</span><span class="o">=</span><span class="kc">True</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
1694
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">L</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">trace_field_gens</span><span class="p">()</span><span class="o">.</span><span class="n">find_field</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">optimize</span><span class="o">=</span><span class="kc">True</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
1695
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">K</span><span class="o">.</span><span class="n">polynomial</span><span class="p">(),</span> <span class="n">L</span><span class="o">.</span><span class="n">polynomial</span><span class="p">()</span>
|
1696
|
+
<span class="p">(</span><span class="n">x</span><span class="o">^</span><span class="mi">2</span> <span class="o">-</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">x</span><span class="o">^</span><span class="mi">4</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">3</span> <span class="o">+</span> <span class="n">x</span><span class="o">^</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">6</span><span class="o">*</span><span class="n">x</span> <span class="o">+</span> <span class="mi">3</span><span class="p">)</span>
|
1697
|
+
</pre></div>
|
1698
|
+
</div>
|
1699
|
+
</dd></dl>
|
1700
|
+
|
1701
|
+
<dl class="py method">
|
1702
|
+
<dt class="sig sig-object py" id="snappy.Manifold.is_isometric_to">
|
1703
|
+
<span class="sig-name descname"><span class="pre">is_isometric_to</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">other</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">Manifold</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">ManifoldHP</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">return_isometries</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">bool</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">Isometry</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#snappy.Manifold.is_isometric_to" title="Link to this definition"></a></dt>
|
1704
|
+
<dd><p>Returns <code class="docutils literal notranslate"><span class="pre">True</span></code> if M and N are isometric, <code class="docutils literal notranslate"><span class="pre">False</span></code> if they not.
|
1705
|
+
A <code class="docutils literal notranslate"><span class="pre">RuntimeError</span></code> is raised in cases where the SnapPea kernel fails
|
1706
|
+
to determine either answer. (This is fairly common for closed
|
1707
|
+
manifolds.)</p>
|
1708
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
1709
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'4_1'</span><span class="p">)</span>
|
1710
|
+
<span class="gp">>>> </span><span class="n">K</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'5_2'</span><span class="p">)</span>
|
1711
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">N</span><span class="p">)</span>
|
1712
|
+
<span class="go">True</span>
|
1713
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">K</span><span class="p">)</span>
|
1714
|
+
<span class="go">False</span>
|
1715
|
+
</pre></div>
|
1716
|
+
</div>
|
1717
|
+
<p>We can also get a complete list of isometries between the two
|
1718
|
+
manifolds:</p>
|
1719
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'5^2_1'</span><span class="p">)</span> <span class="c1"># The Whitehead link</span>
|
1720
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m129'</span><span class="p">)</span>
|
1721
|
+
<span class="gp">>>> </span><span class="n">isoms</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">return_isometries</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
|
1722
|
+
<span class="gp">>>> </span><span class="n">isoms</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="c1"># Includes action on cusps</span>
|
1723
|
+
<span class="go">0 -> 1 1 -> 0</span>
|
1724
|
+
<span class="go">[1 2] [-1 -2]</span>
|
1725
|
+
<span class="go">[0 -1] [ 0 1]</span>
|
1726
|
+
<span class="go">Extends to link</span>
|
1727
|
+
</pre></div>
|
1728
|
+
</div>
|
1729
|
+
<p>Each transformation between cusps is given by a matrix which
|
1730
|
+
acts on the left. That is, the two <em>columns</em> of the matrix
|
1731
|
+
give the image of the meridian and longitude respectively. In
|
1732
|
+
the above example, the meridian of cusp 0 is sent to the
|
1733
|
+
meridian of cusp 1.</p>
|
1734
|
+
<p>Note: The answer <code class="docutils literal notranslate"><span class="pre">True</span></code> is rigorous, but the answer <code class="docutils literal notranslate"><span class="pre">False</span></code> may
|
1735
|
+
not be as there could be numerical errors resulting in finding
|
1736
|
+
an incorrect canonical triangulation.</p>
|
1737
|
+
</dd></dl>
|
1738
|
+
|
1739
|
+
<dl class="py method">
|
1740
|
+
<dt class="sig sig-object py" id="snappy.Manifold.is_orientable">
|
1741
|
+
<span class="sig-name descname"><span class="pre">is_orientable</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#snappy.Manifold.is_orientable" title="Link to this definition"></a></dt>
|
1742
|
+
<dd><p>Return whether the underlying 3-manifold is orientable.</p>
|
1743
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'x124'</span><span class="p">)</span>
|
1744
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">is_orientable</span><span class="p">()</span>
|
1745
|
+
<span class="go">False</span>
|
1746
|
+
</pre></div>
|
1747
|
+
</div>
|
1748
|
+
</dd></dl>
|
1749
|
+
|
1750
|
+
<dl class="py method">
|
1751
|
+
<dt class="sig sig-object py" id="snappy.Manifold.is_two_bridge">
|
1752
|
+
<span class="sig-name descname"><span class="pre">is_two_bridge</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#snappy.Manifold.is_two_bridge" title="Link to this definition"></a></dt>
|
1753
|
+
<dd><p>If the manifold is the complement of a two-bridge knot or link
|
1754
|
+
in <span class="math notranslate nohighlight">\(S^3\)</span>, then this method returns <span class="math notranslate nohighlight">\((p,q)\)</span> where
|
1755
|
+
<span class="math notranslate nohighlight">\(p/q\)</span> is the fraction describing the link.
|
1756
|
+
Otherwise, returns <code class="docutils literal notranslate"><span class="pre">False</span></code>.</p>
|
1757
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
1758
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">is_two_bridge</span><span class="p">()</span>
|
1759
|
+
<span class="go">(2, 5)</span>
|
1760
|
+
<span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m016'</span><span class="p">)</span>
|
1761
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">is_two_bridge</span><span class="p">()</span>
|
1762
|
+
<span class="go">False</span>
|
1763
|
+
</pre></div>
|
1764
|
+
</div>
|
1765
|
+
<p>Note: An answer of <code class="docutils literal notranslate"><span class="pre">True</span></code> is rigorous, but not the answer
|
1766
|
+
<code class="docutils literal notranslate"><span class="pre">False</span></code>, as there could be numerical errors resulting in
|
1767
|
+
finding an incorrect canonical triangulation.</p>
|
1768
|
+
</dd></dl>
|
1769
|
+
|
1770
|
+
<dl class="py method">
|
1771
|
+
<dt class="sig sig-object py" id="snappy.Manifold.isometry_signature">
|
1772
|
+
<span class="sig-name descname"><span class="pre">isometry_signature</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">of_link</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_orientation</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">interval_bits_precs</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[53,</span> <span class="pre">212]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exact_bits_prec_and_degrees</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[(212,</span> <span class="pre">10),</span> <span class="pre">(1000,</span> <span class="pre">20),</span> <span class="pre">(2000,</span> <span class="pre">20)]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">str</span></span></span><a class="headerlink" href="#snappy.Manifold.isometry_signature" title="Link to this definition"></a></dt>
|
1773
|
+
<dd><p>Returns the “isometry signature”, a complete invariant of the hyperbolic
|
1774
|
+
3-manifold obtained by applying the Dehn-fillings.
|
1775
|
+
The isometry signature is always a (decorated) isomorphism signature, see
|
1776
|
+
<a class="reference internal" href="#snappy.Manifold.triangulation_isosig" title="snappy.Manifold.triangulation_isosig"><code class="xref py py-meth docutils literal notranslate"><span class="pre">triangulation_isosig()</span></code></a>, and was introduced in
|
1777
|
+
<a class="reference external" href="http://arxiv.org/abs/1502.00383">Goerner ‘16</a>.</p>
|
1778
|
+
<p>Depending on <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_orientation</span></code>, it is a complete invariant of
|
1779
|
+
either the oriented (if orientable) or unoriented hyperbolic 3-manifold.
|
1780
|
+
If <code class="xref py py-attr docutils literal notranslate"><span class="pre">of_link</span> <span class="pre">=</span> <span class="pre">True</span></code> is specified, the signature is decorated by the
|
1781
|
+
unoriented peripheral curves (aka meridian and longitude, up to homotopy).
|
1782
|
+
If the 3-manifold arises as a link complement, the decorated isometry
|
1783
|
+
signature obtained with <code class="xref py py-attr docutils literal notranslate"><span class="pre">of_link</span> <span class="pre">=</span> <span class="pre">True</span></code> is a complete invariant of
|
1784
|
+
the link.</p>
|
1785
|
+
<p>The isometry signature is computed differently based on whether there
|
1786
|
+
is at least one unfilled cusp.</p>
|
1787
|
+
<p><strong>Cusped manifolds</strong></p>
|
1788
|
+
<p>If there is at least one unfilled cusped, we are in the cusped case.</p>
|
1789
|
+
<p>Here is an example of two links having isometric (hyperbolic) complements:</p>
|
1790
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"L5a1"</span><span class="p">)</span>
|
1791
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"L7n2"</span><span class="p">)</span>
|
1792
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">()</span>
|
1793
|
+
<span class="go">'eLPkbdcddhgggb'</span>
|
1794
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">()</span>
|
1795
|
+
<span class="go">'eLPkbdcddhgggb'</span>
|
1796
|
+
</pre></div>
|
1797
|
+
</div>
|
1798
|
+
<p>The complements do have opposite handedness though:</p>
|
1799
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">ignore_orientation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
1800
|
+
<span class="go">'eLPkbdcddxvvcv'</span>
|
1801
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">ignore_orientation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
1802
|
+
<span class="go">'eLPkbdcddhgggb'</span>
|
1803
|
+
</pre></div>
|
1804
|
+
</div>
|
1805
|
+
<p>We can show that the two links are distinct:</p>
|
1806
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">of_link</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
|
1807
|
+
<span class="go">'eLPkbdcddhgggb_baCbbaCb'</span>
|
1808
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">of_link</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
|
1809
|
+
<span class="go">'eLPkbdcddhgggb_bBcBbaCb'</span>
|
1810
|
+
</pre></div>
|
1811
|
+
</div>
|
1812
|
+
<p>If we Dehn-fill some cusps, the method uses the filled triangulation.
|
1813
|
+
Here, we Dehn-fill the Whitehead link to get the figure-eight knot:</p>
|
1814
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span> <span class="mi">0</span><span class="p">)</span>
|
1815
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">of_link</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
|
1816
|
+
<span class="go">'cPcbbbiht_bacb'</span>
|
1817
|
+
<span class="gp">>>> </span><span class="n">Manifold</span><span class="p">(</span><span class="s2">"4_1"</span><span class="p">)</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">of_link</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
|
1818
|
+
<span class="go">'cPcbbbiht_bacb'</span>
|
1819
|
+
</pre></div>
|
1820
|
+
</div>
|
1821
|
+
<p>In general, the isometry signature is the isomorphism signature (see
|
1822
|
+
<a class="reference internal" href="#snappy.Manifold.triangulation_isosig" title="snappy.Manifold.triangulation_isosig"><code class="xref py py-meth docutils literal notranslate"><span class="pre">triangulation_isosig()</span></code></a>) of the
|
1823
|
+
<a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation()</span></code></a> of the
|
1824
|
+
<a class="reference internal" href="#snappy.Manifold.filled_triangulation" title="snappy.Manifold.filled_triangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">filled_triangulation()</span></code></a>:</p>
|
1825
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">T</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">filled_triangulation</span><span class="p">()</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
|
1826
|
+
<span class="gp">>>> </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_cusp_ordering</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
|
1827
|
+
<span class="gp">... </span> <span class="n">ignore_curve_orientations</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
|
1828
|
+
<span class="go">'cPcbbbiht_bacb'</span>
|
1829
|
+
</pre></div>
|
1830
|
+
</div>
|
1831
|
+
<p><strong>Closed manifolds</strong></p>
|
1832
|
+
<p>If all cusps are filled, we are in the closed case. In this case, the
|
1833
|
+
isometry signature gives the resulting closed hyperbolic 3-manifold as
|
1834
|
+
canonical surgery on a hyperbolic 1-cusped manifold (which is encoded by
|
1835
|
+
its isometry signature). Only orientable manifolds are supported in the
|
1836
|
+
closed case.</p>
|
1837
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"v2000(1,3)"</span><span class="p">)</span>
|
1838
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">()</span>
|
1839
|
+
<span class="go">'fLLQcacdedenbxxrr(-7,12)'</span>
|
1840
|
+
</pre></div>
|
1841
|
+
</div>
|
1842
|
+
<p>The following code illustrates how the isometry signature is computed:</p>
|
1843
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
1844
|
+
<span class="go">[Length Core curve Word</span>
|
1845
|
+
<span class="go"> 0.06491027903143 - 2.63765810995071*I - d,</span>
|
1846
|
+
<span class="go"> 0.49405010583448 + 2.38451103485706*I - a]</span>
|
1847
|
+
<span class="gp">>>> </span><span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_word</span><span class="p">(</span><span class="s1">'d'</span><span class="p">)</span><span class="o">.</span><span class="n">filled_triangulation</span><span class="p">()</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
|
1848
|
+
<span class="gp">>>> </span><span class="n">K</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="mi">0</span><span class="p">)</span>
|
1849
|
+
<span class="gp">>>> </span><span class="n">K</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">ignore_curves</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
1850
|
+
<span class="go">'fLLQcacdedenbxxrr(-7,12)'</span>
|
1851
|
+
</pre></div>
|
1852
|
+
</div>
|
1853
|
+
<p>Note that there is clearly a unique shortest geodesic in this example.
|
1854
|
+
In general, the method first considers a canonical set of geodesics.
|
1855
|
+
For each such geodesic, it computes a candidate signature as above. It
|
1856
|
+
then picks a canonical signature among the candidates. Further details
|
1857
|
+
can be found in an upcoming paper.</p>
|
1858
|
+
<p><strong>Verified computations</strong></p>
|
1859
|
+
<p>While the isometry signature is purely combinatorial, some intermediate
|
1860
|
+
computations are numerical. Thus, if <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>,
|
1861
|
+
floating-point issues can arise.</p>
|
1862
|
+
<p>The method can be made <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing
|
1863
|
+
<code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
|
1864
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">=</span><span class="n">Manifold</span><span class="p">(</span><span class="s2">"m007(4,1)"</span><span class="p">)</span>
|
1865
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">verified</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
1866
|
+
<span class="s1">'eLPkbcdddhggsj(3,1)'</span>
|
1867
|
+
</pre></div>
|
1868
|
+
</div>
|
1869
|
+
<p>This method always needs to compute at least one canonical retriangulation.
|
1870
|
+
It can take the same arguments as <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation()</span></code></a> and
|
1871
|
+
passes them to <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation()</span></code></a> when computing the
|
1872
|
+
verified canonical retriangulation. If the manifold is closed, interval
|
1873
|
+
arithmetic is used when finding and drilling the short geodesics.</p>
|
1874
|
+
<dl class="field-list simple">
|
1875
|
+
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
|
1876
|
+
<dd class="field-odd"><ul class="simple">
|
1877
|
+
<li><p><strong>of_link</strong> – Also encode the unoriented peripheral curves.
|
1878
|
+
Note that it is not necessary for the manifold to be a link
|
1879
|
+
complement to invoke this flag.
|
1880
|
+
Only relevant in the cusped case.</p></li>
|
1881
|
+
<li><p><strong>ignore_orientation</strong> – Do not encode the orientation of the 3-manifold.</p></li>
|
1882
|
+
<li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
|
1883
|
+
<li><p><strong>interval_bits_precs</strong> – Passed to <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation()</span></code></a> and (in the closed
|
1884
|
+
case) also used when calling <a class="reference internal" href="#snappy.Manifold.length_spectrum_alt_gen" title="snappy.Manifold.length_spectrum_alt_gen"><code class="xref py py-meth docutils literal notranslate"><span class="pre">length_spectrum_alt_gen()</span></code></a> and
|
1885
|
+
<a class="reference internal" href="#snappy.Manifold.drill_word" title="snappy.Manifold.drill_word"><code class="xref py py-meth docutils literal notranslate"><span class="pre">drill_word()</span></code></a> to find and drill the short geodesics.</p></li>
|
1886
|
+
<li><p><strong>exact_bits_prec_and_degrees</strong> – Passed to <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation()</span></code></a>.</p></li>
|
1887
|
+
<li><p><strong>verbose</strong> – Print information about finding and drilling the short geodesics.
|
1888
|
+
Also passed to <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation()</span></code></a>.</p></li>
|
1889
|
+
</ul>
|
1890
|
+
</dd>
|
1891
|
+
</dl>
|
1892
|
+
</dd></dl>
|
1893
|
+
|
1894
|
+
<dl class="py method">
|
1895
|
+
<dt class="sig sig-object py" id="snappy.Manifold.isomorphisms_to">
|
1896
|
+
<span class="sig-name descname"><span class="pre">isomorphisms_to</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">other</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><span class="pre">Triangulation</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">TriangulationHP</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">Isometry</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#snappy.Manifold.isomorphisms_to" title="Link to this definition"></a></dt>
|
1897
|
+
<dd><p>Returns a complete list of combinatorial isomorphisms between
|
1898
|
+
the two triangulations:</p>
|
1899
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'5^2_1'</span><span class="p">)</span>
|
1900
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'5^2_1'</span><span class="p">)</span>
|
1901
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">set_peripheral_curves</span><span class="p">([[[</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">],[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">]],[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">]]])</span>
|
1902
|
+
<span class="gp">>>> </span><span class="n">isoms</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">isomorphisms_to</span><span class="p">(</span><span class="n">N</span><span class="p">)</span>
|
1903
|
+
<span class="gp">>>> </span><span class="n">isoms</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span>
|
1904
|
+
<span class="go">0 -> 1 1 -> 0</span>
|
1905
|
+
<span class="go">[ 1 0] [-1 1]</span>
|
1906
|
+
<span class="go">[-1 1] [-3 2]</span>
|
1907
|
+
<span class="go">Does not extend to link</span>
|
1908
|
+
</pre></div>
|
1909
|
+
</div>
|
1910
|
+
<p>Each transformation between cusps is given by a matrix which
|
1911
|
+
acts on the left. That is, the two <em>columns</em> of the matrix
|
1912
|
+
give the image of the meridian and longitude respectively. In
|
1913
|
+
the above example, the meridian of cusp 0 is sent to the
|
1914
|
+
meridian of cusp 1.</p>
|
1915
|
+
</dd></dl>
|
1916
|
+
|
1917
|
+
<dl class="py method">
|
1918
|
+
<dt class="sig sig-object py" id="snappy.Manifold.length_spectrum">
|
1919
|
+
<span class="sig-name descname"><span class="pre">length_spectrum</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cutoff</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">full_rigor</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">grouped</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">include_words</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.length_spectrum" title="Link to this definition"></a></dt>
|
1920
|
+
<dd><p>Returns a list of geodesics (with multiplicities) of length
|
1921
|
+
up to the specified cutoff value. (The default cutoff is 1.0.)</p>
|
1922
|
+
<p>Here’s a quick example:</p>
|
1923
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">L</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m016"</span><span class="p">)</span><span class="o">.</span><span class="n">length_spectrum</span><span class="p">(</span><span class="mf">0.75</span><span class="p">,</span> <span class="n">include_words</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
1924
|
+
<span class="gp">>>> </span><span class="n">L</span>
|
1925
|
+
<span class="go">mult length topology parity word</span>
|
1926
|
+
<span class="go">1 0.58460368501799 + 2.49537045556047*I circle + a</span>
|
1927
|
+
<span class="go">1 0.72978937305180 + 3.02669828218116*I circle + Bc</span>
|
1928
|
+
</pre></div>
|
1929
|
+
</div>
|
1930
|
+
<p>Access just the length:</p>
|
1931
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">L</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">length</span>
|
1932
|
+
<span class="go">0.584603685017987 + 2.495370455560469*I</span>
|
1933
|
+
</pre></div>
|
1934
|
+
</div>
|
1935
|
+
</dd></dl>
|
1936
|
+
|
1937
|
+
<dl class="py method">
|
1938
|
+
<dt class="sig sig-object py" id="snappy.Manifold.length_spectrum_alt">
|
1939
|
+
<span class="sig-name descname"><span class="pre">length_spectrum_alt</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">count</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_len</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Any</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">LengthSpectrumGeodesicInfo</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#snappy.Manifold.length_spectrum_alt" title="Link to this definition"></a></dt>
|
1940
|
+
<dd><p>Returns a list of geodesics. How far this list goes can be specified
|
1941
|
+
by either a cut-off length or a count. The method only supports
|
1942
|
+
orientable manifolds. It is a convenience method for
|
1943
|
+
<a class="reference internal" href="#snappy.Manifold.length_spectrum_alt_gen" title="snappy.Manifold.length_spectrum_alt_gen"><code class="xref py py-meth docutils literal notranslate"><span class="pre">length_spectrum_alt_gen()</span></code></a>.
|
1944
|
+
We refer the reader to
|
1945
|
+
<a class="reference internal" href="#snappy.Manifold.length_spectrum_alt_gen" title="snappy.Manifold.length_spectrum_alt_gen"><code class="xref py py-meth docutils literal notranslate"><span class="pre">length_spectrum_alt_gen()</span></code></a>
|
1946
|
+
for further details not covered here.</p>
|
1947
|
+
<p><strong>Cut-off length</strong></p>
|
1948
|
+
<p>Here is an example where a cut-off length for the geodesics is specified:</p>
|
1949
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m202(3,4)(3,4)"</span><span class="p">)</span>
|
1950
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt</span><span class="p">(</span><span class="n">max_len</span> <span class="o">=</span> <span class="mf">0.5</span><span class="p">)</span>
|
1951
|
+
<span class="go">[Length Core curve Word</span>
|
1952
|
+
<span class="go"> 0.14820741547094 - 1.76955170166922*I Cusp 1 bcDc,</span>
|
1953
|
+
<span class="go"> 0.14820741547097 - 1.76955170166923*I Cusp 0 aabcDabcB]</span>
|
1954
|
+
</pre></div>
|
1955
|
+
</div>
|
1956
|
+
<p>It also supports <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> computations:</p>
|
1957
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M.length_spectrum_alt(max_len = 0.5, verified = True, bits_prec = 100) # doctest: +SKIP
|
1958
|
+
[Length Core curve Word
|
1959
|
+
0.148207415470948? - 1.76955170166924? *I Cusp 0 aabcDabcB,
|
1960
|
+
0.14820741547094... - 1.76955170166923...*I Cusp 1 bcDc]
|
1961
|
+
</pre></div>
|
1962
|
+
</div>
|
1963
|
+
<p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified=True</span></code>, the returned list is guaranteed to include all
|
1964
|
+
geodesics up to the given cut-off length and might include additional
|
1965
|
+
geodesics.</p>
|
1966
|
+
<p><strong>Count</strong></p>
|
1967
|
+
<p>Here is an example where a count is specified:</p>
|
1968
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m202(3,4)(3,4)"</span><span class="p">)</span>
|
1969
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt</span><span class="p">(</span><span class="n">count</span> <span class="o">=</span> <span class="mi">3</span><span class="p">)</span>
|
1970
|
+
<span class="go">[Length Core curve Word</span>
|
1971
|
+
<span class="go"> 0.14820741547094 - 1.76955170166922*I Cusp 1 bcDc,</span>
|
1972
|
+
<span class="go"> 0.14820741547097 - 1.76955170166923*I Cusp 0 aabcDabcB,</span>
|
1973
|
+
<span class="go"> 0.79356651781096 + 2.65902431489655*I - aB,</span>
|
1974
|
+
<span class="go"> 0.79356651781096 + 2.65902431489655*I - b]</span>
|
1975
|
+
</pre></div>
|
1976
|
+
</div>
|
1977
|
+
<p>Note that the number of geodesics listed might be larger than the given
|
1978
|
+
count. In particular, this happens when the same (real) length appears
|
1979
|
+
multiple times. If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified=True</span></code>, the returned list is guaranteed
|
1980
|
+
to include the <code class="xref py py-attr docutils literal notranslate"><span class="pre">count</span></code> shortest geodesics and might include additional
|
1981
|
+
geodesics.</p>
|
1982
|
+
<p><strong>Verified systole</strong></p>
|
1983
|
+
<p>Even though, the first reported geodesic might not be the shortest, we
|
1984
|
+
obtain an interval containing the systole as follows, also see
|
1985
|
+
<a class="reference internal" href="#snappy.Manifold.length_spectrum_alt_gen" title="snappy.Manifold.length_spectrum_alt_gen"><code class="xref py py-meth docutils literal notranslate"><span class="pre">length_spectrum_alt_gen()</span></code></a>:</p>
|
1986
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M = Manifold("m004")
|
1987
|
+
sage: M.length_spectrum_alt(count=1, verified=True, bits_prec=100)[0].length.real() # doctest: +NUMERIC21
|
1988
|
+
1.0870701449957390997853?
|
1989
|
+
</pre></div>
|
1990
|
+
</div>
|
1991
|
+
<dl class="field-list simple">
|
1992
|
+
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
|
1993
|
+
<dd class="field-odd"><ul class="simple">
|
1994
|
+
<li><p><strong>count</strong> – Number of shortest geodesics to list. The actual result might
|
1995
|
+
contain additional geodesics. Exactly one of <code class="xref py py-attr docutils literal notranslate"><span class="pre">count</span></code> and
|
1996
|
+
<code class="xref py py-attr docutils literal notranslate"><span class="pre">max_len</span></code> has to be specified.</p></li>
|
1997
|
+
<li><p><strong>max_len</strong> – Cut-off length for geodesics. The actual result includes all
|
1998
|
+
geodesics up to the given length and might include additional
|
1999
|
+
geodesics. Exactly one of <code class="xref py py-attr docutils literal notranslate"><span class="pre">count</span></code> and <code class="xref py py-attr docutils literal notranslate"><span class="pre">max_len</span></code> has
|
2000
|
+
to be specified.</p></li>
|
2001
|
+
<li><p><strong>bits_prec</strong> – Precision used for the computation. Increase if computation did
|
2002
|
+
not succeed.</p></li>
|
2003
|
+
<li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
|
2004
|
+
</ul>
|
2005
|
+
</dd>
|
2006
|
+
<dt class="field-even">Returns<span class="colon">:</span></dt>
|
2007
|
+
<dd class="field-even"><p>A list of geodesics such that the (lower bound of) the real
|
2008
|
+
length is non-decreasing.</p>
|
2009
|
+
</dd>
|
2010
|
+
</dl>
|
2011
|
+
</dd></dl>
|
2012
|
+
|
2013
|
+
<dl class="py method">
|
2014
|
+
<dt class="sig sig-object py" id="snappy.Manifold.length_spectrum_alt_gen">
|
2015
|
+
<span class="sig-name descname"><span class="pre">length_spectrum_alt_gen</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">Sequence</span><span class="p"><span class="pre">[</span></span><span class="pre">LengthSpectrumGeodesicInfo</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#snappy.Manifold.length_spectrum_alt_gen" title="Link to this definition"></a></dt>
|
2016
|
+
<dd><p>Returns a generator for the geodesics sorted by real length. The method
|
2017
|
+
only supports orientable manifolds.</p>
|
2018
|
+
<p>Here is an example:</p>
|
2019
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m202(3,4)(0,0)"</span><span class="p">)</span>
|
2020
|
+
<span class="gp">>>> </span><span class="n">spec</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt_gen</span><span class="p">()</span>
|
2021
|
+
<span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
|
2022
|
+
<span class="go">Length Core curve Word</span>
|
2023
|
+
<span class="go">0.14742465268512 - 1.78287093565202*I Cusp 0 aabcDabcB</span>
|
2024
|
+
<span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
|
2025
|
+
<span class="go">0.81161414965958 + 2.72911699294426*I - b</span>
|
2026
|
+
<span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
|
2027
|
+
<span class="go">0.84163270359334 + 2.61245944742151*I - aB</span>
|
2028
|
+
</pre></div>
|
2029
|
+
</div>
|
2030
|
+
<p>Note that the shortest geodesic in the above example happens to be the
|
2031
|
+
core curve of the filled cusp (Cusp 0).</p>
|
2032
|
+
<p>Access just the length or word:</p>
|
2033
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">g</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
|
2034
|
+
<span class="gp">>>> </span><span class="n">g</span><span class="o">.</span><span class="n">length</span>
|
2035
|
+
<span class="go">0.93461379591349 + 2.70060614107722*I</span>
|
2036
|
+
<span class="gp">>>> </span><span class="n">g</span><span class="o">.</span><span class="n">word</span>
|
2037
|
+
<span class="go">'a'</span>
|
2038
|
+
</pre></div>
|
2039
|
+
</div>
|
2040
|
+
<p>The word is given with respect to the unsimplified fundamental group:</p>
|
2041
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">G</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">(</span><span class="n">simplify_presentation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
2042
|
+
<span class="gp">>>> </span><span class="n">G</span><span class="o">.</span><span class="n">complex_length</span><span class="p">(</span><span class="s1">'a'</span><span class="p">)</span>
|
2043
|
+
<span class="go">0.93461379591349 + 2.70060614107722*I</span>
|
2044
|
+
</pre></div>
|
2045
|
+
</div>
|
2046
|
+
<p>The method also supports higher precision:</p>
|
2047
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m003(-3,1)"</span><span class="p">)</span>
|
2048
|
+
<span class="gp">>>> </span><span class="n">spec</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt_gen</span><span class="p">(</span><span class="n">bits_prec</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
|
2049
|
+
<span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span><span class="o">.</span><span class="n">length</span>
|
2050
|
+
<span class="go">0.58460368501798696932015666264 + 2.4953704555604684110903962008*I</span>
|
2051
|
+
</pre></div>
|
2052
|
+
</div>
|
2053
|
+
<p><strong>Performance</strong></p>
|
2054
|
+
<p>This method uses a different algorithm than
|
2055
|
+
<a class="reference internal" href="#snappy.Manifold.length_spectrum" title="snappy.Manifold.length_spectrum"><code class="xref py py-meth docutils literal notranslate"><span class="pre">length_spectrum</span></code></a>. In particular,
|
2056
|
+
it does not compute the Dirichlet domain. It also allows for
|
2057
|
+
<a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computations</span></a>.
|
2058
|
+
It is implemented in python and thus
|
2059
|
+
typically slower than <a class="reference internal" href="#snappy.Manifold.length_spectrum" title="snappy.Manifold.length_spectrum"><code class="xref py py-meth docutils literal notranslate"><span class="pre">length_spectrum</span></code></a>.
|
2060
|
+
But there are also some cases where it is significantly faster. In
|
2061
|
+
particular, this applies to spun triangulations such as <code class="docutils literal notranslate"><span class="pre">m004(21,10)</span></code>.</p>
|
2062
|
+
<p>Here is example where we can help the algorithm by guessing and drilling
|
2063
|
+
and filling a short geodesic:</p>
|
2064
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"o9_00639"</span><span class="p">)</span>
|
2065
|
+
</pre></div>
|
2066
|
+
</div>
|
2067
|
+
<p>Over an hour to compute:</p>
|
2068
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">high_precision</span><span class="p">()</span><span class="o">.</span><span class="n">length_spectrum</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span>
|
2069
|
+
<span class="go">mult length topology parity</span>
|
2070
|
+
<span class="go">1 0.00150226276052 - 2.39996262244127*I circle +</span>
|
2071
|
+
</pre></div>
|
2072
|
+
</div>
|
2073
|
+
<p>A couple of minutes to compute:</p>
|
2074
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">spec</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt_gen</span><span class="p">(</span><span class="n">bits_prec</span> <span class="o">=</span> <span class="mi">150</span><span class="p">)</span>
|
2075
|
+
<span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
|
2076
|
+
<span class="go">Length Word Core curve</span>
|
2077
|
+
<span class="go">0.00150226276052 - 2.39996262244127*I a -</span>
|
2078
|
+
</pre></div>
|
2079
|
+
</div>
|
2080
|
+
<p>After drilling and filling, less than a second to compute:</p>
|
2081
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_word</span><span class="p">(</span><span class="s1">'a'</span><span class="p">)</span>
|
2082
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># N is now isometric to o9_00639 but as a surgery m125(0,0)(34,55)</span>
|
2083
|
+
<span class="gp">>>> </span><span class="n">spec</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">length_spectrum_alt_gen</span><span class="p">()</span>
|
2084
|
+
<span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
|
2085
|
+
<span class="go">Length Core curve Word</span>
|
2086
|
+
<span class="go">0.00150226276073 - 2.39996262244128*I Cusp 1 cDcDDcDcDDcDDcDcDDcDcDDcDDcDcDDcDD</span>
|
2087
|
+
<span class="gp">>>> </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span><span class="o">.</span><span class="n">length</span><span class="o">.</span><span class="n">real</span><span class="p">()</span>
|
2088
|
+
<span class="go">0.96218768626877</span>
|
2089
|
+
</pre></div>
|
2090
|
+
</div>
|
2091
|
+
<p><strong>Verified computations</strong></p>
|
2092
|
+
<p>The method also supports <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computations</span></a>:</p>
|
2093
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m019"</span><span class="p">)</span>
|
2094
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">spec</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt_gen</span><span class="p">(</span><span class="n">verified</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">bits_prec</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
|
2095
|
+
<span class="n">sage</span><span class="p">:</span> <span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
|
2096
|
+
<span class="n">Length</span> <span class="n">Core</span> <span class="n">curve</span> <span class="n">Word</span>
|
2097
|
+
<span class="mf">0.43153441294719</span><span class="o">...</span> <span class="o">+</span> <span class="mf">2.35105908147863</span><span class="o">...*</span><span class="n">I</span> <span class="o">-</span> <span class="n">a</span>
|
2098
|
+
<span class="n">sage</span><span class="p">:</span> <span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
|
2099
|
+
<span class="mf">0.88944299721255</span><span class="o">...</span> <span class="o">-</span> <span class="mf">2.94185904702273</span><span class="o">...*</span><span class="n">I</span> <span class="o">-</span> <span class="n">bD</span>
|
2100
|
+
</pre></div>
|
2101
|
+
</div>
|
2102
|
+
<p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code> is passed, the algorithm guarantees that the lower
|
2103
|
+
bound of the real length is (non-strictly) increasing. In particular, we know
|
2104
|
+
that we have found all geodesics less than the following length:</p>
|
2105
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span><span class="o">.</span><span class="n">length</span><span class="o">.</span><span class="n">real</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="c1"># doctest: +NUMERIC12</span>
|
2106
|
+
<span class="mf">0.94135129037387168886341739832</span>
|
2107
|
+
</pre></div>
|
2108
|
+
</div>
|
2109
|
+
<p>To illustrate some pitfalls, here is an example of a potential a result
|
2110
|
+
of the method:</p>
|
2111
|
+
<table class="docutils align-default">
|
2112
|
+
<thead>
|
2113
|
+
<tr class="row-odd"><th class="head"><p>Real length interval</p></th>
|
2114
|
+
<th class="head"><p>Word</p></th>
|
2115
|
+
</tr>
|
2116
|
+
</thead>
|
2117
|
+
<tbody>
|
2118
|
+
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">[1.0,</span> <span class="pre">2.0]</span></code></p></td>
|
2119
|
+
<td><p><code class="docutils literal notranslate"><span class="pre">a</span></code></p></td>
|
2120
|
+
</tr>
|
2121
|
+
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">[1.2,</span> <span class="pre">1.3]</span></code></p></td>
|
2122
|
+
<td><p><code class="docutils literal notranslate"><span class="pre">b</span></code></p></td>
|
2123
|
+
</tr>
|
2124
|
+
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">[1.7,</span> <span class="pre">1.8]</span></code></p></td>
|
2125
|
+
<td><p><code class="docutils literal notranslate"><span class="pre">c</span></code></p></td>
|
2126
|
+
</tr>
|
2127
|
+
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">[3.0,</span> <span class="pre">4.0]</span></code></p></td>
|
2128
|
+
<td><p><code class="docutils literal notranslate"><span class="pre">d</span></code></p></td>
|
2129
|
+
</tr>
|
2130
|
+
</tbody>
|
2131
|
+
</table>
|
2132
|
+
<p>Note that we cannot say whether geodesic <code class="docutils literal notranslate"><span class="pre">a</span></code> is actually the first,
|
2133
|
+
second or third shortest geodesic or tied with <code class="docutils literal notranslate"><span class="pre">b</span></code> or <code class="docutils literal notranslate"><span class="pre">c</span></code>. Increasing
|
2134
|
+
precision can change (representative words and) the order in which the
|
2135
|
+
geodesics are emitted.</p>
|
2136
|
+
<p>We can say that together <code class="docutils literal notranslate"><span class="pre">a</span></code>, <code class="docutils literal notranslate"><span class="pre">b</span></code> and <code class="docutils literal notranslate"><span class="pre">c</span></code> are the three shortest
|
2137
|
+
geodesics. Furthermore, we can also say that the systole
|
2138
|
+
of the manifold is in <code class="docutils literal notranslate"><span class="pre">[1.0,</span> <span class="pre">2.0]</span></code> even though <code class="docutils literal notranslate"><span class="pre">a</span></code> itself might not be
|
2139
|
+
the shortest geodesic. The latter is true in general:</p>
|
2140
|
+
<p><strong>Verified systole</strong></p>
|
2141
|
+
<p>It is not necessarily true that the first geodesic returned
|
2142
|
+
by the method is the shortest geodesic. Despite this, the interval for
|
2143
|
+
the real length of the first geodesic always contains the systole of
|
2144
|
+
the manifold:</p>
|
2145
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M = Manifold("m004")
|
2146
|
+
sage: spec = M.length_spectrum_alt_gen(verified=True)
|
2147
|
+
sage: g = next(spec) # g might or might not be shortest geodesic
|
2148
|
+
sage: systole = g.length.real() # But interval is large enough to contain systole
|
2149
|
+
sage: systole # doctest: +NUMERIC6
|
2150
|
+
1.08707015?
|
2151
|
+
</pre></div>
|
2152
|
+
</div>
|
2153
|
+
<dl class="field-list simple">
|
2154
|
+
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
|
2155
|
+
<dd class="field-odd"><ul class="simple">
|
2156
|
+
<li><p><strong>bits_prec</strong> – Precision used for the computation. Increase if computation did
|
2157
|
+
not succeed.</p></li>
|
2158
|
+
<li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
|
2159
|
+
</ul>
|
2160
|
+
</dd>
|
2161
|
+
<dt class="field-even">Returns<span class="colon">:</span></dt>
|
2162
|
+
<dd class="field-even"><p>A generator to enumerate the geodesics such that the (lower bound
|
2163
|
+
of the) real length is non-decreasing.</p>
|
2164
|
+
</dd>
|
2165
|
+
</dl>
|
2166
|
+
</dd></dl>
|
2167
|
+
|
2168
|
+
<dl class="py method">
|
2169
|
+
<dt class="sig sig-object py" id="snappy.Manifold.link">
|
2170
|
+
<span class="sig-name descname"><span class="pre">link</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.link" title="Link to this definition"></a></dt>
|
2171
|
+
<dd><p>If the manifold is stored as a link complement in your
|
2172
|
+
current session then it returns the number of components
|
2173
|
+
and crossing of the link. To view and interact with the
|
2174
|
+
link see <a class="reference internal" href="spherogram.html#spherogram.Link.view" title="spherogram.Link.view"><code class="xref py py-meth docutils literal notranslate"><span class="pre">spherogram.Link.view()</span></code></a>
|
2175
|
+
and <a class="reference internal" href="triangulation.html#snappy.Triangulation.plink" title="snappy.Triangulation.plink"><code class="xref py py-meth docutils literal notranslate"><span class="pre">plink</span></code></a>.</p>
|
2176
|
+
</dd></dl>
|
2177
|
+
|
2178
|
+
<dl class="py method">
|
2179
|
+
<dt class="sig sig-object py" id="snappy.Manifold.name">
|
2180
|
+
<span class="sig-name descname"><span class="pre">name</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">str</span></span></span><a class="headerlink" href="#snappy.Manifold.name" title="Link to this definition"></a></dt>
|
2181
|
+
<dd><p>Return the name of the triangulation.</p>
|
2182
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'4_1'</span><span class="p">)</span>
|
2183
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">name</span><span class="p">()</span>
|
2184
|
+
<span class="go">'4_1'</span>
|
2185
|
+
</pre></div>
|
2186
|
+
</div>
|
2187
|
+
</dd></dl>
|
2188
|
+
|
2189
|
+
<dl class="py method">
|
2190
|
+
<dt class="sig sig-object py" id="snappy.Manifold.normal_boundary_slopes">
|
2191
|
+
<span class="sig-name descname"><span class="pre">normal_boundary_slopes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">subset</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'all'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">algorithm</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'FXrays'</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.normal_boundary_slopes" title="Link to this definition"></a></dt>
|
2192
|
+
<dd><p>For a one-cusped manifold, returns all the nonempty boundary slopes of
|
2193
|
+
spun normal surfaces. Provided the triangulation supports a
|
2194
|
+
genuine hyperbolic structure, then by <a class="reference external" href="http://arxiv.org/abs/math/0503027">Thurston and Walsh</a> any strict boundary slope
|
2195
|
+
(the boundary of an essential surface which is not a fiber or
|
2196
|
+
semifiber) must be listed here.</p>
|
2197
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'K3_1'</span><span class="p">)</span>
|
2198
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">normal_boundary_slopes</span><span class="p">()</span>
|
2199
|
+
<span class="go">[(16, -1), (20, -1), (37, -2)]</span>
|
2200
|
+
</pre></div>
|
2201
|
+
</div>
|
2202
|
+
<p>If the <code class="docutils literal notranslate"><span class="pre">subset</span></code> flag is set to <code class="docutils literal notranslate"><span class="pre">'kabaya'</span></code>, then it only
|
2203
|
+
returns boundary slopes associated to vertex surfaces with a quad
|
2204
|
+
in every tetrahedron; by Theorem 1.1. of
|
2205
|
+
<a class="reference external" href="http://arxiv.org/abs/1102.4588">Dunfield and Garoufalidis ‘12</a>
|
2206
|
+
these are all strict boundary slopes.</p>
|
2207
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m113'</span><span class="p">)</span>
|
2208
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">normal_boundary_slopes</span><span class="p">()</span>
|
2209
|
+
<span class="go">[(1, 1), (1, 2), (2, -1), (2, 3), (8, 11)]</span>
|
2210
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">normal_boundary_slopes</span><span class="p">(</span><span class="s1">'kabaya'</span><span class="p">)</span>
|
2211
|
+
<span class="go">[(8, 11)]</span>
|
2212
|
+
</pre></div>
|
2213
|
+
</div>
|
2214
|
+
<p>If the <code class="docutils literal notranslate"><span class="pre">subset</span></code> flag is set to <code class="docutils literal notranslate"><span class="pre">'brasile'</span></code> then it returns
|
2215
|
+
only the boundary slopes that are associated to vertex surfaces
|
2216
|
+
giving isolated rays in the space of embedded normal surfaces.</p>
|
2217
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">normal_boundary_slopes</span><span class="p">(</span><span class="s1">'brasile'</span><span class="p">)</span>
|
2218
|
+
<span class="go">[(1, 2), (8, 11)]</span>
|
2219
|
+
</pre></div>
|
2220
|
+
</div>
|
2221
|
+
</dd></dl>
|
2222
|
+
|
2223
|
+
<dl class="py method">
|
2224
|
+
<dt class="sig sig-object py" id="snappy.Manifold.normal_surfaces">
|
2225
|
+
<span class="sig-name descname"><span class="pre">normal_surfaces</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">algorithm</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'FXrays'</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.normal_surfaces" title="Link to this definition"></a></dt>
|
2226
|
+
<dd><p>All the vertex spun-normal surfaces in the current triangulation.</p>
|
2227
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
2228
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">normal_surfaces</span><span class="p">()</span>
|
2229
|
+
<span class="go">[<Surface 0: [0, 0] [1, 2] (4, 1)>,</span>
|
2230
|
+
<span class="go"> <Surface 1: [0, 1] [1, 2] (4, -1)>,</span>
|
2231
|
+
<span class="go"> <Surface 2: [1, 2] [2, 1] (-4, -1)>,</span>
|
2232
|
+
<span class="go"> <Surface 3: [2, 2] [2, 1] (-4, 1)>]</span>
|
2233
|
+
</pre></div>
|
2234
|
+
</div>
|
2235
|
+
</dd></dl>
|
2236
|
+
|
2237
|
+
<dl class="py method">
|
2238
|
+
<dt class="sig sig-object py" id="snappy.Manifold.num_cusps">
|
2239
|
+
<span class="sig-name descname"><span class="pre">num_cusps</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cusp_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'all'</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">int</span></span></span><a class="headerlink" href="#snappy.Manifold.num_cusps" title="Link to this definition"></a></dt>
|
2240
|
+
<dd><p>Return the total number of cusps. By giving the optional argument
|
2241
|
+
‘orientable’ or ‘nonorientable’ it will only count cusps of that type.</p>
|
2242
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'m125'</span><span class="p">)</span>
|
2243
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">()</span>
|
2244
|
+
<span class="go">2</span>
|
2245
|
+
</pre></div>
|
2246
|
+
</div>
|
2247
|
+
</dd></dl>
|
2248
|
+
|
2249
|
+
<dl class="py method">
|
2250
|
+
<dt class="sig sig-object py" id="snappy.Manifold.num_tetrahedra">
|
2251
|
+
<span class="sig-name descname"><span class="pre">num_tetrahedra</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">int</span></span></span><a class="headerlink" href="#snappy.Manifold.num_tetrahedra" title="Link to this definition"></a></dt>
|
2252
|
+
<dd><p>Return the number of tetrahedra in the triangulation.</p>
|
2253
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
2254
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">num_tetrahedra</span><span class="p">()</span>
|
2255
|
+
<span class="go">2</span>
|
2256
|
+
</pre></div>
|
2257
|
+
</div>
|
2258
|
+
</dd></dl>
|
2259
|
+
|
2260
|
+
<dl class="py method">
|
2261
|
+
<dt class="sig sig-object py" id="snappy.Manifold.orientation_cover">
|
2262
|
+
<span class="sig-name descname"><span class="pre">orientation_cover</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.orientation_cover" title="Link to this definition"></a></dt>
|
2263
|
+
<dd><p>For a non-orientable Triangulation, returns the 2-fold cover which
|
2264
|
+
is orientable.</p>
|
2265
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">X</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'x123'</span><span class="p">)</span>
|
2266
|
+
<span class="gp">>>> </span><span class="n">Y</span> <span class="o">=</span> <span class="n">X</span><span class="o">.</span><span class="n">orientation_cover</span><span class="p">()</span>
|
2267
|
+
<span class="gp">>>> </span><span class="p">(</span><span class="n">X</span><span class="o">.</span><span class="n">is_orientable</span><span class="p">(),</span> <span class="n">Y</span><span class="o">.</span><span class="n">is_orientable</span><span class="p">())</span>
|
2268
|
+
<span class="go">(False, True)</span>
|
2269
|
+
<span class="gp">>>> </span><span class="n">Y</span>
|
2270
|
+
<span class="go">x123~(0,0)(0,0)</span>
|
2271
|
+
<span class="gp">>>> </span><span class="n">Y</span><span class="o">.</span><span class="n">cover_info</span><span class="p">()[</span><span class="s1">'type'</span><span class="p">]</span>
|
2272
|
+
<span class="go">'cyclic'</span>
|
2273
|
+
</pre></div>
|
2274
|
+
</div>
|
2275
|
+
</dd></dl>
|
2276
|
+
|
2277
|
+
<dl class="py method">
|
2278
|
+
<dt class="sig sig-object py" id="snappy.Manifold.plink">
|
2279
|
+
<span class="sig-name descname"><span class="pre">plink</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.plink" title="Link to this definition"></a></dt>
|
2280
|
+
<dd><p>Brings up a link editor window if the manifold is stored
|
2281
|
+
as a link complement in your current session.</p>
|
2282
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'4_1'</span><span class="p">)</span> <span class="c1"># stored as a triangulation with a link</span>
|
2283
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">link</span><span class="p">()</span>
|
2284
|
+
<span class="go"><Link: 1 comp; 4 cross></span>
|
2285
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span> <span class="c1"># stored as a triangulation without a link</span>
|
2286
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">link</span><span class="p">()</span>
|
2287
|
+
<span class="gt">Traceback (most recent call last):</span>
|
2288
|
+
<span class="c">...</span>
|
2289
|
+
<span class="gr">ValueError</span>: <span class="n">No associated link known.</span>
|
2290
|
+
</pre></div>
|
2291
|
+
</div>
|
2292
|
+
</dd></dl>
|
2293
|
+
|
2294
|
+
<dl class="py method">
|
2295
|
+
<dt class="sig sig-object py" id="snappy.Manifold.polished_holonomy">
|
2296
|
+
<span class="sig-name descname"><span class="pre">polished_holonomy</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">100</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fundamental_group_args</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lift_to_SL2</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_solution_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dec_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">match_kernel</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.polished_holonomy" title="Link to this definition"></a></dt>
|
2297
|
+
<dd><p>Return the fundamental group of M equipped with a high-precision version of
|
2298
|
+
the holonomy representation:</p>
|
2299
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
2300
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">G</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">polished_holonomy</span><span class="p">()</span>
|
2301
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">G</span><span class="p">(</span><span class="s1">'a'</span><span class="p">)</span><span class="o">.</span><span class="n">trace</span><span class="p">()</span>
|
2302
|
+
<span class="mf">1.5000000000000000000000000000</span> <span class="o">-</span> <span class="mf">0.86602540378443864676372317075</span><span class="o">*</span><span class="n">I</span>
|
2303
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">G</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">polished_holonomy</span><span class="p">(</span><span class="n">bits_prec</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</span>
|
2304
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">G</span><span class="p">(</span><span class="s1">'a'</span><span class="p">)</span><span class="o">.</span><span class="n">trace</span><span class="p">()</span><span class="o">.</span><span class="n">parent</span><span class="p">()</span>
|
2305
|
+
<span class="n">Complex</span> <span class="n">Field</span> <span class="k">with</span> <span class="mi">1000</span> <span class="n">bits</span> <span class="n">of</span> <span class="n">precision</span>
|
2306
|
+
</pre></div>
|
2307
|
+
</div>
|
2308
|
+
</dd></dl>
|
2309
|
+
|
2310
|
+
<dl class="py method">
|
2311
|
+
<dt class="sig sig-object py" id="snappy.Manifold.ptolemy_generalized_obstruction_classes">
|
2312
|
+
<span class="sig-name descname"><span class="pre">ptolemy_generalized_obstruction_classes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">N</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.ptolemy_generalized_obstruction_classes" title="Link to this definition"></a></dt>
|
2313
|
+
<dd><p>Returns the obstruction classes needed to compute
|
2314
|
+
PGL(N,C)-representations for any N, i.e., it returns a list with
|
2315
|
+
a representative cocycle for each element in
|
2316
|
+
H^2(M, boundary M; Z/N) / (Z/N)^* where (Z/N)^* are the units in Z/N.
|
2317
|
+
The first element in the list always corresponds to the trivial
|
2318
|
+
obstruction class.
|
2319
|
+
The generalized ptolemy obstruction classes are thus a generalization
|
2320
|
+
of the ptolemy obstruction classes that allow to find all
|
2321
|
+
boundary-unipotent
|
2322
|
+
PGL(N,C)-representations including those that do not lift to
|
2323
|
+
boundary-unipotent SL(N,C)-representations for N odd or
|
2324
|
+
SL(N,C)/{+1,-1}-representations for N even.</p>
|
2325
|
+
<p>For example, 4_1 has three obstruction classes up to equivalence:</p>
|
2326
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"4_1"</span><span class="p">)</span>
|
2327
|
+
<span class="gp">>>> </span><span class="n">c</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_generalized_obstruction_classes</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
|
2328
|
+
<span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
|
2329
|
+
<span class="go">3</span>
|
2330
|
+
</pre></div>
|
2331
|
+
</div>
|
2332
|
+
<p>For 4_1, we only get three obstruction classes even though we have
|
2333
|
+
H^2(M, boundary M; Z/4) = Z/4 because the two obstruction classes
|
2334
|
+
1 in Z/4 and -1 in Z/4 are related by a unit and thus give
|
2335
|
+
isomorphic Ptolemy varieties.</p>
|
2336
|
+
<p>The primary use of an obstruction class sigma is to construct the
|
2337
|
+
Ptolemy variety of sigma. This variety computes boundary-unipotent
|
2338
|
+
PGL(N,C)-representations whose obstruction class to a
|
2339
|
+
boundary-unipotent lift to SL(N,C) is sigma.</p>
|
2340
|
+
<p>For example for 4_1, there are 2 obstruction classes for N = 3:</p>
|
2341
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"4_1"</span><span class="p">)</span>
|
2342
|
+
<span class="gp">>>> </span><span class="n">c</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_generalized_obstruction_classes</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
|
2343
|
+
<span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
|
2344
|
+
<span class="go">2</span>
|
2345
|
+
</pre></div>
|
2346
|
+
</div>
|
2347
|
+
<p>The Ptolemy variety parametrizing boundary-unipotent
|
2348
|
+
SL(3,C)-representations of 4_1 is obtained by</p>
|
2349
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="n">N</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
2350
|
+
</pre></div>
|
2351
|
+
</div>
|
2352
|
+
<p>and the Ptolemy variety parametrizing boundary-unipotent
|
2353
|
+
PSL(3,C)-representations of 4_1 that do not lift to
|
2354
|
+
boundary-unipotent SL(3,C)-representations is obtained by</p>
|
2355
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="n">N</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
2356
|
+
</pre></div>
|
2357
|
+
</div>
|
2358
|
+
<p>The cocycle representing the non-trivial obstruction class looks as
|
2359
|
+
follows:</p>
|
2360
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
2361
|
+
<span class="go">PtolemyGeneralizedObstructionClass([2, 0, 0, 1])</span>
|
2362
|
+
</pre></div>
|
2363
|
+
</div>
|
2364
|
+
<p>This means that the cocycle takes the value -1 in Z/3 on the first face
|
2365
|
+
class and 1 on the fourth face class but zero on every other of the
|
2366
|
+
four face classes.</p>
|
2367
|
+
</dd></dl>
|
2368
|
+
|
2369
|
+
<dl class="py method">
|
2370
|
+
<dt class="sig sig-object py" id="snappy.Manifold.ptolemy_obstruction_classes">
|
2371
|
+
<span class="sig-name descname"><span class="pre">ptolemy_obstruction_classes</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.ptolemy_obstruction_classes" title="Link to this definition"></a></dt>
|
2372
|
+
<dd><p>Returns the obstruction classes needed to compute
|
2373
|
+
pSL(N,C) = SL(N,C)/{+1,-1} representations for even N, i.e., it
|
2374
|
+
returns a list with a representative cocycle for each class in
|
2375
|
+
H^2(M, boundary M; Z/2). The first element in the list is always
|
2376
|
+
representing the trivial obstruction class.</p>
|
2377
|
+
<p>For example, 4_1 has two obstruction classes:</p>
|
2378
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"4_1"</span><span class="p">)</span>
|
2379
|
+
<span class="gp">>>> </span><span class="n">c</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_obstruction_classes</span><span class="p">()</span>
|
2380
|
+
<span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
|
2381
|
+
<span class="go">2</span>
|
2382
|
+
</pre></div>
|
2383
|
+
</div>
|
2384
|
+
<p>The primary use of these obstruction classes is to construct
|
2385
|
+
the Ptolemy variety as described in Definition 1.7 of
|
2386
|
+
Stavros Garoufalidis, Dylan Thurston, Christian K. Zickert:
|
2387
|
+
“The Complex Volume of SL(n,C)-Representations of 3-Manifolds”
|
2388
|
+
(<a class="reference external" href="http://arxiv.org/abs/1111.2828">http://arxiv.org/abs/1111.2828</a>).</p>
|
2389
|
+
<p>For example, to construct the Ptolemy variety for
|
2390
|
+
PSL(2,C)-representations of 4_1 that do not lift to boundary-parabolic
|
2391
|
+
SL(2,C)-representations, use:</p>
|
2392
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="n">N</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
2393
|
+
</pre></div>
|
2394
|
+
</div>
|
2395
|
+
<p>Or the following short-cut:</p>
|
2396
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="mi">1</span><span class="p">)</span>
|
2397
|
+
</pre></div>
|
2398
|
+
</div>
|
2399
|
+
<p>Note that this obstruction class only makes sense for even N:</p>
|
2400
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
2401
|
+
<span class="gt">Traceback (most recent call last):</span>
|
2402
|
+
<span class="c">...</span>
|
2403
|
+
<span class="gr">AssertionError</span>: <span class="n">PtolemyObstructionClass only makes sense for even N, try PtolemyGeneralizedObstructionClass</span>
|
2404
|
+
</pre></div>
|
2405
|
+
</div>
|
2406
|
+
<p>To obtain PGL(N,C)-representations for N > 2, use the generalized
|
2407
|
+
obstruction class:</p>
|
2408
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">c</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_generalized_obstruction_classes</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
|
2409
|
+
<span class="gp">>>> </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
2410
|
+
</pre></div>
|
2411
|
+
</div>
|
2412
|
+
<p>The original obstruction class encodes a representing cocycle in Z/2 as follows:</p>
|
2413
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">c</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_obstruction_classes</span><span class="p">()</span>
|
2414
|
+
<span class="gp">>>> </span><span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
2415
|
+
<span class="go">PtolemyObstructionClass(s_0_0 + 1, s_1_0 - 1, s_2_0 - 1, s_3_0 + 1, s_0_0 - s_0_1, s_1_0 - s_3_1, s_2_0 - s_2_1, s_3_0 - s_1_1)</span>
|
2416
|
+
</pre></div>
|
2417
|
+
</div>
|
2418
|
+
<p>This means that the cocycle to represent this obstruction class in Z/2
|
2419
|
+
takes value 1 in Z/2 on face 0 of tetrahedra 0 (because s_0_0 = -1)
|
2420
|
+
and value 0 in Z/2 on face 1 of tetrahedra 0 (because s_1_0 = +1).</p>
|
2421
|
+
<p>Face 3 of tetrahedra 0 and face 1 of tetrahedra 1 are identified,
|
2422
|
+
hence the cocycle takes the same value on those two faces (s_3_0 = s_1_1).</p>
|
2423
|
+
</dd></dl>
|
2424
|
+
|
2425
|
+
<dl class="py method">
|
2426
|
+
<dt class="sig sig-object py" id="snappy.Manifold.ptolemy_variety">
|
2427
|
+
<span class="sig-name descname"><span class="pre">ptolemy_variety</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">N</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">obstruction_class</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">simplify</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">eliminate_fixed_ptolemys</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.ptolemy_variety" title="Link to this definition"></a></dt>
|
2428
|
+
<dd><p>Returns a Ptolemy variety as described in</p>
|
2429
|
+
<ul class="simple">
|
2430
|
+
<li><p>Stavros Garoufalidis, Dyland Thurston, Christian K. Zickert:
|
2431
|
+
“The Complex Volume of SL(n,C)-Representations of 3-Manifolds”
|
2432
|
+
(<a class="reference external" href="http://arxiv.org/abs/1111.2828">http://arxiv.org/abs/1111.2828</a>)</p></li>
|
2433
|
+
<li><p>Stavros Garoufalidis, Matthias Goerner, Christian K. Zickert:
|
2434
|
+
“Gluing Equations for PGL(n,C)-Representations of 3-Manifolds ”
|
2435
|
+
(<a class="reference external" href="http://arxiv.org/abs/1207.6711">http://arxiv.org/abs/1207.6711</a>)</p></li>
|
2436
|
+
</ul>
|
2437
|
+
<p>The variety can be exported to magma or sage and solved there. The
|
2438
|
+
solutions can be processed to compute invariants. The method can also
|
2439
|
+
be used to automatically look up precomputed solutions from the
|
2440
|
+
database at <a class="reference external" href="http://ptolemy.unhyperbolic.org/data">http://ptolemy.unhyperbolic.org/data</a> .</p>
|
2441
|
+
<p>Example for m011 and PSL(2,C)-representations:</p>
|
2442
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"m011"</span><span class="p">)</span>
|
2443
|
+
</pre></div>
|
2444
|
+
</div>
|
2445
|
+
<p>Obtain all Ptolemy varieties for PSL(2,C)-representations:</p>
|
2446
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="s1">'all'</span><span class="p">)</span>
|
2447
|
+
</pre></div>
|
2448
|
+
</div>
|
2449
|
+
<p>There are two Ptolemy varieties for the two obstruction classes:</p>
|
2450
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
|
2451
|
+
<span class="go">2</span>
|
2452
|
+
</pre></div>
|
2453
|
+
</div>
|
2454
|
+
<p>Retrieve the solutions from the database</p>
|
2455
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">sols</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">retrieve_solutions</span><span class="p">()</span>
|
2456
|
+
</pre></div>
|
2457
|
+
</div>
|
2458
|
+
<p>Compute the solutions using magma (default in SnapPy)</p>
|
2459
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">sols</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">compute_solutions</span><span class="p">(</span><span class="n">engine</span> <span class="o">=</span> <span class="s1">'magma'</span><span class="p">)</span>
|
2460
|
+
</pre></div>
|
2461
|
+
</div>
|
2462
|
+
<p>Compute the solutions using singular (default in sage)</p>
|
2463
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">sols</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">compute_solutions</span><span class="p">(</span><span class="n">engine</span> <span class="o">=</span> <span class="s1">'sage'</span><span class="p">)</span>
|
2464
|
+
</pre></div>
|
2465
|
+
</div>
|
2466
|
+
<p>Note that magma is significantly faster.</p>
|
2467
|
+
<p>Compute all resulting complex volumes</p>
|
2468
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">cvols</span> <span class="o">=</span> <span class="n">sols</span><span class="o">.</span><span class="n">complex_volume_numerical</span><span class="p">()</span>
|
2469
|
+
<span class="gp">>>> </span><span class="n">cvols</span>
|
2470
|
+
<span class="go">[[[-4.29405713186238 E-16 + 0.725471193740844*I,</span>
|
2471
|
+
<span class="go"> -0.942707362776931 + 0.459731436553693*I,</span>
|
2472
|
+
<span class="go"> 0.942707362776931 + 0.459731436553693*I]],</span>
|
2473
|
+
<span class="go"> [[3.94159248086745 E-15 + 0.312682687518267*I,</span>
|
2474
|
+
<span class="go"> 4.64549527022581 E-15 + 0.680993020093457*I,</span>
|
2475
|
+
<span class="go"> -2.78183391239608 - 0.496837853805869*I,</span>
|
2476
|
+
<span class="go"> 2.78183391239608 - 0.496837853805869*I]]]</span>
|
2477
|
+
</pre></div>
|
2478
|
+
</div>
|
2479
|
+
<p>Show complex volumes as a non-nested list:</p>
|
2480
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">cvols</span><span class="o">.</span><span class="n">flatten</span><span class="p">(</span><span class="n">depth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
2481
|
+
<span class="go">[-4.29405713186238 E-16 + 0.725471193740844*I,</span>
|
2482
|
+
<span class="go"> -0.942707362776931 + 0.459731436553693*I,</span>
|
2483
|
+
<span class="go"> 0.942707362776931 + 0.459731436553693*I,</span>
|
2484
|
+
<span class="go"> 3.94159248086745 E-15 + 0.312682687518267*I,</span>
|
2485
|
+
<span class="go"> 4.64549527022581 E-15 + 0.680993020093457*I,</span>
|
2486
|
+
<span class="go"> -2.78183391239608 - 0.496837853805869*I,</span>
|
2487
|
+
<span class="go"> 2.78183391239608 - 0.496837853805869*I]</span>
|
2488
|
+
</pre></div>
|
2489
|
+
</div>
|
2490
|
+
<p>For more examples, go to <a class="reference external" href="http://ptolemy.unhyperbolic.org/">http://ptolemy.unhyperbolic.org/</a></p>
|
2491
|
+
<p>=== Optional Arguments ===</p>
|
2492
|
+
<p>obstruction_class — class from Definition 1.7 of (1).
|
2493
|
+
None for trivial class or a value returned from ptolemy_obstruction_classes.
|
2494
|
+
Short cuts: obstruction_class = ‘all’ returns a list of Ptolemy varieties
|
2495
|
+
for each obstruction. For easier iteration, can set obstruction_class to
|
2496
|
+
an integer.</p>
|
2497
|
+
<p>simplify — boolean to indicate whether to simplify the equations which
|
2498
|
+
significantly reduces the number of variables.
|
2499
|
+
Simplifying means that several identified Ptolemy coordinates x = y = z = …
|
2500
|
+
are eliminated instead of adding relations x - y = 0, y - z = 0, …</p>
|
2501
|
+
<p>eliminate_fixed_ptolemys — boolean to indicate whether to eliminate
|
2502
|
+
the Ptolemy coordinates that are set to 1 for fixing the decoration.
|
2503
|
+
Even though this simplifies the resulting representation, setting it to
|
2504
|
+
True can cause magma to run longer when finding a Groebner basis.</p>
|
2505
|
+
<p>=== Examples for 4_1 ===</p>
|
2506
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"4_1"</span><span class="p">)</span>
|
2507
|
+
</pre></div>
|
2508
|
+
</div>
|
2509
|
+
<p>Get the varieties for all obstruction classes at once (use
|
2510
|
+
help(varieties[0]) for more information):</p>
|
2511
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">varieties</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="s2">"all"</span><span class="p">)</span>
|
2512
|
+
</pre></div>
|
2513
|
+
</div>
|
2514
|
+
<p>Print the variety as an ideal (sage object) for the non-trivial class:</p>
|
2515
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">varieties</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">ideal</span>
|
2516
|
+
<span class="go">Ideal (-c_0011_0^2 + c_0011_0*c_0101_0 + c_0101_0^2, -c_0011_0^2 - c_0011_0*c_0101_0 + c_0101_0^2, c_0011_0 - 1) of Multivariate Polynomial Ring in c_0011_0, c_0101_0 over Rational Field</span>
|
2517
|
+
</pre></div>
|
2518
|
+
</div>
|
2519
|
+
<p>Print the equations of the variety for the non-trivial class:</p>
|
2520
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">for</span> <span class="n">eqn</span> <span class="ow">in</span> <span class="n">varieties</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">equations</span><span class="p">:</span>
|
2521
|
+
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">eqn</span><span class="p">)</span>
|
2522
|
+
<span class="go"> - c_0011_0 * c_0101_0 + c_0011_0^2 + c_0101_0^2</span>
|
2523
|
+
<span class="go"> c_0011_0 * c_0101_0 - c_0011_0^2 - c_0101_0^2</span>
|
2524
|
+
<span class="go"> - 1 + c_0011_0</span>
|
2525
|
+
</pre></div>
|
2526
|
+
</div>
|
2527
|
+
<p>Generate a magma file to compute Primary Decomposition for N = 3:</p>
|
2528
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
|
2529
|
+
<span class="gp">>>> </span><span class="n">s</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">to_magma</span><span class="p">()</span>
|
2530
|
+
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"ring and ideal"</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
|
2531
|
+
<span class="go">R<c_0012_0, c_0012_1, c_0102_0, c_0111_0, c_0201_0, c_1011_0, c_1011_1, c_1101_0> := PolynomialRing(RationalField(), 8, "grevlex");</span>
|
2532
|
+
<span class="go">MyIdeal := ideal<R |</span>
|
2533
|
+
<span class="go"> c_0012_0 * c_1101_0 + c_0102_0 * c_0111_0 - c_0102_0 * c_1011_0,</span>
|
2534
|
+
<span class="go"> ...</span>
|
2535
|
+
</pre></div>
|
2536
|
+
</div>
|
2537
|
+
<p>=== If you have a magma installation ===</p>
|
2538
|
+
<p>Call p.compute_solutions() to automatically call magma on the above output
|
2539
|
+
and produce exact solutions!!!</p>
|
2540
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">try</span><span class="p">:</span>
|
2541
|
+
<span class="gp">... </span> <span class="n">sols</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">compute_solutions</span><span class="p">()</span>
|
2542
|
+
<span class="gp">... </span><span class="k">except</span><span class="p">:</span>
|
2543
|
+
<span class="gp">... </span> <span class="c1"># magma failed, use precomputed_solutions</span>
|
2544
|
+
<span class="gp">... </span> <span class="n">sols</span> <span class="o">=</span> <span class="kc">None</span>
|
2545
|
+
</pre></div>
|
2546
|
+
</div>
|
2547
|
+
<p>Check solutions against manifold
|
2548
|
+
>>> if sols:
|
2549
|
+
… dummy = sols.check_against_manifold()</p>
|
2550
|
+
<p>=== If you do not have a magma installation ===</p>
|
2551
|
+
<p>Load a precomputed example from magma which is provided with the package:</p>
|
2552
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">snappy.ptolemy.processMagmaFile</span> <span class="kn">import</span> <span class="n">_magma_output_for_4_1__sl3</span><span class="p">,</span> <span class="n">solutions_from_magma</span>
|
2553
|
+
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">_magma_output_for_4_1__sl3</span><span class="p">)</span>
|
2554
|
+
|
2555
|
+
<span class="go">==TRIANGULATION=BEGINS==</span>
|
2556
|
+
<span class="go">% Triangulation</span>
|
2557
|
+
<span class="go">4_1</span>
|
2558
|
+
<span class="go">...</span>
|
2559
|
+
</pre></div>
|
2560
|
+
</div>
|
2561
|
+
<p>Parse the file and produce solutions:</p>
|
2562
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">sols</span> <span class="o">=</span> <span class="n">solutions_from_magma</span><span class="p">(</span><span class="n">_magma_output_for_4_1__sl3</span><span class="p">)</span>
|
2563
|
+
</pre></div>
|
2564
|
+
</div>
|
2565
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">dummy</span> <span class="o">=</span> <span class="n">sols</span><span class="o">.</span><span class="n">check_against_manifold</span><span class="p">()</span>
|
2566
|
+
</pre></div>
|
2567
|
+
</div>
|
2568
|
+
<p>=== Continue here whether you have or do not have magma ===</p>
|
2569
|
+
<p>Pick the first solution of the three different solutions (up to Galois
|
2570
|
+
conjugates):</p>
|
2571
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="n">sols</span><span class="p">)</span>
|
2572
|
+
<span class="go">3</span>
|
2573
|
+
<span class="gp">>>> </span><span class="n">solution</span> <span class="o">=</span> <span class="n">sols</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
2574
|
+
</pre></div>
|
2575
|
+
</div>
|
2576
|
+
<p>Read the exact value for c_1020_0 (help(solution) for more information
|
2577
|
+
on how to compute cross ratios, volumes and other invariants):</p>
|
2578
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">solution</span><span class="p">[</span><span class="s1">'c_1020_0'</span><span class="p">]</span>
|
2579
|
+
<span class="go">Mod(-1/2*x - 3/2, x^2 + 3*x + 4)</span>
|
2580
|
+
</pre></div>
|
2581
|
+
</div>
|
2582
|
+
<p>Example of simplified vs non-simplified variety for N = 4:</p>
|
2583
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">simplified</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="mi">1</span><span class="p">)</span>
|
2584
|
+
<span class="gp">>>> </span><span class="n">full</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">simplify</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span>
|
2585
|
+
<span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="n">simplified</span><span class="o">.</span><span class="n">variables</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">full</span><span class="o">.</span><span class="n">variables</span><span class="p">)</span>
|
2586
|
+
<span class="go">(21, 63)</span>
|
2587
|
+
<span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="n">simplified</span><span class="o">.</span><span class="n">equations</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">full</span><span class="o">.</span><span class="n">equations</span><span class="p">)</span>
|
2588
|
+
<span class="go">(24, 72)</span>
|
2589
|
+
</pre></div>
|
2590
|
+
</div>
|
2591
|
+
</dd></dl>
|
2592
|
+
|
2593
|
+
<dl class="py method">
|
2594
|
+
<dt class="sig sig-object py" id="snappy.Manifold.randomize">
|
2595
|
+
<span class="sig-name descname"><span class="pre">randomize</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">blowup_multiple</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">4</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">passes_at_fours</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">6</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.randomize" title="Link to this definition"></a></dt>
|
2596
|
+
<dd><p>Perform random Pachner moves on the underlying triangulation,
|
2597
|
+
including some initial 3 -> 2 moves that increase the number of
|
2598
|
+
tetrahedra by blowup_multiple.</p>
|
2599
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'Braid:[1,2,-3,-3,1,2]'</span><span class="p">)</span>
|
2600
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">randomize</span><span class="p">()</span>
|
2601
|
+
</pre></div>
|
2602
|
+
</div>
|
2603
|
+
</dd></dl>
|
2604
|
+
|
2605
|
+
<dl class="py method">
|
2606
|
+
<dt class="sig sig-object py" id="snappy.Manifold.reverse_orientation">
|
2607
|
+
<span class="sig-name descname"><span class="pre">reverse_orientation</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#snappy.Manifold.reverse_orientation" title="Link to this definition"></a></dt>
|
2608
|
+
<dd><p>Reverses the orientation of the Triangulation, presuming that
|
2609
|
+
it is orientable.</p>
|
2610
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m015'</span><span class="p">)</span>
|
2611
|
+
<span class="gp">>>> </span><span class="n">cs</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">()</span>
|
2612
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">reverse_orientation</span><span class="p">()</span>
|
2613
|
+
<span class="gp">>>> </span><span class="nb">abs</span><span class="p">(</span><span class="n">cs</span> <span class="o">+</span> <span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">())</span>
|
2614
|
+
<span class="go">0.0</span>
|
2615
|
+
</pre></div>
|
2616
|
+
</div>
|
2617
|
+
</dd></dl>
|
2618
|
+
|
2619
|
+
<dl class="py method">
|
2620
|
+
<dt class="sig sig-object py" id="snappy.Manifold.save">
|
2621
|
+
<span class="sig-name descname"><span class="pre">save</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">file_name</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.save" title="Link to this definition"></a></dt>
|
2622
|
+
<dd><p>Save the triangulation as a SnapPea triangulation file.</p>
|
2623
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
2624
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="s1">'fig-eight.tri'</span><span class="p">)</span>
|
2625
|
+
</pre></div>
|
2626
|
+
</div>
|
2627
|
+
<p>To retrieve a SnapPea triangulation from the saved file
|
2628
|
+
you can do the following. The first command creates a cusped
|
2629
|
+
manifold M. The second one creates the filled manifold M1
|
2630
|
+
with Dehn coefficients (2,3).</p>
|
2631
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'fig-eight.tri'</span><span class="p">)</span>
|
2632
|
+
<span class="gp">>>> </span><span class="n">M1</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'fig-eight.tri(2,3)'</span><span class="p">)</span>
|
2633
|
+
</pre></div>
|
2634
|
+
</div>
|
2635
|
+
</dd></dl>
|
2636
|
+
|
2637
|
+
<dl class="py method">
|
2638
|
+
<dt class="sig sig-object py" id="snappy.Manifold.set_name">
|
2639
|
+
<span class="sig-name descname"><span class="pre">set_name</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">new_name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#snappy.Manifold.set_name" title="Link to this definition"></a></dt>
|
2640
|
+
<dd><p>Give the triangulation a new name.</p>
|
2641
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'4_1'</span><span class="p">)</span>
|
2642
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">set_name</span><span class="p">(</span><span class="s1">'figure-eight-comp'</span><span class="p">)</span>
|
2643
|
+
<span class="gp">>>> </span><span class="n">M</span>
|
2644
|
+
<span class="go">figure-eight-comp(0,0)</span>
|
2645
|
+
</pre></div>
|
2646
|
+
</div>
|
2647
|
+
</dd></dl>
|
2648
|
+
|
2649
|
+
<dl class="py method">
|
2650
|
+
<dt class="sig sig-object py" id="snappy.Manifold.set_peripheral_curves">
|
2651
|
+
<span class="sig-name descname"><span class="pre">set_peripheral_curves</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">peripheral_data</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">which_cusp</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">return_matrices</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.set_peripheral_curves" title="Link to this definition"></a></dt>
|
2652
|
+
<dd><p>Each cusp has a preferred marking. In the case of a torus
|
2653
|
+
cusp, this is pair of essential simple curves meeting in one
|
2654
|
+
point; equivalently, a basis of the first homology of the
|
2655
|
+
boundary torus. These curves are called the meridian and the
|
2656
|
+
longitude.</p>
|
2657
|
+
<p>This method changes these markings in various ways. In many
|
2658
|
+
cases, if the flag return_matrices is True then it returns
|
2659
|
+
a list of change-of-basis matrices is returned, one per
|
2660
|
+
cusp, which will restore the original markings if passed
|
2661
|
+
as peripheral_data.</p>
|
2662
|
+
<ul>
|
2663
|
+
<li><p>Make the shortest curves the meridians, and the second
|
2664
|
+
shortest curves the longitudes.</p>
|
2665
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'5_2'</span><span class="p">)</span>
|
2666
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="s1">'shape'</span><span class="p">)</span>
|
2667
|
+
<span class="go">[-2.49024467 + 2.97944707*I]</span>
|
2668
|
+
<span class="gp">>>> </span><span class="n">cob</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">set_peripheral_curves</span><span class="p">(</span><span class="s1">'shortest'</span><span class="p">,</span> <span class="n">return_matrices</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
2669
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="s1">'shape'</span><span class="p">)</span>
|
2670
|
+
<span class="go">[-0.49024467 + 2.97944707*I]</span>
|
2671
|
+
<span class="gp">>>> </span><span class="n">cob</span>
|
2672
|
+
<span class="go">[[[1, 0], [-2, 1]]]</span>
|
2673
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">set_peripheral_curves</span><span class="p">(</span><span class="n">cob</span><span class="p">)</span>
|
2674
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="s1">'shape'</span><span class="p">)</span>
|
2675
|
+
<span class="go">[-2.49024467 + 2.97944707*I]</span>
|
2676
|
+
</pre></div>
|
2677
|
+
</div>
|
2678
|
+
<p>You can also make just the meridians as short as
|
2679
|
+
possible while fixing the longitudes via the option
|
2680
|
+
‘shortest_meridians’, and conversely with
|
2681
|
+
‘shortest_longitudes’.</p>
|
2682
|
+
</li>
|
2683
|
+
<li><p>If cusps are Dehn filled, make those curves meridians.</p>
|
2684
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m125(0,0)(2,5)'</span><span class="p">)</span>
|
2685
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">set_peripheral_curves</span><span class="p">(</span><span class="s1">'fillings'</span><span class="p">)</span>
|
2686
|
+
<span class="gp">>>> </span><span class="n">M</span>
|
2687
|
+
<span class="go">m125(0,0)(1,0)</span>
|
2688
|
+
</pre></div>
|
2689
|
+
</div>
|
2690
|
+
</li>
|
2691
|
+
<li><p>Change the basis of a particular cusp, say the first one:</p>
|
2692
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">set_peripheral_curves</span><span class="p">(</span> <span class="p">[</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span> <span class="p">]</span> <span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
2693
|
+
</pre></div>
|
2694
|
+
</div>
|
2695
|
+
<p>Here (1,2) is the new meridian written in the old basis, and
|
2696
|
+
(1,3) the new longitude.</p>
|
2697
|
+
</li>
|
2698
|
+
<li><p>Change the basis of all the cusps at once</p>
|
2699
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">new_curves</span> <span class="o">=</span> <span class="p">[</span> <span class="p">[(</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">)],</span> <span class="p">[(</span><span class="mi">3</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">)]</span> <span class="p">]</span>
|
2700
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">set_peripheral_curves</span><span class="p">(</span><span class="n">new_curves</span><span class="p">)</span>
|
2701
|
+
<span class="gp">>>> </span><span class="n">M</span>
|
2702
|
+
<span class="go">m125(0,0)(-1,-2)</span>
|
2703
|
+
</pre></div>
|
2704
|
+
</div>
|
2705
|
+
</li>
|
2706
|
+
</ul>
|
2707
|
+
</dd></dl>
|
2708
|
+
|
2709
|
+
<dl class="py method">
|
2710
|
+
<dt class="sig sig-object py" id="snappy.Manifold.set_target_holonomy">
|
2711
|
+
<span class="sig-name descname"><span class="pre">set_target_holonomy</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">target</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">which_cusp</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">recompute</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.set_target_holonomy" title="Link to this definition"></a></dt>
|
2712
|
+
<dd><p>Computes a geometric structure in which the Dehn filling curve
|
2713
|
+
on the specified cusp has holonomy equal to the target value.
|
2714
|
+
The holonomies of Dehn filling curves on other cusps are left
|
2715
|
+
unchanged. If the ‘recompute’ flag is False, the Dehn filling
|
2716
|
+
equations are modified, but not solved.</p>
|
2717
|
+
</dd></dl>
|
2718
|
+
|
2719
|
+
<dl class="py method">
|
2720
|
+
<dt class="sig sig-object py" id="snappy.Manifold.set_tetrahedra_shapes">
|
2721
|
+
<span class="sig-name descname"><span class="pre">set_tetrahedra_shapes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filled_shapes</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">complete_shapes</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fillings</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.set_tetrahedra_shapes" title="Link to this definition"></a></dt>
|
2722
|
+
<dd><p>Replaces the tetrahedron shapes with those in the given lists,
|
2723
|
+
and sets the Dehn filling coefficients as specified by the
|
2724
|
+
fillings argument. The shapes will get double precision
|
2725
|
+
values; polishing will be needed for high precision shapes.</p>
|
2726
|
+
</dd></dl>
|
2727
|
+
|
2728
|
+
<dl class="py method">
|
2729
|
+
<dt class="sig sig-object py" id="snappy.Manifold.short_slopes">
|
2730
|
+
<span class="sig-name descname"><span class="pre">short_slopes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">length</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">6</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">policy</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'unbiased'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">method</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'maximal'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">first_cusps</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">[]</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.short_slopes" title="Link to this definition"></a></dt>
|
2731
|
+
<dd><p>Returns a list of short slopes (for Dehn-fillings) for each cusp.</p>
|
2732
|
+
<p>That is, the method uses <a class="reference internal" href="#snappy.Manifold.cusp_areas" title="snappy.Manifold.cusp_areas"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_areas()</span></code></a> to find
|
2733
|
+
(maximal) embedded and disjoint cusp neighborhoods. It uses the boundaries
|
2734
|
+
of these cusp neighborhoods to measure the length of a peripheral curve.
|
2735
|
+
For each cusp, it determines all simple peripheral curves shorter than
|
2736
|
+
the given <code class="xref py py-attr docutils literal notranslate"><span class="pre">length</span></code> (which defaults to 6). The result is a list
|
2737
|
+
of the corresponding slopes for each cusp:</p>
|
2738
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"otet20_00022"</span><span class="p">)</span>
|
2739
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">short_slopes</span><span class="p">()</span>
|
2740
|
+
<span class="go">[[(1, 0), (-1, 1), (0, 1)], [(1, 0)]]</span>
|
2741
|
+
</pre></div>
|
2742
|
+
</div>
|
2743
|
+
<p>It takes the same arguments as <a class="reference internal" href="#snappy.Manifold.cusp_areas" title="snappy.Manifold.cusp_areas"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_areas()</span></code></a>:</p>
|
2744
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">short_slopes</span><span class="p">(</span><span class="n">policy</span> <span class="o">=</span> <span class="s1">'greedy'</span><span class="p">)</span>
|
2745
|
+
<span class="go">[[(1, 0)], [(1, 0)]]</span>
|
2746
|
+
</pre></div>
|
2747
|
+
</div>
|
2748
|
+
<p>The ten exceptional slopes of the figure-eight knot:</p>
|
2749
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"4_1"</span><span class="p">)</span>
|
2750
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">short_slopes</span><span class="p">()</span>
|
2751
|
+
<span class="go">[[(1, 0), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]</span>
|
2752
|
+
</pre></div>
|
2753
|
+
</div>
|
2754
|
+
<p>Two more slopes appear when increasing length to <span class="math notranslate nohighlight">\(2\pi\)</span>:</p>
|
2755
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">short_slopes</span><span class="p">(</span><span class="n">length</span> <span class="o">=</span> <span class="mf">6.283185307179586</span><span class="p">)</span>
|
2756
|
+
<span class="go">[[(1, 0), (-5, 1), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]]</span>
|
2757
|
+
</pre></div>
|
2758
|
+
</div>
|
2759
|
+
<p><strong>Verified computation</strong></p>
|
2760
|
+
<p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>, floating-point issues can arise resulting in
|
2761
|
+
incorrect values. The method can be made
|
2762
|
+
<a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
|
2763
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"4_1"</span><span class="p">)</span>
|
2764
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">short_slopes</span><span class="p">(</span><span class="n">verified</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
|
2765
|
+
<span class="p">[[(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]]</span>
|
2766
|
+
</pre></div>
|
2767
|
+
</div>
|
2768
|
+
<p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>, the result is guaranteed to contain all short
|
2769
|
+
slopes and might contain additional slopes (with lengths slightly longer
|
2770
|
+
than the given <code class="xref py py-attr docutils literal notranslate"><span class="pre">length</span></code> but this could not be proven using the
|
2771
|
+
interval estimates).</p>
|
2772
|
+
<p>The given <code class="xref py py-attr docutils literal notranslate"><span class="pre">length</span></code> is cast to a SageMath <code class="docutils literal notranslate"><span class="pre">RealIntervalField</span></code> of the
|
2773
|
+
given precision if <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
|
2774
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">sage.all</span> <span class="kn">import</span> <span class="n">pi</span>
|
2775
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">short_slopes</span><span class="p">(</span><span class="n">length</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">pi</span><span class="p">,</span> <span class="n">verified</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">bits_prec</span> <span class="o">=</span> <span class="mi">100</span><span class="p">)</span>
|
2776
|
+
<span class="p">[[(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]]</span>
|
2777
|
+
</pre></div>
|
2778
|
+
</div>
|
2779
|
+
</dd></dl>
|
2780
|
+
|
2781
|
+
<dl class="py method">
|
2782
|
+
<dt class="sig sig-object py" id="snappy.Manifold.simplify">
|
2783
|
+
<span class="sig-name descname"><span class="pre">simplify</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">passes_at_fours</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">6</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.simplify" title="Link to this definition"></a></dt>
|
2784
|
+
<dd><p>Try to simplify the triangulation by doing Pachner moves.</p>
|
2785
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'12n123'</span><span class="p">)</span>
|
2786
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">simplify</span><span class="p">()</span>
|
2787
|
+
</pre></div>
|
2788
|
+
</div>
|
2789
|
+
<p>It does four kinds of moves that reduce the number of
|
2790
|
+
tetrahedra:</p>
|
2791
|
+
<ul class="simple">
|
2792
|
+
<li><p>3 -> 2 and 2 -> 0 Pacher moves, which eliminate one or two
|
2793
|
+
tetrahedra respectively.</p></li>
|
2794
|
+
<li><p>On suitable valence-1 edges, does a 2 -> 3 and then 2 -> 0 move,
|
2795
|
+
which removes a tetrahedron and creates a new valence-1 edge.</p></li>
|
2796
|
+
<li><p>When a 2-simplex has two edges of valence-4 giving rise to the
|
2797
|
+
suspension of a pentagon, replace these 6 tetrahedra with a
|
2798
|
+
single edge of valence 5.</p></li>
|
2799
|
+
</ul>
|
2800
|
+
<p>It also does random 4 -> 4 moves in hopes of setting up a
|
2801
|
+
simplfication. The argument passes_at_fours is the number of
|
2802
|
+
times it goes through the valence-4 edges without progress
|
2803
|
+
before giving up.</p>
|
2804
|
+
</dd></dl>
|
2805
|
+
|
2806
|
+
<dl class="py method">
|
2807
|
+
<dt class="sig sig-object py" id="snappy.Manifold.slice_obstruction_HKL">
|
2808
|
+
<span class="sig-name descname"><span class="pre">slice_obstruction_HKL</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">primes_spec</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">check_in_S3</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.slice_obstruction_HKL" title="Link to this definition"></a></dt>
|
2809
|
+
<dd><p>For the exterior of a knot in S^3, searches for a topological
|
2810
|
+
slicing obstruction from:</p>
|
2811
|
+
<p>Herald, Kirk, Livingston, Math Zeit., 2010
|
2812
|
+
<a class="reference external" href="https://dx.doi.org/10.1007/s00209-009-0548-1">https://dx.doi.org/10.1007/s00209-009-0548-1</a>
|
2813
|
+
<a class="reference external" href="https://arxiv.org/abs/0804.1355">https://arxiv.org/abs/0804.1355</a></p>
|
2814
|
+
<p>The test looks at the cyclic branched covers of the knot of prime
|
2815
|
+
order p and the F_q homology thereof where q is an odd prime. The
|
2816
|
+
range of such (p, q) pairs searched is given by primes_spec as a
|
2817
|
+
list of (p_max, [q_min, q_max]). It returns the pair (p, q) of
|
2818
|
+
the first nonzero obstruction found (in which case K is not
|
2819
|
+
slice), and otherwise returns None:</p>
|
2820
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'K12n813'</span><span class="p">)</span>
|
2821
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">spec</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">10</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">20</span><span class="p">]),</span> <span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">])]</span>
|
2822
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">slice_obstruction_HKL</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
2823
|
+
<span class="n">Looking</span> <span class="n">at</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">...</span>
|
2824
|
+
<span class="n">Looking</span> <span class="n">at</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span> <span class="o">...</span>
|
2825
|
+
<span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span>
|
2826
|
+
</pre></div>
|
2827
|
+
</div>
|
2828
|
+
<p>You can also specify the p to examine by a range [p_min, p_max] or
|
2829
|
+
the q by just q_max:</p>
|
2830
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">spec</span> <span class="o">=</span> <span class="p">[([</span><span class="mi">3</span><span class="p">,</span> <span class="mi">10</span><span class="p">],</span> <span class="mi">10</span><span class="p">)]</span>
|
2831
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">slice_obstruction_HKL</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
2832
|
+
<span class="n">Looking</span> <span class="n">at</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span> <span class="o">...</span>
|
2833
|
+
<span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span>
|
2834
|
+
</pre></div>
|
2835
|
+
</div>
|
2836
|
+
<p>If primes_spec is just a pair (p, q) then only that obstruction is
|
2837
|
+
checked:</p>
|
2838
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">slice_obstruction_HKL</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
|
2839
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">slice_obstruction_HKL</span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">))</span>
|
2840
|
+
<span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span>
|
2841
|
+
</pre></div>
|
2842
|
+
</div>
|
2843
|
+
<p>Technical note: As implemented, can only get an obstruction when
|
2844
|
+
the decomposition of H_1(cover; F_q) into irreducible Z/pZ-modules
|
2845
|
+
has no repeat factors. The method of [HKL] can be used more
|
2846
|
+
broadly, but other cases requires computing many more twisted
|
2847
|
+
Alexander polynomials.</p>
|
2848
|
+
</dd></dl>
|
2849
|
+
|
2850
|
+
<dl class="py method">
|
2851
|
+
<dt class="sig sig-object py" id="snappy.Manifold.solution_type">
|
2852
|
+
<span class="sig-name descname"><span class="pre">solution_type</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">enum</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.solution_type" title="Link to this definition"></a></dt>
|
2853
|
+
<dd><p>Returns the type of the current solution to the gluing
|
2854
|
+
equations, basically a summary of how degenerate the solution
|
2855
|
+
is. If the flag enum=True is set, then an integer value is
|
2856
|
+
returned. The possible answers are:</p>
|
2857
|
+
<ul class="simple">
|
2858
|
+
<li><p>0: ‘not attempted’</p></li>
|
2859
|
+
<li><p>1: ‘all tetrahedra positively oriented’ aka ‘geometric_solution’
|
2860
|
+
Should correspond to a genuine hyperbolic structure.</p></li>
|
2861
|
+
<li><p>2: ‘contains negatively oriented tetrahedra’ aka ‘nongeometric_solution’
|
2862
|
+
Probably corresponds to a hyperbolic structure but some
|
2863
|
+
simplices have reversed orientations.</p></li>
|
2864
|
+
<li><p>3: ‘contains flat tetrahedra’ All tetrahedra have shape in R - {0, 1}.</p></li>
|
2865
|
+
<li><p>4: ‘contains degenerate tetrahedra’ Some shapes are close to
|
2866
|
+
{0,1, or infinity}.</p></li>
|
2867
|
+
<li><p>5: ‘unrecognized solution type’</p></li>
|
2868
|
+
<li><p>6: ‘no solution found’</p></li>
|
2869
|
+
</ul>
|
2870
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m007'</span><span class="p">)</span>
|
2871
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">solution_type</span><span class="p">()</span>
|
2872
|
+
<span class="go">'all tetrahedra positively oriented'</span>
|
2873
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">(</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span> <span class="p">)</span>
|
2874
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">solution_type</span><span class="p">()</span>
|
2875
|
+
<span class="go">'contains negatively oriented tetrahedra'</span>
|
2876
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">(</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">)</span>
|
2877
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">solution_type</span><span class="p">()</span>
|
2878
|
+
<span class="go">'contains degenerate tetrahedra'</span>
|
2879
|
+
</pre></div>
|
2880
|
+
</div>
|
2881
|
+
</dd></dl>
|
2882
|
+
|
2883
|
+
<dl class="py method">
|
2884
|
+
<dt class="sig sig-object py" id="snappy.Manifold.split">
|
2885
|
+
<span class="sig-name descname"><span class="pre">split</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">which_surface</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.split" title="Link to this definition"></a></dt>
|
2886
|
+
<dd><p>Split the manifold open along a surface of positive characteristic found
|
2887
|
+
by the method “splitting_surfaces”. Returns a list of the pieces, with any
|
2888
|
+
sphere boundary components filled in.</p>
|
2889
|
+
<p>Here’s an example of a Whitehead double on the trefoil.</p>
|
2890
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'K14n26039'</span><span class="p">)</span>
|
2891
|
+
<span class="gp">>>> </span><span class="n">S</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">splitting_surfaces</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
|
2892
|
+
<span class="gp">>>> </span><span class="n">S</span>
|
2893
|
+
<span class="go">Orientable two-sided with euler = 0</span>
|
2894
|
+
</pre></div>
|
2895
|
+
</div>
|
2896
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">pieces</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">S</span><span class="p">);</span> <span class="n">pieces</span>
|
2897
|
+
<span class="go">[K14n26039.a(0,0)(0,0), K14n26039.b(0,0)]</span>
|
2898
|
+
<span class="gp">>>> </span><span class="n">pieces</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
|
2899
|
+
<span class="go">3.66386238</span>
|
2900
|
+
<span class="gp">>>> </span><span class="n">pieces</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">()</span><span class="o">.</span><span class="n">relators</span><span class="p">()</span>
|
2901
|
+
<span class="go">['aabbb']</span>
|
2902
|
+
</pre></div>
|
2903
|
+
</div>
|
2904
|
+
<p>You can also specify a surface by its index.</p>
|
2905
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'L10n111'</span><span class="p">)</span>
|
2906
|
+
<span class="gp">>>> </span><span class="nb">max</span><span class="p">(</span> <span class="n">P</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span> <span class="k">for</span> <span class="n">P</span> <span class="ow">in</span> <span class="n">M</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="p">)</span>
|
2907
|
+
<span class="go">5.33348957</span>
|
2908
|
+
</pre></div>
|
2909
|
+
</div>
|
2910
|
+
</dd></dl>
|
2911
|
+
|
2912
|
+
<dl class="py method">
|
2913
|
+
<dt class="sig sig-object py" id="snappy.Manifold.splitting_surfaces">
|
2914
|
+
<span class="sig-name descname"><span class="pre">splitting_surfaces</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.splitting_surfaces" title="Link to this definition"></a></dt>
|
2915
|
+
<dd><p>Searches for connected closed normal surfaces of nonnegative Euler
|
2916
|
+
characteristic. If spheres or projective planes are found, then
|
2917
|
+
tori and Klein bottles aren’t reported. There is no guarantee
|
2918
|
+
that all such normal surfaces will be found nor that any given
|
2919
|
+
surface is incompressible. The search is confined to surfaces
|
2920
|
+
whose quads are in the tetrahedra that have degenerate shapes.</p>
|
2921
|
+
<p>You can split the manifold open along one of these surfaces
|
2922
|
+
using the method “split”.</p>
|
2923
|
+
<p>A connect sum of two trefoils:</p>
|
2924
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M1</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'DT: fafBCAEFD'</span><span class="p">)</span>
|
2925
|
+
<span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="n">M1</span><span class="o">.</span><span class="n">splitting_surfaces</span><span class="p">())</span>
|
2926
|
+
<span class="go">2</span>
|
2927
|
+
</pre></div>
|
2928
|
+
</div>
|
2929
|
+
<p>First satellite knot in the table.</p>
|
2930
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M2</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'K13n4587'</span><span class="p">)</span>
|
2931
|
+
<span class="gp">>>> </span><span class="n">M2</span><span class="o">.</span><span class="n">splitting_surfaces</span><span class="p">()</span>
|
2932
|
+
<span class="go">[Orientable two-sided with euler = 0]</span>
|
2933
|
+
</pre></div>
|
2934
|
+
</div>
|
2935
|
+
</dd></dl>
|
2936
|
+
|
2937
|
+
<dl class="py method">
|
2938
|
+
<dt class="sig sig-object py" id="snappy.Manifold.symmetric_triangulation">
|
2939
|
+
<span class="sig-name descname"><span class="pre">symmetric_triangulation</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.symmetric_triangulation" title="Link to this definition"></a></dt>
|
2940
|
+
<dd><p>Returns a Dehn filling description of the manifold realizing
|
2941
|
+
the symmetry group.</p>
|
2942
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m003(-3,1)'</span><span class="p">)</span>
|
2943
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">symmetry_group</span><span class="p">()</span>
|
2944
|
+
<span class="go">D6</span>
|
2945
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">symmetric_triangulation</span><span class="p">()</span>
|
2946
|
+
<span class="gp">>>> </span><span class="n">N</span>
|
2947
|
+
<span class="go">m003(1,0)(1,0)(1,0)</span>
|
2948
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">(</span> <span class="p">[(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)]</span> <span class="p">)</span>
|
2949
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">symmetry_group</span><span class="p">(</span><span class="n">of_link</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
2950
|
+
<span class="go">D6</span>
|
2951
|
+
</pre></div>
|
2952
|
+
</div>
|
2953
|
+
</dd></dl>
|
2954
|
+
|
2955
|
+
<dl class="py method">
|
2956
|
+
<dt class="sig sig-object py" id="snappy.Manifold.symmetry_group">
|
2957
|
+
<span class="sig-name descname"><span class="pre">symmetry_group</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">of_link</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><a class="reference internal" href="additional_classes.html#snappy.SymmetryGroup" title="SnapPy.SymmetryGroup"><span class="pre">SymmetryGroup</span></a></span></span><a class="headerlink" href="#snappy.Manifold.symmetry_group" title="Link to this definition"></a></dt>
|
2958
|
+
<dd><p>Returns the symmetry group of the Manifold.
|
2959
|
+
If the flag “of_link” is set, then it only returns symmetries
|
2960
|
+
that preserves the meridians.</p>
|
2961
|
+
</dd></dl>
|
2962
|
+
|
2963
|
+
<dl class="py method">
|
2964
|
+
<dt class="sig sig-object py" id="snappy.Manifold.symplectic_basis">
|
2965
|
+
<span class="sig-name descname"><span class="pre">symplectic_basis</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">verify</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.symplectic_basis" title="Link to this definition"></a></dt>
|
2966
|
+
<dd><p>Extend the Neumann-Zagier matrix to one which is symplectic
|
2967
|
+
(up to factors of 2) using oscillating curves, see
|
2968
|
+
<a class="reference external" href="https://arxiv.org/abs/2208.06969">Mathews and Purcell ‘22</a>.
|
2969
|
+
Only accepts triangulations with 1 cusp.</p>
|
2970
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"4_1"</span><span class="p">)</span>
|
2971
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">symplectic_basis</span><span class="p">()</span>
|
2972
|
+
<span class="go">[-1 0 -1 -1]</span>
|
2973
|
+
<span class="go">[ 2 0 -2 0]</span>
|
2974
|
+
<span class="go">[-2 -1 -2 -1]</span>
|
2975
|
+
<span class="go">[ 0 -1 -2 -1]</span>
|
2976
|
+
</pre></div>
|
2977
|
+
</div>
|
2978
|
+
<dl class="field-list simple">
|
2979
|
+
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
|
2980
|
+
<dd class="field-odd"><p><strong>verify</strong> – Explicitly test if the resulting matrix is symplectic.</p>
|
2981
|
+
</dd>
|
2982
|
+
</dl>
|
2983
|
+
</dd></dl>
|
2984
|
+
|
2985
|
+
<dl class="py method">
|
2986
|
+
<dt class="sig sig-object py" id="snappy.Manifold.tetrahedra_field_gens">
|
2987
|
+
<span class="sig-name descname"><span class="pre">tetrahedra_field_gens</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.tetrahedra_field_gens" title="Link to this definition"></a></dt>
|
2988
|
+
<dd><p>The shapes of the tetrahedra as ApproximateAlgebraicNumbers. Can be
|
2989
|
+
used to compute the tetrahedra field, where the first two parameters
|
2990
|
+
are bits of precision and maximum degree of the field:</p>
|
2991
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M = Manifold('m015')
|
2992
|
+
sage: tets = M.tetrahedra_field_gens()
|
2993
|
+
sage: tets.find_field(100, 10, optimize=True) # doctest: +NORMALIZE_WHITESPACE +NUMERIC9
|
2994
|
+
(Number Field in z with defining polynomial x^3 - x - 1
|
2995
|
+
with z = -0.6623589786223730? - 0.5622795120623013?*I,
|
2996
|
+
<ApproxAN: -0.662358978622 - 0.562279512062*I>, [-z, -z, -z])
|
2997
|
+
</pre></div>
|
2998
|
+
</div>
|
2999
|
+
</dd></dl>
|
3000
|
+
|
3001
|
+
<dl class="py method">
|
3002
|
+
<dt class="sig sig-object py" id="snappy.Manifold.tetrahedra_shapes">
|
3003
|
+
<span class="sig-name descname"><span class="pre">tetrahedra_shapes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">part</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fixed_alignment</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dec_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">intervals</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.tetrahedra_shapes" title="Link to this definition"></a></dt>
|
3004
|
+
<dd><p>Gives the shapes of the tetrahedra in the current solution to
|
3005
|
+
the gluing equations. Returns a list containing one info object
|
3006
|
+
for each tetrahedron. The keys are:</p>
|
3007
|
+
<ul class="simple">
|
3008
|
+
<li><p>rect : the shape of the tetrahedron, as a point in the
|
3009
|
+
complex plane.</p></li>
|
3010
|
+
<li><p>log : the log of the shape</p></li>
|
3011
|
+
<li><p>accuracies: a list of the approximate accuracies of the
|
3012
|
+
shapes, in order (rect re, rect im, log re, log im)</p></li>
|
3013
|
+
</ul>
|
3014
|
+
<p>If the optional variable ‘part’ is set to one of the above,
|
3015
|
+
then the function returns only that component of the data.</p>
|
3016
|
+
<p>If the flag ‘fixed_alignment’ is set to False, then the edges
|
3017
|
+
used to report the shape parameters are chosen so as to
|
3018
|
+
normalize the triangle.</p>
|
3019
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m015'</span><span class="p">)</span>
|
3020
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">tetrahedra_shapes</span><span class="p">(</span><span class="n">part</span><span class="o">=</span><span class="s1">'rect'</span><span class="p">)</span>
|
3021
|
+
<span class="go">[0.66235898 + 0.56227951*I, 0.66235898 + 0.56227951*I, 0.66235898 + 0.56227951*I]</span>
|
3022
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">tetrahedra_shapes</span><span class="p">()</span>
|
3023
|
+
<span class="go">[{'accuracies': (11, 11, 12, 11), 'log': -0.14059979 + 0.70385772*I, 'rect': 0.66235898 + 0.56227951*I},</span>
|
3024
|
+
<span class="go"> {'accuracies': (11, 11, 11, 11), 'log': -0.14059979 + 0.70385772*I, 'rect': 0.66235898 + 0.56227951*I},</span>
|
3025
|
+
<span class="go"> {'accuracies': (11, 11, 11, 11), 'log': -0.14059979 + 0.70385772*I, 'rect': 0.66235898 + 0.56227951*I}]</span>
|
3026
|
+
</pre></div>
|
3027
|
+
</div>
|
3028
|
+
</dd></dl>
|
3029
|
+
|
3030
|
+
<dl class="py method">
|
3031
|
+
<dt class="sig sig-object py" id="snappy.Manifold.trace_field_gens">
|
3032
|
+
<span class="sig-name descname"><span class="pre">trace_field_gens</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">fundamental_group_args</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[]</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.trace_field_gens" title="Link to this definition"></a></dt>
|
3033
|
+
<dd><p>The generators of the trace field as ApproximateAlgebraicNumbers. Can be
|
3034
|
+
used to compute the tetrahedra field, where the first two parameters
|
3035
|
+
are bits of precision and maximum degree of the field:</p>
|
3036
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m125'</span><span class="p">)</span>
|
3037
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">traces</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">trace_field_gens</span><span class="p">()</span>
|
3038
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">traces</span><span class="o">.</span><span class="n">find_field</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">optimize</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># doctest: +NORMALIZE_WHITESPACE</span>
|
3039
|
+
<span class="p">(</span><span class="n">Number</span> <span class="n">Field</span> <span class="ow">in</span> <span class="n">z</span> <span class="k">with</span> <span class="n">defining</span> <span class="n">polynomial</span> <span class="n">x</span><span class="o">^</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span>
|
3040
|
+
<span class="k">with</span> <span class="n">z</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="o">*</span><span class="n">I</span><span class="p">,</span>
|
3041
|
+
<span class="o"><</span><span class="n">ApproxAN</span><span class="p">:</span> <span class="o">-</span><span class="mf">1.0</span><span class="o">*</span><span class="n">I</span><span class="o">></span><span class="p">,</span> <span class="p">[</span><span class="n">z</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">z</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span>
|
3042
|
+
</pre></div>
|
3043
|
+
</div>
|
3044
|
+
</dd></dl>
|
3045
|
+
|
3046
|
+
<dl class="py method">
|
3047
|
+
<dt class="sig sig-object py" id="snappy.Manifold.triangulation_isosig">
|
3048
|
+
<span class="sig-name descname"><span class="pre">triangulation_isosig</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">decorated</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_cusp_ordering</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_curves</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_curve_orientations</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_filling_orientations</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_orientation</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">→</span> <span class="sig-return-typehint"><span class="pre">str</span></span></span><a class="headerlink" href="#snappy.Manifold.triangulation_isosig" title="Link to this definition"></a></dt>
|
3049
|
+
<dd><p>Returns the “(decorated) isomorphism signature”, a compact text
|
3050
|
+
representation of the triangulation:</p>
|
3051
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">T</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
3052
|
+
<span class="gp">>>> </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">()</span>
|
3053
|
+
<span class="go">'cPcbbbiht_BaCB'</span>
|
3054
|
+
</pre></div>
|
3055
|
+
</div>
|
3056
|
+
<p>This string can be used later to recreate an isomorphic triangulation:</p>
|
3057
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">U</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'cPcbbbiht_BaCB'</span><span class="p">)</span>
|
3058
|
+
<span class="gp">>>> </span><span class="n">T</span> <span class="o">==</span> <span class="n">U</span>
|
3059
|
+
<span class="go">True</span>
|
3060
|
+
</pre></div>
|
3061
|
+
</div>
|
3062
|
+
<p>The isomorphism signature is also used to compute the
|
3063
|
+
<a class="reference internal" href="#snappy.Manifold.isometry_signature" title="snappy.Manifold.isometry_signature"><code class="xref py py-meth docutils literal notranslate"><span class="pre">isometry_signature</span></code></a>.
|
3064
|
+
It comes in two flavors controlled by the <code class="xref py py-attr docutils literal notranslate"><span class="pre">decorated</span></code> flag.</p>
|
3065
|
+
<p><strong>Undecorated isomorphism signature</strong></p>
|
3066
|
+
<p>The undecorated isomorphism signature is a complete invariant of the
|
3067
|
+
(oriented) triangulation up to combinatorial isomorphism:</p>
|
3068
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">T</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'m015'</span><span class="p">)</span>
|
3069
|
+
<span class="gp">>>> </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
3070
|
+
<span class="go">'dLQbcccdero'</span>
|
3071
|
+
</pre></div>
|
3072
|
+
</div>
|
3073
|
+
<p>It was introduced in
|
3074
|
+
<a class="reference external" href="http://arxiv.org/abs/1110.6080">Burton ‘11</a>. It canonizes and
|
3075
|
+
generalizes the ealier dehydration string by
|
3076
|
+
<a class="reference external" href="https://doi.org/10.1090/S0025-5718-99-01036-4">Callahan, Hildebrand and Weeks ‘99</a>.
|
3077
|
+
The undecorated isomorphism signature can also be given to
|
3078
|
+
<a class="reference external" href="https://regina-normal.github.io/">Regina</a>’s
|
3079
|
+
<code class="docutils literal notranslate"><span class="pre">Triangulation3.fromIsoSig</span></code>.</p>
|
3080
|
+
<p>By default, the orientation (if orientable) is ignored. More
|
3081
|
+
precisely, it computes the string for both orientations (if orientable)
|
3082
|
+
and uses the lexicographically smaller string:</p>
|
3083
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">T</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'m015'</span><span class="p">)</span>
|
3084
|
+
<span class="gp">>>> </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
3085
|
+
<span class="go">'dLQbcccdero'</span>
|
3086
|
+
<span class="gp">>>> </span><span class="n">T</span><span class="o">.</span><span class="n">reverse_orientation</span><span class="p">()</span>
|
3087
|
+
<span class="gp">>>> </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
3088
|
+
<span class="go">'dLQbcccdero'</span>
|
3089
|
+
</pre></div>
|
3090
|
+
</div>
|
3091
|
+
<p>When specifying <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_orientation</span> <span class="pre">=</span> <span class="pre">False</span></code>, the result
|
3092
|
+
encodes the orientation (if orientable). Now the result is
|
3093
|
+
different if we change the orientation of a chiral triangulation:</p>
|
3094
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">T</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'m015'</span><span class="p">)</span>
|
3095
|
+
<span class="gp">>>> </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">ignore_orientation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
3096
|
+
<span class="go">'dLQbcccdero'</span>
|
3097
|
+
<span class="gp">>>> </span><span class="n">T</span><span class="o">.</span><span class="n">reverse_orientation</span><span class="p">()</span>
|
3098
|
+
<span class="gp">>>> </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">ignore_orientation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
3099
|
+
<span class="go">'dLQbccceekg'</span>
|
3100
|
+
</pre></div>
|
3101
|
+
</div>
|
3102
|
+
<p><strong>Decorated isomorphism signature (default)</strong></p>
|
3103
|
+
<p>SnapPy can decorate the isomorphism signature to include the following
|
3104
|
+
peripheral information in a canonical way (that is invariant under
|
3105
|
+
the action by combinatorial isomorphisms of the triangulation):</p>
|
3106
|
+
<ol class="arabic simple">
|
3107
|
+
<li><p>Indexing of the cusps (that is, ideal vertices).</p>
|
3108
|
+
<ul class="simple">
|
3109
|
+
<li><p>Included by default.
|
3110
|
+
Can be suppressed with <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_cusp_ordering</span> <span class="pre">=</span> <span class="pre">True</span></code>.</p></li>
|
3111
|
+
</ul>
|
3112
|
+
</li>
|
3113
|
+
<li><p>Peripheral curves (aka meridian and longitude, up to homotopy).</p>
|
3114
|
+
<ul class="simple">
|
3115
|
+
<li><p>Included by default.
|
3116
|
+
Can be suppressed with <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_curves</span> <span class="pre">=</span> <span class="pre">True</span></code>.</p></li>
|
3117
|
+
<li><p>By default, the decoration encodes the oriented peripheral curves.
|
3118
|
+
By specifying <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_curve_orientations</span> <span class="pre">=</span> <span class="pre">True</span></code>, it encodes
|
3119
|
+
the unoriented peripheral curves instead.</p></li>
|
3120
|
+
</ul>
|
3121
|
+
</li>
|
3122
|
+
<li><p>Dehn-fillings (if present).</p>
|
3123
|
+
<ul class="simple">
|
3124
|
+
<li><p>By default, the decoration encodes the oriented Dehn-fillings.
|
3125
|
+
That is, we also encodes the orientation of the peripheral curve
|
3126
|
+
that is used for the Dehn-filling (this explanation only
|
3127
|
+
works if the coefficients are integral).
|
3128
|
+
By specifying <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_filling_orientations</span> <span class="pre">=</span> <span class="pre">True</span></code>, the
|
3129
|
+
decoration encodes the unoriented Dehn-fillings.
|
3130
|
+
That is, it normalizes the Dehn-filling coefficients by picking
|
3131
|
+
a canonical pair among <span class="math notranslate nohighlight">\((m,l)\)</span> and <span class="math notranslate nohighlight">\((-m,-l)\)</span>.</p></li>
|
3132
|
+
</ul>
|
3133
|
+
</li>
|
3134
|
+
</ol>
|
3135
|
+
<p>Details of the encoding are explained in the
|
3136
|
+
<a class="reference external" href="https://github.com/3-manifolds/SnapPy/blob/master/python/decorated_isosig.py">SnapPy source code</a>.</p>
|
3137
|
+
<p><strong>Example</strong></p>
|
3138
|
+
<p>Let us consider the links <span class="math notranslate nohighlight">\(9^2_{34}\)</span> and <code class="docutils literal notranslate"><span class="pre">L9a21</span></code>. Note that we use
|
3139
|
+
<a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation</span></code></a>
|
3140
|
+
to make the following examples say something intrinsic about the
|
3141
|
+
hyperbolic manifold:</p>
|
3142
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">snappy</span> <span class="kn">import</span> <span class="n">Manifold</span>
|
3143
|
+
<span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'9^2_34'</span><span class="p">)</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
|
3144
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'L9a21'</span><span class="p">)</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
|
3145
|
+
</pre></div>
|
3146
|
+
</div>
|
3147
|
+
<p>The decorated isosig recovers the entire peripheral information faithfully
|
3148
|
+
(including orientation, see below):</p>
|
3149
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">()</span>
|
3150
|
+
<span class="go">'oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_baBabbbBbC'</span>
|
3151
|
+
<span class="gp">>>> </span><span class="n">K</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_baBabbbBbC'</span><span class="p">)</span>
|
3152
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">isomorphisms_to</span><span class="p">(</span><span class="n">K</span><span class="p">)</span>
|
3153
|
+
<span class="go">[0 -> 0 1 -> 1</span>
|
3154
|
+
<span class="go">[1 0] [1 0]</span>
|
3155
|
+
<span class="go">[0 1] [0 1]</span>
|
3156
|
+
<span class="go">Extends to link]</span>
|
3157
|
+
</pre></div>
|
3158
|
+
</div>
|
3159
|
+
<p>The two links have isometric complements:</p>
|
3160
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
3161
|
+
<span class="go">'oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo'</span>
|
3162
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
3163
|
+
<span class="go">'oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo'</span>
|
3164
|
+
</pre></div>
|
3165
|
+
</div>
|
3166
|
+
<p>However, the complements have different handedness:</p>
|
3167
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span><span class="n">ignore_orientation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
3168
|
+
<span class="go">'oLLzLPwzQQccdeghjiiklmnmnnuvuvvavovvffffo'</span>
|
3169
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span><span class="n">ignore_orientation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
3170
|
+
<span class="go">'oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo'</span>
|
3171
|
+
</pre></div>
|
3172
|
+
</div>
|
3173
|
+
<p>Also, the cusps/components of the link are indexed differently:</p>
|
3174
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_curves</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
3175
|
+
<span class="go">'oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_ba'</span>
|
3176
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_curves</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
3177
|
+
<span class="go">'oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_ab'</span>
|
3178
|
+
</pre></div>
|
3179
|
+
</div>
|
3180
|
+
<p>Ignoring the indexing, we also see that the oriented merdians and
|
3181
|
+
longitudes do not match:</p>
|
3182
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
3183
|
+
<span class="go">'oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_bBbCBabb'</span>
|
3184
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
3185
|
+
<span class="go">'oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_BbbCbabb'</span>
|
3186
|
+
</pre></div>
|
3187
|
+
</div>
|
3188
|
+
<p>However, they are the same links (ignoring indexing and orientation):</p>
|
3189
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">ignore_curve_orientations</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
3190
|
+
<span class="go">'oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_bBBcbabb'</span>
|
3191
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">ignore_curve_orientations</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
3192
|
+
<span class="go">'oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_bBBcbabb'</span>
|
3193
|
+
</pre></div>
|
3194
|
+
</div>
|
3195
|
+
<p>Let us create two surgery presentations from the links (note that we
|
3196
|
+
fill after
|
3197
|
+
<a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation</span></code></a>
|
3198
|
+
since it rejects Dehn-fillings):</p>
|
3199
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span><span class="mi">0</span><span class="p">)</span>
|
3200
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">4</span><span class="p">,</span><span class="o">-</span><span class="mi">5</span><span class="p">),</span><span class="mi">1</span><span class="p">)</span>
|
3201
|
+
</pre></div>
|
3202
|
+
</div>
|
3203
|
+
<p>They are equivalent surgery presentations (of the same manifold):</p>
|
3204
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span>
|
3205
|
+
<span class="gp">... </span> <span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
3206
|
+
<span class="gp">... </span> <span class="n">ignore_curves</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
3207
|
+
<span class="gp">... </span> <span class="n">ignore_filling_orientations</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
3208
|
+
<span class="go">'oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo(0,0)(1,5)'</span>
|
3209
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span>
|
3210
|
+
<span class="gp">... </span> <span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
3211
|
+
<span class="gp">... </span> <span class="n">ignore_curves</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
3212
|
+
<span class="gp">... </span> <span class="n">ignore_filling_orientations</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
3213
|
+
<span class="go">'oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo(0,0)(1,5)'</span>
|
3214
|
+
</pre></div>
|
3215
|
+
</div>
|
3216
|
+
<p><strong>Orientation</strong></p>
|
3217
|
+
<p>Note that <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_orientation=True</span></code> only applies to the undecorated
|
3218
|
+
part of the isomorphism signature. The decoration can still capture the
|
3219
|
+
the orientation.
|
3220
|
+
More, precisely, the result of <a class="reference internal" href="#snappy.Manifold.triangulation_isosig" title="snappy.Manifold.triangulation_isosig"><code class="xref py py-meth docutils literal notranslate"><span class="pre">triangulation_isosig()</span></code></a> depends on
|
3221
|
+
the orientation (if the triangulation is orientable and chiral) if any
|
3222
|
+
of the following is true:</p>
|
3223
|
+
<ol class="arabic simple">
|
3224
|
+
<li><p><code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_orientation</span> <span class="pre">=</span> <span class="pre">False</span></code>.</p></li>
|
3225
|
+
<li><p><code class="xref py py-attr docutils literal notranslate"><span class="pre">decorated</span> <span class="pre">=</span> <span class="pre">True</span></code> and
|
3226
|
+
<code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_curves</span> <span class="pre">=</span> <span class="pre">False</span></code> and
|
3227
|
+
<code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_filling_orientations</span> <span class="pre">=</span> <span class="pre">False</span></code>.</p></li>
|
3228
|
+
</ol>
|
3229
|
+
<p>In these cases, re-constructing a triangulation from the isomorphism
|
3230
|
+
signature yields a triangulation with the same handedness.</p>
|
3231
|
+
<dl class="field-list simple">
|
3232
|
+
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
|
3233
|
+
<dd class="field-odd"><ul class="simple">
|
3234
|
+
<li><p><strong>decorated</strong> – Include peripheral information such as indexing of the cusps,
|
3235
|
+
(oriented or unoriented) peripheral curves and
|
3236
|
+
(oriented or unoriented) Dehn-fillings.</p></li>
|
3237
|
+
<li><p><strong>ignore_cusp_ordering</strong> – Do not encode the indexing of the cusps.
|
3238
|
+
Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">decorated</span> <span class="pre">=</span> <span class="pre">True</span></code>.</p></li>
|
3239
|
+
<li><p><strong>ignore_curves</strong> – Do not encode the peripheral curves.
|
3240
|
+
Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">decorated</span> <span class="pre">=</span> <span class="pre">True</span></code>.
|
3241
|
+
This is new in SnapPy version 3.2.
|
3242
|
+
If <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_curves</span> <span class="pre">=</span> <span class="pre">True</span></code>, the result of this method cannot
|
3243
|
+
be given to prior versions.</p></li>
|
3244
|
+
<li><p><strong>ignore_curve_orientations</strong> – Do not encode the orientations of the peripheral curves.
|
3245
|
+
Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">decorated</span> <span class="pre">=</span> <span class="pre">True</span></code> and
|
3246
|
+
<code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_curves</span> <span class="pre">=</span> <span class="pre">False</span></code>.</p></li>
|
3247
|
+
<li><p><strong>ignore_filling_orientations</strong> – Do not encode the orientations of the Dehn-fillings.
|
3248
|
+
Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">decorated</span> <span class="pre">=</span> <span class="pre">True</span></code>.</p></li>
|
3249
|
+
<li><p><strong>ignore_orientation</strong> – Do not encode the orientation of the triangulation in the
|
3250
|
+
undecorated part of the triangulation isosig.
|
3251
|
+
See above section about orientation.</p></li>
|
3252
|
+
</ul>
|
3253
|
+
</dd>
|
3254
|
+
</dl>
|
3255
|
+
</dd></dl>
|
3256
|
+
|
3257
|
+
<dl class="py method">
|
3258
|
+
<dt class="sig sig-object py" id="snappy.Manifold.use_field_conversion">
|
3259
|
+
<em class="property"><span class="pre">classmethod</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">use_field_conversion</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">func</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.use_field_conversion" title="Link to this definition"></a></dt>
|
3260
|
+
<dd><p>A class method for specifying a numerical conversion function.
|
3261
|
+
This method is deprecated: SnapPy will automatically use
|
3262
|
+
SageMath number types or its own SnapPy number type depending on
|
3263
|
+
whether SageMath is available or not.</p>
|
3264
|
+
<p>SnapPy includes its own number type, snappy.Number, which can
|
3265
|
+
represent floating point real or complex numbers of varying
|
3266
|
+
precision. (In fact, Number is a wrapper for a pari number of
|
3267
|
+
type ‘t_INT’, ‘t_FRAC’, ‘t_REAL’ or ‘t_COMPLEX’, and the pari
|
3268
|
+
gen can be extracted as an attribute: x.gen .) Methods of
|
3269
|
+
SnapPy objects which return numerical values will first compute
|
3270
|
+
the value as a Number, and then optionally convert the Number
|
3271
|
+
to a different numerical type which can be specified by calling
|
3272
|
+
this class method.</p>
|
3273
|
+
<p>By default SnapPy returns Numbers when loaded into python, and
|
3274
|
+
elements of a Sage RealField or ComplexField when loaded into
|
3275
|
+
Sage. These will be 64 bit numbers for ordinary Manifolds and
|
3276
|
+
212 bit numbers for high precision manifolds.</p>
|
3277
|
+
<p>The func argument should be a function which accepts a number and
|
3278
|
+
returns a numerical type of your choosing. Alternatively, the
|
3279
|
+
strings ‘sage’ or ‘snappy’ can be passed as arguments to select
|
3280
|
+
either of the two default behaviors.</p>
|
3281
|
+
<p>EXAMPLE:</p>
|
3282
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
3283
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">R</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span><span class="o">.</span><span class="n">parent</span><span class="p">()</span>
|
3284
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">R</span><span class="o">.</span><span class="n">name</span><span class="p">()</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'RealField'</span><span class="p">)</span>
|
3285
|
+
<span class="kc">True</span>
|
3286
|
+
<span class="n">sage</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">snappy.number</span> <span class="kn">import</span> <span class="n">SnapPyNumbers</span>
|
3287
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">Manifold</span><span class="o">.</span><span class="n">use_field_conversion</span><span class="p">(</span><span class="s1">'snappy'</span><span class="p">)</span>
|
3288
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
3289
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">R</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span><span class="o">.</span><span class="n">parent</span><span class="p">()</span>
|
3290
|
+
<span class="n">sage</span><span class="p">:</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">SnapPyNumbers</span><span class="p">)</span>
|
3291
|
+
<span class="kc">True</span>
|
3292
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">Manifold</span><span class="o">.</span><span class="n">use_field_conversion</span><span class="p">(</span><span class="s1">'sage'</span><span class="p">)</span>
|
3293
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
3294
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">R</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span><span class="o">.</span><span class="n">parent</span><span class="p">()</span>
|
3295
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">R</span><span class="o">.</span><span class="n">name</span><span class="p">()</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'RealField'</span><span class="p">)</span>
|
3296
|
+
<span class="kc">True</span>
|
3297
|
+
</pre></div>
|
3298
|
+
</div>
|
3299
|
+
</dd></dl>
|
3300
|
+
|
3301
|
+
<dl class="py method">
|
3302
|
+
<dt class="sig sig-object py" id="snappy.Manifold.verify_hyperbolicity">
|
3303
|
+
<span class="sig-name descname"><span class="pre">verify_hyperbolicity</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">holonomy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fundamental_group_args</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lift_to_SL</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.verify_hyperbolicity" title="Link to this definition"></a></dt>
|
3304
|
+
<dd><p>Given an orientable SnapPy Manifold, verifies its hyperbolicity.</p>
|
3305
|
+
<p>Similar to HIKMOT’s <a class="reference internal" href="#snappy.Manifold.verify_hyperbolicity" title="snappy.Manifold.verify_hyperbolicity"><code class="xref py py-meth docutils literal notranslate"><span class="pre">verify_hyperbolicity()</span></code></a>, the result is either
|
3306
|
+
<code class="docutils literal notranslate"><span class="pre">(True,</span> <span class="pre">listOfShapeIntervals)</span></code> or <code class="docutils literal notranslate"><span class="pre">(False,</span> <span class="pre">[])</span></code> if verification failed.
|
3307
|
+
<code class="docutils literal notranslate"><span class="pre">listOfShapesIntervals</span></code> is a list of complex intervals (elements in
|
3308
|
+
sage’s <code class="docutils literal notranslate"><span class="pre">ComplexIntervalField</span></code>) certified to contain the true shapes
|
3309
|
+
for the hyperbolic manifold.</p>
|
3310
|
+
<p>Higher precision intervals can be obtained by setting <code class="docutils literal notranslate"><span class="pre">bits_prec</span></code>:</p>
|
3311
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: from snappy import Manifold
|
3312
|
+
sage: M = Manifold("m019")
|
3313
|
+
sage: M.verify_hyperbolicity() # doctest: +NUMERIC12
|
3314
|
+
(True, [0.780552527850? + 0.914473662967?*I, 0.780552527850? + 0.91447366296773?*I, 0.4600211755737? + 0.6326241936052?*I])
|
3315
|
+
|
3316
|
+
sage: M = Manifold("t02333(3,4)")
|
3317
|
+
sage: M.verify_hyperbolicity() # doctest: +NUMERIC9
|
3318
|
+
(True, [2.152188153612? + 0.284940667895?*I, 1.92308491369? + 1.10360701507?*I, 0.014388591584? + 0.143084469681?*I, -2.5493670288? + 3.7453498408?*I, 0.142120333822? + 0.176540027036?*I, 0.504866865874? + 0.82829881681?*I, 0.50479249917? + 0.98036162786?*I, -0.589495705074? + 0.81267480427?*I])
|
3319
|
+
</pre></div>
|
3320
|
+
</div>
|
3321
|
+
<p>One can instead get a holonomy representation associated to the
|
3322
|
+
verified hyperbolic structure. This representation takes values
|
3323
|
+
in 2x2 matrices with entries in the <code class="docutils literal notranslate"><span class="pre">ComplexIntervalField</span></code>:</p>
|
3324
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M = Manifold("m004(1,2)")
|
3325
|
+
sage: success, rho = M.verify_hyperbolicity(holonomy=True)
|
3326
|
+
sage: success
|
3327
|
+
True
|
3328
|
+
sage: trace = rho('aaB').trace(); trace # doctest: +NUMERIC9
|
3329
|
+
-0.1118628555? + 3.8536121048?*I
|
3330
|
+
sage: (trace - 2).contains_zero()
|
3331
|
+
False
|
3332
|
+
sage: (rho('aBAbaabAB').trace() - 2).contains_zero()
|
3333
|
+
True
|
3334
|
+
</pre></div>
|
3335
|
+
</div>
|
3336
|
+
<p>Here, there is <strong>provably</strong> a fixed holonomy representation rho0
|
3337
|
+
from the fundamental group G of M to SL(2, C) so that for each
|
3338
|
+
element g of G the matrix rho0(g) is contained in rho(g). In
|
3339
|
+
particular, the above constitutes a proof that the word ‘aaB’ is
|
3340
|
+
non-trivial in G. In contrast, the final computation is
|
3341
|
+
consistent with ‘aBAbaabAB’ being trivial in G, but <em>does not prove
|
3342
|
+
this</em>.</p>
|
3343
|
+
<p>A non-hyperbolic manifold (<code class="docutils literal notranslate"><span class="pre">False</span></code> indicates that the manifold
|
3344
|
+
might not be hyperbolic but does <strong>not</strong> certify
|
3345
|
+
non-hyperbolicity. Sometimes, hyperbolicity can only be verified
|
3346
|
+
after increasing the precision):</p>
|
3347
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">"4_1(1,0)"</span><span class="p">)</span>
|
3348
|
+
<span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">verify_hyperbolicity</span><span class="p">()</span>
|
3349
|
+
<span class="p">(</span><span class="kc">False</span><span class="p">,</span> <span class="p">[])</span>
|
3350
|
+
</pre></div>
|
3351
|
+
</div>
|
3352
|
+
<p>Under the hood, the function will call the <code class="docutils literal notranslate"><span class="pre">CertifiedShapesEngine</span></code> to produce
|
3353
|
+
intervals certified to contain a solution to the rectangular gluing equations.
|
3354
|
+
It then calls <code class="docutils literal notranslate"><span class="pre">check_logarithmic_gluing_equations_and_positively_oriented_tets</span></code>
|
3355
|
+
to verify that the logarithmic gluing equations are fulfilled and that all
|
3356
|
+
tetrahedra are positively oriented.</p>
|
3357
|
+
</dd></dl>
|
3358
|
+
|
3359
|
+
<dl class="py method">
|
3360
|
+
<dt class="sig sig-object py" id="snappy.Manifold.volume">
|
3361
|
+
<span class="sig-name descname"><span class="pre">volume</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">accuracy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.volume" title="Link to this definition"></a></dt>
|
3362
|
+
<dd><p>Returns the volume of the current solution to the hyperbolic
|
3363
|
+
gluing equations; if the solution is sufficiently non-degenerate,
|
3364
|
+
this is the sum of the volumes of the hyperbolic pieces in
|
3365
|
+
the geometric decomposition of the manifold.</p>
|
3366
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
3367
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
|
3368
|
+
<span class="go">2.02988321</span>
|
3369
|
+
<span class="gp">>>> </span><span class="n">M</span><span class="o">.</span><span class="n">solution_type</span><span class="p">()</span>
|
3370
|
+
<span class="go">'all tetrahedra positively oriented'</span>
|
3371
|
+
</pre></div>
|
3372
|
+
</div>
|
3373
|
+
<p>The return value has an extra attribute, accuracy, which is the
|
3374
|
+
number of digits of accuracy as <em>estimated</em> by SnapPea. When
|
3375
|
+
printing the volume, the result is rounded to 1 more than this
|
3376
|
+
number of digits.</p>
|
3377
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">vol</span><span class="p">,</span> <span class="n">accuracy</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">(</span><span class="n">accuracy</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
|
3378
|
+
<span class="gp">>>> </span><span class="n">accuracy</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">63</span><span class="p">)</span> <span class="c1"># Low precision, High precision</span>
|
3379
|
+
<span class="go">True</span>
|
3380
|
+
</pre></div>
|
3381
|
+
</div>
|
3382
|
+
<p>Inside SageMath, verified computation of the volume of a
|
3383
|
+
hyperbolic manifold is also possible (this will verify first
|
3384
|
+
that the manifold is indeed hyperbolic):</p>
|
3385
|
+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M.volume(verified=True, bits_prec=100) #doctest: +NUMERIC24
|
3386
|
+
2.029883212819307250042405109?
|
3387
|
+
</pre></div>
|
3388
|
+
</div>
|
3389
|
+
</dd></dl>
|
3390
|
+
|
3391
|
+
<dl class="py method">
|
3392
|
+
<dt class="sig sig-object py" id="snappy.Manifold.with_hyperbolic_structure">
|
3393
|
+
<span class="sig-name descname"><span class="pre">with_hyperbolic_structure</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.with_hyperbolic_structure" title="Link to this definition"></a></dt>
|
3394
|
+
<dd><p>Add a (possibly degenerate) hyperbolic structure, turning the
|
3395
|
+
<a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><code class="xref py py-class docutils literal notranslate"><span class="pre">Triangulation</span></code></a> into a <a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><code class="xref py py-class docutils literal notranslate"><span class="pre">Manifold</span></code></a>.</p>
|
3396
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">'m004'</span><span class="p">)</span>
|
3397
|
+
<span class="gp">>>> </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">with_hyperbolic_structure</span><span class="p">()</span>
|
3398
|
+
<span class="gp">>>> </span><span class="n">N</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
|
3399
|
+
<span class="go">2.02988321</span>
|
3400
|
+
</pre></div>
|
3401
|
+
</div>
|
3402
|
+
</dd></dl>
|
3403
|
+
|
3404
|
+
<dl class="py method">
|
3405
|
+
<dt class="sig sig-object py" id="snappy.Manifold.without_hyperbolic_structure">
|
3406
|
+
<span class="sig-name descname"><span class="pre">without_hyperbolic_structure</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.without_hyperbolic_structure" title="Link to this definition"></a></dt>
|
3407
|
+
<dd><p>Returns self as a <a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><code class="xref py py-class docutils literal notranslate"><span class="pre">Triangulation</span></code></a>, forgetting the hyperbolic
|
3408
|
+
structure in the process.</p>
|
3409
|
+
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">'9_42'</span><span class="p">)</span>
|
3410
|
+
<span class="gp">>>> </span><span class="n">T</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">without_hyperbolic_structure</span><span class="p">()</span>
|
3411
|
+
<span class="gp">>>> </span><span class="nb">hasattr</span><span class="p">(</span><span class="n">T</span><span class="p">,</span> <span class="s1">'volume'</span><span class="p">)</span>
|
3412
|
+
<span class="go">False</span>
|
3413
|
+
</pre></div>
|
3414
|
+
</div>
|
3415
|
+
</dd></dl>
|
3416
|
+
|
3417
|
+
</dd></dl>
|
3418
|
+
|
3419
|
+
</section>
|
3420
|
+
|
3421
|
+
|
3422
|
+
</div>
|
3423
|
+
</div>
|
3424
|
+
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
|
3425
|
+
<a href="snappy.html" class="btn btn-neutral float-left" title="The snappy module and its classes" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
|
3426
|
+
<a href="manifoldhp.html" class="btn btn-neutral float-right" title="ManifoldHP: High-precision variant" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
|
3427
|
+
</div>
|
3428
|
+
|
3429
|
+
<hr/>
|
3430
|
+
|
3431
|
+
<div role="contentinfo">
|
3432
|
+
<p>© Copyright 2009-2025, by Marc Culler, Nathan Dunfield, Matthias Goerner, Jeffrey Weeks and others.</p>
|
3433
|
+
</div>
|
3434
|
+
|
3435
|
+
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
|
3436
|
+
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
|
3437
|
+
provided by <a href="https://readthedocs.org">Read the Docs</a>.
|
3438
|
+
|
3439
|
+
|
3440
|
+
</footer>
|
3441
|
+
</div>
|
3442
|
+
</div>
|
3443
|
+
</section>
|
3444
|
+
</div>
|
3445
|
+
<script>
|
3446
|
+
jQuery(function () {
|
3447
|
+
SphinxRtdTheme.Navigation.enable(true);
|
3448
|
+
});
|
3449
|
+
</script>
|
3450
|
+
|
3451
|
+
</body>
|
3452
|
+
</html>
|