snappy 3.3__cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- snappy/CyOpenGL.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.ico +0 -0
- snappy/SnapPy.png +0 -0
- snappy/SnapPyHP.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/__init__.py +534 -0
- snappy/app.py +604 -0
- snappy/app_menus.py +372 -0
- snappy/browser.py +998 -0
- snappy/cache.py +25 -0
- snappy/canonical.py +249 -0
- snappy/cusps/__init__.py +280 -0
- snappy/cusps/cusp_area_matrix.py +98 -0
- snappy/cusps/cusp_areas_from_matrix.py +96 -0
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/short_slopes_for_cusp.py +217 -0
- snappy/cusps/test.py +22 -0
- snappy/cusps/trig_cusp_area_matrix.py +63 -0
- snappy/database.py +454 -0
- snappy/db_utilities.py +79 -0
- snappy/decorated_isosig.py +717 -0
- snappy/dev/__init__.py +0 -0
- snappy/dev/extended_ptolemy/__init__.py +8 -0
- snappy/dev/extended_ptolemy/closed.py +106 -0
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
- snappy/dev/extended_ptolemy/direct.py +42 -0
- snappy/dev/extended_ptolemy/extended.py +406 -0
- snappy/dev/extended_ptolemy/giac_helper.py +43 -0
- snappy/dev/extended_ptolemy/giac_rur.py +129 -0
- snappy/dev/extended_ptolemy/gluing.py +46 -0
- snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
- snappy/dev/extended_ptolemy/printMatrices.py +70 -0
- snappy/dev/vericlosed/__init__.py +1 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
- snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
- snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
- snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
- snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
- snappy/dev/vericlosed/orb/__init__.py +1 -0
- snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
- snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
- snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
- snappy/dev/vericlosed/test.py +54 -0
- snappy/dev/vericlosed/truncatedComplex.py +176 -0
- snappy/dev/vericlosed/verificationError.py +58 -0
- snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
- snappy/doc/_images/SnapPy-196.png +0 -0
- snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
- snappy/doc/_images/m125_paper_plane.jpg +0 -0
- snappy/doc/_images/mac.png +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
- snappy/doc/_images/plink-action.png +0 -0
- snappy/doc/_images/ubuntu.png +0 -0
- snappy/doc/_images/win7.png +0 -0
- snappy/doc/_sources/additional_classes.rst.txt +40 -0
- snappy/doc/_sources/bugs.rst.txt +14 -0
- snappy/doc/_sources/censuses.rst.txt +52 -0
- snappy/doc/_sources/credits.rst.txt +81 -0
- snappy/doc/_sources/development.rst.txt +261 -0
- snappy/doc/_sources/index.rst.txt +215 -0
- snappy/doc/_sources/installing.rst.txt +249 -0
- snappy/doc/_sources/manifold.rst.txt +6 -0
- snappy/doc/_sources/manifoldhp.rst.txt +46 -0
- snappy/doc/_sources/news.rst.txt +425 -0
- snappy/doc/_sources/other.rst.txt +25 -0
- snappy/doc/_sources/platonic_census.rst.txt +20 -0
- snappy/doc/_sources/plink.rst.txt +102 -0
- snappy/doc/_sources/ptolemy.rst.txt +66 -0
- snappy/doc/_sources/ptolemy_classes.rst.txt +42 -0
- snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -0
- snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -0
- snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -0
- snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -0
- snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -0
- snappy/doc/_sources/screenshots.rst.txt +21 -0
- snappy/doc/_sources/snap.rst.txt +87 -0
- snappy/doc/_sources/snappy.rst.txt +28 -0
- snappy/doc/_sources/spherogram.rst.txt +103 -0
- snappy/doc/_sources/todo.rst.txt +47 -0
- snappy/doc/_sources/triangulation.rst.txt +11 -0
- snappy/doc/_sources/tutorial.rst.txt +49 -0
- snappy/doc/_sources/verify.rst.txt +210 -0
- snappy/doc/_sources/verify_internals.rst.txt +79 -0
- snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
- snappy/doc/_static/SnapPy.ico +0 -0
- snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
- snappy/doc/_static/basic.css +906 -0
- snappy/doc/_static/css/badge_only.css +1 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
- snappy/doc/_static/css/theme.css +4 -0
- snappy/doc/_static/doctools.js +149 -0
- snappy/doc/_static/documentation_options.js +13 -0
- snappy/doc/_static/file.png +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
- snappy/doc/_static/jquery.js +2 -0
- snappy/doc/_static/js/badge_only.js +1 -0
- snappy/doc/_static/js/theme.js +1 -0
- snappy/doc/_static/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +192 -0
- snappy/doc/_static/minus.png +0 -0
- snappy/doc/_static/plus.png +0 -0
- snappy/doc/_static/pygments.css +75 -0
- snappy/doc/_static/searchtools.js +635 -0
- snappy/doc/_static/snappy_furo.css +33 -0
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
- snappy/doc/_static/sphinx_highlight.js +154 -0
- snappy/doc/additional_classes.html +1500 -0
- snappy/doc/bugs.html +132 -0
- snappy/doc/censuses.html +453 -0
- snappy/doc/credits.html +184 -0
- snappy/doc/development.html +385 -0
- snappy/doc/doc-latest/additional_classes.html +1500 -0
- snappy/doc/doc-latest/bugs.html +132 -0
- snappy/doc/doc-latest/censuses.html +453 -0
- snappy/doc/doc-latest/credits.html +184 -0
- snappy/doc/doc-latest/development.html +385 -0
- snappy/doc/doc-latest/genindex.html +1349 -0
- snappy/doc/doc-latest/index.html +287 -0
- snappy/doc/doc-latest/installing.html +346 -0
- snappy/doc/doc-latest/manifold.html +3632 -0
- snappy/doc/doc-latest/manifoldhp.html +180 -0
- snappy/doc/doc-latest/news.html +438 -0
- snappy/doc/doc-latest/objects.inv +0 -0
- snappy/doc/doc-latest/other.html +160 -0
- snappy/doc/doc-latest/platonic_census.html +376 -0
- snappy/doc/doc-latest/plink.html +210 -0
- snappy/doc/doc-latest/ptolemy.html +253 -0
- snappy/doc/doc-latest/ptolemy_classes.html +1144 -0
- snappy/doc/doc-latest/ptolemy_examples1.html +409 -0
- snappy/doc/doc-latest/ptolemy_examples2.html +471 -0
- snappy/doc/doc-latest/ptolemy_examples3.html +414 -0
- snappy/doc/doc-latest/ptolemy_examples4.html +195 -0
- snappy/doc/doc-latest/ptolemy_prelim.html +248 -0
- snappy/doc/doc-latest/py-modindex.html +165 -0
- snappy/doc/doc-latest/screenshots.html +141 -0
- snappy/doc/doc-latest/search.html +135 -0
- snappy/doc/doc-latest/searchindex.js +1 -0
- snappy/doc/doc-latest/snap.html +202 -0
- snappy/doc/doc-latest/snappy.html +181 -0
- snappy/doc/doc-latest/spherogram.html +1346 -0
- snappy/doc/doc-latest/todo.html +166 -0
- snappy/doc/doc-latest/triangulation.html +1676 -0
- snappy/doc/doc-latest/tutorial.html +159 -0
- snappy/doc/doc-latest/verify.html +330 -0
- snappy/doc/doc-latest/verify_internals.html +1235 -0
- snappy/doc/genindex.html +1349 -0
- snappy/doc/index.html +287 -0
- snappy/doc/installing.html +346 -0
- snappy/doc/manifold.html +3632 -0
- snappy/doc/manifoldhp.html +180 -0
- snappy/doc/news.html +438 -0
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +160 -0
- snappy/doc/platonic_census.html +376 -0
- snappy/doc/plink.html +210 -0
- snappy/doc/ptolemy.html +253 -0
- snappy/doc/ptolemy_classes.html +1144 -0
- snappy/doc/ptolemy_examples1.html +409 -0
- snappy/doc/ptolemy_examples2.html +471 -0
- snappy/doc/ptolemy_examples3.html +414 -0
- snappy/doc/ptolemy_examples4.html +195 -0
- snappy/doc/ptolemy_prelim.html +248 -0
- snappy/doc/py-modindex.html +165 -0
- snappy/doc/screenshots.html +141 -0
- snappy/doc/search.html +135 -0
- snappy/doc/searchindex.js +1 -0
- snappy/doc/snap.html +202 -0
- snappy/doc/snappy.html +181 -0
- snappy/doc/spherogram.html +1346 -0
- snappy/doc/todo.html +166 -0
- snappy/doc/triangulation.html +1676 -0
- snappy/doc/tutorial.html +159 -0
- snappy/doc/verify.html +330 -0
- snappy/doc/verify_internals.html +1235 -0
- snappy/drilling/__init__.py +456 -0
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +5 -0
- snappy/drilling/crush.py +270 -0
- snappy/drilling/cusps.py +125 -0
- snappy/drilling/debug.py +242 -0
- snappy/drilling/epsilons.py +6 -0
- snappy/drilling/exceptions.py +55 -0
- snappy/drilling/moves.py +620 -0
- snappy/drilling/peripheral_curves.py +210 -0
- snappy/drilling/perturb.py +188 -0
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +274 -0
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +132 -0
- snappy/drilling/tracing.py +351 -0
- snappy/exceptions.py +26 -0
- snappy/export_stl.py +120 -0
- snappy/exterior_to_link/__init__.py +2 -0
- snappy/exterior_to_link/barycentric_geometry.py +463 -0
- snappy/exterior_to_link/exceptions.py +6 -0
- snappy/exterior_to_link/geodesic_map.json +14408 -0
- snappy/exterior_to_link/hyp_utils.py +112 -0
- snappy/exterior_to_link/link_projection.py +323 -0
- snappy/exterior_to_link/main.py +198 -0
- snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
- snappy/exterior_to_link/mcomplex_with_link.py +687 -0
- snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
- snappy/exterior_to_link/pl_utils.py +491 -0
- snappy/exterior_to_link/put_in_S3.py +156 -0
- snappy/exterior_to_link/rational_linear_algebra.py +130 -0
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
- snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
- snappy/exterior_to_link/stored_moves.py +475 -0
- snappy/exterior_to_link/test.py +31 -0
- snappy/filedialog.py +28 -0
- snappy/geometric_structure/__init__.py +212 -0
- snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
- snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +691 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +480 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +41 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +294 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +156 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +35 -0
- snappy/geometric_structure/geodesic/__init__.py +0 -0
- snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
- snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
- snappy/geometric_structure/geodesic/canonical_representatives.py +52 -0
- snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
- snappy/geometric_structure/geodesic/constants.py +6 -0
- snappy/geometric_structure/geodesic/exceptions.py +22 -0
- snappy/geometric_structure/geodesic/fixed_points.py +106 -0
- snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
- snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
- snappy/geometric_structure/geodesic/line.py +30 -0
- snappy/geometric_structure/geodesic/multiplicity.py +127 -0
- snappy/geometric_structure/geodesic/tiles_for_geodesic.py +128 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +121 -0
- snappy/horoviewer.py +443 -0
- snappy/hyperboloid/__init__.py +212 -0
- snappy/hyperboloid/distances.py +259 -0
- snappy/hyperboloid/horoball.py +19 -0
- snappy/hyperboloid/line.py +35 -0
- snappy/hyperboloid/point.py +9 -0
- snappy/hyperboloid/triangle.py +29 -0
- snappy/info_icon.gif +0 -0
- snappy/infowindow.py +65 -0
- snappy/isometry_signature.py +389 -0
- snappy/len_spec/__init__.py +609 -0
- snappy/len_spec/geodesic_info.py +129 -0
- snappy/len_spec/geodesic_key_info_dict.py +116 -0
- snappy/len_spec/geodesic_piece.py +146 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +136 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +185 -0
- snappy/len_spec/spine.py +128 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +276 -0
- snappy/len_spec/word.py +86 -0
- snappy/manifolds/HTWKnots/alternating.gz +0 -0
- snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
- snappy/manifolds/__init__.py +3 -0
- snappy/margulis/__init__.py +332 -0
- snappy/margulis/cusp_neighborhood_neighborhood.py +66 -0
- snappy/margulis/geodesic_neighborhood.py +152 -0
- snappy/margulis/margulis_info.py +21 -0
- snappy/margulis/mu_from_neighborhood_pair.py +175 -0
- snappy/margulis/neighborhood.py +29 -0
- snappy/margulis/test.py +22 -0
- snappy/math_basics.py +187 -0
- snappy/matrix.py +525 -0
- snappy/number.py +657 -0
- snappy/numeric_output_checker.py +345 -0
- snappy/pari.py +41 -0
- snappy/phone_home.py +57 -0
- snappy/polyviewer.py +259 -0
- snappy/ptolemy/__init__.py +17 -0
- snappy/ptolemy/component.py +103 -0
- snappy/ptolemy/coordinates.py +2290 -0
- snappy/ptolemy/fieldExtensions.py +153 -0
- snappy/ptolemy/findLoops.py +473 -0
- snappy/ptolemy/geometricRep.py +59 -0
- snappy/ptolemy/homology.py +165 -0
- snappy/ptolemy/magma/default.magma_template +229 -0
- snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
- snappy/ptolemy/manifoldMethods.py +395 -0
- snappy/ptolemy/matrix.py +350 -0
- snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
- snappy/ptolemy/polynomial.py +856 -0
- snappy/ptolemy/processComponents.py +173 -0
- snappy/ptolemy/processFileBase.py +247 -0
- snappy/ptolemy/processFileDispatch.py +46 -0
- snappy/ptolemy/processMagmaFile.py +392 -0
- snappy/ptolemy/processRurFile.py +150 -0
- snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
- snappy/ptolemy/ptolemyObstructionClass.py +64 -0
- snappy/ptolemy/ptolemyVariety.py +995 -0
- snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
- snappy/ptolemy/reginaWrapper.py +698 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/rur.py +545 -0
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
- snappy/ptolemy/test.py +1126 -0
- snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
- snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
- snappy/ptolemy/utilities.py +236 -0
- snappy/raytracing/__init__.py +64 -0
- snappy/raytracing/additional_horospheres.py +64 -0
- snappy/raytracing/additional_len_spec_choices.py +63 -0
- snappy/raytracing/cohomology_fractal.py +197 -0
- snappy/raytracing/eyeball.py +124 -0
- snappy/raytracing/finite_raytracing_data.py +237 -0
- snappy/raytracing/finite_viewer.py +590 -0
- snappy/raytracing/geodesic_tube_info.py +174 -0
- snappy/raytracing/geodesics.py +246 -0
- snappy/raytracing/geodesics_window.py +258 -0
- snappy/raytracing/gui_utilities.py +293 -0
- snappy/raytracing/hyperboloid_navigation.py +556 -0
- snappy/raytracing/hyperboloid_utilities.py +234 -0
- snappy/raytracing/ideal_raytracing_data.py +592 -0
- snappy/raytracing/inside_viewer.py +974 -0
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +126 -0
- snappy/raytracing/raytracing_view.py +454 -0
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +101 -0
- snappy/raytracing/shaders/fragment.glsl +1744 -0
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +98 -0
- snappy/raytracing/view_scale_controller.py +98 -0
- snappy/raytracing/zoom_slider/__init__.py +263 -0
- snappy/raytracing/zoom_slider/inward.png +0 -0
- snappy/raytracing/zoom_slider/inward18.png +0 -0
- snappy/raytracing/zoom_slider/outward.png +0 -0
- snappy/raytracing/zoom_slider/outward18.png +0 -0
- snappy/raytracing/zoom_slider/test.py +20 -0
- snappy/sage_helper.py +119 -0
- snappy/settings.py +407 -0
- snappy/shell.py +53 -0
- snappy/snap/__init__.py +117 -0
- snappy/snap/character_varieties.py +375 -0
- snappy/snap/find_field.py +372 -0
- snappy/snap/fox_milnor.py +271 -0
- snappy/snap/fundamental_polyhedron.py +569 -0
- snappy/snap/generators.py +39 -0
- snappy/snap/interval_reps.py +81 -0
- snappy/snap/kernel_structures.py +128 -0
- snappy/snap/mcomplex_base.py +18 -0
- snappy/snap/nsagetools.py +716 -0
- snappy/snap/peripheral/__init__.py +1 -0
- snappy/snap/peripheral/dual_cellulation.py +219 -0
- snappy/snap/peripheral/link.py +127 -0
- snappy/snap/peripheral/peripheral.py +159 -0
- snappy/snap/peripheral/surface.py +522 -0
- snappy/snap/peripheral/test.py +35 -0
- snappy/snap/polished_reps.py +335 -0
- snappy/snap/shapes.py +152 -0
- snappy/snap/slice_obs_HKL/__init__.py +194 -0
- snappy/snap/slice_obs_HKL/basics.py +236 -0
- snappy/snap/slice_obs_HKL/direct.py +217 -0
- snappy/snap/slice_obs_HKL/poly_norm.py +212 -0
- snappy/snap/slice_obs_HKL/rep_theory.py +424 -0
- snappy/snap/t3mlite/__init__.py +2 -0
- snappy/snap/t3mlite/arrow.py +243 -0
- snappy/snap/t3mlite/corner.py +22 -0
- snappy/snap/t3mlite/edge.py +172 -0
- snappy/snap/t3mlite/face.py +37 -0
- snappy/snap/t3mlite/files.py +211 -0
- snappy/snap/t3mlite/homology.py +53 -0
- snappy/snap/t3mlite/linalg.py +419 -0
- snappy/snap/t3mlite/mcomplex.py +1499 -0
- snappy/snap/t3mlite/perm4.py +320 -0
- snappy/snap/t3mlite/setup.py +12 -0
- snappy/snap/t3mlite/simplex.py +199 -0
- snappy/snap/t3mlite/spun.py +297 -0
- snappy/snap/t3mlite/surface.py +519 -0
- snappy/snap/t3mlite/test.py +20 -0
- snappy/snap/t3mlite/test_vs_regina.py +86 -0
- snappy/snap/t3mlite/tetrahedron.py +109 -0
- snappy/snap/t3mlite/vertex.py +42 -0
- snappy/snap/test.py +139 -0
- snappy/snap/utilities.py +288 -0
- snappy/test.py +213 -0
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -0
- snappy/tiling/dict_based_set.py +79 -0
- snappy/tiling/floor.py +49 -0
- snappy/tiling/hyperboloid_dict.py +54 -0
- snappy/tiling/iter_utils.py +78 -0
- snappy/tiling/lifted_tetrahedron.py +22 -0
- snappy/tiling/lifted_tetrahedron_set.py +54 -0
- snappy/tiling/quotient_dict.py +70 -0
- snappy/tiling/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +224 -0
- snappy/tiling/triangle.py +33 -0
- snappy/tkterminal.py +920 -0
- snappy/twister/__init__.py +20 -0
- snappy/twister/main.py +646 -0
- snappy/twister/surfaces/S_0_1 +3 -0
- snappy/twister/surfaces/S_0_2 +3 -0
- snappy/twister/surfaces/S_0_4 +7 -0
- snappy/twister/surfaces/S_0_4_Lantern +8 -0
- snappy/twister/surfaces/S_1 +3 -0
- snappy/twister/surfaces/S_1_1 +4 -0
- snappy/twister/surfaces/S_1_2 +5 -0
- snappy/twister/surfaces/S_1_2_5 +6 -0
- snappy/twister/surfaces/S_2 +6 -0
- snappy/twister/surfaces/S_2_1 +8 -0
- snappy/twister/surfaces/S_2_heeg +10 -0
- snappy/twister/surfaces/S_3 +8 -0
- snappy/twister/surfaces/S_3_1 +10 -0
- snappy/twister/surfaces/S_4_1 +12 -0
- snappy/twister/surfaces/S_5_1 +14 -0
- snappy/twister/surfaces/heeg_fig8 +9 -0
- snappy/twister/twister_core.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/upper_halfspace/__init__.py +146 -0
- snappy/upper_halfspace/ideal_point.py +29 -0
- snappy/verify/__init__.py +13 -0
- snappy/verify/canonical.py +542 -0
- snappy/verify/complex_volume/__init__.py +18 -0
- snappy/verify/complex_volume/adjust_torsion.py +86 -0
- snappy/verify/complex_volume/closed.py +168 -0
- snappy/verify/complex_volume/compute_ptolemys.py +90 -0
- snappy/verify/complex_volume/cusped.py +56 -0
- snappy/verify/complex_volume/extended_bloch.py +201 -0
- snappy/verify/cusp_translations.py +85 -0
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +254 -0
- snappy/verify/hyperbolicity.py +224 -0
- snappy/verify/interval_newton_shapes_engine.py +523 -0
- snappy/verify/interval_tree.py +400 -0
- snappy/verify/krawczyk_shapes_engine.py +518 -0
- snappy/verify/real_algebra.py +286 -0
- snappy/verify/shapes.py +25 -0
- snappy/verify/square_extensions.py +1005 -0
- snappy/verify/test.py +72 -0
- snappy/verify/volume.py +128 -0
- snappy/version.py +2 -0
- snappy-3.3.dist-info/METADATA +58 -0
- snappy-3.3.dist-info/RECORD +541 -0
- snappy-3.3.dist-info/WHEEL +6 -0
- snappy-3.3.dist-info/entry_points.txt +2 -0
- snappy-3.3.dist-info/top_level.txt +28 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
from ..hyperboloid.distances import cosh_distance_r13_point_line
|
|
2
|
+
from ..hyperboloid import r13_dot
|
|
3
|
+
from ..math_basics import correct_min, correct_max # type: ignor
|
|
4
|
+
from ..exceptions import InsufficientPrecisionError
|
|
5
|
+
|
|
6
|
+
from ..snap.t3mlite import simplex, Tetrahedron
|
|
7
|
+
|
|
8
|
+
from typing import Optional, Any
|
|
9
|
+
|
|
10
|
+
def lower_bound_geodesic_length(
|
|
11
|
+
lower_bound_cosh_distance, inv_spine_cosh):
|
|
12
|
+
"""
|
|
13
|
+
This implements a version of Proposition 3.5 of
|
|
14
|
+
Weeks-Hodgson's Symmetries, Isometries and Length Spectra of Closed
|
|
15
|
+
Hyperbolic Three-Manifolds. Slightly changing notation, it says:
|
|
16
|
+
|
|
17
|
+
To find all closed geodesics of length at most L, it sufficies to
|
|
18
|
+
find all translates gD such that d(x, gx) <= R where
|
|
19
|
+
R = 2 arccosh(cosh(r) cosh(L/2)).
|
|
20
|
+
|
|
21
|
+
The input is a lower_bound_distance, a lower bound on the radius R of the
|
|
22
|
+
ball we have covered by tiles, and inv_spine_cosh = 1/cosh(r) where
|
|
23
|
+
r is a given tetrahedron's spine radius. More precisely, r is the radius
|
|
24
|
+
with respect to a given's tetrahedron's spine center (typically incenter)
|
|
25
|
+
of the intersection of the triangulation's spine with the tetrahedron.
|
|
26
|
+
|
|
27
|
+
The output is L which has the following property: Any geodesic in M that
|
|
28
|
+
intersects the given tetrahedron's spine and has length less than L is
|
|
29
|
+
among the ones we have encountered during tiling so far.
|
|
30
|
+
|
|
31
|
+
Note that our R is defined slightly differently, thus we can actually drop
|
|
32
|
+
the factor of 2 through out:
|
|
33
|
+
|
|
34
|
+
R = arccosh(cosh(r) cosh(L))
|
|
35
|
+
|
|
36
|
+
We also want an expression in L:
|
|
37
|
+
|
|
38
|
+
L = arccosh(cosh(R) / cosh(r))
|
|
39
|
+
|
|
40
|
+
And want to conservatively return 0 if this is not well-defined.
|
|
41
|
+
|
|
42
|
+
Note that we use the tetrahedron's spine radius here. But since we are
|
|
43
|
+
interested in geodesics and length bounds intrinsic to the manifold, the
|
|
44
|
+
length spectrum computation starts a tiling process for each tetrahedron.
|
|
45
|
+
|
|
46
|
+
Note that if the geometric structure is complete, every geodesic
|
|
47
|
+
will intersect the spine. However, for a spun-triangulation, this
|
|
48
|
+
only applies to geodesics that are not core curves. This is fine
|
|
49
|
+
since we treat core curves separately when computing the length
|
|
50
|
+
spectrum.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
if lower_bound_cosh_distance > 1:
|
|
54
|
+
q = lower_bound_cosh_distance * inv_spine_cosh
|
|
55
|
+
if q > 1:
|
|
56
|
+
return q.arccosh()
|
|
57
|
+
RF = lower_bound_cosh_distance.parent()
|
|
58
|
+
return RF(0)
|
|
59
|
+
|
|
60
|
+
def lower_bound_cosh_distance_r13_point_truncated_tetrahedron(
|
|
61
|
+
point, tet : Tetrahedron, *, verified : bool):
|
|
62
|
+
|
|
63
|
+
"""
|
|
64
|
+
A lower bound for cosh of the distance of a point to a truncated
|
|
65
|
+
tetrahedron tet. Assumes the point is outside the truncated tetrahedron.
|
|
66
|
+
|
|
67
|
+
The truncated tetrahedron is given as follows: ideal triangles
|
|
68
|
+
tet.R13_triangles[f] for each face forming the ideal tetrahedron
|
|
69
|
+
underlying the truncated tetrahedron, a lower bound tet.out_radius
|
|
70
|
+
of the truncated tetrahedron about its spine center (which is the
|
|
71
|
+
ideal tetrahedron's incenter).
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
# We compute one lower bound from the distance to the ideal tetrahedron.
|
|
75
|
+
#
|
|
76
|
+
# Ignore (irrelevant) contributions to the min from those faces
|
|
77
|
+
# where the associated half-space does not contain the point.
|
|
78
|
+
cosh_d_faces = _min([
|
|
79
|
+
cosh_d
|
|
80
|
+
for f in simplex.TwoSubsimplices
|
|
81
|
+
if (cosh_d := lower_bound_cosh_distance_r13_point_triangle(
|
|
82
|
+
point, tet.R13_triangles[f], verified=verified)) is not None ])
|
|
83
|
+
|
|
84
|
+
# We compute the other lower bound as
|
|
85
|
+
#
|
|
86
|
+
# d_out = distance_r13_points(point, tet.spine_center) - tet.out_radius
|
|
87
|
+
#
|
|
88
|
+
# We use trigonometric inequalities to avoid evaluating transcendentals.
|
|
89
|
+
cosh_d_spine_center = -r13_dot(point, tet.spine_center)
|
|
90
|
+
if not cosh_d_spine_center > tet.cosh_out_radius:
|
|
91
|
+
# Only use the second lower bound if d_out has positive sign.
|
|
92
|
+
return cosh_d_faces
|
|
93
|
+
|
|
94
|
+
sinh_d_spine_center = (cosh_d_spine_center ** 2 - 1).sqrt()
|
|
95
|
+
cosh_d_out = (cosh_d_spine_center * tet.cosh_out_radius -
|
|
96
|
+
sinh_d_spine_center * tet.sinh_out_radius)
|
|
97
|
+
|
|
98
|
+
if not cosh_d_out > 1:
|
|
99
|
+
return cosh_d_faces
|
|
100
|
+
|
|
101
|
+
return correct_max([cosh_d_out, cosh_d_faces])
|
|
102
|
+
|
|
103
|
+
def lower_bound_cosh_distance_r13_point_triangle(
|
|
104
|
+
point, triangle, *, verified : bool) -> Optional[Any]:
|
|
105
|
+
"""
|
|
106
|
+
Return None if associated half-space does not contain the point.
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
if verified:
|
|
110
|
+
epsilon = 0
|
|
111
|
+
else:
|
|
112
|
+
RF = point[0].parent()
|
|
113
|
+
epsilon = _compute_epsilon(RF)
|
|
114
|
+
|
|
115
|
+
sinh_dist_point_plane = r13_dot(point, triangle.plane)
|
|
116
|
+
if sinh_dist_point_plane <= -epsilon:
|
|
117
|
+
return None
|
|
118
|
+
for bounding_plane, edge in zip(triangle.bounding_planes,
|
|
119
|
+
triangle.edges):
|
|
120
|
+
if r13_dot(point, bounding_plane) > epsilon:
|
|
121
|
+
return cosh_distance_r13_point_line(point, edge)
|
|
122
|
+
|
|
123
|
+
return (sinh_dist_point_plane ** 2 + 1).sqrt()
|
|
124
|
+
|
|
125
|
+
def _compute_epsilon(RF):
|
|
126
|
+
return RF(0.5) ** (RF.prec() // 2)
|
|
127
|
+
|
|
128
|
+
def _min(values):
|
|
129
|
+
n = len(values)
|
|
130
|
+
if n == 0:
|
|
131
|
+
raise InsufficientPrecisionError(
|
|
132
|
+
"Could not verify point outside of tetrahedron.")
|
|
133
|
+
elif n == 1:
|
|
134
|
+
return values[0]
|
|
135
|
+
else:
|
|
136
|
+
return correct_min(values)
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
from ..SnapPy import Info
|
|
2
|
+
from ..math_basics import (
|
|
3
|
+
is_RealIntervalFieldElement,
|
|
4
|
+
is_ComplexIntervalFieldElement)
|
|
5
|
+
|
|
6
|
+
from typing import Tuple, Optional
|
|
7
|
+
|
|
8
|
+
class LengthSpectrumGeodesicInfo(Info):
|
|
9
|
+
"""
|
|
10
|
+
Information about a geodesic in the length spectrum as returned by
|
|
11
|
+
Manifold.length_spectrum_alt_gen.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def _body(self) -> str:
|
|
15
|
+
if self._is_intermediate:
|
|
16
|
+
return _format_intermediate % (
|
|
17
|
+
_format_real_length(self.length.real()))
|
|
18
|
+
else:
|
|
19
|
+
return _format % (
|
|
20
|
+
_format_length(self.length),
|
|
21
|
+
_format_core_curve(self.core_curve),
|
|
22
|
+
self.word)
|
|
23
|
+
|
|
24
|
+
def __repr__(self) -> str:
|
|
25
|
+
if self._is_first:
|
|
26
|
+
return _header + '\n' + self._body()
|
|
27
|
+
else:
|
|
28
|
+
return self._body()
|
|
29
|
+
|
|
30
|
+
_core_curve_label = 'Core curve'
|
|
31
|
+
_verified_num_digits = 19
|
|
32
|
+
|
|
33
|
+
_format = (
|
|
34
|
+
'%%-%ds ' # Length
|
|
35
|
+
'%%-%ds ' # Core curve
|
|
36
|
+
'%%s' # Word
|
|
37
|
+
) % (_verified_num_digits + len(' + ') + _verified_num_digits + len('*I'),
|
|
38
|
+
len(_core_curve_label))
|
|
39
|
+
|
|
40
|
+
_format_intermediate = (
|
|
41
|
+
' Up to length %%-%ds' % _verified_num_digits)
|
|
42
|
+
|
|
43
|
+
_format_unverified_real = "%16.14f"
|
|
44
|
+
|
|
45
|
+
_header = _format % ( 'Length',
|
|
46
|
+
_core_curve_label,
|
|
47
|
+
'Word')
|
|
48
|
+
|
|
49
|
+
_total_length = len("Out [100:] " + _header)
|
|
50
|
+
|
|
51
|
+
if _total_length > 80:
|
|
52
|
+
raise AssertionError(
|
|
53
|
+
"Total length spectrum string too long: %d" % (
|
|
54
|
+
_total_length))
|
|
55
|
+
|
|
56
|
+
def _format_length(length) -> str:
|
|
57
|
+
if is_ComplexIntervalFieldElement(length):
|
|
58
|
+
return _format_verified_length(length)
|
|
59
|
+
else:
|
|
60
|
+
return _format_unverified_length(length)
|
|
61
|
+
|
|
62
|
+
def _format_verified_length(length) -> str:
|
|
63
|
+
return (
|
|
64
|
+
_format_verified_real_length(length.real()) +
|
|
65
|
+
' ' +
|
|
66
|
+
_format_verified_imag_length(length.imag()) +
|
|
67
|
+
'*I')
|
|
68
|
+
|
|
69
|
+
def _format_verified_real_length(length) -> str:
|
|
70
|
+
result = repr(length)
|
|
71
|
+
return _make_fixed_length(result, _verified_num_digits)
|
|
72
|
+
|
|
73
|
+
def _format_verified_imag_length(length) -> str:
|
|
74
|
+
result = repr(length)
|
|
75
|
+
|
|
76
|
+
# Consume "-" to consistently format " + " and " - " later.
|
|
77
|
+
has_minus = result[0] == '-'
|
|
78
|
+
if has_minus:
|
|
79
|
+
result = result[1:]
|
|
80
|
+
|
|
81
|
+
# If this appears to be zero
|
|
82
|
+
# (that is small enough that it is of the form 1.0?e-10
|
|
83
|
+
# and cannot be verified to be non-zero), then
|
|
84
|
+
# we write "0.00000?" or "0.00000....".
|
|
85
|
+
if 'e' in result and not length != 0:
|
|
86
|
+
num_zeros = (-abs(length).log10()).lower().floor()
|
|
87
|
+
if num_zeros > 2:
|
|
88
|
+
result = '0.' + num_zeros * '0' + '?'
|
|
89
|
+
|
|
90
|
+
result = _make_fixed_length(result, _verified_num_digits)
|
|
91
|
+
|
|
92
|
+
if has_minus:
|
|
93
|
+
result = '- ' + result
|
|
94
|
+
else:
|
|
95
|
+
result = '+ ' + result
|
|
96
|
+
return result
|
|
97
|
+
|
|
98
|
+
def _format_unverified_length(length) -> str:
|
|
99
|
+
lenStr = _format_unverified_real % length.real()
|
|
100
|
+
absImag = abs(length.imag())
|
|
101
|
+
# Unverified: just drop imaginary part if it is close to zero.
|
|
102
|
+
if absImag > 1e-9:
|
|
103
|
+
if length.imag() > 0:
|
|
104
|
+
lenStr += " + "
|
|
105
|
+
else:
|
|
106
|
+
lenStr += " - "
|
|
107
|
+
lenStr += (_format_unverified_real % absImag) + "*I"
|
|
108
|
+
return lenStr
|
|
109
|
+
|
|
110
|
+
def _format_word(word : str, max_length : int) -> str:
|
|
111
|
+
"""
|
|
112
|
+
>>> _format_word('abcdefghi', 9)
|
|
113
|
+
'abcdefghi'
|
|
114
|
+
>>> _format_word('abcdefghi', 8)
|
|
115
|
+
'abcde...'
|
|
116
|
+
>>> _format_word('X1x2x123x12', 11)
|
|
117
|
+
'X1x2x123x12'
|
|
118
|
+
>>> _format_word('X1x2x123x12', 10)
|
|
119
|
+
'X1x2...'
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
if len(word) <= max_length:
|
|
123
|
+
return word
|
|
124
|
+
|
|
125
|
+
# If word is too long, write it as "abc..." so that total
|
|
126
|
+
# length is _max_word_length.
|
|
127
|
+
ellipsis = '...'
|
|
128
|
+
|
|
129
|
+
for i in range(max_length - len(ellipsis), -1, -1):
|
|
130
|
+
# Be careful not to break at, say 2, in x123 since
|
|
131
|
+
# x12... would be misleading.
|
|
132
|
+
if not word[i].isdigit():
|
|
133
|
+
break
|
|
134
|
+
return word[:i] + ellipsis
|
|
135
|
+
|
|
136
|
+
def _format_core_curve(core_curve : Optional[int]) -> str:
|
|
137
|
+
if core_curve is None:
|
|
138
|
+
return '-'
|
|
139
|
+
else:
|
|
140
|
+
return 'Cusp %d' % core_curve
|
|
141
|
+
|
|
142
|
+
def _format_real_length(length):
|
|
143
|
+
if is_RealIntervalFieldElement(length):
|
|
144
|
+
return _format_verified_real_length(length.real())
|
|
145
|
+
else:
|
|
146
|
+
return _format_unverified_real % length.real()
|
|
147
|
+
|
|
148
|
+
def _split_scientific_notation(s : str) -> Tuple[str, str]:
|
|
149
|
+
"""
|
|
150
|
+
>>> _split_scientific_notation('0.45')
|
|
151
|
+
('0.45', '')
|
|
152
|
+
>>> _split_scientific_notation('4.5?e-5')
|
|
153
|
+
('4.5?', 'e-5')
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
parts = s.split('e', 2)
|
|
157
|
+
if len(parts) == 2:
|
|
158
|
+
return parts[0], 'e' + parts[1]
|
|
159
|
+
else:
|
|
160
|
+
return parts[0], ''
|
|
161
|
+
|
|
162
|
+
def _make_fixed_length(result : str, length : int) -> str:
|
|
163
|
+
"""
|
|
164
|
+
>>> _make_fixed_length('0.1234567', 9)
|
|
165
|
+
'0.1234567'
|
|
166
|
+
>>> _make_fixed_length('0.1234567', 8)
|
|
167
|
+
'0.123...'
|
|
168
|
+
>>> _make_fixed_length('1.2345678e-4', 9)
|
|
169
|
+
'1.2...e-4'
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
n = len(result)
|
|
173
|
+
|
|
174
|
+
# How many characters to we need to erase.
|
|
175
|
+
k = n - length
|
|
176
|
+
|
|
177
|
+
if k <= 0:
|
|
178
|
+
# We actually need to fill with white space.
|
|
179
|
+
return result + (-k) * ' '
|
|
180
|
+
|
|
181
|
+
# Preserve trailing, e.g., 'e-4'
|
|
182
|
+
m, e = _split_scientific_notation(result)
|
|
183
|
+
ellipsis = '...'
|
|
184
|
+
k += len(ellipsis)
|
|
185
|
+
return m[:-k] + ellipsis + e
|
snappy/len_spec/spine.py
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
from ..snap.t3mlite import Mcomplex, simplex, Tetrahedron
|
|
2
|
+
from ..hyperboloid.distances import distance_r13_points
|
|
3
|
+
from ..hyperboloid import compute_inradius_and_incenter_from_planes
|
|
4
|
+
from ..hyperboloid import time_r13_normalise, r13_dot
|
|
5
|
+
from ..math_basics import correct_max
|
|
6
|
+
|
|
7
|
+
def add_spine(mcomplex : Mcomplex):
|
|
8
|
+
"""
|
|
9
|
+
Adds a spine to the mcomplex with some geometric structures.
|
|
10
|
+
|
|
11
|
+
The key property of the spine is that every geodesic that is not a core
|
|
12
|
+
curve is intersecting the spine.
|
|
13
|
+
|
|
14
|
+
Topologically, the spine is the dual 2-skeleton of the triangulation.
|
|
15
|
+
Restricted to a tetrahedron, it consists of 12 triangles. The vertices
|
|
16
|
+
of each triangle are on an edge, on a face and inside the tetrahedron.
|
|
17
|
+
|
|
18
|
+
We can give the spine a geometry by picking a point on each edge, on
|
|
19
|
+
each face and in each tetrahedron. Since we are only interested in the
|
|
20
|
+
radius of the spine when restricted to a tetrahedron, we actually do
|
|
21
|
+
not explicitly compute a point for each face.
|
|
22
|
+
|
|
23
|
+
We store the following information about the spine:
|
|
24
|
+
- use the tetrahedron's incenter as its spine center tet.spine_center.
|
|
25
|
+
- compute tet.out_radius, the radius (about the spine center) of a
|
|
26
|
+
tetrahedron truncated by the generalized cusp neighborhoods (that is
|
|
27
|
+
cusp neighborhoods for complete cusps and tubes about core curves
|
|
28
|
+
for incomplete cusps).
|
|
29
|
+
- points on the edges of the triangulation, stored in tet.spine_points.
|
|
30
|
+
- the maximum distance of the tet.spine_points to tet.spine_center in
|
|
31
|
+
tet.spine_radius.
|
|
32
|
+
- tet.inv_spine_cosh = 1 / cosh(r) where r is the tet.spine_radius
|
|
33
|
+
- for the entire fundamental domain, we store a global spine center
|
|
34
|
+
and radius in mcomplex.spine_center and mcomplex.spine_radius.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
for tet in mcomplex.Tetrahedra:
|
|
38
|
+
if False:
|
|
39
|
+
for v in simplex.ZeroSubsimplices:
|
|
40
|
+
d = r13_dot(tet.spine_center, tet.R13_vertices[v])
|
|
41
|
+
if not d < - (1 - mcomplex.RF(1e-8)):
|
|
42
|
+
print(tet.spine_points)
|
|
43
|
+
print(tet.R13_vertices)
|
|
44
|
+
raise Exception("Conjecture is wrong.")
|
|
45
|
+
|
|
46
|
+
tet.out_points = {
|
|
47
|
+
(v0, v1): _out_point(tet, v0, v1)
|
|
48
|
+
for v0 in simplex.ZeroSubsimplices
|
|
49
|
+
for v1 in simplex.ZeroSubsimplices
|
|
50
|
+
if v0 != v1 }
|
|
51
|
+
|
|
52
|
+
tet.spine_points = {
|
|
53
|
+
v0 | v1: time_r13_normalise(
|
|
54
|
+
tet.out_points[(v0, v1)] + tet.out_points[(v1, v0)])
|
|
55
|
+
for v0 in simplex.ZeroSubsimplices
|
|
56
|
+
for v1 in simplex.ZeroSubsimplices
|
|
57
|
+
if v0 < v1 }
|
|
58
|
+
|
|
59
|
+
for v0 in simplex.ZeroSubsimplices:
|
|
60
|
+
if tet.Class[v0].is_complete:
|
|
61
|
+
continue
|
|
62
|
+
for v1 in simplex.ZeroSubsimplices:
|
|
63
|
+
if v0 == v1:
|
|
64
|
+
continue
|
|
65
|
+
e = v0 | v1
|
|
66
|
+
mu_v0v1 = tet.horotriangles[v0].inverse_scale_to_be_on_tube[e]
|
|
67
|
+
mu_v1v0 = tet.horotriangles[v1].inverse_scale_to_be_on_tube[e]
|
|
68
|
+
f = simplex.RightFace[e]
|
|
69
|
+
a = tet.horotriangles[v0].get_real_lengths()[f]
|
|
70
|
+
b = tet.horotriangles[v1].get_real_lengths()[f]
|
|
71
|
+
|
|
72
|
+
# mu_v0v1 / mu_v1v0 < 1 / (a * b)
|
|
73
|
+
if mu_v0v1 * a * b < mu_v1v0:
|
|
74
|
+
continue
|
|
75
|
+
|
|
76
|
+
tet.spine_points[v0, v1] = _point_on_horosphere(tet.R13_vertices[v0], tet.R13_vertices[v1])
|
|
77
|
+
|
|
78
|
+
_, tet.spine_center = compute_inradius_and_incenter_from_planes(
|
|
79
|
+
[ tet.R13_planes[f]
|
|
80
|
+
for f in simplex.TwoSubsimplices ])
|
|
81
|
+
|
|
82
|
+
tet.spine_radius = correct_max(
|
|
83
|
+
[ distance_r13_points(tet.spine_center, p)
|
|
84
|
+
for e, p in tet.spine_points.items() ])
|
|
85
|
+
|
|
86
|
+
tet.inv_spine_cosh = 1 / tet.spine_radius.cosh()
|
|
87
|
+
|
|
88
|
+
tet.out_radius = correct_max(
|
|
89
|
+
[ distance_r13_points(tet.spine_center,
|
|
90
|
+
tet.out_points[(v0, v1)])
|
|
91
|
+
for v0 in simplex.ZeroSubsimplices
|
|
92
|
+
for v1 in simplex.ZeroSubsimplices
|
|
93
|
+
if v0 != v1 ])
|
|
94
|
+
|
|
95
|
+
tet.cosh_out_radius = tet.out_radius.cosh()
|
|
96
|
+
tet.sinh_out_radius = tet.out_radius.sinh()
|
|
97
|
+
|
|
98
|
+
if False:
|
|
99
|
+
print("out, spine =", tet.out_radius, tet.spine_radius)
|
|
100
|
+
|
|
101
|
+
mcomplex.spine_center = mcomplex.baseTet.spine_center
|
|
102
|
+
mcomplex.spine_radius = correct_max(
|
|
103
|
+
[ tet.spine_radius + distance_r13_points(
|
|
104
|
+
mcomplex.spine_center, tet.spine_center)
|
|
105
|
+
for tet in mcomplex.Tetrahedra ])
|
|
106
|
+
|
|
107
|
+
def _out_point(tet : Tetrahedron, v0 : int, v1 : int):
|
|
108
|
+
"""
|
|
109
|
+
Compute one vertex of the tetrahedron truncated by a neighborhood
|
|
110
|
+
in the cusp or about a core curve.
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
# Recall that the vertices defining horospheres truncating the tetrahedron
|
|
114
|
+
# so much that it is just touching the neighborhood without intersecting
|
|
115
|
+
# it.
|
|
116
|
+
#
|
|
117
|
+
# We apply the scale so that the vertex is on the boundary of the
|
|
118
|
+
# neighborhood.
|
|
119
|
+
|
|
120
|
+
s = tet.horotriangles[v0].inverse_scale_to_be_on_tube[v0 | v1]
|
|
121
|
+
return _point_on_horosphere(s * tet.R13_vertices[v0], tet.R13_vertices[v1])
|
|
122
|
+
|
|
123
|
+
def _point_on_horosphere(horo_vec, pt):
|
|
124
|
+
"""
|
|
125
|
+
The point that is the intersection of the horosphere defined by horo_vec
|
|
126
|
+
and the line from horo_vec to pt.
|
|
127
|
+
"""
|
|
128
|
+
return time_r13_normalise( horo_vec - (2 / r13_dot(horo_vec, pt)) * pt)
|
snappy/len_spec/test.py
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from snappy import testing
|
|
2
|
+
import snappy
|
|
3
|
+
|
|
4
|
+
from snappy import len_spec
|
|
5
|
+
import snappy.len_spec.test_cases
|
|
6
|
+
|
|
7
|
+
modules = [
|
|
8
|
+
len_spec,
|
|
9
|
+
len_spec.word,
|
|
10
|
+
len_spec.length_spectrum_geodesic_info,
|
|
11
|
+
len_spec.test_cases
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
def run_doctests(verbose=False, print_info=True):
|
|
15
|
+
globs = {'Manifold': snappy.Manifold}
|
|
16
|
+
return testing.doctest_modules(modules,
|
|
17
|
+
verbose=verbose,
|
|
18
|
+
print_info=print_info,
|
|
19
|
+
extraglobs=globs)
|
|
20
|
+
|
|
21
|
+
run_doctests.__name__ = len_spec.__name__
|
|
22
|
+
|
|
23
|
+
if __name__ == '__main__':
|
|
24
|
+
testing.run_doctests_as_main(run_doctests)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""
|
|
2
|
+
IMPORTANT: Python only recognises this as a doc string if there is
|
|
3
|
+
nothing before it. In particular, add any includes after the doc string.
|
|
4
|
+
|
|
5
|
+
>>> M = Manifold("m125(3,4)(0,0)")
|
|
6
|
+
>>> spec = M.length_spectrum_alt_gen()
|
|
7
|
+
>>> next(spec) # doctest: +NUMERIC9
|
|
8
|
+
Length Core curve Word
|
|
9
|
+
0.24208261435543 - 1.73621300277325*I Cusp 0 aBDcDcb
|
|
10
|
+
>>> next(spec).length # doctest: +NUMERIC9
|
|
11
|
+
0.90986906036840 + 3.03574280072295*I
|
|
12
|
+
>>> next(spec).length # doctest: +NUMERIC9
|
|
13
|
+
0.98258854739348 - 2.33353878259198*I
|
|
14
|
+
>>> next(spec).length # doctest: +NUMERIC9
|
|
15
|
+
1.00610499287709 - 3.02617893116978*I
|
|
16
|
+
>>> next(spec).length # doctest: +NUMERIC9
|
|
17
|
+
1.13551437663552 - 2.12918861416187*I
|
|
18
|
+
>>> next(spec).length # doctest: +NUMERIC9
|
|
19
|
+
1.63203771292969 + 2.30009520293758*I
|
|
20
|
+
|
|
21
|
+
Examples with +SKIP from length_spectrum_alt
|
|
22
|
+
|
|
23
|
+
>>> M = Manifold("m202(3,4)(3,4)")
|
|
24
|
+
>>> spec = M.length_spectrum_alt(count = 3)
|
|
25
|
+
>>> len(spec)
|
|
26
|
+
4
|
|
27
|
+
>>> spec[0].length # doctest: +NUMERIC9
|
|
28
|
+
0.14820741547094 - 1.76955170166922*I
|
|
29
|
+
>>> spec[1].length # doctest: +NUMERIC9
|
|
30
|
+
0.14820741547097 - 1.76955170166923*I
|
|
31
|
+
>>> spec[2].length # doctest: +NUMERIC9
|
|
32
|
+
0.79356651781096 + 2.65902431489655*I
|
|
33
|
+
>>> spec[3].length # doctest: +NUMERIC9
|
|
34
|
+
0.79356651781096 + 2.65902431489655*I
|
|
35
|
+
|
|
36
|
+
Verified:
|
|
37
|
+
|
|
38
|
+
sage: spec = M.length_spectrum_alt(count = 3, verified = True, bits_prec = 110)
|
|
39
|
+
sage: len(spec)
|
|
40
|
+
4
|
|
41
|
+
sage: spec[0].length # doctest: +NUMERIC9
|
|
42
|
+
0.14820741547094772? - 1.76955170166923543?*I
|
|
43
|
+
sage: spec[1].length # doctest: +NUMERIC9
|
|
44
|
+
0.14820741547094772? - 1.76955170166923543?*I
|
|
45
|
+
sage: spec[2].length # doctest: +NUMERIC9
|
|
46
|
+
0.79356651781095741? + 2.65902431489655135?*I
|
|
47
|
+
sage: spec[3].length # doctest: +NUMERIC9
|
|
48
|
+
0.79356651781095741? + 2.65902431489655135?*I
|
|
49
|
+
|
|
50
|
+
>>> M = Manifold("m202(3,4)(0,0)")
|
|
51
|
+
>>> M.length_spectrum_alt(max_len = 1.1) # doctest: +NUMERIC9
|
|
52
|
+
[Length Core curve Word
|
|
53
|
+
0.14742465268512 - 1.78287093565202*I Cusp 0 aabcDabcB,
|
|
54
|
+
0.81161414965958 + 2.72911699294426*I - b,
|
|
55
|
+
0.84163270359334 + 2.61245944742151*I - aB,
|
|
56
|
+
0.93461379591349 + 2.70060614107722*I - a]
|
|
57
|
+
|
|
58
|
+
sage: M.length_spectrum_alt(max_len = 1.1, verified=True, bits_prec=130) # doctest: +NORMALIZE_WHITESPACE
|
|
59
|
+
[Length Core curve Word
|
|
60
|
+
0.14742465268515... - 1.78287093565201...*I Cusp 0 aabcDabcB,
|
|
61
|
+
0.81161414965958... + 2.72911699294425...*I - b,
|
|
62
|
+
0.84163270359334... + 2.61245944742151...*I - aB,
|
|
63
|
+
0.93461379591349... + 2.70060614107721...*I - a]
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
if not __doc__:
|
|
69
|
+
raise Exception("doc string with tests was not recognized.")
|