snappy 3.2__cp311-cp311-macosx_10_12_x86_64.whl
Sign up to get free protection for your applications and to get access to all the features.
- snappy/CyOpenGL.cpython-311-darwin.so +0 -0
- snappy/SnapPy.cpython-311-darwin.so +0 -0
- snappy/SnapPy.ico +0 -0
- snappy/SnapPy.png +0 -0
- snappy/SnapPyHP.cpython-311-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-311-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
@@ -0,0 +1,298 @@
|
|
1
|
+
Step-by-step examples: Part 1
|
2
|
+
=============================
|
3
|
+
|
4
|
+
.. _ptolemy-example-basic:
|
5
|
+
|
6
|
+
The Ptolemy variety for SL(*N*, **C**)
|
7
|
+
--------------------------------------
|
8
|
+
|
9
|
+
Given a SnapPy triangulation, we obtain the reduced Ptolemy variety to find
|
10
|
+
SL(2, **C**)-representations as follows::
|
11
|
+
|
12
|
+
>>> M=Manifold("m003")
|
13
|
+
>>> M.ptolemy_variety(N = 2)
|
14
|
+
Ptolemy Variety for m003, N = 2
|
15
|
+
c_0011_0 * c_0101_0 + c_0011_0^2 - c_0101_0^2
|
16
|
+
c_0011_0 * c_0101_0 + c_0011_0^2 - c_0101_0^2
|
17
|
+
- 1 + c_0011_0
|
18
|
+
|
19
|
+
The result of ``M.ptolemy_variety(2)`` is an object of type ``PtolemyVariety``.
|
20
|
+
|
21
|
+
**Remark:** The exact formatting of the output might change between SnapPy versions and sage.
|
22
|
+
|
23
|
+
**Remark:** The first two equations are the two Ptolemy relations
|
24
|
+
for the two tetrahedra in ``m003``. The last equation :ref:`reduces <ptolemy-reduced-variety>` the Ptolemy variety.
|
25
|
+
|
26
|
+
Similar, we can obtain the Ptolemy variety for higher *N*, say SL(3, **C**)::
|
27
|
+
|
28
|
+
>>> M=Manifold("m004")
|
29
|
+
>>> M.ptolemy_variety(3)
|
30
|
+
Ptolemy Variety for m003, N = 3
|
31
|
+
c_0012_0 * c_1101_0 + c_0012_1 * c_0111_0 - c_0102_0 * c_1011_0
|
32
|
+
c_0012_1 * c_1110_0 - c_0102_0 * c_0111_0 + c_0102_1 * c_1011_0
|
33
|
+
c_0012_0 * c_0111_0 + c_0102_0 * c_1101_0 - c_0102_1 * c_1110_0
|
34
|
+
c_0012_0 * c_1110_0 + c_0012_1 * c_1011_0 - c_0102_1 * c_1101_0
|
35
|
+
- c_0012_0 * c_0111_0 - c_0012_1 * c_1101_0 + c_0102_1 * c_1011_0
|
36
|
+
- c_0012_0 * c_1110_0 - c_0102_0 * c_1011_0 + c_0102_1 * c_0111_0
|
37
|
+
- c_0012_1 * c_0111_0 + c_0102_0 * c_1110_0 - c_0102_1 * c_1101_0
|
38
|
+
- c_0012_0 * c_1011_0 - c_0012_1 * c_1110_0 + c_0102_0 * c_1101_0
|
39
|
+
- 1 + c_0012_0
|
40
|
+
- 1 + c_0111_0
|
41
|
+
|
42
|
+
**Remark:** Similarly, we obtain four Ptolemy relations for each of the two tetrahedra in ``m004`` corresponding to the four subsimplices of a tetrahedron we get for *N*\ =3 (see Figure 2 of [GTZ2011]_).
|
43
|
+
|
44
|
+
Using auto-completion
|
45
|
+
---------------------
|
46
|
+
|
47
|
+
Let us assign a Ptolemy variety to ``p`` and then type ``p.``::
|
48
|
+
|
49
|
+
>>> p=Manifold("m003").ptolemy_variety(2)
|
50
|
+
>>> p.
|
51
|
+
|
52
|
+
If we are in SnapPy, sage or ipython, we can now hit the tab-key and see a list of attributes and methods available for a Ptolemy variety::
|
53
|
+
|
54
|
+
>>> p.
|
55
|
+
p.canonical_representative p.filename_base p.to_magma
|
56
|
+
p.compute_decomposition p.path_to_file p.to_magma_file
|
57
|
+
p.compute_solutions p.py_eval_section p.variables
|
58
|
+
p.degree_to_shapes p.py_eval_variable_dict p.variables_with_non_zero_condition
|
59
|
+
p.equations p.retrieve_decomposition
|
60
|
+
p.equations_with_non_zero_condition p.retrieve_solutions
|
61
|
+
|
62
|
+
We can get further help by using the ``?``::
|
63
|
+
|
64
|
+
>>> p.filename_base?
|
65
|
+
...
|
66
|
+
Definition: p.filename_base(self)
|
67
|
+
Docstring:
|
68
|
+
Preferred filename base for writing out this Ptolemy variety
|
69
|
+
...
|
70
|
+
|
71
|
+
This is a general mechanism and works for all objects in SnapPy, sage or ipython.
|
72
|
+
|
73
|
+
.. _ptolemy-example-retrieve-exact-solutions:
|
74
|
+
|
75
|
+
Retrieving exact solutions from the database
|
76
|
+
--------------------------------------------
|
77
|
+
|
78
|
+
Given a Ptolemy variety, we can access the database at `ptolemy.unhyperbolic.org <http://ptolemy.unhyperbolic.org/>`_ to retrieve solutions for it with ``retrieve_solutions`` (if this is not working, please check your Internet connection)::
|
79
|
+
|
80
|
+
>>> p=Manifold("m003").ptolemy_variety(2)
|
81
|
+
>>> sols=p.retrieve_solutions()
|
82
|
+
Trying to retrieve solutions from http://ptolemy.unhyperbolic.org/data/pgl2/OrientableCuspedCensus/02_tetrahedra/m003__sl2_c0.magma_out ...
|
83
|
+
Parsing..
|
84
|
+
>>> sols
|
85
|
+
[PtolemyCoordinates(
|
86
|
+
{'c_0011_0': 1,
|
87
|
+
'c_0011_1': -1,
|
88
|
+
'c_0101_0': Mod(x, x^2 - x - 1),
|
89
|
+
'c_0101_1': Mod(-x, x^2 - x - 1),
|
90
|
+
'c_0110_0': Mod(-x, x^2 - x - 1),
|
91
|
+
'c_0110_1': Mod(x, x^2 - x - 1),
|
92
|
+
'c_1001_0': -1,
|
93
|
+
'c_1001_1': 1,
|
94
|
+
'c_1010_0': Mod(x, x^2 - x - 1),
|
95
|
+
'c_1010_1': Mod(-x, x^2 - x - 1),
|
96
|
+
'c_1100_0': 1,
|
97
|
+
'c_1100_1': -1,
|
98
|
+
's_0_0': 1,
|
99
|
+
's_0_1': 1,
|
100
|
+
's_1_0': 1,
|
101
|
+
's_1_1': 1,
|
102
|
+
's_2_0': 1,
|
103
|
+
's_2_1': 1,
|
104
|
+
's_3_0': 1,
|
105
|
+
's_3_1': 1},
|
106
|
+
is_numerical = False, ...)]
|
107
|
+
|
108
|
+
The result is a list of solutions (up to Galois conjugation), here the list contains only one solution. Let us pick that one::
|
109
|
+
|
110
|
+
>>> len(sols)
|
111
|
+
1
|
112
|
+
>>> sol = sols[0]
|
113
|
+
PtolemyCoordinates(
|
114
|
+
{'c_0011_0': 1,
|
115
|
+
'c_0011_1': -1,
|
116
|
+
'c_0101_0': Mod(x, x^2 - x - 1),
|
117
|
+
'c_0101_1': Mod(-x, x^2 - x - 1),
|
118
|
+
'c_0110_0': Mod(-x, x^2 - x - 1),
|
119
|
+
'c_0110_1': Mod(x, x^2 - x - 1),
|
120
|
+
'c_1001_0': -1,
|
121
|
+
'c_1001_1': 1,
|
122
|
+
'c_1010_0': Mod(x, x^2 - x - 1),
|
123
|
+
'c_1010_1': Mod(-x, x^2 - x - 1),
|
124
|
+
'c_1100_0': 1,
|
125
|
+
'c_1100_1': -1,
|
126
|
+
's_0_0': 1,
|
127
|
+
's_0_1': 1,
|
128
|
+
's_1_0': 1,
|
129
|
+
's_1_1': 1,
|
130
|
+
's_2_0': 1,
|
131
|
+
's_2_1': 1,
|
132
|
+
's_3_0': 1,
|
133
|
+
's_3_1': 1},
|
134
|
+
is_numerical = False, ...)
|
135
|
+
|
136
|
+
As we can see, a solution assigns a value to each Ptolemy coordinate c\ :sub:`...`\ . It is of type ``PtolemyCoordinates`` (a subclass of python's ``dict``) and more details are discussed in :ref:`a later example <ptolemy-example-structure-of-solution>`.
|
137
|
+
|
138
|
+
**Remark:** We can give the additional argument ``verbose=False`` to suppress the messages about the database access::
|
139
|
+
|
140
|
+
>>> sols = Manifold("m003").ptolemy_variety(2).retrieve_solutions(verbose=False)
|
141
|
+
|
142
|
+
.. _ptolemy-example-matrices:
|
143
|
+
|
144
|
+
Compute the matrices for a representation
|
145
|
+
-----------------------------------------
|
146
|
+
|
147
|
+
**Remark:** Requires SnapPy 2.3 or later.
|
148
|
+
|
149
|
+
Given a solution as above, we can take a word in the fundamental group and get its image under the representation using :py:meth:`~snappy.ptolemy.coordinates.PtolemyCoordinates.evaluate_word`. Here, we do it for the two generators::
|
150
|
+
|
151
|
+
>>> M = Manifold("m003")
|
152
|
+
>>> sol = M.ptolemy_variety(2).retrieve_solutions()[0]
|
153
|
+
>>> sol.evaluate_word('a')
|
154
|
+
[[0, Mod(1, x^2 - x - 1)], [Mod(-1, x^2 - x - 1), Mod(-x, x^2 - x - 1)]]
|
155
|
+
>>> sol.evaluate_word('b')
|
156
|
+
[[Mod(x, x^2 - x - 1), Mod(x, x^2 - x - 1)],
|
157
|
+
[Mod(-x, x^2 - x - 1), Mod(-1, x^2 - x - 1)]]
|
158
|
+
|
159
|
+
By default, this word is with respect to the unsimplified presentation of the fundamental group. Thus, we expect the identity matrix when we evaluate a relator (for PSL(*N*, **C**) the diagonal element will be an *N*-th root of unity)::
|
160
|
+
|
161
|
+
>>> M.fundamental_group(simplify_presentation=False)
|
162
|
+
Generators:
|
163
|
+
a,b,c
|
164
|
+
Relators:
|
165
|
+
BCaC
|
166
|
+
AbCbA
|
167
|
+
>>> sol.evaluate_word('BCaC')
|
168
|
+
[[Mod(1, x^2 - x - 1), 0], [0, Mod(1, x^2 - x - 1)]]
|
169
|
+
|
170
|
+
We revisit computing the matrices :ref:`here <ptolemy-detailed-example-matrices>` to explain how to use a different presentation of the fundamental group.
|
171
|
+
|
172
|
+
**Remark:** The matrices are currently returned as a list of list of pari ``POLMOD`` objects. In the future, the ptolemy module should return the matrices as sage matrices over a `sage NumberField <http://doc.sagemath.org/html/en/reference/number_fields/sage/rings/number_field/number_field.html>`_.
|
173
|
+
|
174
|
+
.. _ptolemy-example-traces:
|
175
|
+
|
176
|
+
Compute the traces
|
177
|
+
------------------
|
178
|
+
|
179
|
+
**Remark:** Requires SnapPy 2.3.2 or later.
|
180
|
+
|
181
|
+
We can compute the traces of these matrices::
|
182
|
+
|
183
|
+
>>> sol = Manifold("m003").ptolemy_variety(2).retrieve_solutions(verbose=False)[0]
|
184
|
+
>>> from snappy.ptolemy.matrix import matrix_trace
|
185
|
+
>>> matrix_trace(sol.evaluate_word('a'))
|
186
|
+
Mod(-1, x^2 - x - 1)
|
187
|
+
>>> matrix_trace(sol.evaluate_word('b'))
|
188
|
+
Mod(-x -1, x^2 -x -1)
|
189
|
+
>>> matrix_trace(sol.evaluate_word('ab'))
|
190
|
+
Mod(-x + 2, x^2 + x + 1)
|
191
|
+
>>> matrix_trace(sol.evaluate_word('ba'))
|
192
|
+
Mod(-x + 2, x^2 + x + 1)
|
193
|
+
|
194
|
+
**Remark:** Since this representation is irreducible, it is uniquely determined up to conjugacy by the above 4 traces, see Slide 30 of
|
195
|
+
`Marc Culler's slides <http://www.math.illinois.edu/GEAR/resources/Culler/Culler-lecture3-slides.pdf>`_.
|
196
|
+
|
197
|
+
.. _ptolemy-examples-trace-field:
|
198
|
+
|
199
|
+
Compute the trace field for a PSL(*2*, **C**)-representation
|
200
|
+
------------------------------------------------------------
|
201
|
+
|
202
|
+
>>> sol = Manifold("m003").ptolemy_variety(2).retrieve_solutions(verbose=False)[0]
|
203
|
+
>>> sol.number_field()
|
204
|
+
x^2 + x + 1
|
205
|
+
|
206
|
+
This is the Ptolemy field which is equal to the trace field if *N*\ = 2 by results of [GGZ2014]_.
|
207
|
+
|
208
|
+
.. _ptolemy-example-volume:
|
209
|
+
|
210
|
+
Compute the volume
|
211
|
+
------------------
|
212
|
+
|
213
|
+
We can also compute the volume of the representations::
|
214
|
+
|
215
|
+
>>> sol = Manifold("m003").ptolemy_variety(2).retrieve_solutions(verbose=False)[0]
|
216
|
+
>>> sol.volume_numerical()
|
217
|
+
[0.E-38, 1.88266550875941 E-14]
|
218
|
+
|
219
|
+
Recall that we had an algebraic solution in the number field with defining polynomial x\ :sup:`2`\ +x+1. This number field has two embeddings into **C**, yielding two representations. This is why the result is a list of two volumes. In this case, they are both zero up to numerical precision.
|
220
|
+
|
221
|
+
.. _ptolemy-example-increase-precision:
|
222
|
+
|
223
|
+
Increase precision
|
224
|
+
------------------
|
225
|
+
|
226
|
+
We can get higher precision be setting it in pari (in decimal digits)::
|
227
|
+
|
228
|
+
>>> sol = Manifold("m011").ptolemy_variety(2).retrieve_solutions(verbose=False)[0]
|
229
|
+
>>> sol.volume_numerical()
|
230
|
+
[-4.30211422042248 E-16, -0.942707362776931, 0.942707362776931]
|
231
|
+
>>> pari.set_real_precision(40)
|
232
|
+
15
|
233
|
+
>>> sol.volume_numerical()
|
234
|
+
[-1.5819817649675358086 E-40,
|
235
|
+
-0.9427073627769277209212996030922116475902,
|
236
|
+
0.9427073627769277209212996030922116475902]
|
237
|
+
|
238
|
+
**Remark:** This is not using interval arithmetics (although this is planned for the future). For now, the computed value of a quantity might differ from the real value by far more than the number of displayed digits suggests. To be confident about the result, we can increase the precision and see how many digits of the result are stabilizing.
|
239
|
+
|
240
|
+
.. _ptolemy-example-obstruction-class:
|
241
|
+
|
242
|
+
Ptolemy varieties for PSL(*N*, **C**)-representations
|
243
|
+
-----------------------------------------------------
|
244
|
+
|
245
|
+
The representations of ``m003`` we detected so far had trivial volume and thus cannot include the geometric representation. This is because the geometric representation is a boundary-unipotent PSL(2, **C**)-representation but not a :ref:`boundary-unipotent SL(2, C)-representation <ptolemy-boundary-unipotent>` and we only detect the latter ones above.
|
246
|
+
|
247
|
+
We can obtain the Ptolemy varieties for all :ref:`obstruction classes <obstruction-class>` to find the PSL(*N*, **C**)-representation that do not lift to boundary-unipotent SL(*N*, **C**)-representations as well::
|
248
|
+
|
249
|
+
>>> M = Manifold("m003")
|
250
|
+
>>> M.ptolemy_variety(N = 2, obstruction_class = 'all')
|
251
|
+
[Ptolemy Variety for m003, N = 2, obstruction_class = 0
|
252
|
+
c_0011_0 * c_0101_0 + c_0011_0^2 - c_0101_0^2
|
253
|
+
c_0011_0 * c_0101_0 + c_0011_0^2 - c_0101_0^2
|
254
|
+
- 1 + c_0011_0,
|
255
|
+
Ptolemy Variety for m003, N = 2, obstruction_class = 1
|
256
|
+
- c_0011_0 * c_0101_0 - c_0011_0^2 - c_0101_0^2
|
257
|
+
- c_0011_0 * c_0101_0 - c_0011_0^2 - c_0101_0^2
|
258
|
+
- 1 + c_0011_0]
|
259
|
+
|
260
|
+
The first Ptolemy variety in this list always corresponds to the trivial obstruction class. Let us try the non-trivial obstruction class::
|
261
|
+
|
262
|
+
>>> p = M.ptolemy_variety(2, 'all')[1]
|
263
|
+
>>> sols=p.retrieve_solutions(verbose=False)
|
264
|
+
>>> sols.volume_numerical()
|
265
|
+
[[2.02988321281931, -2.02988321281931]]
|
266
|
+
|
267
|
+
We now see a representation with volume twice that of a regular ideal tetrahedron. This is the geometric representation of ``m003``.
|
268
|
+
Here is python code to iterate over all obstruction classes:
|
269
|
+
|
270
|
+
>>> for p in Manifold("m003").ptolemy_variety(2,'all'):
|
271
|
+
... sols = p.retrieve_solutions(verbose=False)
|
272
|
+
... print(sols.volume_numerical())
|
273
|
+
[[0.E-19, 1.88267370443418 E-14]]
|
274
|
+
[[2.02988321281931, -2.02988321281931]]
|
275
|
+
|
276
|
+
And in functional style::
|
277
|
+
|
278
|
+
>>> [p.retrieve_solutions().volume_numerical() for p in Manifold("m003").ptolemy_variety(2,'all')]
|
279
|
+
Trying to retrieve solutions from http://ptolemy.unhyperbolic.org/data/pgl2/OrientableCuspedCensus/02_tetrahedra/m003__sl2_c0.magma_out ...
|
280
|
+
Parsing...
|
281
|
+
Trying to retrieve solutions from http://ptolemy.unhyperbolic.org/data/pgl2/OrientableCuspedCensus/02_tetrahedra/m003__sl2_c1.magma_out ...
|
282
|
+
Parsing...
|
283
|
+
[[[0.E-19, 1.88267370443418 E-14]], [[2.02988321281931, -2.02988321281931]]]
|
284
|
+
|
285
|
+
**Remark**: As we see, it is not necessary to use named arguments ``N = 2`` and ``obstruction_class = 'all'`` for faster typing. However, for better readability of our code, we recommend to include the names.
|
286
|
+
|
287
|
+
A short cut for a PSL(*N*, **C**) Ptolemy variety
|
288
|
+
-------------------------------------------------
|
289
|
+
|
290
|
+
We have seen that ``M.ptolemy_variety(2, 'all')`` gives a Ptolemy variety for each obstruction class. We used ``M.ptolemy_variety(2, 'all')[3]`` to pick one, here the fourth, of those varieties. A shorter form of doing this is::
|
291
|
+
|
292
|
+
>>> M = Manifold("m009")
|
293
|
+
>>> M.ptolemy_variety(2, 3)
|
294
|
+
Ptolemy Variety for m009, N = 2, obstruction_class = 3
|
295
|
+
c_0011_0^2 + c_0101_0 * c_0101_1 + c_0101_1^2
|
296
|
+
- c_0011_0^2 + c_0101_0^2 + c_0101_1^2
|
297
|
+
- c_0011_0^2 - c_0101_0 * c_0101_1 - c_0101_1^2
|
298
|
+
- 1 + c_0011_0
|
@@ -0,0 +1,363 @@
|
|
1
|
+
Step-by-step examples: Part 2
|
2
|
+
=============================
|
3
|
+
|
4
|
+
.. _ptolemy-example-smart-lists:
|
5
|
+
|
6
|
+
The Ptolemy list type
|
7
|
+
---------------------
|
8
|
+
|
9
|
+
Recall that ``ptolemy_variety`` with ``obstruction_class='all'`` returns a list of varieties, one for each obstruction class::
|
10
|
+
|
11
|
+
>>> M = Manifold("m003")
|
12
|
+
>>> M.ptolemy_variety(2, obstruction_class = 'all')
|
13
|
+
[Ptolemy Variety for m003, N = 2, obstruction_class = 0
|
14
|
+
c_0011_0 * c_0101_0 + c_0011_0^2 - c_0101_0^2
|
15
|
+
c_0011_0 * c_0101_0 + c_0011_0^2 - c_0101_0^2
|
16
|
+
- 1 + c_0011_0,
|
17
|
+
Ptolemy Variety for m003, N = 2, obstruction_class = 1
|
18
|
+
- c_0011_0 * c_0101_0 - c_0011_0^2 - c_0101_0^2
|
19
|
+
- c_0011_0 * c_0101_0 - c_0011_0^2 - c_0101_0^2
|
20
|
+
- 1 + c_0011_0]
|
21
|
+
|
22
|
+
Also recall that ``retrieve_solutions`` was a method of a ``PtolemyVariety``. Assume we want to call ``retrieve_solutions`` for each Ptolemy variety. As in the previous example, we could write a loop such as::
|
23
|
+
|
24
|
+
>>> [p.retrieve_solutions(verbose=False) for p in M.ptolemy_variety(2, 'all')]
|
25
|
+
|
26
|
+
The ptolemy module allows to do this in a much shorter way::
|
27
|
+
|
28
|
+
>>> M.ptolemy_variety(2, 'all').retrieve_solutions(verbose=False)
|
29
|
+
[[PtolemyCoordinates(
|
30
|
+
{'c_0011_0': 1,
|
31
|
+
'c_0011_1': -1,
|
32
|
+
'c_0101_0': Mod(x, x^2 - x - 1),
|
33
|
+
...,
|
34
|
+
's_3_1': 1},
|
35
|
+
is_numerical = False, ...)],
|
36
|
+
[PtolemyCoordinates(
|
37
|
+
{'c_0011_0': 1,
|
38
|
+
'c_0011_1': -1,
|
39
|
+
'c_0101_0': Mod(x, x^2 + x + 1),
|
40
|
+
...,
|
41
|
+
's_3_1': 1},
|
42
|
+
is_numerical = False, ...)]]
|
43
|
+
|
44
|
+
This behavior is specific to the ptolemy module. It works with many methods of the ptolemy module that
|
45
|
+
can potentially return more than one object. These methods return a special kind of list (usually
|
46
|
+
``MethodMappingList``, a subclass of python ``list``) that tries to call the method of the given name (here ``retrieve_solutions``) with
|
47
|
+
the given arguments (here ``verbose=False``) on each element in the list (here the two Ptolemy varieties).
|
48
|
+
|
49
|
+
Since ``retrieve_solutions`` itself actually returns a list, the result is a list of lists of solutions which are of type ``PtolemyCoordinates``. The first level groups the solutions by obstruction class. The inner lists contain the different (non-Galois conjugate) solutions for each obstruction class (here, for ``m003``, each inner lists contains only one element).
|
50
|
+
|
51
|
+
Using the Ptolemy list type recursively
|
52
|
+
---------------------------------------
|
53
|
+
|
54
|
+
The list type described in the previous example works recursively. Recall that an algebraic solution to a Ptolemy variety (of type ``PtolemyCoordinates``) has a method ``volume_numerical`` that returns a list of volumes::
|
55
|
+
|
56
|
+
>>> M=Manifold("m003")
|
57
|
+
>>> p=M.ptolemy_variety(2,1)
|
58
|
+
>>> sol=p.retrieve_solutions(verbose=False)[0]
|
59
|
+
>>> sol.volume_numerical()
|
60
|
+
[0.E-19, 1.88267370443418 E-14]
|
61
|
+
|
62
|
+
We can chain these commands together to retrieve the volumes of all boundary-unipotent PSL(2, **C**) (that are :ref:`generically decorated <ptolemy-generically-decorated>` with respect to the triangulation) in just one line::
|
63
|
+
|
64
|
+
>>> Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical()
|
65
|
+
[[[0.E-19, 1.88267370443418 E-14]], [[2.02988321281931, -2.02988321281931]]]
|
66
|
+
|
67
|
+
Note that the volumes of the representations are in a list of lists of lists. At the first level the volumes are grouped by obstruction class, then by Galois conjugacy.
|
68
|
+
|
69
|
+
**Remark:** There might be an extra level for witness points.
|
70
|
+
|
71
|
+
**Remark:** Unfortunately, this is not compatible with tab-autocompletion, see :ref:`later <ptolemy-example-missing-auto-completion>`.
|
72
|
+
|
73
|
+
A comparison of ``m003`` and ``m004``
|
74
|
+
-------------------------------------
|
75
|
+
|
76
|
+
We can now compare the set of volumes of ``m003`` and ``m004``:
|
77
|
+
|
78
|
+
>>> Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical()
|
79
|
+
[[[0.E-19, 1.88267370443418 E-14]], [[2.02988321281931, -2.02988321281931]]]
|
80
|
+
>>> Manifold("m004").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical()
|
81
|
+
[[], [[-2.02988321281931, 2.02988321281931]]]
|
82
|
+
|
83
|
+
We see that the two manifolds are distinguished by their volumes of boundary-unipotent representations: ``m004`` has no representation with trivial volume (this is not a proof as in theory, there could be such a representation which is not :ref:`generically decorated <ptolemy-generically-decorated>` with respect to the given triangulation) and no representation that can be lifted to a boundary-unipotent SL(2, **C**)-representation.
|
84
|
+
|
85
|
+
A non-hyperbolic example
|
86
|
+
------------------------
|
87
|
+
|
88
|
+
We can also compute the volumes for a manifold that might be non-hyperbolic, here the complement of the 5\ :sub:`1` knot::
|
89
|
+
|
90
|
+
>>> Manifold("5_1").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical()
|
91
|
+
[[], [[1.52310839130992 E-14, 0.E-37]]]
|
92
|
+
|
93
|
+
Note that one of the Ptolemy varieties is non-empty which proves that all edges of the triangulation are essential. We also see that all volumes are 0 and thus smaller than the volume 2.029883... of the figure-eight knot complement that is proven to be the smallest volume of any orientable cusped manifold. Thus, it follows from Theorem 1.3 and Remark 1.4 of [GGZ2014]_ that 5\ :sub:`1` is not hyperbolic.
|
94
|
+
|
95
|
+
**Remark:** The ptolemy module does not (yet) support interval arithmetics, otherwise, this would be a proof that 5\ :sub:`1` is not hyperbolic.
|
96
|
+
|
97
|
+
|
98
|
+
Flattening nested structures
|
99
|
+
----------------------------
|
100
|
+
|
101
|
+
If we want to loose some of the grouping, we can call ``flatten`` on the results. Here the grouping by obstruction class is lost::
|
102
|
+
|
103
|
+
>>> Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical().flatten()
|
104
|
+
[[0.E-19, 1.88267370443418 E-14], [2.02988321281931, -2.02988321281931]]
|
105
|
+
|
106
|
+
And now, the grouping by Galois conjugacy is lost as well, resulting in a flat list::
|
107
|
+
|
108
|
+
>>> Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical().flatten(2)
|
109
|
+
[0.E-19, 1.88267370443418 E-14, 2.02988321281931, -2.02988321281931]
|
110
|
+
|
111
|
+
So the result is just a flat list.
|
112
|
+
|
113
|
+
**Remark:** We cannot `overflatten`. If we give an even larger argument to flatten, the result will just stay a flat list.
|
114
|
+
|
115
|
+
.. _ptolemy-example-missing-auto-completion:
|
116
|
+
|
117
|
+
Lack of tab-autocompletion for nested structures
|
118
|
+
-------------------------------------------------
|
119
|
+
|
120
|
+
Unfortunately, the autocompletion does not list all the desired results when we have a nested structure. For example::
|
121
|
+
|
122
|
+
>>> sols = Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False)
|
123
|
+
>>> sols.
|
124
|
+
|
125
|
+
When we now hit the tab key::
|
126
|
+
|
127
|
+
>>> sols.
|
128
|
+
sols.append sols.extend sols.index sols.pop sols.reverse
|
129
|
+
sols.count sols.flatten sols.insert sols.remove sols.sort
|
130
|
+
|
131
|
+
... we only get ``list`` methods, but not the desired ``volume_numerical``. One way to discover the available methods is to pick a leaf of the nested structure and hit the tab key::
|
132
|
+
|
133
|
+
>>> sol = sols.flatten(100)[0]
|
134
|
+
>>> sol.
|
135
|
+
sol.N sol.keys
|
136
|
+
sol.check_against_manifold sol.long_edge
|
137
|
+
...
|
138
|
+
sol.itervalues sol.volume_numerical
|
139
|
+
|
140
|
+
The overview diagram might also be helpful.
|
141
|
+
|
142
|
+
Converting exact solutions into numerical solutions
|
143
|
+
---------------------------------------------------
|
144
|
+
|
145
|
+
We can turn exact solutions into numerical solutions by calling ``numerical``::
|
146
|
+
|
147
|
+
>>> sol = Manifold("m003").ptolemy_variety(2, 1).retrieve_solutions()[0]
|
148
|
+
>>> sol
|
149
|
+
PtolemyCoordinates(
|
150
|
+
{'c_0011_0': 1,
|
151
|
+
'c_0011_1': -1,
|
152
|
+
'c_0101_0': Mod(x, x^2 + x + 1),
|
153
|
+
...
|
154
|
+
's_3_1': 1},
|
155
|
+
is_numerical = False, ...)
|
156
|
+
>>> sol.numerical()
|
157
|
+
[PtolemyCoordinates(
|
158
|
+
{'c_0011_0': 1,
|
159
|
+
'c_0011_1': -1,
|
160
|
+
'c_0101_0': -0.500000000000000 - 0.866025403784439*I,
|
161
|
+
...,
|
162
|
+
's_3_1': 1},
|
163
|
+
is_numerical = True, ...),
|
164
|
+
PtolemyCoordinates(
|
165
|
+
{'c_0011_0': 1,
|
166
|
+
'c_0011_1': -1,
|
167
|
+
'c_0101_0': -0.500000000000000 + 0.866025403784439*I,
|
168
|
+
...,
|
169
|
+
's_3_1': 1},
|
170
|
+
is_numerical = True, ...)]
|
171
|
+
|
172
|
+
Note that the one exact (algebraic) solution turns into a list of numerical solutions which are Galois conjugates.
|
173
|
+
|
174
|
+
**Remark:** This uses the current pari precision. See the :ref:`above example <ptolemy-example-increase-precision>`, in particular, the comment about interval arithmetics.
|
175
|
+
|
176
|
+
**Remark:** Calling ``numerical()`` on a numerical solution does nothing.
|
177
|
+
|
178
|
+
**Remark:** ``CrossRatios`` also support ``numerical``.
|
179
|
+
|
180
|
+
.. _ptolemy-example-numerical-matrix:
|
181
|
+
|
182
|
+
Working with exact vs numerical solutions
|
183
|
+
-----------------------------------------
|
184
|
+
|
185
|
+
Most methods such as ``evaluate_word`` or ``cross_ratios`` work just the same way on an exact solution::
|
186
|
+
|
187
|
+
>>> exact_sol = Manifold("m004").ptolemy_variety(2, 1).retrieve_solutions()[0]
|
188
|
+
>>> exact_sol
|
189
|
+
PtolemyCoordinates(
|
190
|
+
{'c_0011_0': 1,
|
191
|
+
'c_0011_1': -1,
|
192
|
+
'c_0101_0': 1,
|
193
|
+
'c_0101_1': Mod(x, x^2 + x + 1),
|
194
|
+
...,
|
195
|
+
's_3_1': -1},
|
196
|
+
is_numerical = False, ...)
|
197
|
+
>>> exact_sol.evaluate_word('a')
|
198
|
+
[[Mod(-2*x, x^2 + x + 1), Mod(-x - 1, x^2 + x + 1)],
|
199
|
+
[Mod(x, x^2 + x + 1), Mod(x + 1, x^2 + x + 1)]]
|
200
|
+
|
201
|
+
... as they do on a numerical solution::
|
202
|
+
|
203
|
+
>>> numerical_sol = sol.numerical()[0]
|
204
|
+
>>> numerical_sol
|
205
|
+
PtolemyCoordinates(
|
206
|
+
{'c_0011_0': 1,
|
207
|
+
'c_0011_1': -1,
|
208
|
+
'c_0101_0': 1,
|
209
|
+
'c_0101_1': -0.500000000000000 - 0.866025403784439*I,
|
210
|
+
...,
|
211
|
+
's_3_1': -1},
|
212
|
+
is_numerical = False, ...)
|
213
|
+
>>> numerical_sol.evaluate_word('a')
|
214
|
+
[[1.00000000000000 + 1.73205080756888*I,
|
215
|
+
-0.500000000000000 + 0.866025403784439*I],
|
216
|
+
[-0.500000000000000 - 0.866025403784439*I,
|
217
|
+
0.500000000000000 - 0.866025403784439*I]]
|
218
|
+
|
219
|
+
Methods with postfix ``_numerical`` are special: when applied to an exact solution, they implicitly convert it to a list
|
220
|
+
of Galois conjugate numerical solutions first. ``volume_numerical`` is an example (because volume is a transcendental function)::
|
221
|
+
|
222
|
+
>>> exact_sol.volume_numerical()
|
223
|
+
[-2.02988321281931, 2.02988321281931]
|
224
|
+
>>> numerical_sol.volume_numerical()
|
225
|
+
-2.02988321281931
|
226
|
+
|
227
|
+
.. _ptolemy-example-retrieve-numerical-solutions:
|
228
|
+
|
229
|
+
Computing numerical solutions directly
|
230
|
+
--------------------------------------
|
231
|
+
|
232
|
+
We can also directly compute numerical solutions::
|
233
|
+
|
234
|
+
>>> M = Manifold("m004")
|
235
|
+
>>> sols = M.ptolemy_variety(2,'all').retrieve_solutions(numerical = True)
|
236
|
+
[[],
|
237
|
+
[[PtolemyCoordinates(
|
238
|
+
{'c_0011_0': 1.00000000000000 + 0.E-19*I,
|
239
|
+
'c_0011_1': -1.00000000000000 + 0.E-19*I,
|
240
|
+
'c_0101_0': 1.00000000000000 + 0.E-19*I,
|
241
|
+
'c_0101_1': -0.500000000000000 - 0.866025403784439*I,
|
242
|
+
...,
|
243
|
+
's_3_1': -1},
|
244
|
+
is_numerical = True, ...),
|
245
|
+
PtolemyCoordinates(
|
246
|
+
{'c_0011_0': 1.00000000000000 + 0.E-19*I,
|
247
|
+
'c_0011_1': -1.00000000000000 + 0.E-19*I,
|
248
|
+
'c_0101_0': 1.00000000000000 + 0.E-19*I,
|
249
|
+
'c_0101_1': -0.500000000000000 + 0.866025403784439*I,
|
250
|
+
...,
|
251
|
+
's_3_1': -1},
|
252
|
+
is_numerical = True, ...)]]]
|
253
|
+
|
254
|
+
The structure is as described earlier, a list of lists of lists: first solutions are grouped by obstruction class, then by Galois conjugacy.
|
255
|
+
|
256
|
+
The advantage over going through the exact solutions is that it might be much faster
|
257
|
+
(because it can avoid computing the number field from the lexicographic Groebner basis, see later). For example, many PSL(3, **C**) examples only work when using ``numerical = True``.
|
258
|
+
|
259
|
+
.. _ptolemy-example-cross-ratios:
|
260
|
+
|
261
|
+
Computing cross ratios from Ptolemy coordinates
|
262
|
+
-----------------------------------------------
|
263
|
+
|
264
|
+
Given exact or numerical solutions to the Ptolemy variety, we can also compute the cross ratios/shape parameters::
|
265
|
+
|
266
|
+
>>> sols = Manifold("m004").ptolemy_variety(2,'all').retrieve_solutions(verbose=False)
|
267
|
+
>>> zs=sols.cross_ratios()
|
268
|
+
>>> zs
|
269
|
+
[[],
|
270
|
+
[CrossRatios({'z_0000_0': Mod(x + 1, x^2 + x + 1),
|
271
|
+
'z_0000_1': Mod(x + 1, x^2 + x + 1),
|
272
|
+
'zp_0000_0': Mod(x + 1, x^2 + x + 1),
|
273
|
+
'zp_0000_1': Mod(x + 1, x^2 + x + 1),
|
274
|
+
'zpp_0000_0': Mod(x + 1, x^2 + x + 1),
|
275
|
+
'zpp_0000_1': Mod(x + 1, x^2 + x + 1)},
|
276
|
+
is_numerical = False, ...)]]
|
277
|
+
|
278
|
+
**Remark**: The shapes will be given as element in the Ptolemy field with defining polynomial being the second argument to ``Mod(..., ...)``, here, x\ :sup:`2`\ +x+1. The Ptolemy field is a (possibly trivial) extension of the shape field. For *N* =2, the Ptolemy field is the trace field [GGZ2014]_ and an iterated square extension of the shape field which is the invariant trace field for a cusped manifold.
|
279
|
+
|
280
|
+
And numerically, so that we can compare to SnapPy's shapes::
|
281
|
+
|
282
|
+
>>> zs.numerical()
|
283
|
+
[[],
|
284
|
+
[[CrossRatios(
|
285
|
+
{'z_0000_0': 0.500000000000000 - 0.866025403784439*I,
|
286
|
+
'z_0000_1': 0.500000000000000 - 0.866025403784439*I,
|
287
|
+
'zp_0000_0': 0.500000000000000 - 0.866025403784439*I,
|
288
|
+
'zp_0000_1': 0.500000000000000 - 0.866025403784439*I,
|
289
|
+
'zpp_0000_0': 0.500000000000000 - 0.866025403784439*I,
|
290
|
+
'zpp_0000_1': 0.500000000000000 - 0.866025403784439*I},
|
291
|
+
is_numerical = True, ...),
|
292
|
+
CrossRatios(
|
293
|
+
{'z_0000_0': 0.500000000000000 + 0.866025403784439*I,
|
294
|
+
'z_0000_1': 0.500000000000000 + 0.866025403784439*I,
|
295
|
+
'zp_0000_0': 0.500000000000000 + 0.866025403784439*I,
|
296
|
+
'zp_0000_1': 0.500000000000000 + 0.866025403784439*I,
|
297
|
+
'zpp_0000_0': 0.500000000000000 + 0.866025403784439*I,
|
298
|
+
'zpp_0000_1': 0.500000000000000 + 0.866025403784439*I},
|
299
|
+
is_numerical = True, ...)]]]
|
300
|
+
>>> Manifold("m004").tetrahedra_shapes('rect')
|
301
|
+
[0.5000000000 + 0.8660254038*I, 0.5000000000 + 0.8660254038*I]
|
302
|
+
|
303
|
+
The result is of type ``CrossRatios`` and assigns z as well as z'=1/(1-z) and z''=1-1/z a value.
|
304
|
+
|
305
|
+
.. _ptolemy-non-zero-dim-comp:
|
306
|
+
|
307
|
+
The dimension of a component
|
308
|
+
----------------------------
|
309
|
+
|
310
|
+
A Ptolemy variety might have positively dimensional components (note that this might or might not be a positively dimensional family of representations, see :ref:`here <ptolemy-generically-decorated>`). For example, the Ptolemy variety for ``m371`` and the trivial obstruction class has a 1-dimensional component. This is indicated by::
|
311
|
+
|
312
|
+
>>> M.ptolemy_variety(2).retrieve_solutions()
|
313
|
+
[NonZeroDimensionalComponent(dimension = 1)]
|
314
|
+
|
315
|
+
Or::
|
316
|
+
|
317
|
+
>>> M=Manifold("m371")
|
318
|
+
>>> M.ptolemy_variety(2).retrieve_solutions()
|
319
|
+
[[ PtolemyCoordinates(
|
320
|
+
{'c_0011_0': 1,
|
321
|
+
'c_0011_1': -1,
|
322
|
+
'c_0011_2': -1,
|
323
|
+
'c_0011_3': Mod(-x - 1, x^2 + x + 2),
|
324
|
+
...,
|
325
|
+
's_3_4': 1},
|
326
|
+
is_numerical = False, ...)
|
327
|
+
(witnesses for NonZeroDimensionalComponent(dimension = 1, free_variables = ['c_0110_2'])) ]]
|
328
|
+
|
329
|
+
The latter actually also provides a sample point (:ref:`witness <ptolemy-example-find-witness>` which we will use :ref:`later <ptolemy-example-non-zero-dim-rep>` to determine whether this corresponds to a 1-dimensional family of representations or not) on the 1-dimensional component. A ``NonZeroDimensionalComponent`` as well as ``PtolemyCoordinates`` (that correspond to 0-dimensional components of the Ptolemy variety)) has a ``dimension`` attribute, so we can do::
|
330
|
+
|
331
|
+
>>> M=Manifold("m371")
|
332
|
+
>>> sols = M.ptolemy_variety(2,'all').retrieve_solutions()
|
333
|
+
>>> sols.dimension
|
334
|
+
[[1], [], [0], []]
|
335
|
+
|
336
|
+
This means that the Ptolemy variety for the trivial obstruction class has a 1-dimensional component and that the Ptolemy variety of one of the other obstruction classes a 0-dimensional component.
|
337
|
+
|
338
|
+
A ``NonZeroDimensionalComponent`` is actually again a list whose elements will be witness points if witnesses have been computed for this Ptolemy variety.
|
339
|
+
|
340
|
+
**Warning:** This implies that if we ``flatten`` too much, the reported dimension becomes 0 which is the dimension of the witness point instead of 1::
|
341
|
+
|
342
|
+
>>> sols.flatten()
|
343
|
+
[1, 0]
|
344
|
+
|
345
|
+
Too much ``flatten``::
|
346
|
+
|
347
|
+
>>> sols.flatten()
|
348
|
+
[0, 0]
|
349
|
+
|
350
|
+
The advantage is that we can still call methods such as ``volume_numerical`` and actually see the volume of a witness point (it is known that the volume stays constant on a component of boundary-unipotent representations, so one witness point can tell us the volume of all representation in that component)::
|
351
|
+
|
352
|
+
>>> sols.volume_numerical()
|
353
|
+
[[[ [0.E-38, 0.E-38] (witnesses for NonZeroDimensionalComponent(dimension = 1, free_variables = ['c_0110_2'])) ]],
|
354
|
+
[],
|
355
|
+
[[4.75170196551790,
|
356
|
+
-4.75170196551790,
|
357
|
+
4.75170196551790,
|
358
|
+
-4.75170196551790,
|
359
|
+
1.17563301006556,
|
360
|
+
-1.17563301006556,
|
361
|
+
1.17563301006556,
|
362
|
+
-1.17563301006556]],
|
363
|
+
[]]
|