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,320 @@
|
|
|
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 operator import inv
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _make_opp_dict():
|
|
12
|
+
def swap(t):
|
|
13
|
+
return (t[1], t[0])
|
|
14
|
+
dic = {(0, 1): (2, 3), (2, 0): (1, 3), (1, 2): (0, 3)}
|
|
15
|
+
for k in list(dic):
|
|
16
|
+
dic[dic[k]] = k
|
|
17
|
+
dic[swap(dic[k])] = swap(k)
|
|
18
|
+
dic[swap(k)] = swap(dic[k])
|
|
19
|
+
return dic
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# opposite[(i,j)] = (k,l), where i,j,k,l are distinct and the permutation
|
|
23
|
+
# 0->i,1->j,2->k,3->l is even.
|
|
24
|
+
|
|
25
|
+
opposite = _make_opp_dict()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Perm4Basic:
|
|
29
|
+
"""
|
|
30
|
+
Class Perm4Basic: A permutation of {0,1,2,3}.
|
|
31
|
+
|
|
32
|
+
A permutation can be initialized with a length 4 dictionary or a
|
|
33
|
+
4-tuple or a length 2 dictionary; in the latter case the sign of
|
|
34
|
+
the permutation can be specified by setting "sign=0" (even) or
|
|
35
|
+
"sign=1" (odd). The default sign is odd, since odd permutations
|
|
36
|
+
describe orientation-preserving gluings.
|
|
37
|
+
|
|
38
|
+
This is the original version of Perm4, which was tablized for
|
|
39
|
+
speed reasons.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(self, init, sign=1):
|
|
43
|
+
self.dict = {}
|
|
44
|
+
if isinstance(init, Perm4Basic) or len(init) == 4:
|
|
45
|
+
for i in range(4):
|
|
46
|
+
self.dict[i] = init[i]
|
|
47
|
+
else:
|
|
48
|
+
self.dict = init
|
|
49
|
+
v = list(init.items())
|
|
50
|
+
x = opposite[(v[0][0],v[1][0])]
|
|
51
|
+
y = opposite[(v[0][1],v[1][1])]
|
|
52
|
+
self.dict[x[0]] = y[sign]
|
|
53
|
+
self.dict[x[1]] = y[1-sign]
|
|
54
|
+
|
|
55
|
+
def image(self, bitmap):
|
|
56
|
+
"""
|
|
57
|
+
A subset of {0,1,2,3} can be represented by a bitmap. This
|
|
58
|
+
computes the bitmap of the image subset.
|
|
59
|
+
|
|
60
|
+
>>> Perm4Basic([2, 3, 1, 0]).image(10)
|
|
61
|
+
9
|
|
62
|
+
"""
|
|
63
|
+
image = 0
|
|
64
|
+
for i in range(4):
|
|
65
|
+
if bitmap & (1 << i):
|
|
66
|
+
image = image | (1 << self.dict[i])
|
|
67
|
+
return image
|
|
68
|
+
|
|
69
|
+
def __repr__(self):
|
|
70
|
+
return str(self.tuple())
|
|
71
|
+
|
|
72
|
+
def __call__(self, a_tuple):
|
|
73
|
+
"""
|
|
74
|
+
P((i, ... ,j)) returns the image tuple (P(i), ... , P(j))
|
|
75
|
+
"""
|
|
76
|
+
image = []
|
|
77
|
+
for i in a_tuple:
|
|
78
|
+
image.append(self.dict[i])
|
|
79
|
+
return tuple(image)
|
|
80
|
+
|
|
81
|
+
def __getitem__(self, index):
|
|
82
|
+
"""
|
|
83
|
+
P[i] returns the image of i, P(i)
|
|
84
|
+
|
|
85
|
+
>>> Perm4Basic([2, 3, 1, 0])[3]
|
|
86
|
+
0
|
|
87
|
+
"""
|
|
88
|
+
return self.dict[index]
|
|
89
|
+
|
|
90
|
+
def __mul__(self, other):
|
|
91
|
+
"""
|
|
92
|
+
P*Q is the composition P*Q(i) = P(Q(i))
|
|
93
|
+
|
|
94
|
+
>>> P = Perm4Basic((2, 3, 1, 0))
|
|
95
|
+
>>> Q = Perm4Basic((1, 0, 2, 3))
|
|
96
|
+
>>> P * Q
|
|
97
|
+
(3, 2, 1, 0)
|
|
98
|
+
>>> Q * P
|
|
99
|
+
(2, 3, 0, 1)
|
|
100
|
+
"""
|
|
101
|
+
composition = {}
|
|
102
|
+
for i in range(4):
|
|
103
|
+
composition[i] = self.dict[other.dict[i]]
|
|
104
|
+
return Perm4Basic(composition)
|
|
105
|
+
|
|
106
|
+
def __invert__(self):
|
|
107
|
+
"""
|
|
108
|
+
inv(P) is the inverse permutation
|
|
109
|
+
|
|
110
|
+
>>> inv(Perm4Basic([2, 1, 3, 0]))
|
|
111
|
+
(3, 1, 0, 2)
|
|
112
|
+
"""
|
|
113
|
+
inverse = {}
|
|
114
|
+
for i in range(4):
|
|
115
|
+
inverse[self.dict[i]] = i
|
|
116
|
+
return Perm4Basic(inverse)
|
|
117
|
+
|
|
118
|
+
def sign(self):
|
|
119
|
+
"""
|
|
120
|
+
sign(P) is the sign: 0 for even, 1 for odd
|
|
121
|
+
|
|
122
|
+
>>> Perm4Basic([0, 1, 3, 2]).sign()
|
|
123
|
+
1
|
|
124
|
+
>>> Perm4Basic([1, 0, 3, 2]).sign()
|
|
125
|
+
0
|
|
126
|
+
"""
|
|
127
|
+
sign = 0
|
|
128
|
+
for (i,j) in [(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)]:
|
|
129
|
+
sign = sign ^ (self.dict[i] < self.dict[j])
|
|
130
|
+
return sign
|
|
131
|
+
|
|
132
|
+
def tuple(self):
|
|
133
|
+
"""
|
|
134
|
+
P.tuple() returns a tuple representing the permutation P
|
|
135
|
+
|
|
136
|
+
>>> Perm4Basic([1, 2, 0, 3]).tuple()
|
|
137
|
+
(1, 2, 0, 3)
|
|
138
|
+
"""
|
|
139
|
+
return tuple(self.dict[i] for i in range(4))
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
S4_tuples = [(0,1,2,3), (0,1,3,2), (0,2,1,3), (0,2,3,1), (0,3,1,2), (0,3,2,1),
|
|
143
|
+
(1,0,2,3), (1,0,3,2), (1,2,0,3), (1,2,3,0), (1,3,0,2), (1,3,2,0),
|
|
144
|
+
(2,0,1,3), (2,0,3,1), (2,1,0,3), (2,1,3,0), (2,3,0,1), (2,3,1,0),
|
|
145
|
+
(3,0,1,2), (3,0,2,1), (3,1,0,2), (3,1,2,0), (3,2,0,1), (3,2,1,0)]
|
|
146
|
+
|
|
147
|
+
A4_tuples = [(0,1,2,3), (0,2,3,1), (0,3,1,2), (1,0,3,2), (1,2,0,3), (1,3,2,0),
|
|
148
|
+
(2,0,1,3), (2,1,3,0), (2,3,0,1), (3,0,2,1), (3,1,0,2), (3,2,1,0)]
|
|
149
|
+
|
|
150
|
+
KleinFour_tuples = [(0,1,2,3), # Id
|
|
151
|
+
(1,0,3,2), # (01)(23)
|
|
152
|
+
(2,3,0,1), # (02)(13)
|
|
153
|
+
(3,2,1,0) ] # (03)(12)
|
|
154
|
+
|
|
155
|
+
perm_tuple_to_index = {t:i for i, t in enumerate(S4_tuples)}
|
|
156
|
+
perm_basic_by_index = [Perm4Basic(t) for t in S4_tuples]
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def perm_basic_to_index(perm):
|
|
160
|
+
return perm_tuple_to_index[perm.tuple()]
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
perm_signs_by_index = {i: perm.sign()
|
|
164
|
+
for i, perm in enumerate(perm_basic_by_index)}
|
|
165
|
+
|
|
166
|
+
bitmap_images = {(i, bitmap): perm.image(bitmap)
|
|
167
|
+
for bitmap in range(16)
|
|
168
|
+
for i, perm in enumerate(perm_basic_by_index)}
|
|
169
|
+
|
|
170
|
+
index_of_inverse_by_index = {i: perm_basic_to_index(inv(perm))
|
|
171
|
+
for i, perm in enumerate(perm_basic_by_index)}
|
|
172
|
+
|
|
173
|
+
index_mult_table_by_index = {(i, j): perm_basic_to_index(P * Q)
|
|
174
|
+
for i, P in enumerate(perm_basic_by_index)
|
|
175
|
+
for j, Q in enumerate(perm_basic_by_index)}
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
class Perm4():
|
|
179
|
+
"""
|
|
180
|
+
Class Perm4: A permutation of {0,1,2,3}.
|
|
181
|
+
|
|
182
|
+
A permutation can be initialized with a length 4 dictionary or a
|
|
183
|
+
4-tuple or a length 2 dictionary; in the latter case the sign of
|
|
184
|
+
the permutation can be specified by setting "sign=0" (even) or
|
|
185
|
+
"sign=1" (odd). The default sign is odd, since odd permutations
|
|
186
|
+
describe orientation-preserving gluings.
|
|
187
|
+
"""
|
|
188
|
+
|
|
189
|
+
def __init__(self, init, sign=1):
|
|
190
|
+
if isinstance(init, int):
|
|
191
|
+
self._index = init
|
|
192
|
+
self._tuple = S4_tuples[init]
|
|
193
|
+
elif isinstance(init, Perm4):
|
|
194
|
+
self._index = init._index
|
|
195
|
+
self._tuple = init._tuple
|
|
196
|
+
elif len(init) == 4:
|
|
197
|
+
self._tuple = tuple(init[i] for i in range(4))
|
|
198
|
+
self._index = perm_tuple_to_index[self._tuple]
|
|
199
|
+
else:
|
|
200
|
+
self._tuple = Perm4Basic(init, sign).tuple()
|
|
201
|
+
self._index = perm_tuple_to_index[self._tuple]
|
|
202
|
+
|
|
203
|
+
def image(self, bitmap):
|
|
204
|
+
"""
|
|
205
|
+
A subset of {0,1,2,3} can be represented by a bitmap. This
|
|
206
|
+
computes the bitmap of the image subset.
|
|
207
|
+
|
|
208
|
+
>>> Perm4([2, 3, 1, 0]).image(10)
|
|
209
|
+
9
|
|
210
|
+
"""
|
|
211
|
+
return bitmap_images[self._index, bitmap]
|
|
212
|
+
|
|
213
|
+
def __repr__(self):
|
|
214
|
+
return str(self._tuple)
|
|
215
|
+
|
|
216
|
+
def __call__(self, a_tuple):
|
|
217
|
+
"""
|
|
218
|
+
P((i, ... ,j)) returns the image tuple (P(i), ... , P(j))
|
|
219
|
+
|
|
220
|
+
>>> Perm4([2, 3, 1, 0])(range(3))
|
|
221
|
+
(2, 3, 1)
|
|
222
|
+
"""
|
|
223
|
+
image = []
|
|
224
|
+
for i in a_tuple:
|
|
225
|
+
image.append(self._tuple[i])
|
|
226
|
+
return tuple(image)
|
|
227
|
+
|
|
228
|
+
def __getitem__(self, index):
|
|
229
|
+
"""
|
|
230
|
+
P[i] returns the image of i, P(i)
|
|
231
|
+
|
|
232
|
+
>>> Perm4([2, 3, 1, 0])[3]
|
|
233
|
+
0
|
|
234
|
+
"""
|
|
235
|
+
return self._tuple[index]
|
|
236
|
+
|
|
237
|
+
def __mul__(self, other):
|
|
238
|
+
"""
|
|
239
|
+
P*Q is the composition P*Q(i) = P(Q(i))
|
|
240
|
+
|
|
241
|
+
>>> P = Perm4((2, 3, 1, 0))
|
|
242
|
+
>>> Q = Perm4((1, 0, 2, 3))
|
|
243
|
+
>>> P * Q
|
|
244
|
+
(3, 2, 1, 0)
|
|
245
|
+
>>> Q * P
|
|
246
|
+
(2, 3, 0, 1)
|
|
247
|
+
"""
|
|
248
|
+
return mult_table_by_index[self._index, other._index]
|
|
249
|
+
|
|
250
|
+
def __invert__(self):
|
|
251
|
+
"""
|
|
252
|
+
inv(P) is the inverse permutation
|
|
253
|
+
|
|
254
|
+
>>> inv(Perm4([2, 1, 3, 0]))
|
|
255
|
+
(3, 1, 0, 2)
|
|
256
|
+
"""
|
|
257
|
+
return inverse_by_index[self._index]
|
|
258
|
+
|
|
259
|
+
def sign(self):
|
|
260
|
+
"""
|
|
261
|
+
sign(P) is the sign: 0 for even, 1 for odd
|
|
262
|
+
|
|
263
|
+
>>> Perm4([0, 1, 3, 2]).sign()
|
|
264
|
+
1
|
|
265
|
+
>>> Perm4([1, 0, 3, 2]).sign()
|
|
266
|
+
0
|
|
267
|
+
"""
|
|
268
|
+
return perm_signs_by_index[self._index]
|
|
269
|
+
|
|
270
|
+
def tuple(self):
|
|
271
|
+
"""
|
|
272
|
+
P.tuple() returns a tuple representing the permutation P
|
|
273
|
+
|
|
274
|
+
>>> Perm4([1, 2, 0, 3]).tuple()
|
|
275
|
+
(1, 2, 0, 3)
|
|
276
|
+
"""
|
|
277
|
+
return self._tuple
|
|
278
|
+
|
|
279
|
+
@staticmethod
|
|
280
|
+
def S4():
|
|
281
|
+
""""
|
|
282
|
+
All permutations in S4
|
|
283
|
+
|
|
284
|
+
>>> len(list(Perm4.S4()))
|
|
285
|
+
24
|
|
286
|
+
"""
|
|
287
|
+
for p in S4_tuples:
|
|
288
|
+
yield Perm4(p)
|
|
289
|
+
|
|
290
|
+
@staticmethod
|
|
291
|
+
def A4():
|
|
292
|
+
"""
|
|
293
|
+
All even permutations in A4
|
|
294
|
+
|
|
295
|
+
>>> len(list(Perm4.A4()))
|
|
296
|
+
12
|
|
297
|
+
"""
|
|
298
|
+
for p in A4_tuples:
|
|
299
|
+
yield Perm4(p)
|
|
300
|
+
|
|
301
|
+
@staticmethod
|
|
302
|
+
def KleinFour():
|
|
303
|
+
"""
|
|
304
|
+
Z/2 x Z/2 as a subgroup of A4.
|
|
305
|
+
|
|
306
|
+
>>> len(list(Perm4.KleinFour()))
|
|
307
|
+
4
|
|
308
|
+
"""
|
|
309
|
+
for p in KleinFour_tuples:
|
|
310
|
+
yield Perm4(p)
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
inverse_by_index = {k:Perm4(v) for k, v in index_of_inverse_by_index.items()}
|
|
314
|
+
mult_table_by_index = {k:Perm4(v) for k, v in index_mult_table_by_index.items()}
|
|
315
|
+
|
|
316
|
+
__all__ = ["Perm4", "inv"]
|
|
317
|
+
|
|
318
|
+
if __name__ == '__main__':
|
|
319
|
+
import doctest
|
|
320
|
+
doctest.testmod()
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from distutils.core import setup
|
|
2
|
+
|
|
3
|
+
setup(
|
|
4
|
+
name="t3m",
|
|
5
|
+
version="",
|
|
6
|
+
description="Tinker toys for topologists",
|
|
7
|
+
author="Marc Culler and Nathan Dunfield",
|
|
8
|
+
author_email="culler@math.uic.edu, dunfield@caltech.edu",
|
|
9
|
+
url="http://www.math.uic.edu/~t3m",
|
|
10
|
+
packages=['t3m'],
|
|
11
|
+
package_dir={'t3m': ''}
|
|
12
|
+
)
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# $Id: simplex.py,v 1.4 2010/07/12 21:14:01 t3m 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
|
+
# Global definitions dealing with simplices
|
|
10
|
+
SimplexError = 'Error'
|
|
11
|
+
|
|
12
|
+
# The subsimplices of a 3-simplex correspond to the subsets of a 4
|
|
13
|
+
# element set. A subset of a 4-element set is represented as a bitmap
|
|
14
|
+
# by a binary number between 0 and 15. We name the subsets as
|
|
15
|
+
# follows:
|
|
16
|
+
|
|
17
|
+
N = 0 # 0000
|
|
18
|
+
V0 = 1 # 0001
|
|
19
|
+
V1 = 2 # 0010
|
|
20
|
+
E01 = 3 # 0011 <-----|
|
|
21
|
+
V2 = 4 # 0100 |
|
|
22
|
+
E02 = 5 # 0101 <---| |
|
|
23
|
+
E21 = 6 # 0110 <-| | |
|
|
24
|
+
F3 = 7 # 0111 | | |
|
|
25
|
+
V3 = 8 # 1000 | | | Opposite edges
|
|
26
|
+
E03 = 9 # 1001 <-| | |
|
|
27
|
+
E13 = 10 # 1010 <---| |
|
|
28
|
+
F2 = 11 # 1011 |
|
|
29
|
+
E32 = 12 # 1100 <-----|
|
|
30
|
+
F1 = 13 # 1101
|
|
31
|
+
F0 = 14 # 1110
|
|
32
|
+
T = 15 # 1111
|
|
33
|
+
|
|
34
|
+
# User-friendly?
|
|
35
|
+
|
|
36
|
+
E10 = 3
|
|
37
|
+
E20 = 5
|
|
38
|
+
E12 = 6
|
|
39
|
+
E30 = 9
|
|
40
|
+
E31 = 10
|
|
41
|
+
E23 = 12
|
|
42
|
+
|
|
43
|
+
# Generate a bitmap from a tuple of vertices.
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def bitmap(tuple):
|
|
47
|
+
bmap = 0
|
|
48
|
+
for i in tuple:
|
|
49
|
+
bmap = bmap | (1 << i)
|
|
50
|
+
return bmap
|
|
51
|
+
|
|
52
|
+
# This list of subsimplex names can be used for printing.
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
SubsimplexName = ('N', 'V0', 'V1', 'E01', 'V2', 'E02', 'E12', 'F3',
|
|
56
|
+
'V3', 'E03', 'E31', 'F2', 'E23', 'F1', 'F0', 'T')
|
|
57
|
+
|
|
58
|
+
# A simplex is oriented like this:
|
|
59
|
+
# 1
|
|
60
|
+
# /|\
|
|
61
|
+
# / | \
|
|
62
|
+
# / | \
|
|
63
|
+
# 2---|---3
|
|
64
|
+
# \ | /
|
|
65
|
+
# \ | /
|
|
66
|
+
# \|/
|
|
67
|
+
# 0
|
|
68
|
+
#
|
|
69
|
+
# This is the same as SnapPea's default right_handed orientation.
|
|
70
|
+
#
|
|
71
|
+
# Each edge has a default orientation. The edge directions are chosen
|
|
72
|
+
# so that vertex 0 is a source and so that a simplex looks like this
|
|
73
|
+
# when viewed from any edge:
|
|
74
|
+
# *
|
|
75
|
+
# /|\
|
|
76
|
+
# / ^ \
|
|
77
|
+
# / | \
|
|
78
|
+
# *-<-|---*
|
|
79
|
+
# \ | /
|
|
80
|
+
# \ | /
|
|
81
|
+
# \|/
|
|
82
|
+
# *
|
|
83
|
+
|
|
84
|
+
# These dictionaries associate to each edge its initial vertex, terminal
|
|
85
|
+
# vertex, or a tuple containing both.
|
|
86
|
+
|
|
87
|
+
Tail = { E01:V0 , E02:V0 , E21:V2 , E03:V0 , E13:V1 , E32:V3 }
|
|
88
|
+
Head = { E01:V1 , E02:V2 , E21:V1 , E03:V3 , E13:V3 , E32:V2 }
|
|
89
|
+
EdgeTuple = { E01:(0,1), E02:(0,2), E21:(2,1), E03:(0,3), E13:(1,3), E32:(3,2)}
|
|
90
|
+
|
|
91
|
+
# These dictionaries associate to each edge a face containing it. If
|
|
92
|
+
# the terminal vertex of the edge is on top then the associated face
|
|
93
|
+
# is to the right (left, top, bottom) of the edge.
|
|
94
|
+
|
|
95
|
+
# ^
|
|
96
|
+
# /|\
|
|
97
|
+
# / | \ <-T
|
|
98
|
+
# / | \
|
|
99
|
+
# -L-|-R-
|
|
100
|
+
# \ | /
|
|
101
|
+
# \ | / <-B
|
|
102
|
+
# \|/
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
RightFace = { E01:F2 , E02:F3 , E21:F3 , E03:F1 , E13:F2 , E32:F1 }
|
|
106
|
+
LeftFace = { E01:F3 , E02:F1 , E21:F0 , E03:F2 , E13:F0 , E32:F0 }
|
|
107
|
+
TopFace = { E01:F0 , E02:F0 , E21:F2 , E03:F0 , E13:F1 , E32:F3 }
|
|
108
|
+
BottomFace = { E01:F1 , E02:F2 , E21:F1 , E03:F3 , E13:F3 , E32:F2 }
|
|
109
|
+
|
|
110
|
+
# This dictionary associates to each face an edge contained in it.
|
|
111
|
+
|
|
112
|
+
PickAnEdge = { F0:E21 , F1:E23, F2:E03, F3:E01}
|
|
113
|
+
|
|
114
|
+
# This dictionary associates to each edge its opposite edge.
|
|
115
|
+
OppositeEdge = { E01:E23, E02:E13, E03:E12, E12:E03, E13:E02, E23:E01 }
|
|
116
|
+
|
|
117
|
+
# This dictionary associates to each edge a list of the edges which
|
|
118
|
+
# are not opposite to it.
|
|
119
|
+
|
|
120
|
+
AdjacentEdges = { E01:(E02,E03,E12,E13),
|
|
121
|
+
E02:(E01,E03,E12,E23),
|
|
122
|
+
E03:(E01,E02,E13,E23),
|
|
123
|
+
E12:(E01,E02,E13,E23),
|
|
124
|
+
E13:(E01,E03,E12,E23),
|
|
125
|
+
E23:(E02,E03,E12,E13) }
|
|
126
|
+
|
|
127
|
+
# Loops that run through all subsimplices of a given dimension
|
|
128
|
+
# can use these lists of bitmaps as index sets.
|
|
129
|
+
|
|
130
|
+
# A list of all faces:
|
|
131
|
+
TwoSubsimplices = (F0,F1,F2,F3)
|
|
132
|
+
|
|
133
|
+
# A list of all edges:
|
|
134
|
+
OneSubsimplices = (E01,E02,E21,E03,E13,E32)
|
|
135
|
+
|
|
136
|
+
# A list of all vertices:
|
|
137
|
+
ZeroSubsimplices = (V0,V1,V2,V3)
|
|
138
|
+
|
|
139
|
+
# This dictionary maps the bitmap of a face to its index.
|
|
140
|
+
FaceIndex = {F0: 0, F1: 1, F2: 2, F3: 3}
|
|
141
|
+
|
|
142
|
+
# This dictionary maps a directed edge to the tail of its opposite.
|
|
143
|
+
|
|
144
|
+
OppTail = {(V0,V1):V3,(V0,V2):V1,(V0,V3):V2,(V1,V2):V3,(V1,V3):V0,(V2,V3):V1,
|
|
145
|
+
(V1,V0):V2,(V2,V0):V3,(V3,V0):V1,(V2,V1):V0,(V3,V1):V2,(V3,V2):V0}
|
|
146
|
+
|
|
147
|
+
# This dictionary maps each vertex to the three adjacent faces in
|
|
148
|
+
# counter-clockwise order
|
|
149
|
+
FacesAroundVertexCounterclockwise = {
|
|
150
|
+
V0: (F1, F2, F3),
|
|
151
|
+
V1: (F0, F3, F2),
|
|
152
|
+
V2: (F0, F1, F3),
|
|
153
|
+
V3: (F0, F2, F1)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
# This dictionary maps each faces to the three adjacent vertices in
|
|
157
|
+
# counter-clockwise order
|
|
158
|
+
VerticesOfFaceCounterclockwise = {
|
|
159
|
+
F0: (V3, V2, V1),
|
|
160
|
+
F1: (V2, V3, V0),
|
|
161
|
+
F2: (V3, V1, V0),
|
|
162
|
+
F3: (V1, V2, V0)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
# Dimension of a subsimplex
|
|
166
|
+
def dimension(x):
|
|
167
|
+
if x in ZeroSubsimplices:
|
|
168
|
+
return 0
|
|
169
|
+
if x in OneSubsimplices:
|
|
170
|
+
return 1
|
|
171
|
+
if x in TwoSubsimplices:
|
|
172
|
+
return 2
|
|
173
|
+
if x == T:
|
|
174
|
+
return 3
|
|
175
|
+
raise Exception("%r is not a subsimplex" % x)
|
|
176
|
+
|
|
177
|
+
# Decide if the bitmap x represents a subset of the bitmap y
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def is_subset(x, y):
|
|
181
|
+
if (x & y == x):
|
|
182
|
+
return 1
|
|
183
|
+
return 0
|
|
184
|
+
|
|
185
|
+
# Return the complement of a subsimplex
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def comp(subsimplex):
|
|
189
|
+
return ~subsimplex & 0xf
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
EdgeFacePairs = [(edge, face) for face in TwoSubsimplices
|
|
193
|
+
for edge in OneSubsimplices
|
|
194
|
+
if is_subset(edge, face)]
|
|
195
|
+
|
|
196
|
+
# Given and edge and a face, return the other face that meets the edge.
|
|
197
|
+
|
|
198
|
+
flip_face = {(edge, face):(edge | ~face & 0xf)
|
|
199
|
+
for edge, face in EdgeFacePairs}
|