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,274 @@
|
|
|
1
|
+
from .moves import one_four_move, two_three_move
|
|
2
|
+
from .tracing import GeodesicPiece, GeodesicPieceTracker
|
|
3
|
+
|
|
4
|
+
from . import debug
|
|
5
|
+
|
|
6
|
+
from ..snap.t3mlite import Mcomplex, Tetrahedron
|
|
7
|
+
|
|
8
|
+
from typing import Sequence, Dict
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def traverse_geodesics_to_subdivide(
|
|
12
|
+
mcomplex : Mcomplex,
|
|
13
|
+
all_pieces : Sequence[Sequence[GeodesicPiece]]) -> Sequence[Tetrahedron]:
|
|
14
|
+
"""
|
|
15
|
+
The function expects a triangulation and a list of list of geodesic pieces
|
|
16
|
+
where each list was generated by calling trace_geodesic on the same
|
|
17
|
+
triangulation. That is, the pieces of each list form a simple closed curve in
|
|
18
|
+
the manifold that is geodesic except for one point. See trace_geodesic for
|
|
19
|
+
further details on the input. Note that the function corrupts its input
|
|
20
|
+
data.
|
|
21
|
+
|
|
22
|
+
The function returns a list of tetrahedra that form a triangulation that is
|
|
23
|
+
isometric to the given triangulation and such that the above simple closed
|
|
24
|
+
curves all embed into the 1-skeleton. The triangulation will have ideal and
|
|
25
|
+
finite vertices (that will be assigned light-like and (unnormalized)
|
|
26
|
+
time-like vectors, respectively by tet.R13_vertices).
|
|
27
|
+
|
|
28
|
+
An edge E of the new triangulation is part of one of the above simple
|
|
29
|
+
closed curves if there is a pair of a tetrahedron tet and an edge e in that
|
|
30
|
+
tetrahedron representing E and there is a GeodesicPiece in
|
|
31
|
+
tet.geodesic_pieces with endpoints being the endpoints of e.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
# We perform _traverse_geodesic_to_subdivide for each of the given simple
|
|
35
|
+
# closed curves. A call to _traverse_geodesic_to_subdivide will use
|
|
36
|
+
# 1-4 and 2-3 move to introduce finite vertices and edges connecting them
|
|
37
|
+
# so that the given simple curve can be embedded into the 1-skeleton.
|
|
38
|
+
#
|
|
39
|
+
# While the details of this process are described in
|
|
40
|
+
# _traverse_geodesic_to_subdivide, we describe here the nature of the
|
|
41
|
+
# data structure to represent the intermediate triangulations with
|
|
42
|
+
# line segments embedded in tetrahedra (that is GeodesicPiece's).
|
|
43
|
+
#
|
|
44
|
+
# We actually do not explicitly store the set or list of tetrahedra
|
|
45
|
+
# and line segments making up the intermediate triangulations and
|
|
46
|
+
# simple closed curves, respectively here. Instead, we just keep pointers to
|
|
47
|
+
# some GeodesicPiece's and rely on the fact that the triangulation
|
|
48
|
+
# and each simple closed curve is connected and we can find all
|
|
49
|
+
# tetrahedra and pieces by traversal.
|
|
50
|
+
#
|
|
51
|
+
# The traversal uses that:
|
|
52
|
+
# Each tetrahedron tet points to its four neighbors through tet.Neighbors.
|
|
53
|
+
# Each tetrahedron tet points to all line segments embedded in it
|
|
54
|
+
# through tet.geodesic_pieces.
|
|
55
|
+
# Each GeodesicPiece points back to the tetrahedron where the line
|
|
56
|
+
# segment it represents is embedded in.
|
|
57
|
+
# Each GeodesicPiece also has a pointer to the previous and next
|
|
58
|
+
# GeodesicPiece in the simple closed curves. In other words, we have
|
|
59
|
+
# a cyclically linked list of GeodesicPiece's.
|
|
60
|
+
#
|
|
61
|
+
# Note that the 1-4 and 2-3 moves will replace tetrahedra and
|
|
62
|
+
# GeodesicPiece's with other tetrahedra and GeodesicPiece's.
|
|
63
|
+
#
|
|
64
|
+
# Thus, in general, it is not safe to keep a pointer to a tetrahedron
|
|
65
|
+
# or GeodesicPiece around.
|
|
66
|
+
#
|
|
67
|
+
# The only exception are the "unprocessed" start pieces of the
|
|
68
|
+
# simple closed curves. That is the first piece of a simple closed
|
|
69
|
+
# curve before the simple closed curve became part of the 1-skeleton
|
|
70
|
+
# through _traverse_geodesic_to_subdivide. Recall from trace_geodesic
|
|
71
|
+
# that such a start piece starts in the interior of a tetrahedron and
|
|
72
|
+
# ends at one of the faces of the tetrahedron. The code in the 1-4 and
|
|
73
|
+
# 2-3 moves has special logic to detect pieces of this nature. For
|
|
74
|
+
# such a piece, it actually modifies the GeodesicPiece in place
|
|
75
|
+
# rather than replacing it with one or several other GeodesicPiece's
|
|
76
|
+
# like it does for non-start GeodesicPiece's.
|
|
77
|
+
#
|
|
78
|
+
# Thus, we can store all start pieces here and iterate through them
|
|
79
|
+
# (a start piece will be valid until we have given it to
|
|
80
|
+
# _traverse_geodesic_to_subdivide but not after).
|
|
81
|
+
|
|
82
|
+
# Add pointers to the geodesic pieces to the respective tetrahedra.
|
|
83
|
+
for tet in mcomplex.Tetrahedra:
|
|
84
|
+
tet.geodesic_pieces = []
|
|
85
|
+
for pieces in all_pieces:
|
|
86
|
+
for piece in pieces:
|
|
87
|
+
piece.tet.geodesic_pieces.append(piece)
|
|
88
|
+
|
|
89
|
+
# Store all start pieces.
|
|
90
|
+
trackers = [ GeodesicPieceTracker(pieces[0]) for pieces in all_pieces ]
|
|
91
|
+
|
|
92
|
+
for tracker in trackers:
|
|
93
|
+
debug.check_consistency_segments(
|
|
94
|
+
debug.flatten_link_list(tracker.geodesic_piece))
|
|
95
|
+
|
|
96
|
+
# Iterate through start pieces.
|
|
97
|
+
for tracker in trackers:
|
|
98
|
+
# Make 1-skeleton contain the simple closed curve starting with
|
|
99
|
+
# the start piece.
|
|
100
|
+
last_piece : GeodesicPiece = _traverse_geodesic_to_subdivide(
|
|
101
|
+
tracker.geodesic_piece, mcomplex.verified)
|
|
102
|
+
|
|
103
|
+
# At this point, all start pieces have been processed and all elements
|
|
104
|
+
# of start_pieces are invalid. Luckily, _traverse_geodesic_to_subdivide
|
|
105
|
+
# gives us a valid GeodesicPiece we can use for traversal.
|
|
106
|
+
|
|
107
|
+
return _find_and_index_all_tetrahedra(last_piece.tet)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _traverse_geodesic_to_subdivide(
|
|
111
|
+
start_piece : GeodesicPiece,
|
|
112
|
+
verified : bool) -> GeodesicPiece:
|
|
113
|
+
|
|
114
|
+
debug.check_consistency_2(start_piece)
|
|
115
|
+
|
|
116
|
+
# We introduce the following notation for the current state
|
|
117
|
+
# of the GeodesicPiece's that are cyclically linked to form
|
|
118
|
+
# the simple closed curve that we are currently processing:
|
|
119
|
+
#
|
|
120
|
+
# start_piece.prev
|
|
121
|
+
# v
|
|
122
|
+
# F-F-T-F-...-F-
|
|
123
|
+
# ^
|
|
124
|
+
# start_piece
|
|
125
|
+
#
|
|
126
|
+
# X-Y denotes a GeodesicPiece where X and Y are V, F, or T to
|
|
127
|
+
# indicate whether the start or end point, respectively, is
|
|
128
|
+
# a vertex, on a face or in the interior of a tetrahedron.
|
|
129
|
+
#
|
|
130
|
+
# Since we have V = X for two consecutive pieces U-V X-Y, we
|
|
131
|
+
# abbreviate to U-X-Y.
|
|
132
|
+
#
|
|
133
|
+
# Furthermore, since drawing circles in ASCII art is difficult,
|
|
134
|
+
# X- indicates that we wrap back to the first letter in a line.
|
|
135
|
+
#
|
|
136
|
+
# "v" over a piece and "^" under a piece means that is currently
|
|
137
|
+
# pointed to by a variable we are interested in where the name
|
|
138
|
+
# the variable if it is not just "piece".
|
|
139
|
+
|
|
140
|
+
# Following trace_geodesic, we start with
|
|
141
|
+
#
|
|
142
|
+
# start_piece.prev
|
|
143
|
+
# v
|
|
144
|
+
# F-F-T-F-F-...-F-
|
|
145
|
+
# ^
|
|
146
|
+
# start_piece
|
|
147
|
+
|
|
148
|
+
end_piece, piece = one_four_move(
|
|
149
|
+
[start_piece.prev, start_piece],
|
|
150
|
+
verified)
|
|
151
|
+
|
|
152
|
+
# The first 1-4 move creates a vertex for the point where the
|
|
153
|
+
# simple closed curve starts and ends:
|
|
154
|
+
#
|
|
155
|
+
# end_piece
|
|
156
|
+
# v
|
|
157
|
+
# F-F-V-F-F-...-F-
|
|
158
|
+
# ^
|
|
159
|
+
|
|
160
|
+
debug.check_consistency_2(piece)
|
|
161
|
+
|
|
162
|
+
while True:
|
|
163
|
+
# When entering the curve, we have
|
|
164
|
+
#
|
|
165
|
+
#
|
|
166
|
+
# V-...-V-F-...-F-
|
|
167
|
+
# ^
|
|
168
|
+
# Note that there is only a single V if the curve
|
|
169
|
+
# runs for the first time. And there might be only
|
|
170
|
+
# a single F if we are about to finish.
|
|
171
|
+
|
|
172
|
+
# Proceed to the next piece.
|
|
173
|
+
piece = piece.next_
|
|
174
|
+
|
|
175
|
+
# We now have a different picture depending on whether
|
|
176
|
+
# there was only a single F.
|
|
177
|
+
|
|
178
|
+
if piece.is_face_to_vertex():
|
|
179
|
+
|
|
180
|
+
# We have
|
|
181
|
+
#
|
|
182
|
+
# prev.piece
|
|
183
|
+
# v
|
|
184
|
+
# V-...-V-F-V-...-V-
|
|
185
|
+
# ^
|
|
186
|
+
#
|
|
187
|
+
# We can now achieve the goal by a single 2-3 move:
|
|
188
|
+
# prev.piece and piece will turn into a single new piece
|
|
189
|
+
# that is the edge created by the 2-3 move - the face
|
|
190
|
+
# common to the tetrahedra containing prev.piece and piece
|
|
191
|
+
# has disappeared.
|
|
192
|
+
|
|
193
|
+
piece = two_three_move([piece.prev, piece], verified)
|
|
194
|
+
debug.check_consistency_2(piece)
|
|
195
|
+
|
|
196
|
+
# The entire simple closed curve consists of edges of
|
|
197
|
+
# tetrahedra.
|
|
198
|
+
#
|
|
199
|
+
# V-...-V-V-...-V-
|
|
200
|
+
# ^
|
|
201
|
+
#
|
|
202
|
+
# We are done.
|
|
203
|
+
|
|
204
|
+
return piece
|
|
205
|
+
|
|
206
|
+
# We have
|
|
207
|
+
#
|
|
208
|
+
# V-...-V-F-F-...-F-
|
|
209
|
+
# ^
|
|
210
|
+
#
|
|
211
|
+
# We pick a point on the geodesic piece and use it as vertex
|
|
212
|
+
# for a 1-4 move.
|
|
213
|
+
|
|
214
|
+
piece, next_piece = one_four_move([piece], verified)
|
|
215
|
+
|
|
216
|
+
debug.check_consistency_2(piece)
|
|
217
|
+
|
|
218
|
+
# We have
|
|
219
|
+
#
|
|
220
|
+
# piece.prev next_piece
|
|
221
|
+
# v v
|
|
222
|
+
# V-...-V-F-V-F-...-F-
|
|
223
|
+
# ^
|
|
224
|
+
#
|
|
225
|
+
# Remark: The current piece might not be the only geodesic
|
|
226
|
+
# piece (of this simple closed curve) going through the tetrahedron.
|
|
227
|
+
# The 1-4 move will split these other pieces into several piece.
|
|
228
|
+
# But the pieces will be again F-F. And the process still finishes
|
|
229
|
+
# in finite time. Similar for the 2-3 move.
|
|
230
|
+
#
|
|
231
|
+
# We perform a 2-3 move, see also above description.
|
|
232
|
+
|
|
233
|
+
piece = two_three_move([piece.prev, piece], verified)
|
|
234
|
+
debug.check_consistency_2(piece)
|
|
235
|
+
|
|
236
|
+
# We have
|
|
237
|
+
#
|
|
238
|
+
# V-...-V-V-F-...-F-
|
|
239
|
+
# ^
|
|
240
|
+
#
|
|
241
|
+
# Move to the next piece.
|
|
242
|
+
|
|
243
|
+
piece = piece.next_
|
|
244
|
+
|
|
245
|
+
# We have
|
|
246
|
+
#
|
|
247
|
+
# V-...-V-V-F-...-F-
|
|
248
|
+
# ^
|
|
249
|
+
#
|
|
250
|
+
# Start next iteration.
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def _find_and_index_all_tetrahedra(tet : Tetrahedron):
|
|
254
|
+
"""
|
|
255
|
+
Recursively traverses neighbors of the given Tetrahedron
|
|
256
|
+
to find all tetrahedra tet in the connected component.
|
|
257
|
+
|
|
258
|
+
Assigns tet.Index to them.
|
|
259
|
+
"""
|
|
260
|
+
result = []
|
|
261
|
+
pending_tets = [tet]
|
|
262
|
+
visited_tets = set()
|
|
263
|
+
i = 0
|
|
264
|
+
while pending_tets:
|
|
265
|
+
tet = pending_tets.pop()
|
|
266
|
+
if tet not in visited_tets:
|
|
267
|
+
visited_tets.add(tet)
|
|
268
|
+
tet.Index = i
|
|
269
|
+
i += 1
|
|
270
|
+
result.append(tet)
|
|
271
|
+
for neighbor in tet.Neighbor.values():
|
|
272
|
+
pending_tets.append(neighbor)
|
|
273
|
+
|
|
274
|
+
return result
|
snappy/drilling/test.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from snappy import testing
|
|
2
|
+
import snappy
|
|
3
|
+
|
|
4
|
+
from snappy import drilling
|
|
5
|
+
import snappy.drilling.test_cases
|
|
6
|
+
|
|
7
|
+
modules = [
|
|
8
|
+
drilling,
|
|
9
|
+
drilling.test_cases
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
def run_doctests(verbose=False, print_info=True):
|
|
13
|
+
globs = {'Manifold' : snappy.Manifold,
|
|
14
|
+
'ManifoldHP': snappy.ManifoldHP}
|
|
15
|
+
return testing.doctest_modules(modules,
|
|
16
|
+
verbose=verbose,
|
|
17
|
+
print_info=print_info,
|
|
18
|
+
extraglobs=globs)
|
|
19
|
+
|
|
20
|
+
run_doctests.__name__ = drilling.__name__
|
|
21
|
+
|
|
22
|
+
if __name__ == '__main__':
|
|
23
|
+
testing.run_doctests_as_main(run_doctests)
|
|
@@ -0,0 +1,132 @@
|
|
|
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
|
+
Test with manifold without symmetry. Note that the code in drilling is
|
|
6
|
+
deterministic but the SnapPea kernel code to remove the finite vertices
|
|
7
|
+
and simplify is not. Thus, we need canonical_retriangulation() to get
|
|
8
|
+
a consistent result:
|
|
9
|
+
|
|
10
|
+
>>> from snappy.drilling.exceptions import GeodesicSystemNotSimpleError
|
|
11
|
+
>>> M = Manifold("v2986")
|
|
12
|
+
>>> M.drill_word('gB').canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
|
|
13
|
+
'kLvvAQQkbhijhghgjijxxacvcccccv_baBaaBDbBa'
|
|
14
|
+
|
|
15
|
+
Test non-simple geodesic and verified computation:
|
|
16
|
+
|
|
17
|
+
sage: M = ManifoldHP("m004")
|
|
18
|
+
sage: try:
|
|
19
|
+
... M.drill_word('bbCC', verified = True)
|
|
20
|
+
... except GeodesicSystemNotSimpleError as e:
|
|
21
|
+
... print("Not simple")
|
|
22
|
+
Not simple
|
|
23
|
+
|
|
24
|
+
Tests drilling one geodesic that intersects 1-skeleton::
|
|
25
|
+
|
|
26
|
+
>>> M = Manifold("m125")
|
|
27
|
+
>>> M.drill_word('d').canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
|
|
28
|
+
'svLvLQLAzQMMQdifhjmlknlopnqpqrrroaaaaaaoaaaaaaoaaao_aBbaBaaBeDBb'
|
|
29
|
+
|
|
30
|
+
Tests drilling two geodesics that intersect each other:
|
|
31
|
+
|
|
32
|
+
>>> try: # doctest: +NUMERIC9
|
|
33
|
+
... M.drill_words(['d','Ad'])
|
|
34
|
+
... except GeodesicSystemNotSimpleError as e:
|
|
35
|
+
... print("Max tube radius:", e.maximal_tube_radius)
|
|
36
|
+
Max tube radius: 0.0000000000
|
|
37
|
+
|
|
38
|
+
Tests drilling geodesics that are entirely in the 2-skeleton::
|
|
39
|
+
|
|
40
|
+
>>> M.drill_words(['a','acAADa']).canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
|
|
41
|
+
'ivvPQQcfhghgfghfaaaaaaaaa_BabBBbBaBBaBbbBa'
|
|
42
|
+
|
|
43
|
+
Same test as verified computation::
|
|
44
|
+
|
|
45
|
+
sage: M.drill_words(['a','acAADa'], verified = True, bits_prec = 60).canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
|
|
46
|
+
'ivvPQQcfhghgfghfaaaaaaaaa_BabBBbBaBBaBbbBa'
|
|
47
|
+
|
|
48
|
+
Test error when drilling something close to core curve::
|
|
49
|
+
|
|
50
|
+
>>> M = Manifold("m125")
|
|
51
|
+
>>> MM = M.drill_word('d')
|
|
52
|
+
>>> MM.dehn_fill((1,0),2)
|
|
53
|
+
>>> bad_word = 'bc'
|
|
54
|
+
>>> MM.drill_word(bad_word) # doctest: +ELLIPSIS
|
|
55
|
+
Traceback (most recent call last):
|
|
56
|
+
...
|
|
57
|
+
snappy.geometric_structure.geodesic.check_away_from_core_curve.ObjectCloseToCoreCurve: Geodesic bc is very close to the core curve of cusp 2 and might intersect it. Distance: ...
|
|
58
|
+
|
|
59
|
+
There are two places where we detect whether the geodesic is close
|
|
60
|
+
to a core curve (rather than tiling forever). Test the other place
|
|
61
|
+
in the GeodesicTube code used to determine the maximal amount we can
|
|
62
|
+
perturb the geodesic:
|
|
63
|
+
|
|
64
|
+
>>> drill_words_implementation(MM, [bad_word], verified = False, bits_prec = 53, perturb = True) # doctest: +ELLIPSIS
|
|
65
|
+
Traceback (most recent call last):
|
|
66
|
+
...
|
|
67
|
+
snappy.geometric_structure.geodesic.check_away_from_core_curve.ObjectCloseToCoreCurve: Geodesic bc is very close to the core curve of cusp 2 and might intersect it. Distance: ...
|
|
68
|
+
|
|
69
|
+
A particular tricky case in terms testing that the start piece is correctly
|
|
70
|
+
handled by 2-3 moves (in particular, commit f9879d04 introduced a bug):
|
|
71
|
+
|
|
72
|
+
>>> Manifold("m004").drill_words(['CAC','CCbC']).canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
|
|
73
|
+
'qLvvLvAMQQQkcgimopkllmpkonnnpixcaelchapewetvrn_bcaaBbBBbaBaBbB'
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
An interesting case where geodesic intersects triangulation in only one tetrahedron:
|
|
77
|
+
|
|
78
|
+
>>> Manifold("m019").drill_word('A').canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
|
|
79
|
+
'gLLPQccdefffqffqqof_BaaBdcbb'
|
|
80
|
+
|
|
81
|
+
A bug in an earlier implementation found by Nathan Dunfield (where putting the words in one order caused a failure):
|
|
82
|
+
|
|
83
|
+
>>> import sys
|
|
84
|
+
>>> original_limit = sys.getrecursionlimit()
|
|
85
|
+
>>> sys.setrecursionlimit(100000)
|
|
86
|
+
>>> def drilled_isosig(M, words):
|
|
87
|
+
... for i in range(10):
|
|
88
|
+
... try:
|
|
89
|
+
... F = M.drill_words(words).filled_triangulation()
|
|
90
|
+
... return F.canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
|
|
91
|
+
... except RuntimeError:
|
|
92
|
+
... pass
|
|
93
|
+
>>> drilled_isosig(Manifold('K11n34(0,1)'), ['iFcdbEiFJ', 'iFJ'])
|
|
94
|
+
'zLLvLLwzAwPQMQzzQkcdgijkjplssrnrotqruvwyxyxyhsgnnighueqdniblsipklpxgcr_BcaBbBcB'
|
|
95
|
+
>>> drilled_isosig(Manifold('K11n34(0,1)'), ['iFJ', 'iFcdbEiFJ'])
|
|
96
|
+
'zLLvLLwzAwPQMQzzQkcdgijkjplssrnrotqruvwyxyxyhsgnnighueqdniblsipklpxgcr_babBcBBcaB'
|
|
97
|
+
>>> sys.setrecursionlimit(original_limit)
|
|
98
|
+
|
|
99
|
+
Stress test by using large perturbation. In particular, this is testing the
|
|
100
|
+
case where two geodesic pieces are adjacent to the same triangle and we
|
|
101
|
+
need to shorten before crushing. We do white-box testing (verbose = True)
|
|
102
|
+
to make sure we really hit the shortening case.
|
|
103
|
+
|
|
104
|
+
>>> from snappy.drilling import perturb
|
|
105
|
+
>>> original_radius = perturb._tube_developing_radius
|
|
106
|
+
>>> perturb._tube_developing_radius = 1
|
|
107
|
+
>>> Manifold("m209").drill_word('aaaEDBd', verbose=True).isometry_signature(of_link=True) # doctest: +NUMERIC9
|
|
108
|
+
Tubes lower bound injectivity radius: 0.505170045966405
|
|
109
|
+
Number of geodesic pieces: [12]
|
|
110
|
+
Number of tets after subdividing: 69
|
|
111
|
+
Shortening geodesic by sweeping across triangle.
|
|
112
|
+
'mLALzLQMPbcbefjhhijkllxxnnxagbxnhhn_cbBabBcB'
|
|
113
|
+
>>> Manifold("m307").drill_word('dadadabCdada', verbose=True).isometry_signature(of_link=True) # doctest: +NUMERIC9
|
|
114
|
+
Tubes lower bound injectivity radius: 0.380575727319487
|
|
115
|
+
Number of geodesic pieces: [9]
|
|
116
|
+
Number of tets after subdividing: 45
|
|
117
|
+
Shortening geodesic by sweeping across triangle.
|
|
118
|
+
'oLLwQvvPQQcbeefgemnllnmnmlhhaaaaaahaaaaah_bBbabaab'
|
|
119
|
+
>>> Manifold("m307").drill_word('ADADcBADADAD', verbose=True).isometry_signature(of_link=True) # doctest: +NUMERIC9
|
|
120
|
+
Tubes lower bound injectivity radius: 0.380575727319372
|
|
121
|
+
Number of geodesic pieces: [9]
|
|
122
|
+
Number of tets after subdividing: 49
|
|
123
|
+
Shortening geodesic by sweeping across triangle.
|
|
124
|
+
'oLLwQvvPQQcbeefgemnllnmnmlhhaaaaaahaaaaah_bBbabaab'
|
|
125
|
+
>>> perturb._tube_developing_radius = original_radius
|
|
126
|
+
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
from . import drill_words_implementation
|
|
130
|
+
|
|
131
|
+
if not __doc__:
|
|
132
|
+
raise Exception("doc string with tests was not recognized.")
|