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,210 @@
|
|
|
1
|
+
from ..snap.t3mlite import Mcomplex
|
|
2
|
+
from ..snap.t3mlite import simplex, Tetrahedron
|
|
3
|
+
|
|
4
|
+
from collections import deque
|
|
5
|
+
|
|
6
|
+
from typing import Dict
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def install_peripheral_curves(start_tet : Tetrahedron) -> None:
|
|
10
|
+
"""
|
|
11
|
+
Given a suitable base tetrahedron in the complex obtained by
|
|
12
|
+
crushing edges in the barycentric subdivision, compute a new
|
|
13
|
+
meridian and longitude.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
# Also see notes about orientation below.
|
|
17
|
+
_install_meridian(start_tet)
|
|
18
|
+
|
|
19
|
+
# Longitude computed as curve intersecting meridian once, so
|
|
20
|
+
# we need to compute meridian first.
|
|
21
|
+
_install_longitude(start_tet)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _walk_face(tet : Tetrahedron, ml : int, f : int) -> Tetrahedron:
|
|
25
|
+
"""
|
|
26
|
+
Input is a tetrahedron, a number ml saying whether we want to
|
|
27
|
+
set the meridian or longitude and a t3mlite.simplex-style
|
|
28
|
+
face not equal to simplex.F0.
|
|
29
|
+
|
|
30
|
+
Add piece to peripheral curve to cusp triangle about vertex 0
|
|
31
|
+
corresponding to walking across the given face. Returns
|
|
32
|
+
tetrahedron after crossing the given face.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
tet.PeripheralCurves[ml][tet.orientation][simplex.V0][f] = +1
|
|
36
|
+
tet = tet.Neighbor[f]
|
|
37
|
+
tet.PeripheralCurves[ml][tet.orientation][simplex.V0][f] = -1
|
|
38
|
+
|
|
39
|
+
return tet
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _install_meridian(start_tet : Tetrahedron) -> None:
|
|
43
|
+
# Before the barycentric subdivision, we can just pick a loop
|
|
44
|
+
# about one of the edges making up the geodesic (or closed
|
|
45
|
+
# simple curve isotopic to the geodesic) as meridian.
|
|
46
|
+
#
|
|
47
|
+
# Imagine a cusp triangle at one end of the edge in a tetrahedron
|
|
48
|
+
# adjacent to the edge. After the barycentric subdivision, the
|
|
49
|
+
# cusp triangle will be divided like this:
|
|
50
|
+
#
|
|
51
|
+
# 1
|
|
52
|
+
# /|\
|
|
53
|
+
# / | \
|
|
54
|
+
# / | \
|
|
55
|
+
# / | \
|
|
56
|
+
# 2* | *2
|
|
57
|
+
# / * | * \
|
|
58
|
+
# / c 3 \
|
|
59
|
+
# / * | * \
|
|
60
|
+
# / * | * \
|
|
61
|
+
# / * | * \
|
|
62
|
+
# / * c | b * \
|
|
63
|
+
# / * | * \
|
|
64
|
+
# 1------------2------------1
|
|
65
|
+
#
|
|
66
|
+
# The subtriangles c are crushed, but crush_geodesic_pieces has
|
|
67
|
+
# given us the subtetrahedron associated with subtriangle b. Thus,
|
|
68
|
+
# we can trace a meridian by going around the crushed subtriangles.
|
|
69
|
+
# That is, starting from the given subtetrahedron, we go through
|
|
70
|
+
# face 2, then 1, then 2, and then 3 (crossing to what used to be
|
|
71
|
+
# the next tetrahedron about the crushed edge) and so on until we
|
|
72
|
+
# are back at the given subtetrahedron.
|
|
73
|
+
|
|
74
|
+
tet = start_tet
|
|
75
|
+
while True:
|
|
76
|
+
for f in [ simplex.F2, simplex.F1, simplex.F2, simplex.F3 ]:
|
|
77
|
+
tet = _walk_face(tet, 0, f)
|
|
78
|
+
if tet is start_tet:
|
|
79
|
+
break
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _has_meridian(tet : Tetrahedron) -> bool:
|
|
83
|
+
for sheet in tet.PeripheralCurves[0]:
|
|
84
|
+
for v in sheet[simplex.V0].values():
|
|
85
|
+
if v != 0:
|
|
86
|
+
return True
|
|
87
|
+
return False
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _walk_tet_to_face(start_tet : Tetrahedron,
|
|
91
|
+
tet_to_face : Dict[Tetrahedron, int]) -> None:
|
|
92
|
+
tet = start_tet
|
|
93
|
+
while True:
|
|
94
|
+
tet = _walk_face(tet, 1, tet_to_face[tet])
|
|
95
|
+
if tet is start_tet:
|
|
96
|
+
break
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _install_longitude(start_tet : Tetrahedron):
|
|
100
|
+
"""
|
|
101
|
+
Uses the meridian installed with _install_meridian to
|
|
102
|
+
find a curve crossing the meridian once.
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
# The following figure shows the meridian installed by
|
|
106
|
+
# _install_meridian in the vertex link.
|
|
107
|
+
# M denotes the meridian and tet1 is the peripheral
|
|
108
|
+
# base subtetetrahedron.
|
|
109
|
+
#
|
|
110
|
+
# 1
|
|
111
|
+
# / \
|
|
112
|
+
# / \
|
|
113
|
+
# / \
|
|
114
|
+
# / M \
|
|
115
|
+
# / M \
|
|
116
|
+
# / M \
|
|
117
|
+
# / M \
|
|
118
|
+
# 2---------------3---------------1
|
|
119
|
+
# / \ M tet1 / \ /
|
|
120
|
+
# / \ M / \ /
|
|
121
|
+
# / \ L M / \ /
|
|
122
|
+
# / L\ L/LM \ /
|
|
123
|
+
# / L \ / LML \ /
|
|
124
|
+
# / \ / M \ /
|
|
125
|
+
# / tet2 \ / tet0 M \ /
|
|
126
|
+
# 3---------------1---------------2
|
|
127
|
+
# / \ M /
|
|
128
|
+
# / \ M /
|
|
129
|
+
# / \ M /
|
|
130
|
+
# / \ M /
|
|
131
|
+
# / M \ /
|
|
132
|
+
# / M \ /
|
|
133
|
+
# / M \ /
|
|
134
|
+
# 2---------------3
|
|
135
|
+
#
|
|
136
|
+
# We start our longitude by traversing tet0, tet1 and tet2.
|
|
137
|
+
#
|
|
138
|
+
# To close it to a loop, we look for a path out from tet0 to tet2
|
|
139
|
+
# traversing only those cusp triangles not containing the meridian
|
|
140
|
+
# (maybe we should say: we are allowed to jump into a cusp triangle
|
|
141
|
+
# if it does not contain the meridian to go from tet0 to tet2 -
|
|
142
|
+
# since the very first piece of the path from tet0 to tet2 is in
|
|
143
|
+
# a cusp triangle that the meridian crosses).
|
|
144
|
+
#
|
|
145
|
+
# We find that path trough breadth-first search.
|
|
146
|
+
|
|
147
|
+
tet0 = start_tet
|
|
148
|
+
tet1 = start_tet.Neighbor[simplex.F2]
|
|
149
|
+
tet2 = tet1.Neighbor[simplex.F3]
|
|
150
|
+
|
|
151
|
+
if not _has_meridian(tet0):
|
|
152
|
+
raise Exception(
|
|
153
|
+
"start_tet expected to have meridian.")
|
|
154
|
+
if not _has_meridian(tet1):
|
|
155
|
+
raise Exception(
|
|
156
|
+
"F2-neighbor of start_tet expected to have meridian.")
|
|
157
|
+
if _has_meridian(tet2):
|
|
158
|
+
raise Exception(
|
|
159
|
+
"F3-enighbor of F2-neighbor of start_tet not expected to have "
|
|
160
|
+
"meridian.")
|
|
161
|
+
|
|
162
|
+
# For a tetrahedron stores the face through which this face was
|
|
163
|
+
# first reached. Thus, we can later trace back a path to the starting
|
|
164
|
+
# tetrahedron.
|
|
165
|
+
visited_tet_to_face = { tet1 : simplex.F3 }
|
|
166
|
+
pending_tets = deque([( tet0, simplex.F2)])
|
|
167
|
+
while True:
|
|
168
|
+
tet, entry_f = pending_tets.popleft()
|
|
169
|
+
if tet in visited_tet_to_face:
|
|
170
|
+
continue
|
|
171
|
+
visited_tet_to_face[tet] = entry_f
|
|
172
|
+
if tet is tet2:
|
|
173
|
+
break
|
|
174
|
+
for f in [ simplex.F1, simplex.F2, simplex.F3 ]:
|
|
175
|
+
neighbor = tet.Neighbor[f]
|
|
176
|
+
if f != entry_f and not _has_meridian(neighbor):
|
|
177
|
+
pending_tets.append((neighbor, f))
|
|
178
|
+
|
|
179
|
+
_walk_tet_to_face(start_tet, visited_tet_to_face)
|
|
180
|
+
|
|
181
|
+
# Notes on orientation
|
|
182
|
+
#
|
|
183
|
+
# We want to pick a longitude that is parallel (vs anti-parallel) to the
|
|
184
|
+
# drilled curve. That is, when embedding the drilled manifold into the
|
|
185
|
+
# undrilled manifold, the longitude is isotopic to the given geodesic.
|
|
186
|
+
#
|
|
187
|
+
# We also want to pick a meridian such that the orientations of the meridian,
|
|
188
|
+
# longitude and manifold are consistent according to the SnapPea kernel
|
|
189
|
+
# conventions (ideally, but not strictly necessary: if we flipped the
|
|
190
|
+
# meridian, the SnapPea kernel would actually flip it back).
|
|
191
|
+
#
|
|
192
|
+
# An important piece of achieving this is in crush.py where a subtetrahedron
|
|
193
|
+
# is picked as peripheral base. Picking that subtetrahedron both checks
|
|
194
|
+
# the orientation of the subtetrahedron with respect to the manifold and
|
|
195
|
+
# the orientation of its 0-1 edge with respect to the drilled geodesic
|
|
196
|
+
# are consistent. See _find_perm_for_piece.
|
|
197
|
+
#
|
|
198
|
+
# Several tests check that the orientation of the longitude is indeed correct.
|
|
199
|
+
#
|
|
200
|
+
# Checking that the meridian is picked correctly here cannot be done through
|
|
201
|
+
# tests since the SnapPea kernel can flip the meridian to make its orientation
|
|
202
|
+
# consistent with the longitude and manifold.
|
|
203
|
+
#
|
|
204
|
+
# To check the meridian, it is thus necessary to add printf's into the kernel
|
|
205
|
+
# and exercise Manifold.drill_word. The two if-branches where the kernel is
|
|
206
|
+
# flipping the meridian and that should not be executed are:
|
|
207
|
+
#
|
|
208
|
+
# "if (tet->cusp[v]->intersection_number[L][M] == -1)" in orient.c and
|
|
209
|
+
# "if (tet->cusp[i]->intersection_number[L][M] == -1)" in peripheral_curves.c
|
|
210
|
+
#
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
from . import constants
|
|
2
|
+
from . import epsilons
|
|
3
|
+
from . import exceptions
|
|
4
|
+
|
|
5
|
+
from ..geometric_structure.geodesic.tiles_for_geodesic import compute_tiles_for_geodesic
|
|
6
|
+
from ..geometric_structure.geodesic.geodesic_start_point_info import GeodesicStartPointInfo
|
|
7
|
+
from ..geometric_structure.geodesic.check_away_from_core_curve import check_away_from_core_curve_iter
|
|
8
|
+
from ..hyperboloid import ( # type: ignore
|
|
9
|
+
unit_time_vector_to_o13_hyperbolic_translation,
|
|
10
|
+
r13_dot,
|
|
11
|
+
time_r13_normalise)
|
|
12
|
+
from ..hyperboloid.line import R13Line
|
|
13
|
+
from ..hyperboloid.distances import distance_r13_lines, distance_r13_points
|
|
14
|
+
from ..tiling.triangle import add_triangles_to_tetrahedra
|
|
15
|
+
from ..snap.t3mlite import Mcomplex # type: ignore
|
|
16
|
+
from ..exceptions import InsufficientPrecisionError # type: ignore
|
|
17
|
+
from ..matrix import make_vector # type: ignore
|
|
18
|
+
from ..math_basics import correct_min # type: ignore
|
|
19
|
+
|
|
20
|
+
from typing import Sequence, Tuple, List, Any
|
|
21
|
+
|
|
22
|
+
# For perturbing, it is sufficient to just find some non-trivial
|
|
23
|
+
# lower bound for the embedding radius of a tube about a geodesic.
|
|
24
|
+
# To just any such bound, set _tube_developing_radius = 0.
|
|
25
|
+
# This will develop the tube just to the point where we can verify
|
|
26
|
+
# that it has positive radius.
|
|
27
|
+
#
|
|
28
|
+
# To stress-test our code, we can develop the tube further, by
|
|
29
|
+
# setting _tube_developing_radius > 0. The isotopy type of
|
|
30
|
+
# the drilled curve will not change no matter how large
|
|
31
|
+
# _tube_developing_radius is. In other words, we still compute
|
|
32
|
+
# a lower bound for the embedding radius which eventually will
|
|
33
|
+
# be the embedding radius up to rounding errors as
|
|
34
|
+
# _tube_developing_radius increases.
|
|
35
|
+
#
|
|
36
|
+
_tube_developing_radius = 0
|
|
37
|
+
|
|
38
|
+
def perturb_geodesics(
|
|
39
|
+
mcomplex : Mcomplex,
|
|
40
|
+
geodesics : Sequence[GeodesicStartPointInfo],
|
|
41
|
+
verbose=False):
|
|
42
|
+
"""
|
|
43
|
+
Given a triangulation with structures added by add_r13_geometry
|
|
44
|
+
and GeodesicStartPointInfo's with start points on the line that is a lift
|
|
45
|
+
of the closed geodesic, perturbs the start point away from the line
|
|
46
|
+
and computes a new end point (as image of the new start point under
|
|
47
|
+
the matrix associated to the geodesic line). The line segment
|
|
48
|
+
from the start point to the end point forms a simple closed
|
|
49
|
+
curve in the manifold which is guaranteed to be isotopic to the
|
|
50
|
+
closed geodesic.
|
|
51
|
+
|
|
52
|
+
If several GeodesicStartPointInfo's are given and/or there are filled
|
|
53
|
+
cusps with core curves, the system of simple closed curves
|
|
54
|
+
resulting from the perturbation together with the core curves
|
|
55
|
+
is guaranteed to be isotopic to the original system of closed
|
|
56
|
+
geodesics together with the core curves.
|
|
57
|
+
|
|
58
|
+
Through the perturbation, the simple closed curve should avoid
|
|
59
|
+
the 1-skeleton (more precision might be required to see this).
|
|
60
|
+
In particular, the start point should be in the interior of
|
|
61
|
+
a tetrahedron and trace_geodesic should succeed.
|
|
62
|
+
An example where trace_geodesic would not succeed without
|
|
63
|
+
perturbation is e.g., the geodesic 'a' in m125 which lies entirely
|
|
64
|
+
in the 2-skeleton.
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
if mcomplex.verified:
|
|
68
|
+
epsilon = 0
|
|
69
|
+
else:
|
|
70
|
+
epsilon = epsilons.compute_tube_injectivity_radius_epsilon(mcomplex.RF)
|
|
71
|
+
|
|
72
|
+
# Compute a lower bound for the maximal distance we can
|
|
73
|
+
# perturb the start points before we might change the isotopy class.
|
|
74
|
+
#
|
|
75
|
+
r = compute_lower_bound_injectivity_radius(mcomplex, geodesics)
|
|
76
|
+
|
|
77
|
+
if verbose:
|
|
78
|
+
print("Tubes lower bound injectivity radius:", r)
|
|
79
|
+
|
|
80
|
+
# If the distance between two different closed geodesics or
|
|
81
|
+
# between two different lifts of the same geodesic (that is the
|
|
82
|
+
# closed geodesic is not simple) or between
|
|
83
|
+
# a closed geodesic and a core curve is zero, raise exception that
|
|
84
|
+
# the system is not simple.
|
|
85
|
+
if not r > epsilon:
|
|
86
|
+
raise exceptions.GeodesicSystemNotSimpleError(r)
|
|
87
|
+
|
|
88
|
+
# Perturb each geodesic using above amount
|
|
89
|
+
for g in geodesics:
|
|
90
|
+
perturb_geodesic(g, r, mcomplex.verified)
|
|
91
|
+
|
|
92
|
+
def compute_lower_bound_injectivity_radius(
|
|
93
|
+
mcomplex : Mcomplex,
|
|
94
|
+
geodesics : Sequence[GeodesicStartPointInfo]):
|
|
95
|
+
|
|
96
|
+
if len(geodesics) == 0:
|
|
97
|
+
raise Exception("No geodesic tubes given")
|
|
98
|
+
|
|
99
|
+
add_triangles_to_tetrahedra(mcomplex)
|
|
100
|
+
|
|
101
|
+
min_radius = mcomplex.RF(_tube_developing_radius)
|
|
102
|
+
|
|
103
|
+
distances = []
|
|
104
|
+
|
|
105
|
+
tet_to_lines : List[List[R13Line]] = [[] for tet in mcomplex.Tetrahedra ]
|
|
106
|
+
|
|
107
|
+
core_curve_epsilon = _compute_core_curve_epsilon(mcomplex)
|
|
108
|
+
|
|
109
|
+
for geodesic in geodesics:
|
|
110
|
+
for tile in (
|
|
111
|
+
check_away_from_core_curve_iter(
|
|
112
|
+
compute_tiles_for_geodesic(mcomplex, geodesic),
|
|
113
|
+
epsilon=core_curve_epsilon,
|
|
114
|
+
obj_name='Geodesic %s' % geodesic.word)):
|
|
115
|
+
if tile.lower_bound_distance > min_radius:
|
|
116
|
+
distances.append(tile.lower_bound_distance)
|
|
117
|
+
break
|
|
118
|
+
tet_index = tile.lifted_tetrahedron.tet.Index
|
|
119
|
+
tet_to_lines[tet_index].append(
|
|
120
|
+
tile.inverse_lifted_geometric_object)
|
|
121
|
+
|
|
122
|
+
for tet in mcomplex.Tetrahedra:
|
|
123
|
+
for curve in tet.core_curves.values():
|
|
124
|
+
tet_to_lines[tet.Index].append(curve.r13_line)
|
|
125
|
+
|
|
126
|
+
for r13_lines in tet_to_lines:
|
|
127
|
+
for i, r13_line0 in enumerate(r13_lines):
|
|
128
|
+
for r13_line1 in r13_lines[:i]:
|
|
129
|
+
distances.append(distance_r13_lines(r13_line0, r13_line1))
|
|
130
|
+
|
|
131
|
+
return correct_min(distances) / 2
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def perturb_geodesic(geodesic : GeodesicStartPointInfo,
|
|
135
|
+
injectivity_radius,
|
|
136
|
+
verified : bool):
|
|
137
|
+
if geodesic.line is None:
|
|
138
|
+
raise ValueError("GeodesicStartPointInfo needs line to be perturbed.")
|
|
139
|
+
|
|
140
|
+
perturbed_point = perturb_unit_time_point(
|
|
141
|
+
time_r13_normalise(geodesic.unnormalised_start_point),
|
|
142
|
+
max_amt=injectivity_radius,
|
|
143
|
+
verified=verified)
|
|
144
|
+
|
|
145
|
+
m = geodesic.line.o13_matrix
|
|
146
|
+
|
|
147
|
+
geodesic.unnormalised_start_point = perturbed_point
|
|
148
|
+
geodesic.unnormalised_end_point = m * perturbed_point
|
|
149
|
+
geodesic.line = None
|
|
150
|
+
|
|
151
|
+
geodesic.find_tet_or_core_curve()
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def perturb_unit_time_point(point, max_amt, verified : bool):
|
|
155
|
+
|
|
156
|
+
RF = point.base_ring()
|
|
157
|
+
|
|
158
|
+
amt = RF(0.5) * max_amt
|
|
159
|
+
direction = make_vector(
|
|
160
|
+
[RF(x) for x in constants.point_perturbation_direction])
|
|
161
|
+
perturbed_origin = make_vector(
|
|
162
|
+
[ amt.cosh() ] + list(amt.sinh() * direction.normalized()))
|
|
163
|
+
|
|
164
|
+
m = unit_time_vector_to_o13_hyperbolic_translation(point)
|
|
165
|
+
perturbed_point = m * perturbed_origin
|
|
166
|
+
|
|
167
|
+
if not verified:
|
|
168
|
+
return perturbed_point
|
|
169
|
+
|
|
170
|
+
space_coords = [ RF(x.center()) for x in perturbed_point[1:4] ]
|
|
171
|
+
time_coord = sum((x**2 for x in space_coords), RF(1)).sqrt()
|
|
172
|
+
perturbed_point = make_vector([time_coord] + space_coords)
|
|
173
|
+
|
|
174
|
+
d = distance_r13_points(point, perturbed_point)
|
|
175
|
+
if not d < RF(0.75) * max_amt:
|
|
176
|
+
raise InsufficientPrecisionError(
|
|
177
|
+
"Could not verify perturbed point is close enough to original "
|
|
178
|
+
"start point. "
|
|
179
|
+
"Increasing the precision will probably fix this.")
|
|
180
|
+
|
|
181
|
+
return perturbed_point
|
|
182
|
+
|
|
183
|
+
def _compute_core_curve_epsilon(mcomplex):
|
|
184
|
+
if mcomplex.verified:
|
|
185
|
+
return 0
|
|
186
|
+
else:
|
|
187
|
+
RF = mcomplex.RF
|
|
188
|
+
return RF(0.5) ** (RF.prec() // 2 - 8)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from .cusps import CuspPostDrillInfo
|
|
2
|
+
from .barycentric import transpositions, perm_to_index, mark_subtetrahedra_about_edge
|
|
3
|
+
|
|
4
|
+
from ..snap.t3mlite import Tetrahedron, Perm4, simplex
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def shorten_in_barycentric_subdivision(tetrahedra, verbose : bool = False):
|
|
8
|
+
while shorten_one_in_barycentric_subdivision(tetrahedra):
|
|
9
|
+
if verbose:
|
|
10
|
+
print("Shortening geodesic by sweeping across triangle.")
|
|
11
|
+
|
|
12
|
+
def shorten_one_in_barycentric_subdivision(tetrahedra):
|
|
13
|
+
for tet in tetrahedra:
|
|
14
|
+
for perm, orientation in zip(Perm4.S4(), tet.marked_subtetrahedra):
|
|
15
|
+
if orientation != +1:
|
|
16
|
+
continue
|
|
17
|
+
other_perm = perm * transpositions[1]
|
|
18
|
+
j = perm_to_index(other_perm)
|
|
19
|
+
if tet.marked_subtetrahedra[j] == 0:
|
|
20
|
+
continue
|
|
21
|
+
mark_subtetrahedra_about_edge(tet, perm, 0)
|
|
22
|
+
mark_subtetrahedra_about_edge(tet, other_perm, 0)
|
|
23
|
+
new_perm = perm * Perm4((1,2,0,3))
|
|
24
|
+
mark_subtetrahedra_about_edge(tet, new_perm)
|
|
25
|
+
_remove_post_drill_info_from_vertex(tet, perm.image(simplex.V0))
|
|
26
|
+
return True
|
|
27
|
+
return False
|
|
28
|
+
|
|
29
|
+
def _remove_post_drill_info_from_vertex(tet, v):
|
|
30
|
+
if tet.post_drill_infos[v].index is None:
|
|
31
|
+
return
|
|
32
|
+
tet.post_drill_infos[v] = CuspPostDrillInfo()
|
|
33
|
+
for f in simplex.FacesAroundVertexCounterclockwise[v]:
|
|
34
|
+
_remove_post_drill_info_from_vertex(
|
|
35
|
+
tet.Neighbor[f],
|
|
36
|
+
tet.Gluing[f].image(v))
|