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,109 @@
|
|
|
1
|
+
# $Id: tetrahedron.py,v 1.2 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 .perm4 import Perm4, inv
|
|
11
|
+
|
|
12
|
+
import sys
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Tetrahedron:
|
|
16
|
+
def __init__(self, name=''):
|
|
17
|
+
self.Index = -1
|
|
18
|
+
self.Name = name
|
|
19
|
+
self.Neighbor = {F0:None,F1:None,F2:None,F3:None} # Tetrahedra
|
|
20
|
+
self.Gluing = {F0:None,F1:None,F2:None,F3:None} # Permutations
|
|
21
|
+
self.Class = [None]*16 # list of equivalence classes
|
|
22
|
+
self.Checked = 0 # flag
|
|
23
|
+
|
|
24
|
+
def __repr__(self):
|
|
25
|
+
if self.Index != -1:
|
|
26
|
+
return ( 'tet' + str(self.Index) )
|
|
27
|
+
else:
|
|
28
|
+
return '< floating tetrahedron ' + ' at ' + str(id(self)) + '>'
|
|
29
|
+
|
|
30
|
+
def attach(self, two_subsimplex, tet, perm_data):
|
|
31
|
+
if tet is None:
|
|
32
|
+
self.Neighbor[two_subsimplex] = None
|
|
33
|
+
self.Gluing[two_subsimplex] = None
|
|
34
|
+
else:
|
|
35
|
+
perm = Perm4(perm_data)
|
|
36
|
+
self.Neighbor[two_subsimplex] = tet
|
|
37
|
+
self.Gluing[two_subsimplex] = perm
|
|
38
|
+
tet.Neighbor[perm.image(two_subsimplex)] = self
|
|
39
|
+
tet.Gluing[perm.image(two_subsimplex)] = inv(self.Gluing[two_subsimplex])
|
|
40
|
+
|
|
41
|
+
# Reverse the orientation. Vertices are relabelled by a transposition
|
|
42
|
+
# and gluings are adjusted.
|
|
43
|
+
def reverse(self):
|
|
44
|
+
transpo = Perm4((1, 0, 2, 3))
|
|
45
|
+
nhbr = self.Neighbor.copy()
|
|
46
|
+
gluing = self.Gluing.copy()
|
|
47
|
+
for two_subsimplex in TwoSubsimplices:
|
|
48
|
+
relabeled = transpo.image(two_subsimplex)
|
|
49
|
+
if nhbr[two_subsimplex] is not None:
|
|
50
|
+
perm = (gluing[two_subsimplex] * transpo).tuple()
|
|
51
|
+
else:
|
|
52
|
+
perm = None
|
|
53
|
+
self.attach(relabeled, nhbr[two_subsimplex], perm)
|
|
54
|
+
|
|
55
|
+
# Unglues and removes references to self from neighbor.
|
|
56
|
+
def detach(self, two_subsimplex):
|
|
57
|
+
neighbor = self.Neighbor[two_subsimplex]
|
|
58
|
+
if neighbor is None:
|
|
59
|
+
return
|
|
60
|
+
neighbors_subsimplex = self.Gluing[two_subsimplex].image(two_subsimplex)
|
|
61
|
+
self.Neighbor[two_subsimplex] = None
|
|
62
|
+
self.Gluing[two_subsimplex] = None
|
|
63
|
+
if (neighbor.Neighbor and
|
|
64
|
+
neighbor.Neighbor[neighbors_subsimplex] == self):
|
|
65
|
+
neighbor.Neighbor[neighbors_subsimplex] = None
|
|
66
|
+
neighbor.Gluing[neighbors_subsimplex] = None
|
|
67
|
+
|
|
68
|
+
def erase(self):
|
|
69
|
+
for two_subsimplex in TwoSubsimplices:
|
|
70
|
+
self.detach(two_subsimplex)
|
|
71
|
+
self.Index = -1
|
|
72
|
+
self.Neighbor = None
|
|
73
|
+
self.Gluing = None
|
|
74
|
+
self.clear_Class()
|
|
75
|
+
|
|
76
|
+
def clear_Class(self):
|
|
77
|
+
self.Class = [None]*16 # list of equivalence classes
|
|
78
|
+
|
|
79
|
+
def info(self, out=sys.stdout):
|
|
80
|
+
if len(self.Name) == 0:
|
|
81
|
+
out.write(repr(self) + "\t%s\n" %
|
|
82
|
+
([self.Neighbor.get(s) for s in TwoSubsimplices]))
|
|
83
|
+
else:
|
|
84
|
+
out.write(repr(self) + " ( " + self.Name + " )\n")
|
|
85
|
+
out.write("\t%s\n" % ([self.Neighbor.get(s) for s in TwoSubsimplices]))
|
|
86
|
+
|
|
87
|
+
out.write("\t%s\n" % ([self.Gluing.get(s) for s in TwoSubsimplices]))
|
|
88
|
+
|
|
89
|
+
out.write("\tVertices: " + repr(self.Class[V0])
|
|
90
|
+
+ repr(self.Class[V1])
|
|
91
|
+
+ repr(self.Class[V2])
|
|
92
|
+
+ repr(self.Class[V3]) + '\n')
|
|
93
|
+
|
|
94
|
+
if self.Index > -1:
|
|
95
|
+
s = ""
|
|
96
|
+
for edge in OneSubsimplices[:3]:
|
|
97
|
+
s = (s + "%s : %-10s " %
|
|
98
|
+
(SubsimplexName[edge], self.Class[edge]))
|
|
99
|
+
out.write("\tEdges: " + s + '\n')
|
|
100
|
+
s = ""
|
|
101
|
+
for edge in OneSubsimplices[3:]:
|
|
102
|
+
s = (s + "%s : %-10s " %
|
|
103
|
+
(SubsimplexName[edge], self.Class[edge]))
|
|
104
|
+
out.write("\t " + s + '\n')
|
|
105
|
+
|
|
106
|
+
# Below added 7/12/99 by NMD
|
|
107
|
+
|
|
108
|
+
def get_orientation_of_edge(self, a, b):
|
|
109
|
+
return self.Class[a | b].orientation_with_respect_to(self, a, b)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# $Id: vertex.py,v 1.3 2003/03/07 17:29:28 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
|
+
class Vertex:
|
|
10
|
+
def __init__(self):
|
|
11
|
+
self.Index = -1
|
|
12
|
+
self.IntOrBdry = ''
|
|
13
|
+
self.Corners = [] # Corners of type "0-simplex in Tetrahedron"
|
|
14
|
+
self.Edges = [] # incident Edges
|
|
15
|
+
# An Edge will appear twice if both its endpoints
|
|
16
|
+
# are equal to this Vertex
|
|
17
|
+
|
|
18
|
+
def __repr__(self):
|
|
19
|
+
if self.Index > -1:
|
|
20
|
+
return ('v' + str(self.Index)
|
|
21
|
+
+ ' (' + self.IntOrBdry + ') ')
|
|
22
|
+
else:
|
|
23
|
+
return '< floating vertex' + str(id(self)) + ' >'
|
|
24
|
+
|
|
25
|
+
def erase(self):
|
|
26
|
+
for corner in self.Corners:
|
|
27
|
+
corner.Tetrahedron.Class[corner.Subsimplex] = None
|
|
28
|
+
for edge in self.Edges:
|
|
29
|
+
try:
|
|
30
|
+
edge.Vertices.remove(self)
|
|
31
|
+
except:
|
|
32
|
+
pass
|
|
33
|
+
self.Index = -1
|
|
34
|
+
|
|
35
|
+
def link_genus(self):
|
|
36
|
+
# The link of a vertex in an Mcomplex is a surface
|
|
37
|
+
# of arbitrary genus, possibly with non-empty boundary.
|
|
38
|
+
# For now I am pretending that links are closed and orientable
|
|
39
|
+
sum = 12
|
|
40
|
+
for edge in self.Edges:
|
|
41
|
+
sum = sum - 6 + edge.valence()
|
|
42
|
+
return sum//12
|
snappy/snap/test.py
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
from snappy import testing
|
|
2
|
+
import snappy
|
|
3
|
+
|
|
4
|
+
from snappy.sage_helper import _within_sage
|
|
5
|
+
from snappy.pari import pari
|
|
6
|
+
|
|
7
|
+
from snappy import snap
|
|
8
|
+
|
|
9
|
+
modules = [
|
|
10
|
+
snap,
|
|
11
|
+
snap.t3mlite.linalg,
|
|
12
|
+
snap.t3mlite.mcomplex,
|
|
13
|
+
snap.t3mlite.perm4,
|
|
14
|
+
snap.t3mlite.spun,
|
|
15
|
+
snap.character_varieties,
|
|
16
|
+
snap.nsagetools,
|
|
17
|
+
snap.slice_obs_HKL.basics,
|
|
18
|
+
snap.slice_obs_HKL.poly_norm,
|
|
19
|
+
snap.slice_obs_HKL.rep_theory,
|
|
20
|
+
snap.slice_obs_HKL.direct,
|
|
21
|
+
snap.slice_obs_HKL,
|
|
22
|
+
snap.fox_milnor,
|
|
23
|
+
snap.polished_reps,
|
|
24
|
+
snap.interval_reps,
|
|
25
|
+
snap.fundamental_polyhedron,
|
|
26
|
+
snap.peripheral.dual_cellulation,
|
|
27
|
+
snap.peripheral.link,
|
|
28
|
+
snap.peripheral.peripheral
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
def run_doctests(verbose=False, print_info=True):
|
|
32
|
+
globs = {'Manifold':snappy.Manifold,
|
|
33
|
+
'ManifoldHP':snappy.ManifoldHP,
|
|
34
|
+
'Triangulation':snappy.Triangulation,
|
|
35
|
+
'Mcomplex':snappy.snap.t3mlite.Mcomplex,
|
|
36
|
+
'LinkSurface':snappy.snap.peripheral.link.LinkSurface}
|
|
37
|
+
return testing.doctest_modules(modules,
|
|
38
|
+
verbose=verbose,
|
|
39
|
+
print_info=print_info,
|
|
40
|
+
extraglobs=globs)
|
|
41
|
+
|
|
42
|
+
run_doctests.__name__ = snap.__name__
|
|
43
|
+
|
|
44
|
+
def _test_gluing_equations(manifold, shapes):
|
|
45
|
+
"""
|
|
46
|
+
Given a manifold and exact shapes, test whether the rectangular gluing
|
|
47
|
+
equations are fulfilled.
|
|
48
|
+
"""
|
|
49
|
+
one_minus_shapes = [1 - shape for shape in shapes]
|
|
50
|
+
for A, B, c in manifold.gluing_equations('rect'):
|
|
51
|
+
val = c
|
|
52
|
+
for a, shape in zip(A, shapes):
|
|
53
|
+
val *= shape ** a
|
|
54
|
+
for b, one_minus_shape in zip(B, one_minus_shapes):
|
|
55
|
+
val *= one_minus_shape ** b
|
|
56
|
+
if not val == 1:
|
|
57
|
+
return False
|
|
58
|
+
return True
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_polished(dec_prec=200):
|
|
62
|
+
def test_manifold(manifold):
|
|
63
|
+
eqns = manifold.gluing_equations('rect')
|
|
64
|
+
shapes = manifold.tetrahedra_shapes('rect', dec_prec=dec_prec)
|
|
65
|
+
return snap.shapes.gluing_equation_error(eqns, shapes)
|
|
66
|
+
|
|
67
|
+
def test_census(name, census):
|
|
68
|
+
manifolds = list(census)
|
|
69
|
+
print('Checking gluing equations for %d %s manifolds' % (len(manifolds), name))
|
|
70
|
+
max_error = pari(0)
|
|
71
|
+
for i, M in enumerate(manifolds):
|
|
72
|
+
max_error = max(max_error, test_manifold(M))
|
|
73
|
+
print('\r ' + repr( (i, M) ).ljust(35) + ' Max error so far: %.2g' % float(max_error), end='')
|
|
74
|
+
print()
|
|
75
|
+
|
|
76
|
+
test_census('cusped census', snappy.OrientableCuspedCensus(filter='cusps>1')[-100:])
|
|
77
|
+
test_census('closed census', snappy.OrientableClosedCensus()[-100:])
|
|
78
|
+
test_census('4-component links', [M for M in snappy.LinkExteriors(num_cusps=4) if M.solution_type() == 'all tetrahedra positively oriented'])
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def test_holonomy(dec_prec=200):
|
|
82
|
+
def test_manifold(manifold):
|
|
83
|
+
# This has several internal checks which raise exceptions
|
|
84
|
+
# if something is amiss
|
|
85
|
+
G = snap.polished_holonomy(manifold, dec_prec=dec_prec)
|
|
86
|
+
|
|
87
|
+
for census in [snappy.OrientableCuspedCensus, snappy.OrientableClosedCensus]:
|
|
88
|
+
print('Testing holonomy of 100 manifolds in ', census)
|
|
89
|
+
for manifold in census()[-100:]:
|
|
90
|
+
test_manifold(manifold)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def test_fields(bits_prec=200, degree=20):
|
|
94
|
+
for census in [snappy.OrientableCuspedCensus, snappy.OrientableClosedCensus]:
|
|
95
|
+
print('Fields of 100 manifolds in ', census)
|
|
96
|
+
for manifold in census()[:100]:
|
|
97
|
+
S = snap.tetrahedra_field_gens(manifold)
|
|
98
|
+
Tr = snap.trace_field_gens(manifold)
|
|
99
|
+
InvTr = snap.trace_field_gens(manifold)
|
|
100
|
+
hol = snap.holonomy_matrix_entries(manifold)
|
|
101
|
+
for kind, X in [('shapes', S),
|
|
102
|
+
('trace', Tr),
|
|
103
|
+
('invtrace', InvTr),
|
|
104
|
+
('hol', hol)]:
|
|
105
|
+
K = X.find_field(bits_prec, degree)
|
|
106
|
+
if K is None:
|
|
107
|
+
print('Problem with', manifold, kind)
|
|
108
|
+
else:
|
|
109
|
+
if kind == 'shapes':
|
|
110
|
+
# Field is a sage number field, shapes are polynomials
|
|
111
|
+
field, numerical_root, shapes = K
|
|
112
|
+
# Turn the polynomials expressing the shapes in the
|
|
113
|
+
# root of the number field into expressions in the
|
|
114
|
+
# number field
|
|
115
|
+
shapes = [ field(shape) for shape in shapes ]
|
|
116
|
+
if not _test_gluing_equations(manifold, shapes):
|
|
117
|
+
print('Problem with', manifold,
|
|
118
|
+
'(gluing equations violated)')
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def test_ZHS(bits_prec=500, degree=20):
|
|
122
|
+
for manifold in snappy.OrientableClosedCensus:
|
|
123
|
+
if manifold.homology().order() == 1:
|
|
124
|
+
T = snap.trace_field_gens(manifold)
|
|
125
|
+
ans = T.find_field(bits_prec, degree, True)
|
|
126
|
+
if ans:
|
|
127
|
+
print(manifold, ans[0].polynomial())
|
|
128
|
+
else:
|
|
129
|
+
print(manifold, ans)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def big_test():
|
|
133
|
+
test_polished()
|
|
134
|
+
if _within_sage:
|
|
135
|
+
test_holonomy()
|
|
136
|
+
test_fields()
|
|
137
|
+
|
|
138
|
+
if __name__ == '__main__':
|
|
139
|
+
testing.run_doctests_as_main(run_doctests)
|
snappy/snap/utilities.py
ADDED
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"""A collection of Python classes and objects which emulate various
|
|
2
|
+
features of Sage; the purpose of these is to allow some of the
|
|
3
|
+
snappy.snap tools to be used in an environment where Sage is not
|
|
4
|
+
available, such as in the SnapPy GUI or in a Windows python
|
|
5
|
+
interpreter.
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from ..sage_helper import _within_sage
|
|
10
|
+
from snappy.number import SnapPyNumbers, Number
|
|
11
|
+
from itertools import chain
|
|
12
|
+
from ..pari import pari, PariError
|
|
13
|
+
from .fundamental_polyhedron import Infinity
|
|
14
|
+
if _within_sage:
|
|
15
|
+
from ..sage_helper import matrix as sage_matrix, vector as sage_vector
|
|
16
|
+
from ..sage_helper import RealField_class, ComplexField_class
|
|
17
|
+
|
|
18
|
+
def is_field(R):
|
|
19
|
+
return isinstance(R, (SnapPyNumbers, RealField_class,
|
|
20
|
+
ComplexField_class))
|
|
21
|
+
else:
|
|
22
|
+
def is_field(R):
|
|
23
|
+
return isinstance(R, SnapPyNumbers)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class MatrixBase():
|
|
27
|
+
"""Base class for Vector2 and Matrix2x2. Do not instantiate."""
|
|
28
|
+
_base_ring = None
|
|
29
|
+
|
|
30
|
+
def __len__(self):
|
|
31
|
+
return 2
|
|
32
|
+
|
|
33
|
+
def _pari_(self):
|
|
34
|
+
# force left multiplication by Numbers to use rmul
|
|
35
|
+
raise PariError
|
|
36
|
+
|
|
37
|
+
def base_ring(self):
|
|
38
|
+
"""If a base ring was set when initializing the matrix, then this
|
|
39
|
+
method will return that ring. Otherwise, the base ring is a
|
|
40
|
+
SnapPyNumbers object whose precision is the maximum precision
|
|
41
|
+
of the elements. If a new Number is created using the computed
|
|
42
|
+
base ring and combined with the entries of this matrix, then the
|
|
43
|
+
precision of the result will be determined by the precisions of
|
|
44
|
+
the entries.
|
|
45
|
+
"""
|
|
46
|
+
if self._base_ring:
|
|
47
|
+
return self._base_ring
|
|
48
|
+
else:
|
|
49
|
+
precision = max([x.prec() for x in self.list()])
|
|
50
|
+
return SnapPyNumbers(precision=precision)
|
|
51
|
+
|
|
52
|
+
def list(self):
|
|
53
|
+
# Override this
|
|
54
|
+
return []
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class Vector2(MatrixBase):
|
|
58
|
+
"""A 2-dimensional vector whose entries are snappy Numbers."""
|
|
59
|
+
def __init__(self, *args):
|
|
60
|
+
if is_field(args[0]):
|
|
61
|
+
self._base_ring = number = SnapPyNumbers(args[0].precision())
|
|
62
|
+
args = args[1:]
|
|
63
|
+
else:
|
|
64
|
+
self._base_ring = None
|
|
65
|
+
number = Number
|
|
66
|
+
if len(args) == 1:
|
|
67
|
+
args = args[0]
|
|
68
|
+
if len(args) == 2:
|
|
69
|
+
self.x, self.y = (number(t) for t in args)
|
|
70
|
+
else:
|
|
71
|
+
raise ValueError('Invalid initialization for a Vector2.')
|
|
72
|
+
|
|
73
|
+
def __getitem__(self, index):
|
|
74
|
+
if index == 0:
|
|
75
|
+
return self.x
|
|
76
|
+
elif index == 1:
|
|
77
|
+
return self.y
|
|
78
|
+
else:
|
|
79
|
+
raise IndexError('Invalid Vector2 index.')
|
|
80
|
+
|
|
81
|
+
def __repr__(self):
|
|
82
|
+
entries = [str(e) for e in self.list()]
|
|
83
|
+
size = max(map(len, entries))
|
|
84
|
+
entries = tuple(('%%-%d.%ds' % (size, size)) % x for x in entries)
|
|
85
|
+
return '[ %s ]\n[ %s ]' % entries
|
|
86
|
+
|
|
87
|
+
def __add__(self, other):
|
|
88
|
+
return Vector2(self.x + other.x, self.y + other.y)
|
|
89
|
+
|
|
90
|
+
def __sub__(self, other):
|
|
91
|
+
return Vector2(self.x - other.x, self.y - other.y)
|
|
92
|
+
|
|
93
|
+
def __mul__(self, other):
|
|
94
|
+
if isinstance(other, Matrix2x2):
|
|
95
|
+
return Vector2(self.x * other.a + self.y * other.c,
|
|
96
|
+
self.x * other.b + self.y * other.d)
|
|
97
|
+
if isinstance(other, Number):
|
|
98
|
+
return Vector2(self.x * other, self.y * other)
|
|
99
|
+
try:
|
|
100
|
+
return self * self.base_ring()(other)
|
|
101
|
+
except (TypeError, ValueError):
|
|
102
|
+
return NotImplemented
|
|
103
|
+
|
|
104
|
+
def __rmul__(self, other):
|
|
105
|
+
return Vector2(self.x * other, self.y * other)
|
|
106
|
+
|
|
107
|
+
def __div__(self, other):
|
|
108
|
+
return Vector2(self.x / other, self.y / other)
|
|
109
|
+
|
|
110
|
+
def __truediv__(self, other):
|
|
111
|
+
return Vector2(self.x / other, self.y / other)
|
|
112
|
+
|
|
113
|
+
def __neg__(self):
|
|
114
|
+
return Vector2(-self.x, -self.y)
|
|
115
|
+
|
|
116
|
+
def list(self):
|
|
117
|
+
return [self.x, self.y]
|
|
118
|
+
|
|
119
|
+
def sage(self):
|
|
120
|
+
return sage_vector([self.x.sage(), self.y.sage()])
|
|
121
|
+
|
|
122
|
+
def norm(self, p=2):
|
|
123
|
+
if p == 1:
|
|
124
|
+
return self.x.abs() + self.y.abs()
|
|
125
|
+
if p == 2:
|
|
126
|
+
return ((self.x * self.x).abs() + (self.y * self.y).abs()).sqrt()
|
|
127
|
+
if p == Infinity:
|
|
128
|
+
return max(self.x.abs(), self.y.abs())
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class Matrix2x2(MatrixBase):
|
|
132
|
+
"""A 2x2 matrix class whose entries are snappy Numbers."""
|
|
133
|
+
def __init__(self, *args):
|
|
134
|
+
if is_field(args[0]):
|
|
135
|
+
self._base_ring = number = SnapPyNumbers(args[0].precision())
|
|
136
|
+
args = args[1:]
|
|
137
|
+
else:
|
|
138
|
+
self._base_ring = None
|
|
139
|
+
number = Number
|
|
140
|
+
if len(args) == 1:
|
|
141
|
+
args = tuple(chain(*args[0]))
|
|
142
|
+
if len(args) == 4:
|
|
143
|
+
self.a, self.b, self.c, self.d = (number(x) for x in args)
|
|
144
|
+
else:
|
|
145
|
+
raise ValueError('Invalid initialization for a Matrix2x2.')
|
|
146
|
+
|
|
147
|
+
def __repr__(self):
|
|
148
|
+
entries = [str(e) for e in self.list()]
|
|
149
|
+
size = max(map(len, entries))
|
|
150
|
+
entries = tuple(('%%-%d.%ds' % (size, size)) % x for x in entries)
|
|
151
|
+
return '[ %s %s ]\n[ %s %s ]' % entries
|
|
152
|
+
|
|
153
|
+
def __getitem__(self, index):
|
|
154
|
+
if isinstance(index, int):
|
|
155
|
+
if index == 0:
|
|
156
|
+
return [self.a, self.b]
|
|
157
|
+
if index == 1:
|
|
158
|
+
return [self.c, self.d]
|
|
159
|
+
elif isinstance(index, tuple) and len(index) == 2:
|
|
160
|
+
i, j = index
|
|
161
|
+
if i == 0:
|
|
162
|
+
return self.a if j == 0 else self.b
|
|
163
|
+
if i == 1:
|
|
164
|
+
return self.c if j == 0 else self.d
|
|
165
|
+
raise IndexError('Invalid 2x2 matrix index.')
|
|
166
|
+
|
|
167
|
+
def __add__(self, other):
|
|
168
|
+
return Matrix2x2(self.a + other.a,
|
|
169
|
+
self.b + other.b,
|
|
170
|
+
self.c + other.c,
|
|
171
|
+
self.d + other.d)
|
|
172
|
+
|
|
173
|
+
def __sub__(self, other):
|
|
174
|
+
return Matrix2x2(self.a - other.a,
|
|
175
|
+
self.b - other.b,
|
|
176
|
+
self.c - other.c,
|
|
177
|
+
self.d - other.d)
|
|
178
|
+
|
|
179
|
+
def __mul__(self, other):
|
|
180
|
+
if isinstance(other, Matrix2x2):
|
|
181
|
+
return Matrix2x2(self.a * other.a + self.b * other.c,
|
|
182
|
+
self.a * other.b + self.b * other.d,
|
|
183
|
+
self.c * other.a + self.d * other.c,
|
|
184
|
+
self.c * other.b + self.d * other.d)
|
|
185
|
+
if isinstance(other, Vector2):
|
|
186
|
+
return Vector2(self.a * other.x + self.b * other.y,
|
|
187
|
+
self.c * other.x + self.d * other.y)
|
|
188
|
+
if isinstance(other, Number):
|
|
189
|
+
return Matrix2x2(self.a * other, self.b * other,
|
|
190
|
+
self.c * other, self.d * other)
|
|
191
|
+
try:
|
|
192
|
+
return self * self.base_ring()(other)
|
|
193
|
+
except (TypeError, ValueError):
|
|
194
|
+
return NotImplemented
|
|
195
|
+
|
|
196
|
+
def __rmul__(self, other):
|
|
197
|
+
# Assumes that other is a scalar. This will not be
|
|
198
|
+
# called when left multiplying by a Matrix2x2
|
|
199
|
+
return Matrix2x2(self.a * other, self.b * other,
|
|
200
|
+
self.c * other, self.d * other)
|
|
201
|
+
|
|
202
|
+
def __div__(self, other):
|
|
203
|
+
# Assumes that other is a scalar.
|
|
204
|
+
return Matrix2x2(self.a / other, self.b / other,
|
|
205
|
+
self.c / other, self.d / other)
|
|
206
|
+
|
|
207
|
+
def __truediv__(self, other):
|
|
208
|
+
# Assumes that other is a scalar.
|
|
209
|
+
return Matrix2x2(self.a / other, self.b / other,
|
|
210
|
+
self.c / other, self.d / other)
|
|
211
|
+
|
|
212
|
+
def __neg__(self):
|
|
213
|
+
return Matrix2x2(-self.a, -self.b, -self.c, -self.d)
|
|
214
|
+
|
|
215
|
+
def __invert__(self):
|
|
216
|
+
try:
|
|
217
|
+
D = 1 / self.det()
|
|
218
|
+
except ZeroDivisionError:
|
|
219
|
+
raise ZeroDivisionError('matrix %s is not invertible.' % self)
|
|
220
|
+
return Matrix2x2(self.d * D, -self.b * D, -self.c * D, self.a * D)
|
|
221
|
+
|
|
222
|
+
def adjoint(self):
|
|
223
|
+
return Matrix2x2(self.d, -self.b, -self.c, self.a)
|
|
224
|
+
|
|
225
|
+
def determinant(self):
|
|
226
|
+
return self.a * self.d - self.b * self.c
|
|
227
|
+
|
|
228
|
+
det = determinant
|
|
229
|
+
|
|
230
|
+
def trace(self):
|
|
231
|
+
return self.a + self.d
|
|
232
|
+
|
|
233
|
+
def eigenvalues(self):
|
|
234
|
+
# WARNING: This can take infinitely long!!!! (WHY???)
|
|
235
|
+
R = self.base_ring()
|
|
236
|
+
x = pari('x')
|
|
237
|
+
a, b, c, d = map(pari, self.list())
|
|
238
|
+
p = x * x - (a + d) * x + (a * d - b * c)
|
|
239
|
+
roots = p.polroots(precision=R.precision())
|
|
240
|
+
return map(R, roots)
|
|
241
|
+
|
|
242
|
+
def norm(self, p=2):
|
|
243
|
+
if p == 1:
|
|
244
|
+
return max(self.a.abs() + self.c.abs(), self.b.abs() + self.d.abs())
|
|
245
|
+
if p == 'frob':
|
|
246
|
+
return sum([x * x for x in self.list()]).sqrt()
|
|
247
|
+
if p == Infinity:
|
|
248
|
+
return max(self.a.abs() + self.b.abs(), self.c.abs() + self.d.abs())
|
|
249
|
+
if p == 2:
|
|
250
|
+
return max([x.abs() for x in self.eigenvalues()])
|
|
251
|
+
|
|
252
|
+
def list(self):
|
|
253
|
+
return [self.a, self.b, self.c, self.d]
|
|
254
|
+
|
|
255
|
+
def rows(self):
|
|
256
|
+
return [Vector2(self.base_ring(), self.a, self.b),
|
|
257
|
+
Vector2(self.base_ring(), self.a, self.b)]
|
|
258
|
+
|
|
259
|
+
def sage(self):
|
|
260
|
+
return sage_matrix(2, 2, [x.sage() for x in self.list()])
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def indexset(n):
|
|
264
|
+
"""The orders of the non-zero bits in the binary expansion of n."""
|
|
265
|
+
i = 0
|
|
266
|
+
result = []
|
|
267
|
+
while True:
|
|
268
|
+
mask = 1 << i
|
|
269
|
+
if n & mask:
|
|
270
|
+
result.append(i)
|
|
271
|
+
if n < mask:
|
|
272
|
+
break
|
|
273
|
+
i += 1
|
|
274
|
+
return result
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def powerset(X):
|
|
278
|
+
"""Iterator for all finite subsequences of the iterable X"""
|
|
279
|
+
n = 0
|
|
280
|
+
segment = []
|
|
281
|
+
for x in X:
|
|
282
|
+
segment.append(x)
|
|
283
|
+
while True:
|
|
284
|
+
try:
|
|
285
|
+
yield [segment[i] for i in indexset(n)]
|
|
286
|
+
except IndexError:
|
|
287
|
+
break
|
|
288
|
+
n += 1
|