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,122 @@
|
|
|
1
|
+
from snappy.snap import t3mlite as t3m
|
|
2
|
+
|
|
3
|
+
from truncatedComplex import *
|
|
4
|
+
|
|
5
|
+
class OneVertexTruncatedComplex(TruncatedComplex):
|
|
6
|
+
|
|
7
|
+
def __init__(self, hyperbolic_structure):
|
|
8
|
+
super().__init__(
|
|
9
|
+
hyperbolic_structure.mcomplex)
|
|
10
|
+
|
|
11
|
+
self.hyperbolic_structure = hyperbolic_structure
|
|
12
|
+
|
|
13
|
+
if len(hyperbolic_structure.mcomplex.Vertices) != 1:
|
|
14
|
+
raise Exception("Expected one vertex triangulation")
|
|
15
|
+
|
|
16
|
+
self._compute_shortest_paths()
|
|
17
|
+
self._compute_loops()
|
|
18
|
+
self._check_consistency()
|
|
19
|
+
self._compute_matrices_for_loops()
|
|
20
|
+
self._compute_fixed_pts()
|
|
21
|
+
|
|
22
|
+
def _compute_shortest_paths(self):
|
|
23
|
+
|
|
24
|
+
base_tet_and_perm = (0, t3m.Perm4([0,1,2,3]))
|
|
25
|
+
|
|
26
|
+
self.tet_and_perm_to_edge = {
|
|
27
|
+
self.get_key(base_tet_and_perm) : None
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
pending = [ base_tet_and_perm ]
|
|
31
|
+
|
|
32
|
+
self.alpha_edges = [ None for edge in self.mcomplex.Edges ]
|
|
33
|
+
|
|
34
|
+
while pending:
|
|
35
|
+
tet_and_perm = pending.pop()
|
|
36
|
+
|
|
37
|
+
edge_index, edge_end = (
|
|
38
|
+
self.get_edge_index_and_end_from_tet_and_perm(
|
|
39
|
+
tet_and_perm))
|
|
40
|
+
|
|
41
|
+
if edge_end == 0 and self.alpha_edges[edge_index] is None:
|
|
42
|
+
self.alpha_edges[edge_index] = TruncatedComplex.Edge(
|
|
43
|
+
'alpha', tet_and_perm)
|
|
44
|
+
|
|
45
|
+
for edge in self.get_edges_for_tet_and_perm(tet_and_perm):
|
|
46
|
+
|
|
47
|
+
if edge.subcomplex_type != 'alpha':
|
|
48
|
+
|
|
49
|
+
tet_and_perm_of_end = edge.tet_and_perm_of_end()
|
|
50
|
+
|
|
51
|
+
key = self.get_key(tet_and_perm_of_end)
|
|
52
|
+
|
|
53
|
+
if key not in self.tet_and_perm_to_edge:
|
|
54
|
+
self.tet_and_perm_to_edge[key] = edge
|
|
55
|
+
pending.append(tet_and_perm_of_end)
|
|
56
|
+
|
|
57
|
+
def _compute_shortest_path(self, tet_and_perm):
|
|
58
|
+
|
|
59
|
+
result = []
|
|
60
|
+
|
|
61
|
+
while True:
|
|
62
|
+
key = self.get_key(tet_and_perm)
|
|
63
|
+
|
|
64
|
+
edge = self.tet_and_perm_to_edge[key]
|
|
65
|
+
if edge is None:
|
|
66
|
+
return result[::-1]
|
|
67
|
+
|
|
68
|
+
result.append(edge)
|
|
69
|
+
tet_and_perm = edge.tet_and_perm
|
|
70
|
+
|
|
71
|
+
@staticmethod
|
|
72
|
+
def _reverse_path(path):
|
|
73
|
+
return [ edge.reverse() for edge in path[::-1] ]
|
|
74
|
+
|
|
75
|
+
def _compute_loop(self, alpha_edge):
|
|
76
|
+
|
|
77
|
+
s = alpha_edge.tet_and_perm
|
|
78
|
+
path_to_s = self._compute_shortest_path(s)
|
|
79
|
+
|
|
80
|
+
e = alpha_edge.tet_and_perm_of_end()
|
|
81
|
+
path_to_e = self._compute_shortest_path(e)
|
|
82
|
+
path_from_e = OneVertexTruncatedComplex._reverse_path(path_to_e)
|
|
83
|
+
|
|
84
|
+
return path_to_s + [ alpha_edge ] + path_from_e
|
|
85
|
+
|
|
86
|
+
def _compute_loops(self):
|
|
87
|
+
self.loops = [ self._compute_loop(alpha_edge)
|
|
88
|
+
for alpha_edge in self.alpha_edges ]
|
|
89
|
+
|
|
90
|
+
def _check_consistency(self):
|
|
91
|
+
|
|
92
|
+
for loop in self.loops:
|
|
93
|
+
self.check_loop(loop)
|
|
94
|
+
|
|
95
|
+
def _compute_matrices_for_loops(self):
|
|
96
|
+
def _to_psl(m):
|
|
97
|
+
return m / m.determinant().sqrt()
|
|
98
|
+
|
|
99
|
+
self.matrix_for_loops = [
|
|
100
|
+
_to_psl(self.hyperbolic_structure.pgl2_matrix_for_path(loop))
|
|
101
|
+
for loop in self.loops ]
|
|
102
|
+
|
|
103
|
+
def _compute_fixed_pts(self):
|
|
104
|
+
self.fixed_pts_for_loops = [
|
|
105
|
+
_fixed_points(m) for m in self.matrix_for_loops ]
|
|
106
|
+
|
|
107
|
+
def _fixed_points(m):
|
|
108
|
+
# (a * z + b) = z * (c * z + d)
|
|
109
|
+
# z^2 + (d - a) / c * z - b / c = 0
|
|
110
|
+
|
|
111
|
+
# p' = (a - d) / 2 * c
|
|
112
|
+
# q = - b / c
|
|
113
|
+
|
|
114
|
+
# p' +/- sqrt( p'^2 - q ) = -p' +/- sqrt(p'^2 + b / c)
|
|
115
|
+
|
|
116
|
+
cinv = 1 / m[1, 0]
|
|
117
|
+
|
|
118
|
+
p = (m[0,0] - m[1,1]) * cinv / 2
|
|
119
|
+
d = p ** 2 + m[0,1] * cinv
|
|
120
|
+
|
|
121
|
+
s = d.sqrt()
|
|
122
|
+
return [p - s, p + s]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Directory to find orb binary
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from .hyperbolicStructure import HyperbolicStructure
|
|
2
|
+
|
|
3
|
+
from .verificationError import *
|
|
4
|
+
|
|
5
|
+
from sage.all import vector, RealDoubleField, sqrt
|
|
6
|
+
|
|
7
|
+
__all__ = ['compute_approx_hyperbolic_structure_from_vertex_gram_matrix_file']
|
|
8
|
+
|
|
9
|
+
def normalize_gram_matrix(m):
|
|
10
|
+
for i in range(4):
|
|
11
|
+
if not (m[i][i] < 0):
|
|
12
|
+
raise OrbVertexGramMatrixError(
|
|
13
|
+
"Non-negative entry in vertex gram matrix")
|
|
14
|
+
|
|
15
|
+
return [[ -1 if i == j else m[i][j] / sqrt(m[i][i] * m[j][j])
|
|
16
|
+
for j in range(4) ] for i in range(4) ]
|
|
17
|
+
|
|
18
|
+
def normalize_gram_matrices(ms):
|
|
19
|
+
return [ normalize_gram_matrix(m) for m in ms ]
|
|
20
|
+
|
|
21
|
+
def edge_parameter_from_normalized_gram_matrices(edge, gram_matrices):
|
|
22
|
+
corner = edge.Corners[0]
|
|
23
|
+
|
|
24
|
+
s = corner.Subsimplex
|
|
25
|
+
i, j = [ k for k in range(4) if s & (1 << k) ]
|
|
26
|
+
return gram_matrices[corner.Tetrahedron.Index][i][j]
|
|
27
|
+
|
|
28
|
+
def edge_parameters_from_normalized_gram_matrices(mcomplex, gram_matrices):
|
|
29
|
+
return [ edge_parameter_from_normalized_gram_matrices(e, gram_matrices)
|
|
30
|
+
for e in mcomplex.Edges ]
|
|
31
|
+
|
|
32
|
+
def edge_parameters_from_gram_matrices(mcomplex, gram_matrices):
|
|
33
|
+
return vector(
|
|
34
|
+
RealDoubleField(),
|
|
35
|
+
edge_parameters_from_normalized_gram_matrices(
|
|
36
|
+
mcomplex,
|
|
37
|
+
normalize_gram_matrices(gram_matrices)))
|
|
38
|
+
|
|
39
|
+
def edge_parameters_from_vertex_gram_matrix_file(mcomplex, filename):
|
|
40
|
+
return edge_parameters_from_gram_matrices(
|
|
41
|
+
mcomplex, eval(open(filename).read()))
|
|
42
|
+
|
|
43
|
+
def compute_approx_hyperbolic_structure_from_vertex_gram_matrix_file(
|
|
44
|
+
mcomplex, filename):
|
|
45
|
+
return HyperbolicStructure(
|
|
46
|
+
mcomplex,
|
|
47
|
+
edge_parameters_from_vertex_gram_matrix_file(mcomplex, filename))
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from .hyperbolicStructure import *
|
|
2
|
+
from .verificationError import *
|
|
3
|
+
|
|
4
|
+
from sage.all import RealField, vector
|
|
5
|
+
|
|
6
|
+
__all__ = ['polish_approx_hyperbolic_structure']
|
|
7
|
+
|
|
8
|
+
def polish_approx_hyperbolic_structure(
|
|
9
|
+
approx_hyperbolic_structure, bits_prec = 53,
|
|
10
|
+
verbose = False):
|
|
11
|
+
|
|
12
|
+
RF = RealField(bits_prec + 20)
|
|
13
|
+
|
|
14
|
+
twoPi = 2 * RF.pi()
|
|
15
|
+
|
|
16
|
+
edge_parameters = vector(RF, approx_hyperbolic_structure.edge_lengths)
|
|
17
|
+
|
|
18
|
+
epsilon = RF(0.5) ** bits_prec
|
|
19
|
+
|
|
20
|
+
if not (approx_hyperbolic_structure.exact_edges and
|
|
21
|
+
approx_hyperbolic_structure.var_edges):
|
|
22
|
+
raise Exception("Did not pick exact/var edges")
|
|
23
|
+
|
|
24
|
+
for i in range(100):
|
|
25
|
+
try:
|
|
26
|
+
result = HyperbolicStructure(
|
|
27
|
+
approx_hyperbolic_structure.mcomplex,
|
|
28
|
+
edge_parameters,
|
|
29
|
+
approx_hyperbolic_structure.exact_edges,
|
|
30
|
+
approx_hyperbolic_structure.var_edges)
|
|
31
|
+
except BadDihedralAngleError as e:
|
|
32
|
+
raise PolishingFailedWithBadDihedralAngleError("When polishing", e)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
errs = vector(
|
|
36
|
+
[result.angle_sums[e] - twoPi for e in result.exact_edges])
|
|
37
|
+
|
|
38
|
+
max_err = max([abs(err) for err in errs])
|
|
39
|
+
|
|
40
|
+
if verbose:
|
|
41
|
+
print("Iteration %d: error = %s" % (i, RealField(53)(max_err)))
|
|
42
|
+
|
|
43
|
+
if max_err < epsilon:
|
|
44
|
+
return result
|
|
45
|
+
|
|
46
|
+
j = result.full_rank_jacobian_submatrix()
|
|
47
|
+
try:
|
|
48
|
+
jinv = j.inverse()
|
|
49
|
+
except ZeroDivisionError:
|
|
50
|
+
raise PolishingError("Singular matrix")
|
|
51
|
+
|
|
52
|
+
delta = jinv * errs
|
|
53
|
+
|
|
54
|
+
for e, d in zip(result.var_edges, delta):
|
|
55
|
+
edge_parameters[e] -= d
|
|
56
|
+
|
|
57
|
+
print("Max error", max_err)
|
|
58
|
+
print(approx_hyperbolic_structure.full_rank_jacobian_submatrix().SVD()[1].diagonal())
|
|
59
|
+
|
|
60
|
+
raise PolishingError("Newton method did not produce a result")
|
|
61
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import branchedDoubleCover
|
|
2
|
+
import veriClosed
|
|
3
|
+
from veriClosed import *
|
|
4
|
+
from veriClosed.verifyHyperbolicStructureEngine import *
|
|
5
|
+
from veriClosed.testing.cocycleTester import *
|
|
6
|
+
|
|
7
|
+
from veriClosed.testing import __path__ as testPaths
|
|
8
|
+
testPath = testPaths[0]
|
|
9
|
+
|
|
10
|
+
from snappy import Triangulation
|
|
11
|
+
from snappy.sage_helper import doctest_modules
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
import sys
|
|
15
|
+
|
|
16
|
+
def testCocycles(isoSig):
|
|
17
|
+
"""
|
|
18
|
+
Testing.
|
|
19
|
+
|
|
20
|
+
>>> testCocycles("kLLLvQQkccfgighjijjlnannwnashp")
|
|
21
|
+
True
|
|
22
|
+
>>> testCocycles("qLLvLAzMAQAkcdjifjhlnkmlnnopphsksskcimafjwovqw")
|
|
23
|
+
True
|
|
24
|
+
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
T = Triangulation(isoSig, remove_finite_vertices = False)
|
|
29
|
+
hyperbolic_structure = compute_verified_hyperbolic_structure(T, source = 'new', bits_prec = 106)
|
|
30
|
+
engine = VerifyHyperbolicStructureEngine(hyperbolic_structure)
|
|
31
|
+
tester = CocycleTester(engine)
|
|
32
|
+
tester.test()
|
|
33
|
+
|
|
34
|
+
return True
|
|
35
|
+
|
|
36
|
+
def testVerifyFromVertexGramMatrixFile():
|
|
37
|
+
"""
|
|
38
|
+
Testing.
|
|
39
|
+
|
|
40
|
+
>>> f = os.path.join(testPath, "m004_1_2.tri")
|
|
41
|
+
>>> T = Triangulation(f, remove_finite_vertices = False)
|
|
42
|
+
>>> bool(compute_verified_hyperbolic_structure(T, source = f + '.vgm'))
|
|
43
|
+
True
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def _doctest():
|
|
47
|
+
doctest_modules(
|
|
48
|
+
[ sys.modules[__name__],
|
|
49
|
+
veriClosed.computeVerifiedHyperbolicStructure,
|
|
50
|
+
branchedDoubleCover])
|
|
51
|
+
|
|
52
|
+
if __name__ == '__main__':
|
|
53
|
+
_doctest()
|
|
54
|
+
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
from snappy.snap import t3mlite as t3m
|
|
2
|
+
|
|
3
|
+
__all__ = ['TruncatedComplex']
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TruncatedComplex():
|
|
7
|
+
|
|
8
|
+
class SubcomplexBase():
|
|
9
|
+
def __init__(self, subcomplex_type, tet_and_perm):
|
|
10
|
+
self.subcomplex_type = subcomplex_type
|
|
11
|
+
self.tet_and_perm = tet_and_perm
|
|
12
|
+
|
|
13
|
+
class Edge(SubcomplexBase):
|
|
14
|
+
"""
|
|
15
|
+
tet_and_perm is a pair (index of tet, perm) parametrizing a vertex in
|
|
16
|
+
the truncated complex. This vertex is where the directed edge starts.
|
|
17
|
+
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def tet_and_perm_of_end(self):
|
|
21
|
+
"""
|
|
22
|
+
Get the pair (index of tet, perm) parametrizing the vertex of the
|
|
23
|
+
truncated complex where the directed edge ends.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
tet_index, p = self.tet_and_perm
|
|
27
|
+
if self.subcomplex_type == 'alpha':
|
|
28
|
+
return (tet_index, p * t3m.Perm4([1,0,2,3]))
|
|
29
|
+
if self.subcomplex_type == 'beta':
|
|
30
|
+
return (tet_index, p * t3m.Perm4([0,2,1,3]))
|
|
31
|
+
if self.subcomplex_type == 'gamma':
|
|
32
|
+
return (tet_index, p * t3m.Perm4([0,1,3,2]))
|
|
33
|
+
|
|
34
|
+
raise Exception("Unknown subcomplex_type for Edge")
|
|
35
|
+
|
|
36
|
+
def reverse(self):
|
|
37
|
+
"""
|
|
38
|
+
Reverse the direction of the edge.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
return TruncatedComplex.Edge(
|
|
42
|
+
self.subcomplex_type, self.tet_and_perm_of_end())
|
|
43
|
+
|
|
44
|
+
def __repr__(self):
|
|
45
|
+
return 'TruncatedComplex.Edge(%r, %r)' % (
|
|
46
|
+
self.subcomplex_type, self.tet_and_perm)
|
|
47
|
+
|
|
48
|
+
class EdgeLoop(SubcomplexBase):
|
|
49
|
+
def __init__(self, tet_and_perm, edge_index):
|
|
50
|
+
super(TruncatedComplex.EdgeLoop, self).__init__('edgeLoop', tet_and_perm)
|
|
51
|
+
self.edge_index = edge_index
|
|
52
|
+
|
|
53
|
+
def tet_and_perm_of_end(self):
|
|
54
|
+
return self.tet_and_perm
|
|
55
|
+
|
|
56
|
+
def __repr__(self):
|
|
57
|
+
return 'TruncatedComplex.EdgeLoop(%r, %d)' % (
|
|
58
|
+
self.tet_and_perm, self.edge_index)
|
|
59
|
+
|
|
60
|
+
def __init__(self, mcomplex):
|
|
61
|
+
self.mcomplex = mcomplex
|
|
62
|
+
|
|
63
|
+
# maps to tet and perm to 0 or 1 to indicate the end of the edge
|
|
64
|
+
self.tet_and_perm_to_end_of_edge = {
|
|
65
|
+
(tet.Index, p2.tuple()) : end
|
|
66
|
+
for i, edge in enumerate(mcomplex.Edges)
|
|
67
|
+
for tet, perm in edge.embeddings()
|
|
68
|
+
for end, p in [ (0, perm), (1, perm * t3m.Perm4([1,0,2,3])) ]
|
|
69
|
+
for p2 in [ p, p * t3m.Perm4([0,1,3,2]) ] }
|
|
70
|
+
|
|
71
|
+
def get_glued_tet_and_perm(self, tet_and_perm):
|
|
72
|
+
"""
|
|
73
|
+
The face pairings of the tetrahedra make it such that two
|
|
74
|
+
pairs (index of tet, perm) parametrize the same vertex in the
|
|
75
|
+
truncated complex. Given a pair, return the other pair.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
tet_index, p = tet_and_perm
|
|
79
|
+
|
|
80
|
+
face = p.image(t3m.F3)
|
|
81
|
+
tet = self.mcomplex.Tetrahedra[tet_index]
|
|
82
|
+
|
|
83
|
+
return (tet.Neighbor[face].Index, tet.Gluing[face] * p)
|
|
84
|
+
|
|
85
|
+
def get_key(self, tet_and_perm):
|
|
86
|
+
"""
|
|
87
|
+
Recall that there are two pairs (index of tet, perm) corresponding
|
|
88
|
+
to the same vertex in the truncated complex. Pick the lexicographically
|
|
89
|
+
smallest (when converting perm to a tuple so that it is hashable).
|
|
90
|
+
This can be used as key in a dictionary mapping vertices of the
|
|
91
|
+
truncated complex to something.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
def to_tuple(tet_and_perm):
|
|
95
|
+
tet, perm = tet_and_perm
|
|
96
|
+
return (tet, perm.tuple())
|
|
97
|
+
|
|
98
|
+
return min(to_tuple(tet_and_perm),
|
|
99
|
+
to_tuple(self.get_glued_tet_and_perm(tet_and_perm)))
|
|
100
|
+
|
|
101
|
+
def get_edges_for_tet_and_perm(self, tet_and_perm):
|
|
102
|
+
"""
|
|
103
|
+
Given a vertex in the truncated complex parametrized by
|
|
104
|
+
(index of tet, perm), return all four edges starting at that
|
|
105
|
+
vertex.
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
other_tet_and_perm = self.get_glued_tet_and_perm(tet_and_perm)
|
|
109
|
+
|
|
110
|
+
return [
|
|
111
|
+
TruncatedComplex.Edge('alpha', tet_and_perm),
|
|
112
|
+
TruncatedComplex.Edge('beta', tet_and_perm),
|
|
113
|
+
TruncatedComplex.Edge('gamma', tet_and_perm),
|
|
114
|
+
TruncatedComplex.Edge('gamma', other_tet_and_perm) ]
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@staticmethod
|
|
118
|
+
def get_edges_of_small_hexagon(tet_and_perm):
|
|
119
|
+
tet_index, p = tet_and_perm
|
|
120
|
+
return [
|
|
121
|
+
TruncatedComplex.Edge('beta', tet_and_perm),
|
|
122
|
+
TruncatedComplex.Edge('gamma', (tet_index, p * t3m.Perm4([0,2,1,3]))),
|
|
123
|
+
TruncatedComplex.Edge('beta', (tet_index, p * t3m.Perm4([0,2,3,1]))),
|
|
124
|
+
TruncatedComplex.Edge('gamma', (tet_index, p * t3m.Perm4([0,3,2,1]))),
|
|
125
|
+
TruncatedComplex.Edge('beta' , (tet_index, p * t3m.Perm4([0,3,1,2]))),
|
|
126
|
+
TruncatedComplex.Edge('gamma', (tet_index, p * t3m.Perm4([0,1,3,2]))) ]
|
|
127
|
+
|
|
128
|
+
@staticmethod
|
|
129
|
+
def get_edges_of_rectangle(tet_and_perm):
|
|
130
|
+
tet_index, p = tet_and_perm
|
|
131
|
+
return [
|
|
132
|
+
TruncatedComplex.Edge('gamma', tet_and_perm),
|
|
133
|
+
TruncatedComplex.Edge('alpha', (tet_index, p * t3m.Perm4([0,1,3,2]))),
|
|
134
|
+
TruncatedComplex.Edge('gamma', (tet_index, p * t3m.Perm4([1,0,3,2]))),
|
|
135
|
+
TruncatedComplex.Edge('alpha', (tet_index, p * t3m.Perm4([1,0,2,3]))) ]
|
|
136
|
+
|
|
137
|
+
@staticmethod
|
|
138
|
+
def get_edges_of_big_hexagon(tet_and_perm):
|
|
139
|
+
tet_index, p = tet_and_perm
|
|
140
|
+
return [
|
|
141
|
+
TruncatedComplex.Edge('beta', tet_and_perm),
|
|
142
|
+
TruncatedComplex.Edge('alpha', (tet_index, p * t3m.Perm4([0,2,1,3]))),
|
|
143
|
+
TruncatedComplex.Edge('beta', (tet_index, p * t3m.Perm4([2,0,1,3]))),
|
|
144
|
+
TruncatedComplex.Edge('alpha', (tet_index, p * t3m.Perm4([2,1,0,3]))),
|
|
145
|
+
TruncatedComplex.Edge('beta', (tet_index, p * t3m.Perm4([1,2,0,3]))),
|
|
146
|
+
TruncatedComplex.Edge('alpha', (tet_index, p * t3m.Perm4([1,0,2,3])))]
|
|
147
|
+
|
|
148
|
+
@staticmethod
|
|
149
|
+
def get_tet_and_odd_perms_for_vertex(vertex):
|
|
150
|
+
for corner in vertex.Corners:
|
|
151
|
+
for perm in t3m.Perm4.A4():
|
|
152
|
+
p = perm * t3m.Perm4([0,1,3,2])
|
|
153
|
+
if p.image(t3m.V0) == corner.Subsimplex:
|
|
154
|
+
yield corner.Tetrahedron.Index, p
|
|
155
|
+
|
|
156
|
+
@staticmethod
|
|
157
|
+
def get_first_tet_and_odd_perm_for_vertex(vertex):
|
|
158
|
+
for tet_and_perm in TruncatedComplex.get_tet_and_odd_perms_for_vertex(
|
|
159
|
+
vertex):
|
|
160
|
+
return tet_and_perm
|
|
161
|
+
|
|
162
|
+
def get_edge_index_and_end_from_tet_and_perm(self, tet_and_perm):
|
|
163
|
+
tet_index, p = tet_and_perm
|
|
164
|
+
tet = self.mcomplex.Tetrahedra[tet_index]
|
|
165
|
+
return (
|
|
166
|
+
tet.Class[p.image(t3m.E01)].Index,
|
|
167
|
+
self.tet_and_perm_to_end_of_edge[(tet_index, p.tuple())])
|
|
168
|
+
|
|
169
|
+
def check_loop(self, loop):
|
|
170
|
+
l = len(loop)
|
|
171
|
+
for i in range(l):
|
|
172
|
+
s = loop[ i ].tet_and_perm_of_end()
|
|
173
|
+
e = loop[(i+1) % l].tet_and_perm
|
|
174
|
+
|
|
175
|
+
if self.get_key(s) != self.get_key(e):
|
|
176
|
+
raise Exception("Failed to be a loop at %d: %r" % (i, loop))
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
class VerificationError(RuntimeError):
|
|
2
|
+
pass
|
|
3
|
+
|
|
4
|
+
class BadVertexGramMatrixError(VerificationError):
|
|
5
|
+
'''
|
|
6
|
+
Failed to verify that vertex gram matrix is realized by a finite tetrahedron.
|
|
7
|
+
'''
|
|
8
|
+
pass
|
|
9
|
+
|
|
10
|
+
class AngleSumIntervalNotContainingTwoPiError(VerificationError):
|
|
11
|
+
'''
|
|
12
|
+
The interval for the sum of the dihedral angles adjacent to an edge is
|
|
13
|
+
2 * pi.
|
|
14
|
+
'''
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
class GimbalDerivativeNotInvertibleError(VerificationError):
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
class VertexHasNoApproxEdgeError(VerificationError):
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
class NewtonMethodError(VerificationError):
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
class NewtonStepError(NewtonMethodError):
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
class NewtonMethodConvergenceError(NewtonMethodError):
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
class BadDihedralAngleError(VerificationError):
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
class KrawczykFailedToFinishError(VerificationError):
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
class KrawczykFailedWithBadDihedralAngleError(VerificationError):
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
class OrbSolutionTypeError(VerificationError):
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
class UnknownOrbFailureError(VerificationError):
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
class OrbMissingError(VerificationError):
|
|
48
|
+
pass
|
|
49
|
+
|
|
50
|
+
class OrbVertexGramMatrixError(VerificationError):
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
class PolishingError(VerificationError):
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
class PolishingFailedWithBadDihedralAngleError(VerificationError):
|
|
57
|
+
pass
|
|
58
|
+
|