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,172 @@
|
|
|
1
|
+
# $Id: edge.py,v 1.3 2002/09/20 03:52:16 culler Exp $
|
|
2
|
+
# t3m - software for studying triangulated 3-manifolds
|
|
3
|
+
# Copyright (C) 2002 Marc Culler, Nathan Dunfield and others
|
|
4
|
+
#
|
|
5
|
+
# This program is distributed under the terms of the
|
|
6
|
+
# GNU General Public License, version 2 or later, as published by
|
|
7
|
+
# the Free Software Foundation. See the file GPL.txt for details.
|
|
8
|
+
|
|
9
|
+
from .simplex import *
|
|
10
|
+
from .corner import Corner
|
|
11
|
+
from .arrow import Arrow
|
|
12
|
+
from .perm4 import Perm4
|
|
13
|
+
import sys
|
|
14
|
+
|
|
15
|
+
# A table used for _add_corner, equivalent to:
|
|
16
|
+
# other_arrow = arrow.copy().opposite()
|
|
17
|
+
# tail, head = other_arrow.tail(), other_arrow.head()
|
|
18
|
+
|
|
19
|
+
_edge_add_corner_dict = {}
|
|
20
|
+
for edge, face in EdgeFacePairs:
|
|
21
|
+
other_arrow = Arrow(edge, face, None).opposite()
|
|
22
|
+
_edge_add_corner_dict[edge, face] = other_arrow.tail(), other_arrow.head()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# An edge has an initial and terminal vertex, but these are determined
|
|
26
|
+
# arbitrarily when the 1-skeleton is constructed.
|
|
27
|
+
|
|
28
|
+
class Edge:
|
|
29
|
+
|
|
30
|
+
def __init__(self):
|
|
31
|
+
self.Index = -1
|
|
32
|
+
self.Name = ''
|
|
33
|
+
self.IntOrBdry = '' # value: '', 'int' or 'bdry'
|
|
34
|
+
self.Corners = [] # Corners of type "1-simplex in Tetrahedron"
|
|
35
|
+
self.Vertices = [] # pairs: (initial Vertex, terminal Vertex)
|
|
36
|
+
self.LeftBdryArrow = None # Arrows representing the two boundary faces,
|
|
37
|
+
self.RightBdryArrow = None # if this is a boundary edge.
|
|
38
|
+
self._edge_orient_cache = {}
|
|
39
|
+
|
|
40
|
+
def __repr__(self):
|
|
41
|
+
if self.Index > -1:
|
|
42
|
+
return ('e' + str(self.Index) + self.Name +
|
|
43
|
+
' (' + self.IntOrBdry + ')')
|
|
44
|
+
else:
|
|
45
|
+
return '< floating edge' + str(id(self)) + ' >'
|
|
46
|
+
|
|
47
|
+
# below added by NMD for more detailed printing
|
|
48
|
+
|
|
49
|
+
# returns an arrow rotating around self
|
|
50
|
+
|
|
51
|
+
def get_arrow(self):
|
|
52
|
+
e = self.Corners[0].Subsimplex
|
|
53
|
+
return Arrow(e, RightFace[e], self.Corners[0].Tetrahedron)
|
|
54
|
+
|
|
55
|
+
def info(self, out=sys.stdout):
|
|
56
|
+
out.write(repr(self) + "\t Edge of valence %d\tEndpoints %s\n"
|
|
57
|
+
% (self.valence(), self.Vertices))
|
|
58
|
+
if self.IntOrBdry == 'bdry':
|
|
59
|
+
a = self.LeftBdryArrow.copy()
|
|
60
|
+
a.reverse()
|
|
61
|
+
else:
|
|
62
|
+
a = self.get_arrow()
|
|
63
|
+
s = "\t"
|
|
64
|
+
for i in range(self.valence()):
|
|
65
|
+
s = s + repr(a) + " "
|
|
66
|
+
a.next()
|
|
67
|
+
if i > 0 and (i + 1) % 3 == 0 and i != (self.valence()-1):
|
|
68
|
+
s = s + "\n\t"
|
|
69
|
+
out.write(s + '\n')
|
|
70
|
+
|
|
71
|
+
def valence(self):
|
|
72
|
+
return len(self.Corners)
|
|
73
|
+
|
|
74
|
+
# Return 1 if all corners belong to distinct tetrahedra.
|
|
75
|
+
def distinct(self):
|
|
76
|
+
for corner in self.Corners:
|
|
77
|
+
corner.Tetrahedron.Checked = 0
|
|
78
|
+
for corner in self.Corners:
|
|
79
|
+
if corner.Tetrahedron.Checked == 1:
|
|
80
|
+
return 0
|
|
81
|
+
else:
|
|
82
|
+
corner.Tetrahedron.Checked = 1
|
|
83
|
+
return 1
|
|
84
|
+
|
|
85
|
+
# Return 1 if two sides of a 2-simplex are identified to the edge.
|
|
86
|
+
def self_adjacent(self):
|
|
87
|
+
for corner in self.Corners:
|
|
88
|
+
for one_subsimplex in AdjacentEdges[corner.Subsimplex]:
|
|
89
|
+
if corner.Tetrahedron.Class[one_subsimplex] is self:
|
|
90
|
+
return 1
|
|
91
|
+
return 0
|
|
92
|
+
|
|
93
|
+
# Return 1 if two opposite edges of a 3-simplex are identified to
|
|
94
|
+
# the edge.
|
|
95
|
+
def self_opposite(self):
|
|
96
|
+
count = 0
|
|
97
|
+
for corner in self.Corners:
|
|
98
|
+
if corner.Tetrahedron.Class[comp(corner.Subsimplex)] == self:
|
|
99
|
+
count = count + 1
|
|
100
|
+
return count/2
|
|
101
|
+
|
|
102
|
+
# Remove all references to self from adjoining Tetrahedra and Vertices
|
|
103
|
+
def erase(self):
|
|
104
|
+
for corner in self.Corners:
|
|
105
|
+
corner.Tetrahedron.Class[corner.Subsimplex] = None
|
|
106
|
+
for vertex in self.Vertices:
|
|
107
|
+
try:
|
|
108
|
+
vertex.Edges.remove(self)
|
|
109
|
+
except:
|
|
110
|
+
pass
|
|
111
|
+
self.Index = -1
|
|
112
|
+
|
|
113
|
+
# Below added 7/6/99 by NMD. Given a tetrahedra and a pair of vertices
|
|
114
|
+
# (a, b) returns the orientation of the edge self with respect to the arrow
|
|
115
|
+
# (a -> b). Returns 1 if the orientations agree and -1 if they differ.
|
|
116
|
+
# raises an exception if the arrow is not on this edge.
|
|
117
|
+
|
|
118
|
+
def orientation_with_respect_to(self, tet, a, b):
|
|
119
|
+
try:
|
|
120
|
+
return self._edge_orient_cache[(tet, a, b)]
|
|
121
|
+
except IndexError:
|
|
122
|
+
raise ValueError("Given corner of tet not on this edge")
|
|
123
|
+
|
|
124
|
+
def index(self):
|
|
125
|
+
return self.Index
|
|
126
|
+
|
|
127
|
+
def _first_embedding(self):
|
|
128
|
+
"""
|
|
129
|
+
For this edge, return an edge embedding similar
|
|
130
|
+
to regina, that is a pair (tetrahedron, permutation) such that
|
|
131
|
+
vertex 0 and 1 of the tetrahedron span the edge.
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
corner = self.Corners[0]
|
|
135
|
+
tet = corner.Tetrahedron
|
|
136
|
+
|
|
137
|
+
for perm in Perm4.A4():
|
|
138
|
+
if corner.Subsimplex == perm.image(E01):
|
|
139
|
+
# Match orientation of edge given by Vertices
|
|
140
|
+
if tet.Class[perm.image(V0)] == self.Vertices[0]:
|
|
141
|
+
if tet.Class[perm.image(V1)] == self.Vertices[1]:
|
|
142
|
+
return (tet, perm)
|
|
143
|
+
|
|
144
|
+
def embeddings(self):
|
|
145
|
+
"""
|
|
146
|
+
Iterator through the embeddings of this edge.
|
|
147
|
+
An edge embedding is a pair (tetrahedron, permutation) such that
|
|
148
|
+
vertices of the tetrahedron that are labeled by the images of 0 and 1
|
|
149
|
+
under the permutation span the edge. The images of 2 and 3 of the edge
|
|
150
|
+
embeddings are in an orientation compatible way.
|
|
151
|
+
This is similar to the NEdgeEmbeddings of regina.
|
|
152
|
+
"""
|
|
153
|
+
|
|
154
|
+
order = len(self.Corners)
|
|
155
|
+
tet, perm = self._first_embedding()
|
|
156
|
+
for i in range(order):
|
|
157
|
+
yield tet, perm
|
|
158
|
+
face = perm.image(F2)
|
|
159
|
+
tet, perm = (
|
|
160
|
+
tet.Neighbor[face], tet.Gluing[face] * perm * Perm4( (0,1,3,2) ))
|
|
161
|
+
|
|
162
|
+
def _add_corner(self, arrow):
|
|
163
|
+
"""
|
|
164
|
+
Used by Mcomplex.build_edge_classes
|
|
165
|
+
"""
|
|
166
|
+
self.Corners.append(Corner(arrow.Tetrahedron, arrow.Edge))
|
|
167
|
+
# Next line equivalent to:
|
|
168
|
+
# other_arrow = arrow.copy().opposite()
|
|
169
|
+
# tail, head = other_arrow.tail(), other_arrow.head()
|
|
170
|
+
tail, head = _edge_add_corner_dict[arrow.Edge, arrow.Face]
|
|
171
|
+
self._edge_orient_cache[arrow.Tetrahedron, tail, head] = 1
|
|
172
|
+
self._edge_orient_cache[arrow.Tetrahedron, head, tail] = -1
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# $$
|
|
2
|
+
# t3m - software for studying triangulated 3-manifolds
|
|
3
|
+
# Copyright (C) 2002 Marc Culler, Nathan Dunfield and others
|
|
4
|
+
#
|
|
5
|
+
# This program is distributed under the terms of the
|
|
6
|
+
# GNU General Public License, version 2 or later, as published by
|
|
7
|
+
# the Free Software Foundation. See the file GPL.txt for details.
|
|
8
|
+
|
|
9
|
+
from .arrow import Arrow
|
|
10
|
+
from .simplex import PickAnEdge
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Face:
|
|
14
|
+
def __init__(self):
|
|
15
|
+
self.Index = -1
|
|
16
|
+
self.IntOrBdry = ''
|
|
17
|
+
self.Corners = [] # Corners of type "2-simplex in Tetrahedron"
|
|
18
|
+
|
|
19
|
+
def __repr__(self):
|
|
20
|
+
if self.Index > -1:
|
|
21
|
+
return ('f' + str(self.Index)
|
|
22
|
+
+ ' (' + self.IntOrBdry + ')')
|
|
23
|
+
else:
|
|
24
|
+
return '< floating face' + str(id(self)) + ' >'
|
|
25
|
+
|
|
26
|
+
def erase(self):
|
|
27
|
+
for corner in self.Corners:
|
|
28
|
+
corner.Tetrahedron.Class[corner.Subsimplex] = None
|
|
29
|
+
self.Index = -1
|
|
30
|
+
|
|
31
|
+
def bdry_arrow(self):
|
|
32
|
+
if self.IntOrBdry != 'bdry':
|
|
33
|
+
return None
|
|
34
|
+
face = self.Corners[0].Subsimplex
|
|
35
|
+
tet = self.Corners[0].Tetrahedron
|
|
36
|
+
edge = PickAnEdge[face]
|
|
37
|
+
return Arrow(edge, face, tet)
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# t3m - software for studying triangulated 3-manifolds
|
|
2
|
+
# Copyright (C) 2002 Marc Culler, Nathan Dunfield and others
|
|
3
|
+
#
|
|
4
|
+
# This program is distributed under the terms of the
|
|
5
|
+
# GNU General Public License, version 2 or later, as published by
|
|
6
|
+
# the Free Software Foundation. See the file GPL.txt for details.
|
|
7
|
+
|
|
8
|
+
from .arrow import eArrow
|
|
9
|
+
from .simplex import *
|
|
10
|
+
from .tetrahedron import Tetrahedron
|
|
11
|
+
import re
|
|
12
|
+
|
|
13
|
+
# Nathan's code for importing and exporting snappea files.
|
|
14
|
+
# Converts a SnapPea file to MComplex. Doesn't really use all the
|
|
15
|
+
# structure of the SnapPea file as it relies only on the fact that the
|
|
16
|
+
# gluing data for the ith pair of tetrahedra is given by the ith pair
|
|
17
|
+
# of lines like:
|
|
18
|
+
#
|
|
19
|
+
# 2 5 1 34
|
|
20
|
+
# 3120 0321 0132 0132
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def read_SnapPea_file(file_name=None, data=None):
|
|
24
|
+
if data is None:
|
|
25
|
+
data = open(file_name).read().decode('ascii')
|
|
26
|
+
count = 0
|
|
27
|
+
|
|
28
|
+
neighbors_match = r"^\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s*$"
|
|
29
|
+
perm_match = r"\s*([0123]{4,4})\s+([0123]{4,4})\s+([0123]{4,4})\s+([0123]{4,4})\s*$"
|
|
30
|
+
snappea_re = re.compile(neighbors_match + perm_match, re.MULTILINE)
|
|
31
|
+
|
|
32
|
+
fake_tets = []
|
|
33
|
+
|
|
34
|
+
curr_poss = 0
|
|
35
|
+
while 1:
|
|
36
|
+
m = snappea_re.search(data, curr_poss)
|
|
37
|
+
if not m:
|
|
38
|
+
break
|
|
39
|
+
else:
|
|
40
|
+
neighbors = [int(g) for g in m.group(1,2,3,4)]
|
|
41
|
+
perms = []
|
|
42
|
+
for perm in m.group(5,6,7,8):
|
|
43
|
+
perm = [int(p) for p in [perm[0], perm[1], perm[2], perm[3]]]
|
|
44
|
+
perms.append(perm)
|
|
45
|
+
fake_tets.append( (neighbors, perms) )
|
|
46
|
+
curr_poss = m.end(8)
|
|
47
|
+
return fake_tets
|
|
48
|
+
|
|
49
|
+
# ------------End function SnapPea to Mcomplex--------------------
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# Exports an Mcomplex in SnapPea 2.0 format.
|
|
53
|
+
# ASSUMES THAT THE MANIFOLD IS ORIENTABLE AND THAT THE LINK OF
|
|
54
|
+
# ANY VERTEX HAS GENUS AT MOST ONE.
|
|
55
|
+
|
|
56
|
+
def write_SnapPea_file(mcomplex, fileobject):
|
|
57
|
+
out = fileobject.write
|
|
58
|
+
if hasattr(fileobject, 'name'):
|
|
59
|
+
name = fileobject.name
|
|
60
|
+
else:
|
|
61
|
+
name = 'untitled'
|
|
62
|
+
|
|
63
|
+
out("% Triangulation\n\n" + name + "\nnot_attempted 0.0\nunknown_orientability\nCS_unknown\n\n")
|
|
64
|
+
|
|
65
|
+
torus_cusps = []
|
|
66
|
+
for vertex in mcomplex.Vertices:
|
|
67
|
+
g = vertex.link_genus()
|
|
68
|
+
if g > 1:
|
|
69
|
+
raise ValueError("Link of vertex has genus more than 1.")
|
|
70
|
+
if g == 1:
|
|
71
|
+
torus_cusps.append(vertex)
|
|
72
|
+
|
|
73
|
+
# All torus cusps are unfilled
|
|
74
|
+
|
|
75
|
+
out("%d 0\n" % len(torus_cusps))
|
|
76
|
+
for i in torus_cusps:
|
|
77
|
+
out( " torus 0.000000000000 0.000000000000\n" )
|
|
78
|
+
|
|
79
|
+
out("\n")
|
|
80
|
+
|
|
81
|
+
# The num of tetrahedra
|
|
82
|
+
|
|
83
|
+
out("%d\n" % len(mcomplex))
|
|
84
|
+
|
|
85
|
+
# Output the tetraheda themselves.
|
|
86
|
+
|
|
87
|
+
for tet in mcomplex.Tetrahedra:
|
|
88
|
+
for face in TwoSubsimplices:
|
|
89
|
+
out(" %d" % mcomplex.Tetrahedra.index( tet.Neighbor[face]))
|
|
90
|
+
out("\n")
|
|
91
|
+
for face in TwoSubsimplices:
|
|
92
|
+
out(" %d%d%d%d" % tet.Gluing[face].tuple())
|
|
93
|
+
|
|
94
|
+
out("\n")
|
|
95
|
+
for vert in ZeroSubsimplices:
|
|
96
|
+
vertex = tet.Class[vert]
|
|
97
|
+
if vertex.link_genus() == 1:
|
|
98
|
+
out("%d " % torus_cusps.index(vertex))
|
|
99
|
+
else:
|
|
100
|
+
out("-1 ")
|
|
101
|
+
out("\n")
|
|
102
|
+
if hasattr(tet, 'PeripheralCurves'):
|
|
103
|
+
for curve in tet.PeripheralCurves:
|
|
104
|
+
for sheet in curve:
|
|
105
|
+
for v in ZeroSubsimplices:
|
|
106
|
+
for f in TwoSubsimplices:
|
|
107
|
+
out("%d " % sheet[v][f])
|
|
108
|
+
if v == V3:
|
|
109
|
+
out("\n")
|
|
110
|
+
else:
|
|
111
|
+
out(" ")
|
|
112
|
+
else:
|
|
113
|
+
for i in range(4):
|
|
114
|
+
out("0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n")
|
|
115
|
+
out("0.0 0.0\n\n")
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
# Nathan's code for importing and exporting geo files.
|
|
119
|
+
#
|
|
120
|
+
# converts Casson's u, v, w, x into 0, 1, 2, 3
|
|
121
|
+
|
|
122
|
+
conv = {"u" : V0, "v" : V1, "w" : V2, "x" : V3}
|
|
123
|
+
conv_back = {V0: "u", V1 : "v", V2 : "w", V3: "x"}
|
|
124
|
+
|
|
125
|
+
# Geo saves edges in the form "5ux". This function returns
|
|
126
|
+
# (tet_num, starting_vertex, ending_vertex). Because Casson
|
|
127
|
+
# starts his indexing of tets at 1 and Jeff starts at 0,
|
|
128
|
+
# we subtract 1.
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def read_edge(edge):
|
|
132
|
+
m = re.match("([0-9]+)([uvwx])([uvwx])", edge)
|
|
133
|
+
return (int(m.group(1)) - 1, conv[m.group(2)], conv[m.group(3)])
|
|
134
|
+
|
|
135
|
+
# Geo stores manifolds by storing the link around each edge. This
|
|
136
|
+
# function takes two successive edges in the link and glues the
|
|
137
|
+
# corresponding tetrahedra together.
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def read_geo_file(file_name, num_tet=None):
|
|
141
|
+
data = open(file_name).readlines()
|
|
142
|
+
if num_tet is None:
|
|
143
|
+
num_tet = len(data) - 2
|
|
144
|
+
tets = []
|
|
145
|
+
for i in range(num_tet):
|
|
146
|
+
tets.append(Tetrahedron())
|
|
147
|
+
|
|
148
|
+
for line in data[1 : ]:
|
|
149
|
+
line = line.decode('ascii')
|
|
150
|
+
cycle = re.split(r"\s+", line[ : -1])[1 : ]
|
|
151
|
+
for i in range(len(cycle)):
|
|
152
|
+
t1, v1, v2 = read_edge(cycle[i])
|
|
153
|
+
t2, w1, w2 = read_edge(cycle[(i+1) % len(cycle)]) # Yes, that's w2, w1
|
|
154
|
+
a = eArrow(tets[t1], v1, v2)
|
|
155
|
+
b = eArrow(tets[t2], w1, w2)
|
|
156
|
+
a.glue(b)
|
|
157
|
+
|
|
158
|
+
return Mcomplex(tets)
|
|
159
|
+
|
|
160
|
+
# ---------Code to go from Mcomplex to Geo---------------------
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def write_geo_file(mcomplex, fileobject):
|
|
164
|
+
out = fileobject.write
|
|
165
|
+
out("k\n")
|
|
166
|
+
i = 1
|
|
167
|
+
for edge in mcomplex.Edges:
|
|
168
|
+
tet = edge.Corners[0].Tetrahedron
|
|
169
|
+
edge_name = edge.Corners[0].Subsimplex
|
|
170
|
+
init = Head[edge_name]
|
|
171
|
+
fin = Tail[edge_name]
|
|
172
|
+
a = eArrow(tet, init, fin).opposite()
|
|
173
|
+
b = a.copy()
|
|
174
|
+
out("%d\t%d%s%s " % (i, mcomplex.Tetrahedra.index(b.Tetrahedron) + 1,
|
|
175
|
+
conv_back[b.tail()], conv_back[b.head()]))
|
|
176
|
+
b.next()
|
|
177
|
+
while b != a:
|
|
178
|
+
out("%d%s%s " % (mcomplex.Tetrahedra.index(b.Tetrahedron) + 1,
|
|
179
|
+
conv_back[b.tail()], conv_back[b.head()]))
|
|
180
|
+
b.next()
|
|
181
|
+
|
|
182
|
+
i = i + 1
|
|
183
|
+
out("\n")
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
# writing a file for Matveev's program Spine
|
|
187
|
+
|
|
188
|
+
def write_spine_file(mcomplex, fileobject):
|
|
189
|
+
out = fileobject.write
|
|
190
|
+
for edge in mcomplex.Edges:
|
|
191
|
+
n = edge.valence()
|
|
192
|
+
A = edge.get_arrow()
|
|
193
|
+
tets, global_faces, local_faces, back_local_faces = [], [], [], []
|
|
194
|
+
for i in range(n):
|
|
195
|
+
tets.append(A.Tetrahedron.Index + 1)
|
|
196
|
+
global_faces.append(A.Tetrahedron.Class[A.Face].Index + 1)
|
|
197
|
+
local_faces.append(A.Face)
|
|
198
|
+
back_local_faces.append(comp(A.head()))
|
|
199
|
+
A.next()
|
|
200
|
+
|
|
201
|
+
signs = [1 if (tets[i], local_faces[i]) < (tets[(i + 1) % n], back_local_faces[(i + 1) % n]) else -1 for i in range(n)]
|
|
202
|
+
ans = repr([signs[i]*global_faces[i] for i in range(n)])[1:-1].replace(",", "")
|
|
203
|
+
out(ans + "\n")
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
__all__ = ('read_SnapPea_file',
|
|
207
|
+
'write_SnapPea_file',
|
|
208
|
+
'read_geo_file',
|
|
209
|
+
'write_geo_file',
|
|
210
|
+
'write_spine_file',
|
|
211
|
+
)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from .simplex import *
|
|
2
|
+
from .linalg import Matrix
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def boundary_three(manifold):
|
|
6
|
+
F, T = len(manifold.Faces), len(manifold.Tetrahedra)
|
|
7
|
+
ans = Matrix(F, T)
|
|
8
|
+
for F in manifold.Faces:
|
|
9
|
+
t0, t1 = (C.Tetrahedron.Index for C in F.Corners)
|
|
10
|
+
ans[F.Index, t0] += 1
|
|
11
|
+
ans[F.Index, t1] += -1
|
|
12
|
+
return ans
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def boundary_two(manifold):
|
|
16
|
+
VerticesOfFace = { F0 : (V1, V2, V3), F1 : (V0, V3, V2), F2 : (V0, V1, V3), F3 :
|
|
17
|
+
(V0, V2, V1) }
|
|
18
|
+
|
|
19
|
+
E, F = len(manifold.Edges), len(manifold.Faces)
|
|
20
|
+
ans = Matrix(E, F)
|
|
21
|
+
for F in manifold.Faces:
|
|
22
|
+
C = F.Corners[0]
|
|
23
|
+
tet = C.Tetrahedron
|
|
24
|
+
vertices = VerticesOfFace[C.Subsimplex]
|
|
25
|
+
for i in range(3):
|
|
26
|
+
a, b = vertices[i], vertices[(i + 1) % 3]
|
|
27
|
+
e = tet.Class[a | b]
|
|
28
|
+
ans[e.index(), F.Index] += e.orientation_with_respect_to(tet, a, b)
|
|
29
|
+
return ans
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def boundary_one(manifold):
|
|
33
|
+
V, E = len(manifold.Vertices), len(manifold.Edges)
|
|
34
|
+
ans = Matrix(V, E)
|
|
35
|
+
for e in manifold.Edges:
|
|
36
|
+
v_init, v_term = (v.Index for v in e.Vertices)
|
|
37
|
+
ans[v_term, e.Index] += 1
|
|
38
|
+
ans[v_init, e.Index] += -1
|
|
39
|
+
return ans
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def boundary_maps(manifold):
|
|
43
|
+
"""
|
|
44
|
+
The boundary maps in the homology chain complex of the
|
|
45
|
+
underlying cell-complex of a Mcomplex.
|
|
46
|
+
|
|
47
|
+
>>> M = Mcomplex('o9_12345')
|
|
48
|
+
>>> len(M.boundary_maps()) == 3
|
|
49
|
+
True
|
|
50
|
+
"""
|
|
51
|
+
B1, B2, B3 = boundary_one(manifold), boundary_two(manifold), boundary_three(manifold)
|
|
52
|
+
assert B1*B2 == 0 and B2*B3 == 0
|
|
53
|
+
return B1, B2, B3
|