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
snappy/drilling/crush.py
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
from .cusps import CuspPostDrillInfo
|
|
2
|
+
from .peripheral_curves import install_peripheral_curves
|
|
3
|
+
from .barycentric import transpositions, perm_to_index
|
|
4
|
+
|
|
5
|
+
from ..snap.t3mlite import Tetrahedron, Perm4, Mcomplex, simplex
|
|
6
|
+
|
|
7
|
+
from typing import Set, Sequence
|
|
8
|
+
|
|
9
|
+
def crush_geodesic_pieces(tetrahedra : Sequence[Tetrahedron]) -> Mcomplex:
|
|
10
|
+
"""
|
|
11
|
+
Given tetrahedra produced by traverse_geodesics_to_subdivide,
|
|
12
|
+
compute the barycentric subdivision and crush all subtetrahedra in the
|
|
13
|
+
barycentric subdivision that have been marked as being adjacent to an edge
|
|
14
|
+
that coincides with a GeodesicPiece.
|
|
15
|
+
|
|
16
|
+
The function mark_subtetrahedra_about_geodesic_pieces marks the
|
|
17
|
+
subtetrahedra as described above.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
# We call the tetrahedra in the barycentric subdivision subtetrahedra
|
|
21
|
+
# to distinguish them from the original tetrahedra.
|
|
22
|
+
|
|
23
|
+
# We order the vertices of a subtetrahedra such that 0 corresponds to an
|
|
24
|
+
# original vertex, vertex 1 to an edge center, ... of a tetrahedron.
|
|
25
|
+
# This means that half of the subtetrahedra have the orientation
|
|
26
|
+
# reversed from the tetrahedron.
|
|
27
|
+
|
|
28
|
+
# While it is conceptually easier to think of creating the barycentric
|
|
29
|
+
# subdivision and then doing the crushing in two steps, we actually do
|
|
30
|
+
# not create a separate Mcomplex for the intermediate barycentric
|
|
31
|
+
# subdivison.
|
|
32
|
+
|
|
33
|
+
# Recall that each subtetrahedron in the barycentric subdivision
|
|
34
|
+
# is given by a pair of a tetrahedron tet and a permutation p.
|
|
35
|
+
# Using the index i that p has in Perm4.S4, we index
|
|
36
|
+
# a subtetrahedron by 24 * tet.Index + i.
|
|
37
|
+
|
|
38
|
+
# The subtetrahedra that are supposed to be curshed in the barycentric
|
|
39
|
+
# are assumed to be marked in tet.marked_subtetrahedra.
|
|
40
|
+
#
|
|
41
|
+
# Later, we also pick a subtetrahedron for each simple closed curve to
|
|
42
|
+
# compute a new meridian and longitude.
|
|
43
|
+
|
|
44
|
+
# Use bit mask to create the subtetrahedra surviving the crushing.
|
|
45
|
+
subtetrahedra = [
|
|
46
|
+
Tetrahedron() if marked_subtet == 0 else None
|
|
47
|
+
for tet in tetrahedra
|
|
48
|
+
for marked_subtet in tet.marked_subtetrahedra ]
|
|
49
|
+
|
|
50
|
+
_assign_orientations(subtetrahedra)
|
|
51
|
+
|
|
52
|
+
# Now glue the subtetrahedra in the crushed complex.
|
|
53
|
+
# Also carry forward post drill infos and peripheral curves.
|
|
54
|
+
for tet in tetrahedra:
|
|
55
|
+
for i, perm in enumerate(Perm4.S4()):
|
|
56
|
+
subtet_index = 24 * tet.Index + i
|
|
57
|
+
subtet = subtetrahedra[subtet_index]
|
|
58
|
+
|
|
59
|
+
if subtet is None:
|
|
60
|
+
continue
|
|
61
|
+
|
|
62
|
+
# The gluings internal (between subtetrahedra of the
|
|
63
|
+
# same tetrahedron)
|
|
64
|
+
for face in range(3):
|
|
65
|
+
other_perm = perm * transpositions[face]
|
|
66
|
+
j = perm_to_index(other_perm)
|
|
67
|
+
other_subtet_index = 24 * tet.Index + j
|
|
68
|
+
if face == 1 and tet.marked_subtetrahedra[j] != 0:
|
|
69
|
+
# We are processing subtetrahedron t and its
|
|
70
|
+
# neighbor c is adjacent to a GeodesicPiece (=)
|
|
71
|
+
# and thus it and its neighbor c' get crushed.
|
|
72
|
+
# Thus, we need to glue t to t'.
|
|
73
|
+
#
|
|
74
|
+
# 0
|
|
75
|
+
# /|\
|
|
76
|
+
# / | \
|
|
77
|
+
# / | \
|
|
78
|
+
# / | \
|
|
79
|
+
# 1* | *1
|
|
80
|
+
# / * | * \
|
|
81
|
+
# / t 2 t' \
|
|
82
|
+
# / * | * \
|
|
83
|
+
# / * | * \
|
|
84
|
+
# / * | * \
|
|
85
|
+
# / * c | c' * \
|
|
86
|
+
# / * | * \
|
|
87
|
+
# 0============1============0
|
|
88
|
+
#
|
|
89
|
+
other_perm = perm * Perm4((2,1,0,3))
|
|
90
|
+
j = perm_to_index(other_perm)
|
|
91
|
+
other_subtet_index = 24 * tet.Index + j
|
|
92
|
+
# attach is working symmetrically also setting the Neighbors
|
|
93
|
+
# and Gluings of the other tetrahedron, so only call it once
|
|
94
|
+
# per face-pairing
|
|
95
|
+
if j > i:
|
|
96
|
+
subtet.attach(simplex.TwoSubsimplices[face],
|
|
97
|
+
subtetrahedra[other_subtet_index],
|
|
98
|
+
(0,1,2,3))
|
|
99
|
+
|
|
100
|
+
# The external gluing.
|
|
101
|
+
vertex = perm.image(simplex.V0)
|
|
102
|
+
face = perm.image(simplex.F3)
|
|
103
|
+
other_tet = tet.Neighbor[face]
|
|
104
|
+
other_perm = tet.Gluing[face] * perm
|
|
105
|
+
j = perm_to_index(other_perm)
|
|
106
|
+
other_subtet_index = 24 * other_tet.Index + j
|
|
107
|
+
if other_subtet_index > subtet_index:
|
|
108
|
+
subtet.attach(simplex.F3,
|
|
109
|
+
subtetrahedra[other_subtet_index],
|
|
110
|
+
(0,1,2,3))
|
|
111
|
+
|
|
112
|
+
# Only vertex 0 corresponds to an original vertex.
|
|
113
|
+
# The other vertices will actually be finite, i.e., have
|
|
114
|
+
# spherical vertex links.
|
|
115
|
+
subtet.post_drill_infos = {
|
|
116
|
+
simplex.V0 : tet.post_drill_infos[vertex],
|
|
117
|
+
simplex.V1 : CuspPostDrillInfo(),
|
|
118
|
+
simplex.V2 : CuspPostDrillInfo(),
|
|
119
|
+
simplex.V3 : CuspPostDrillInfo() }
|
|
120
|
+
|
|
121
|
+
# Transfer peripheral curves. Note that for the same reason
|
|
122
|
+
# this is only relevant for vertex 0.
|
|
123
|
+
#
|
|
124
|
+
# Recall that SnapPea stores the peripheral curves on the
|
|
125
|
+
# half-edges of the dual 1-skeleton of the cusp triangulation.
|
|
126
|
+
#
|
|
127
|
+
# tet.PeripheralCurves is a structure similar to the one in the
|
|
128
|
+
# SnapPea kernel (see peripheral_curves.c for more info) nested
|
|
129
|
+
# as follows:
|
|
130
|
+
# - list for meridian and longitude
|
|
131
|
+
# - list for sheets in orientation double-cover of cusp triangle
|
|
132
|
+
# - dict with key being the vertex where the cusp triangle is
|
|
133
|
+
# - dict with key being a face of tetrahedron. The face intersects
|
|
134
|
+
# the cusp triangle in an edge. The value says how often the
|
|
135
|
+
# dual half-edge participates in the peripheral curve.
|
|
136
|
+
#
|
|
137
|
+
# After the barycentric subdivision, the original cusp triangle
|
|
138
|
+
# is split as shown:
|
|
139
|
+
#
|
|
140
|
+
# 1
|
|
141
|
+
# /|\
|
|
142
|
+
# / | \
|
|
143
|
+
# / | \
|
|
144
|
+
# / | \ The six new cusp triangles
|
|
145
|
+
# 2* | *2
|
|
146
|
+
# / * | * \
|
|
147
|
+
# / 3 \
|
|
148
|
+
# / * | * \
|
|
149
|
+
# / * | * \
|
|
150
|
+
# / * | * \
|
|
151
|
+
# / * | * \
|
|
152
|
+
# / * | * \
|
|
153
|
+
# 1------------2------------1
|
|
154
|
+
#
|
|
155
|
+
# We first transfer the original peripheral curves to the dual
|
|
156
|
+
# half-edges opposite vertex 3 in the above picture.
|
|
157
|
+
# The resulting chain will thus temporarily fail to be a cycle.
|
|
158
|
+
# Later, we fix the chains to be cycles again by adding values
|
|
159
|
+
# to the half-edges forming a circle about vertex 3 in the
|
|
160
|
+
# above picture - in _fix_all_peripheral_curves.
|
|
161
|
+
|
|
162
|
+
subtet.needs_peripheral_curves_fixed = False
|
|
163
|
+
subtet.PeripheralCurves = [
|
|
164
|
+
[ { v : { f : 0 for f in simplex.TwoSubsimplices }
|
|
165
|
+
for v in simplex.ZeroSubsimplices }
|
|
166
|
+
for sheet in range(2) ]
|
|
167
|
+
for ml in range(2) ]
|
|
168
|
+
for ml in range(2): # For meridian and longitude
|
|
169
|
+
for sheet in range(2): # For two-sheets in orientation-double cover
|
|
170
|
+
p = tet.PeripheralCurves[ml][sheet][vertex][face]
|
|
171
|
+
# Note that in the above picture, an edge of the original
|
|
172
|
+
# cusp triangle is split into two. Thus, we have two triangles
|
|
173
|
+
# to pick from when transferring the value of an old dualf
|
|
174
|
+
# half-edge to the new cusp triangles.
|
|
175
|
+
#
|
|
176
|
+
# We do these choices so that the cycle condition is at least
|
|
177
|
+
# fulfilled for the edges coinciding with the edges of the
|
|
178
|
+
# original cusp triangle.
|
|
179
|
+
if p > 0 and perm.sign() == 0:
|
|
180
|
+
subtet.PeripheralCurves[ml][sheet][simplex.V0][simplex.F3] = p
|
|
181
|
+
subtet.needs_peripheral_curves_fixed = True
|
|
182
|
+
elif p < 0 and perm.sign() == 1:
|
|
183
|
+
subtet.PeripheralCurves[ml][1 - sheet][simplex.V0][simplex.F3] = p
|
|
184
|
+
|
|
185
|
+
_fix_all_peripheral_curves(subtetrahedra)
|
|
186
|
+
|
|
187
|
+
# Find peripheral curves for each cusps created by crushing the simple
|
|
188
|
+
# closed curves.
|
|
189
|
+
# Record which of these cusps was already processed to only do this once
|
|
190
|
+
# per cusp.
|
|
191
|
+
new_cusp_indices : Set[int] = set()
|
|
192
|
+
for tet in tetrahedra:
|
|
193
|
+
for perm, orientation in zip(Perm4.S4(), tet.marked_subtetrahedra):
|
|
194
|
+
# We found a subtetrahedron adjacent to a geodesic piece.
|
|
195
|
+
#
|
|
196
|
+
# Make sure its 0-1 edge is parallel and not anti-parallel to
|
|
197
|
+
# the geodesic piece. This way the longitude will be parallel to
|
|
198
|
+
# the geodesic piece.
|
|
199
|
+
if orientation != +1:
|
|
200
|
+
continue
|
|
201
|
+
# Check orientation of subtetrahedron so that the orientation of
|
|
202
|
+
# the meridian relative to the longitude matches the orientation of the
|
|
203
|
+
# cusp.
|
|
204
|
+
if perm.sign() == 1:
|
|
205
|
+
continue
|
|
206
|
+
v : int = perm.image(simplex.V0)
|
|
207
|
+
cusp_index : int = tet.post_drill_infos[v].index
|
|
208
|
+
if cusp_index is None:
|
|
209
|
+
raise Exception("Vertex on geodesic has no assigned cusp")
|
|
210
|
+
if cusp_index in new_cusp_indices:
|
|
211
|
+
continue
|
|
212
|
+
# First time we encounter this simple closed curve. Pick a base
|
|
213
|
+
# tet to install the meridian and longitude.
|
|
214
|
+
# This base tet better not be one of the subtetrahedra that is
|
|
215
|
+
# crushed. So pick a neighbor of the subtetrahedron adjacent
|
|
216
|
+
# to the geodesic piece.
|
|
217
|
+
other_perm = perm * transpositions[1]
|
|
218
|
+
subtet_index = 24 * tet.Index + perm_to_index(other_perm)
|
|
219
|
+
install_peripheral_curves(subtetrahedra[subtet_index])
|
|
220
|
+
new_cusp_indices.add(cusp_index)
|
|
221
|
+
|
|
222
|
+
# To preserve the orientation, make sure that the first subtetrahedron
|
|
223
|
+
# we pass to Mcomplex has the same orientation as the original tetrahedron
|
|
224
|
+
# - since the SnapPea kernel will use the first tetrahedron of an
|
|
225
|
+
# orientable triangulation to orient it.
|
|
226
|
+
return Mcomplex([ subtet
|
|
227
|
+
for s in [0, 1]
|
|
228
|
+
for subtet in subtetrahedra
|
|
229
|
+
if subtet and subtet.orientation == s ])
|
|
230
|
+
|
|
231
|
+
def _assign_orientations(subtetrahedra):
|
|
232
|
+
for j in range(len(subtetrahedra) // 24):
|
|
233
|
+
for i, perm in enumerate(Perm4.S4()):
|
|
234
|
+
subtet_index = 24 * j + i
|
|
235
|
+
subtet = subtetrahedra[subtet_index]
|
|
236
|
+
if subtet:
|
|
237
|
+
subtet.orientation = perm.sign()
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def _fix_peripheral_curves(subtet):
|
|
241
|
+
"""
|
|
242
|
+
Traverse the six new cusp triangles shown in one
|
|
243
|
+
of the figures in crush_geodesic_pieces.
|
|
244
|
+
"""
|
|
245
|
+
for i in range(6):
|
|
246
|
+
subtet.needs_peripheral_curves_fixed = False
|
|
247
|
+
|
|
248
|
+
if i % 2 == 0:
|
|
249
|
+
face0, face1 = simplex.F1, simplex.F2
|
|
250
|
+
else:
|
|
251
|
+
face0, face1 = simplex.F2, simplex.F1
|
|
252
|
+
neighbor = subtet.Neighbor[face1]
|
|
253
|
+
for ml in range(2):
|
|
254
|
+
for sheet in range(2):
|
|
255
|
+
tri = subtet.PeripheralCurves[ml][sheet][simplex.V0]
|
|
256
|
+
p = tri[face0] + tri[simplex.F3]
|
|
257
|
+
tri[face1] = -p
|
|
258
|
+
neighbor.PeripheralCurves[ml][1-sheet][simplex.V0][face1] = p
|
|
259
|
+
subtet = neighbor
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def _fix_all_peripheral_curves(subtetrahedra):
|
|
263
|
+
"""
|
|
264
|
+
Fix peripheral curves for all subtetrahedra that require it, see
|
|
265
|
+
crush_geodesic_pieces where the needs_peripheral_curves_fixed flag
|
|
266
|
+
was raised for details.
|
|
267
|
+
"""
|
|
268
|
+
for subtet in subtetrahedra:
|
|
269
|
+
if subtet and subtet.needs_peripheral_curves_fixed:
|
|
270
|
+
_fix_peripheral_curves(subtet)
|
snappy/drilling/cusps.py
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
from ..geometric_structure.geodesic.geodesic_start_point_info import GeodesicStartPointInfo
|
|
2
|
+
from ..geometric_structure import Filling, FillingMatrix
|
|
3
|
+
|
|
4
|
+
from ..snap.t3mlite import Mcomplex, simplex
|
|
5
|
+
|
|
6
|
+
from . import exceptions
|
|
7
|
+
|
|
8
|
+
from typing import Tuple, Optional, Sequence
|
|
9
|
+
|
|
10
|
+
# @dataclass
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class CuspPostDrillInfo:
|
|
14
|
+
"""
|
|
15
|
+
Information carried around to be applied after drilling
|
|
16
|
+
the manifold when re-indexing the cusps, re-applying the
|
|
17
|
+
Dehn-fillings or changing the peripheral curve when drilling
|
|
18
|
+
a core curve.
|
|
19
|
+
|
|
20
|
+
Note that we store this information sometime on a
|
|
21
|
+
snappy.snap.t3mlite.Vertex as post_drill_info and sometimes
|
|
22
|
+
as a dictionary tet.post_drill_infos on each tetrahedron assigning
|
|
23
|
+
a CuspPostDrillInfo to each vertex of the tetrahedron. The latter
|
|
24
|
+
representation is more redundant as we need to store the same
|
|
25
|
+
CuspPostDrillInfo to each vertex of each tetrahedron belonging to
|
|
26
|
+
the same vertex class - but is also more convenient in certain
|
|
27
|
+
circumstances.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(self,
|
|
31
|
+
# Index this vertex will have in the drilled manifold.
|
|
32
|
+
# None if vertex is a finite vertex.
|
|
33
|
+
index : Optional[int] = None,
|
|
34
|
+
# Filling that needs to be applied after drilling the
|
|
35
|
+
# manifold. (0,0) if cusps will be left unfilled.
|
|
36
|
+
filling : Filling = (0, 0),
|
|
37
|
+
# Optional adjustment of peripheral curves performed
|
|
38
|
+
# to drilled manifold with Manifold.set_peripheral_curves.
|
|
39
|
+
peripheral_matrix : Optional[FillingMatrix] = None):
|
|
40
|
+
self.index = index
|
|
41
|
+
self.filling = filling
|
|
42
|
+
self.peripheral_matrix = peripheral_matrix
|
|
43
|
+
|
|
44
|
+
def __eq__(self, other):
|
|
45
|
+
"""
|
|
46
|
+
Used for debugging.
|
|
47
|
+
"""
|
|
48
|
+
return (self.index == self.index and
|
|
49
|
+
self.filling == self.filling and
|
|
50
|
+
self.peripheral_matrix == self.peripheral_matrix)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def index_geodesics_and_add_post_drill_infos(
|
|
54
|
+
geodesics : Sequence[GeodesicStartPointInfo],
|
|
55
|
+
mcomplex : Mcomplex) -> None:
|
|
56
|
+
|
|
57
|
+
all_reindexed_verts = {
|
|
58
|
+
g.core_curve_cusp for g in geodesics if g.core_curve_cusp}
|
|
59
|
+
|
|
60
|
+
old_vertices = [v for v in mcomplex.Vertices
|
|
61
|
+
if v not in all_reindexed_verts]
|
|
62
|
+
|
|
63
|
+
for i, v in enumerate(old_vertices):
|
|
64
|
+
v.post_drill_info = CuspPostDrillInfo(
|
|
65
|
+
index=i, filling=v.filling_matrix[0])
|
|
66
|
+
|
|
67
|
+
n = len(old_vertices)
|
|
68
|
+
|
|
69
|
+
for i, g in enumerate(geodesics):
|
|
70
|
+
if g.core_curve_cusp:
|
|
71
|
+
if g.core_curve_multiplicity not in [-1, +1]:
|
|
72
|
+
raise exceptions.GeodesicMultipleOfCoreCurve(
|
|
73
|
+
g.word, g.core_curve_multiplicity)
|
|
74
|
+
|
|
75
|
+
g.core_curve_cusp.post_drill_info = CuspPostDrillInfo(
|
|
76
|
+
index=n + i,
|
|
77
|
+
peripheral_matrix=_multiply_filling_matrix(
|
|
78
|
+
g.core_curve_cusp.filling_matrix,
|
|
79
|
+
g.core_curve_multiplicity))
|
|
80
|
+
else:
|
|
81
|
+
g.index = n + i
|
|
82
|
+
|
|
83
|
+
for tet in mcomplex.Tetrahedra:
|
|
84
|
+
tet.post_drill_infos = {
|
|
85
|
+
V : tet.Class[V].post_drill_info
|
|
86
|
+
for V in simplex.ZeroSubsimplices }
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def reorder_vertices_and_get_post_drill_infos(
|
|
90
|
+
mcomplex : Mcomplex) -> Sequence[CuspPostDrillInfo]:
|
|
91
|
+
|
|
92
|
+
cusp_vertices_dict = { }
|
|
93
|
+
finite_vertices = [ ]
|
|
94
|
+
for vert in mcomplex.Vertices:
|
|
95
|
+
c = vert.Corners[0]
|
|
96
|
+
post_drill_info = c.Tetrahedron.post_drill_infos[c.Subsimplex]
|
|
97
|
+
vert.post_drill_info = post_drill_info
|
|
98
|
+
if post_drill_info.index is None:
|
|
99
|
+
finite_vertices.append(vert)
|
|
100
|
+
else:
|
|
101
|
+
cusp_vertices_dict[post_drill_info.index] = vert
|
|
102
|
+
|
|
103
|
+
cusp_vertices = [ cusp_vertices_dict[i]
|
|
104
|
+
for i in range(len(cusp_vertices_dict)) ]
|
|
105
|
+
|
|
106
|
+
mcomplex.Vertices = cusp_vertices + finite_vertices
|
|
107
|
+
|
|
108
|
+
return [ v.post_drill_info for v in cusp_vertices ]
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def refill_and_adjust_peripheral_curves(
|
|
112
|
+
manifold,
|
|
113
|
+
post_drill_infos : Sequence[CuspPostDrillInfo]) -> None:
|
|
114
|
+
|
|
115
|
+
manifold.dehn_fill([ info.filling for info in post_drill_infos])
|
|
116
|
+
|
|
117
|
+
for info in post_drill_infos:
|
|
118
|
+
if info.peripheral_matrix is not None:
|
|
119
|
+
manifold.set_peripheral_curves(
|
|
120
|
+
info.peripheral_matrix, which_cusp=info.index)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _multiply_filling_matrix(m : FillingMatrix, s : int) -> FillingMatrix:
|
|
124
|
+
return ((s * m[0][0], s * m[0][1]),
|
|
125
|
+
(s * m[1][0], s * m[1][1]))
|
snappy/drilling/debug.py
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
from ..snap.t3mlite import simplex
|
|
2
|
+
from ..matrix import make_identity_matrix
|
|
3
|
+
from ..hyperboloid import *
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def _find_all_tetrahedra(tet):
|
|
7
|
+
result = [ ]
|
|
8
|
+
pending_tets = [ tet ]
|
|
9
|
+
visited_tets = set()
|
|
10
|
+
while pending_tets:
|
|
11
|
+
tet = pending_tets.pop()
|
|
12
|
+
if tet not in visited_tets:
|
|
13
|
+
visited_tets.add(tet)
|
|
14
|
+
result.append(tet)
|
|
15
|
+
for neighbor in tet.Neighbor.values():
|
|
16
|
+
pending_tets.append(neighbor)
|
|
17
|
+
return result
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def check_peripheral_curves(tets):
|
|
21
|
+
for tet in tets:
|
|
22
|
+
for f in simplex.TwoSubsimplices:
|
|
23
|
+
neighbor = tet.Neighbor[f]
|
|
24
|
+
gluing = tet.Gluing[f]
|
|
25
|
+
other_f = gluing.image(f)
|
|
26
|
+
sgn = gluing.sign()
|
|
27
|
+
for v in simplex.ZeroSubsimplices:
|
|
28
|
+
v_comp = simplex.comp(v)
|
|
29
|
+
other_v = gluing.image(v)
|
|
30
|
+
for ml in range(2):
|
|
31
|
+
for sheet_index in range(2):
|
|
32
|
+
sheet = tet.PeripheralCurves[ml][sheet_index][v]
|
|
33
|
+
if f == v_comp:
|
|
34
|
+
if sum(sheet.values()) != 0:
|
|
35
|
+
raise Exception("Not adding up to zero. %r" % tet)
|
|
36
|
+
if sheet[v_comp] != 0:
|
|
37
|
+
raise Exception("Diagonal entry for peripheral curve.")
|
|
38
|
+
else:
|
|
39
|
+
if sgn == 0:
|
|
40
|
+
other_sheet_index = 1 - sheet_index
|
|
41
|
+
else:
|
|
42
|
+
other_sheet_index = sheet_index
|
|
43
|
+
a = sheet[f]
|
|
44
|
+
b = neighbor.PeripheralCurves[ml][other_sheet_index][other_v][other_f]
|
|
45
|
+
if a + b != 0:
|
|
46
|
+
raise Exception("Peripheral curve not adding up.")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def check_vertex_indices(tets):
|
|
50
|
+
for tet in tets:
|
|
51
|
+
for v in simplex.ZeroSubsimplices:
|
|
52
|
+
index = tet.post_drill_infos[v]
|
|
53
|
+
for f in simplex.TwoSubsimplices:
|
|
54
|
+
if v & f:
|
|
55
|
+
if tet.Neighbor[f].post_drill_infos[tet.Gluing[f].image(v)] != index:
|
|
56
|
+
print("tet, v face:", tet, v, f)
|
|
57
|
+
print("index and other index:", index, tet.Neighbor[f].post_drill_infos, [tet.Gluing[f].image(v)])
|
|
58
|
+
raise Exception("Neighbors don't have same vertex.")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def check_points_equal(v0, v1):
|
|
62
|
+
RF = v0[0].parent()
|
|
63
|
+
|
|
64
|
+
if abs(r13_dot(v0, v0)) < RF(1e-10):
|
|
65
|
+
if abs(r13_dot(v1, v1)) > RF(1e-10):
|
|
66
|
+
raise Exception("Light-like vs time-like:", v0, v1)
|
|
67
|
+
if abs(r13_dot(v0, v1)) > RF(1e-10):
|
|
68
|
+
raise Exception("Non-colinlinear light like:", v0, v1)
|
|
69
|
+
else:
|
|
70
|
+
if any(abs(x - y) > RF(1e-10) for x, y in zip(v0, v1)):
|
|
71
|
+
raise Exception("Different time-like:", v0, v1)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def check_points_consistency(m):
|
|
75
|
+
for tet in m.Tetrahedra:
|
|
76
|
+
for F in simplex.TwoSubsimplices:
|
|
77
|
+
for V in simplex.ZeroSubsimplices:
|
|
78
|
+
if V & F:
|
|
79
|
+
check_points_equal(
|
|
80
|
+
tet.O13_matrices[F] * tet.R13_vertices[V],
|
|
81
|
+
tet.Neighbor[F].R13_vertices[tet.Gluing[F].image(V)])
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def check_edge_consistency(m):
|
|
85
|
+
RF = m.Tetrahedra[0].O13_matrices[simplex.F0].base_ring()
|
|
86
|
+
id_matrix = make_identity_matrix(ring=RF, n=4)
|
|
87
|
+
|
|
88
|
+
for e in m.Edges:
|
|
89
|
+
t = id_matrix
|
|
90
|
+
for tet, perm in e.embeddings():
|
|
91
|
+
t = tet.O13_matrices[perm.image(simplex.F2)] * t
|
|
92
|
+
t = t - id_matrix
|
|
93
|
+
for i in range(4):
|
|
94
|
+
for j in range(4):
|
|
95
|
+
if abs(t[i,j]) > RF(1e-10):
|
|
96
|
+
raise Exception("Edge not gluing up")
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def check_geodesic1(tets):
|
|
100
|
+
RF = tets[0].O13_matrices[simplex.F0].base_ring()
|
|
101
|
+
|
|
102
|
+
for tet in tets:
|
|
103
|
+
for geodesic_segment in tet.geodesic_pieces:
|
|
104
|
+
if geodesic_segment.tet is not tet:
|
|
105
|
+
raise Exception("Geodesic tet inconsistency")
|
|
106
|
+
|
|
107
|
+
for ptInClass in geodesic_segment.endpoints:
|
|
108
|
+
if ptInClass.subsimplex in simplex.ZeroSubsimplices:
|
|
109
|
+
check_points_equal(
|
|
110
|
+
ptInClass.r13_point,
|
|
111
|
+
tet.R13_vertices[ptInClass.subsimplex])
|
|
112
|
+
else:
|
|
113
|
+
if abs(r13_dot(ptInClass.r13_point, tet.R13_planes[ptInClass.subsimplex])) > RF(1e-10):
|
|
114
|
+
raise Exception("Point not on plane")
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def check_consistency(mcomplex):
|
|
118
|
+
check_edge_consistency(mcomplex)
|
|
119
|
+
check_points_consistency(mcomplex)
|
|
120
|
+
check_geodesic1(mcomplex.Tetrahedra)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def check_consistency_segments(segments):
|
|
124
|
+
for i in range(len(segments)):
|
|
125
|
+
s0 = segments[i]
|
|
126
|
+
s1 = segments[(i+1) % len(segments)]
|
|
127
|
+
|
|
128
|
+
if s0.tet.Class[s0.endpoints[1].subsimplex] is not s1.tet.Class[s1.endpoints[0].subsimplex]:
|
|
129
|
+
raise Exception("Classes of consecutive segments not matching %i" % i)
|
|
130
|
+
|
|
131
|
+
if s0.next_ is not s1:
|
|
132
|
+
raise Exception("Linked list broken (next)")
|
|
133
|
+
if s1.prev is not s0:
|
|
134
|
+
raise Exception("Linked list broken (prev)")
|
|
135
|
+
|
|
136
|
+
if s0.endpoints[1].subsimplex in simplex.TwoSubsimplices:
|
|
137
|
+
check_points_equal(
|
|
138
|
+
s0.tet.O13_matrices[s0.endpoints[1].subsimplex] * s0.endpoints[1].r13_point,
|
|
139
|
+
s1.endpoints[0].r13_point)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def print_cell(f):
|
|
143
|
+
if f in simplex.ZeroSubsimplices:
|
|
144
|
+
return "V"
|
|
145
|
+
if f in simplex.TwoSubsimplices:
|
|
146
|
+
return "F"
|
|
147
|
+
if f == simplex.T:
|
|
148
|
+
return "T"
|
|
149
|
+
raise Exception("BLAH")
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def output_linked(x, tets_set):
|
|
153
|
+
y = x
|
|
154
|
+
while True:
|
|
155
|
+
# print(y)
|
|
156
|
+
print(print_cell(y.endpoints[0].subsimplex) + "-----" + print_cell(y.endpoints[1].subsimplex), end=" ")
|
|
157
|
+
y = y.next_
|
|
158
|
+
if x is y:
|
|
159
|
+
break
|
|
160
|
+
|
|
161
|
+
print()
|
|
162
|
+
|
|
163
|
+
y = x
|
|
164
|
+
while True:
|
|
165
|
+
print("%2d---%2d" % (y.endpoints[0].subsimplex, y.endpoints[1].subsimplex), end=" ")
|
|
166
|
+
y = y.next_
|
|
167
|
+
if x is y:
|
|
168
|
+
break
|
|
169
|
+
|
|
170
|
+
print()
|
|
171
|
+
|
|
172
|
+
y = x
|
|
173
|
+
while True:
|
|
174
|
+
if y.tet in tets_set:
|
|
175
|
+
print(" * ", end=" ")
|
|
176
|
+
else:
|
|
177
|
+
print(" ", end=" ")
|
|
178
|
+
y = y.next_
|
|
179
|
+
if x is y:
|
|
180
|
+
break
|
|
181
|
+
|
|
182
|
+
print()
|
|
183
|
+
print()
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def flatten_link_list(x):
|
|
187
|
+
y = x
|
|
188
|
+
l = []
|
|
189
|
+
while True:
|
|
190
|
+
l.append(y)
|
|
191
|
+
y = y.next_
|
|
192
|
+
if x is y:
|
|
193
|
+
return l
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def check_consistency_2(piece):
|
|
197
|
+
tets = _find_all_tetrahedra(piece.tet)
|
|
198
|
+
|
|
199
|
+
tets_set = set(tets)
|
|
200
|
+
|
|
201
|
+
to_pieces_map = { }
|
|
202
|
+
|
|
203
|
+
num_pieces = 0
|
|
204
|
+
|
|
205
|
+
for tet in tets:
|
|
206
|
+
for piece in tet.geodesic_pieces:
|
|
207
|
+
|
|
208
|
+
num_pieces += 1
|
|
209
|
+
|
|
210
|
+
if piece.tet is not tet:
|
|
211
|
+
raise Exception("Piece.tet not pointing to tet.")
|
|
212
|
+
if piece.next_.prev is not piece:
|
|
213
|
+
raise Exception("Link list broken.")
|
|
214
|
+
if piece.prev.next_ is not piece:
|
|
215
|
+
raise Exception("Link list broken.")
|
|
216
|
+
|
|
217
|
+
if piece.index != piece.next_.index:
|
|
218
|
+
raise Exception("Index inconsistent.")
|
|
219
|
+
|
|
220
|
+
if piece.index != piece.prev.index:
|
|
221
|
+
raise Exception("Index inconsistent.")
|
|
222
|
+
|
|
223
|
+
if piece.index not in to_pieces_map:
|
|
224
|
+
l = flatten_link_list(piece)
|
|
225
|
+
for i, p in enumerate(l):
|
|
226
|
+
if p is piece:
|
|
227
|
+
l == l[i:] + l[:i]
|
|
228
|
+
break
|
|
229
|
+
else:
|
|
230
|
+
for i, p in enumerate(l):
|
|
231
|
+
if p.endpoints[0].subsimplex == simplex.T:
|
|
232
|
+
l == l[i:] + l[:i]
|
|
233
|
+
break
|
|
234
|
+
|
|
235
|
+
to_pieces_map[piece.index] = l
|
|
236
|
+
|
|
237
|
+
if False:
|
|
238
|
+
for i, pieces in sorted(to_pieces_map.items()):
|
|
239
|
+
print("Component %d (length %d):" % (i, len(pieces)))
|
|
240
|
+
output_linked(pieces[0], tets_set)
|
|
241
|
+
|
|
242
|
+
print("Total length: %d" % num_pieces)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
class DrillGeodesicError(RuntimeError):
|
|
2
|
+
pass
|
|
3
|
+
|
|
4
|
+
class GeodesicSystemNotSimpleError(DrillGeodesicError):
|
|
5
|
+
def __init__(self, maximal_tube_radius):
|
|
6
|
+
self.maximal_tube_radius = maximal_tube_radius
|
|
7
|
+
super().__init__(
|
|
8
|
+
"One of the given geodesics might not simple or two of the "
|
|
9
|
+
"given geodesics might intersect. "
|
|
10
|
+
"The maximal tube radius about the given system of geodesics "
|
|
11
|
+
"was estimated to be: %r." % maximal_tube_radius)
|
|
12
|
+
|
|
13
|
+
class GeodesicMultipleOfCoreCurve(DrillGeodesicError):
|
|
14
|
+
def __init__(self, word, multiplicity):
|
|
15
|
+
self.word = word
|
|
16
|
+
self.multiplicity = multiplicity
|
|
17
|
+
super().__init__(
|
|
18
|
+
"The geodesic %s is a %d-fold multiple of a core curve." % (
|
|
19
|
+
word, multiplicity))
|
|
20
|
+
|
|
21
|
+
class UnfinishedTraceGeodesicError(DrillGeodesicError):
|
|
22
|
+
def __init__(self, steps):
|
|
23
|
+
self.steps = steps
|
|
24
|
+
super().__init__(
|
|
25
|
+
"The geodesic seems to have more than %d pieces in the "
|
|
26
|
+
"triangulation. This is probably due to a pathology, "
|
|
27
|
+
"e.g., the geodesic is very close to a core curve of "
|
|
28
|
+
"filled cusp." % steps)
|
|
29
|
+
|
|
30
|
+
class GeodesicHittingOneSkeletonError(DrillGeodesicError):
|
|
31
|
+
"""
|
|
32
|
+
Base class for exceptions caused by the geodesic hitting the
|
|
33
|
+
1-skeleton and that can be avoided by perturbing the geodesic.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class GeodesicStartPointOnTwoSkeletonError(GeodesicHittingOneSkeletonError):
|
|
38
|
+
"""
|
|
39
|
+
Raised when the start point given to GeodesicStartPointInfo appears not to be in the
|
|
40
|
+
interior of a tetrahedron.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class RayHittingOneSkeletonError(GeodesicHittingOneSkeletonError):
|
|
45
|
+
"""
|
|
46
|
+
Raised when the geodesic appears to intersect the 1-skeleton of the
|
|
47
|
+
original triangulation.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class RetracingRayHittingOneSkeletonError(GeodesicHittingOneSkeletonError):
|
|
52
|
+
"""
|
|
53
|
+
Raised when the geodesic appears to intersect the 1-skeleton of the
|
|
54
|
+
subdivided triangulation.
|
|
55
|
+
"""
|