snappy 3.3__cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- snappy/CyOpenGL.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.ico +0 -0
- snappy/SnapPy.png +0 -0
- snappy/SnapPyHP.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/__init__.py +534 -0
- snappy/app.py +604 -0
- snappy/app_menus.py +372 -0
- snappy/browser.py +998 -0
- snappy/cache.py +25 -0
- snappy/canonical.py +249 -0
- snappy/cusps/__init__.py +280 -0
- snappy/cusps/cusp_area_matrix.py +98 -0
- snappy/cusps/cusp_areas_from_matrix.py +96 -0
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/short_slopes_for_cusp.py +217 -0
- snappy/cusps/test.py +22 -0
- snappy/cusps/trig_cusp_area_matrix.py +63 -0
- snappy/database.py +454 -0
- snappy/db_utilities.py +79 -0
- snappy/decorated_isosig.py +717 -0
- snappy/dev/__init__.py +0 -0
- snappy/dev/extended_ptolemy/__init__.py +8 -0
- snappy/dev/extended_ptolemy/closed.py +106 -0
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
- snappy/dev/extended_ptolemy/direct.py +42 -0
- snappy/dev/extended_ptolemy/extended.py +406 -0
- snappy/dev/extended_ptolemy/giac_helper.py +43 -0
- snappy/dev/extended_ptolemy/giac_rur.py +129 -0
- snappy/dev/extended_ptolemy/gluing.py +46 -0
- snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
- snappy/dev/extended_ptolemy/printMatrices.py +70 -0
- snappy/dev/vericlosed/__init__.py +1 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
- snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
- snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
- snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
- snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
- snappy/dev/vericlosed/orb/__init__.py +1 -0
- snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
- snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
- snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
- snappy/dev/vericlosed/test.py +54 -0
- snappy/dev/vericlosed/truncatedComplex.py +176 -0
- snappy/dev/vericlosed/verificationError.py +58 -0
- snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
- snappy/doc/_images/SnapPy-196.png +0 -0
- snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
- snappy/doc/_images/m125_paper_plane.jpg +0 -0
- snappy/doc/_images/mac.png +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
- snappy/doc/_images/plink-action.png +0 -0
- snappy/doc/_images/ubuntu.png +0 -0
- snappy/doc/_images/win7.png +0 -0
- snappy/doc/_sources/additional_classes.rst.txt +40 -0
- snappy/doc/_sources/bugs.rst.txt +14 -0
- snappy/doc/_sources/censuses.rst.txt +52 -0
- snappy/doc/_sources/credits.rst.txt +81 -0
- snappy/doc/_sources/development.rst.txt +261 -0
- snappy/doc/_sources/index.rst.txt +215 -0
- snappy/doc/_sources/installing.rst.txt +249 -0
- snappy/doc/_sources/manifold.rst.txt +6 -0
- snappy/doc/_sources/manifoldhp.rst.txt +46 -0
- snappy/doc/_sources/news.rst.txt +425 -0
- snappy/doc/_sources/other.rst.txt +25 -0
- snappy/doc/_sources/platonic_census.rst.txt +20 -0
- snappy/doc/_sources/plink.rst.txt +102 -0
- snappy/doc/_sources/ptolemy.rst.txt +66 -0
- snappy/doc/_sources/ptolemy_classes.rst.txt +42 -0
- snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -0
- snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -0
- snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -0
- snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -0
- snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -0
- snappy/doc/_sources/screenshots.rst.txt +21 -0
- snappy/doc/_sources/snap.rst.txt +87 -0
- snappy/doc/_sources/snappy.rst.txt +28 -0
- snappy/doc/_sources/spherogram.rst.txt +103 -0
- snappy/doc/_sources/todo.rst.txt +47 -0
- snappy/doc/_sources/triangulation.rst.txt +11 -0
- snappy/doc/_sources/tutorial.rst.txt +49 -0
- snappy/doc/_sources/verify.rst.txt +210 -0
- snappy/doc/_sources/verify_internals.rst.txt +79 -0
- snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
- snappy/doc/_static/SnapPy.ico +0 -0
- snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
- snappy/doc/_static/basic.css +906 -0
- snappy/doc/_static/css/badge_only.css +1 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
- snappy/doc/_static/css/theme.css +4 -0
- snappy/doc/_static/doctools.js +149 -0
- snappy/doc/_static/documentation_options.js +13 -0
- snappy/doc/_static/file.png +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
- snappy/doc/_static/jquery.js +2 -0
- snappy/doc/_static/js/badge_only.js +1 -0
- snappy/doc/_static/js/theme.js +1 -0
- snappy/doc/_static/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +192 -0
- snappy/doc/_static/minus.png +0 -0
- snappy/doc/_static/plus.png +0 -0
- snappy/doc/_static/pygments.css +75 -0
- snappy/doc/_static/searchtools.js +635 -0
- snappy/doc/_static/snappy_furo.css +33 -0
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
- snappy/doc/_static/sphinx_highlight.js +154 -0
- snappy/doc/additional_classes.html +1500 -0
- snappy/doc/bugs.html +132 -0
- snappy/doc/censuses.html +453 -0
- snappy/doc/credits.html +184 -0
- snappy/doc/development.html +385 -0
- snappy/doc/doc-latest/additional_classes.html +1500 -0
- snappy/doc/doc-latest/bugs.html +132 -0
- snappy/doc/doc-latest/censuses.html +453 -0
- snappy/doc/doc-latest/credits.html +184 -0
- snappy/doc/doc-latest/development.html +385 -0
- snappy/doc/doc-latest/genindex.html +1349 -0
- snappy/doc/doc-latest/index.html +287 -0
- snappy/doc/doc-latest/installing.html +346 -0
- snappy/doc/doc-latest/manifold.html +3632 -0
- snappy/doc/doc-latest/manifoldhp.html +180 -0
- snappy/doc/doc-latest/news.html +438 -0
- snappy/doc/doc-latest/objects.inv +0 -0
- snappy/doc/doc-latest/other.html +160 -0
- snappy/doc/doc-latest/platonic_census.html +376 -0
- snappy/doc/doc-latest/plink.html +210 -0
- snappy/doc/doc-latest/ptolemy.html +253 -0
- snappy/doc/doc-latest/ptolemy_classes.html +1144 -0
- snappy/doc/doc-latest/ptolemy_examples1.html +409 -0
- snappy/doc/doc-latest/ptolemy_examples2.html +471 -0
- snappy/doc/doc-latest/ptolemy_examples3.html +414 -0
- snappy/doc/doc-latest/ptolemy_examples4.html +195 -0
- snappy/doc/doc-latest/ptolemy_prelim.html +248 -0
- snappy/doc/doc-latest/py-modindex.html +165 -0
- snappy/doc/doc-latest/screenshots.html +141 -0
- snappy/doc/doc-latest/search.html +135 -0
- snappy/doc/doc-latest/searchindex.js +1 -0
- snappy/doc/doc-latest/snap.html +202 -0
- snappy/doc/doc-latest/snappy.html +181 -0
- snappy/doc/doc-latest/spherogram.html +1346 -0
- snappy/doc/doc-latest/todo.html +166 -0
- snappy/doc/doc-latest/triangulation.html +1676 -0
- snappy/doc/doc-latest/tutorial.html +159 -0
- snappy/doc/doc-latest/verify.html +330 -0
- snappy/doc/doc-latest/verify_internals.html +1235 -0
- snappy/doc/genindex.html +1349 -0
- snappy/doc/index.html +287 -0
- snappy/doc/installing.html +346 -0
- snappy/doc/manifold.html +3632 -0
- snappy/doc/manifoldhp.html +180 -0
- snappy/doc/news.html +438 -0
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +160 -0
- snappy/doc/platonic_census.html +376 -0
- snappy/doc/plink.html +210 -0
- snappy/doc/ptolemy.html +253 -0
- snappy/doc/ptolemy_classes.html +1144 -0
- snappy/doc/ptolemy_examples1.html +409 -0
- snappy/doc/ptolemy_examples2.html +471 -0
- snappy/doc/ptolemy_examples3.html +414 -0
- snappy/doc/ptolemy_examples4.html +195 -0
- snappy/doc/ptolemy_prelim.html +248 -0
- snappy/doc/py-modindex.html +165 -0
- snappy/doc/screenshots.html +141 -0
- snappy/doc/search.html +135 -0
- snappy/doc/searchindex.js +1 -0
- snappy/doc/snap.html +202 -0
- snappy/doc/snappy.html +181 -0
- snappy/doc/spherogram.html +1346 -0
- snappy/doc/todo.html +166 -0
- snappy/doc/triangulation.html +1676 -0
- snappy/doc/tutorial.html +159 -0
- snappy/doc/verify.html +330 -0
- snappy/doc/verify_internals.html +1235 -0
- snappy/drilling/__init__.py +456 -0
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +5 -0
- snappy/drilling/crush.py +270 -0
- snappy/drilling/cusps.py +125 -0
- snappy/drilling/debug.py +242 -0
- snappy/drilling/epsilons.py +6 -0
- snappy/drilling/exceptions.py +55 -0
- snappy/drilling/moves.py +620 -0
- snappy/drilling/peripheral_curves.py +210 -0
- snappy/drilling/perturb.py +188 -0
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +274 -0
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +132 -0
- snappy/drilling/tracing.py +351 -0
- snappy/exceptions.py +26 -0
- snappy/export_stl.py +120 -0
- snappy/exterior_to_link/__init__.py +2 -0
- snappy/exterior_to_link/barycentric_geometry.py +463 -0
- snappy/exterior_to_link/exceptions.py +6 -0
- snappy/exterior_to_link/geodesic_map.json +14408 -0
- snappy/exterior_to_link/hyp_utils.py +112 -0
- snappy/exterior_to_link/link_projection.py +323 -0
- snappy/exterior_to_link/main.py +198 -0
- snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
- snappy/exterior_to_link/mcomplex_with_link.py +687 -0
- snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
- snappy/exterior_to_link/pl_utils.py +491 -0
- snappy/exterior_to_link/put_in_S3.py +156 -0
- snappy/exterior_to_link/rational_linear_algebra.py +130 -0
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
- snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
- snappy/exterior_to_link/stored_moves.py +475 -0
- snappy/exterior_to_link/test.py +31 -0
- snappy/filedialog.py +28 -0
- snappy/geometric_structure/__init__.py +212 -0
- snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
- snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +691 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +480 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +41 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +294 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +156 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +35 -0
- snappy/geometric_structure/geodesic/__init__.py +0 -0
- snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
- snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
- snappy/geometric_structure/geodesic/canonical_representatives.py +52 -0
- snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
- snappy/geometric_structure/geodesic/constants.py +6 -0
- snappy/geometric_structure/geodesic/exceptions.py +22 -0
- snappy/geometric_structure/geodesic/fixed_points.py +106 -0
- snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
- snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
- snappy/geometric_structure/geodesic/line.py +30 -0
- snappy/geometric_structure/geodesic/multiplicity.py +127 -0
- snappy/geometric_structure/geodesic/tiles_for_geodesic.py +128 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +121 -0
- snappy/horoviewer.py +443 -0
- snappy/hyperboloid/__init__.py +212 -0
- snappy/hyperboloid/distances.py +259 -0
- snappy/hyperboloid/horoball.py +19 -0
- snappy/hyperboloid/line.py +35 -0
- snappy/hyperboloid/point.py +9 -0
- snappy/hyperboloid/triangle.py +29 -0
- snappy/info_icon.gif +0 -0
- snappy/infowindow.py +65 -0
- snappy/isometry_signature.py +389 -0
- snappy/len_spec/__init__.py +609 -0
- snappy/len_spec/geodesic_info.py +129 -0
- snappy/len_spec/geodesic_key_info_dict.py +116 -0
- snappy/len_spec/geodesic_piece.py +146 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +136 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +185 -0
- snappy/len_spec/spine.py +128 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +276 -0
- snappy/len_spec/word.py +86 -0
- snappy/manifolds/HTWKnots/alternating.gz +0 -0
- snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
- snappy/manifolds/__init__.py +3 -0
- snappy/margulis/__init__.py +332 -0
- snappy/margulis/cusp_neighborhood_neighborhood.py +66 -0
- snappy/margulis/geodesic_neighborhood.py +152 -0
- snappy/margulis/margulis_info.py +21 -0
- snappy/margulis/mu_from_neighborhood_pair.py +175 -0
- snappy/margulis/neighborhood.py +29 -0
- snappy/margulis/test.py +22 -0
- snappy/math_basics.py +187 -0
- snappy/matrix.py +525 -0
- snappy/number.py +657 -0
- snappy/numeric_output_checker.py +345 -0
- snappy/pari.py +41 -0
- snappy/phone_home.py +57 -0
- snappy/polyviewer.py +259 -0
- snappy/ptolemy/__init__.py +17 -0
- snappy/ptolemy/component.py +103 -0
- snappy/ptolemy/coordinates.py +2290 -0
- snappy/ptolemy/fieldExtensions.py +153 -0
- snappy/ptolemy/findLoops.py +473 -0
- snappy/ptolemy/geometricRep.py +59 -0
- snappy/ptolemy/homology.py +165 -0
- snappy/ptolemy/magma/default.magma_template +229 -0
- snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
- snappy/ptolemy/manifoldMethods.py +395 -0
- snappy/ptolemy/matrix.py +350 -0
- snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
- snappy/ptolemy/polynomial.py +856 -0
- snappy/ptolemy/processComponents.py +173 -0
- snappy/ptolemy/processFileBase.py +247 -0
- snappy/ptolemy/processFileDispatch.py +46 -0
- snappy/ptolemy/processMagmaFile.py +392 -0
- snappy/ptolemy/processRurFile.py +150 -0
- snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
- snappy/ptolemy/ptolemyObstructionClass.py +64 -0
- snappy/ptolemy/ptolemyVariety.py +995 -0
- snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
- snappy/ptolemy/reginaWrapper.py +698 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/rur.py +545 -0
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
- snappy/ptolemy/test.py +1126 -0
- snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
- snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
- snappy/ptolemy/utilities.py +236 -0
- snappy/raytracing/__init__.py +64 -0
- snappy/raytracing/additional_horospheres.py +64 -0
- snappy/raytracing/additional_len_spec_choices.py +63 -0
- snappy/raytracing/cohomology_fractal.py +197 -0
- snappy/raytracing/eyeball.py +124 -0
- snappy/raytracing/finite_raytracing_data.py +237 -0
- snappy/raytracing/finite_viewer.py +590 -0
- snappy/raytracing/geodesic_tube_info.py +174 -0
- snappy/raytracing/geodesics.py +246 -0
- snappy/raytracing/geodesics_window.py +258 -0
- snappy/raytracing/gui_utilities.py +293 -0
- snappy/raytracing/hyperboloid_navigation.py +556 -0
- snappy/raytracing/hyperboloid_utilities.py +234 -0
- snappy/raytracing/ideal_raytracing_data.py +592 -0
- snappy/raytracing/inside_viewer.py +974 -0
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +126 -0
- snappy/raytracing/raytracing_view.py +454 -0
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +101 -0
- snappy/raytracing/shaders/fragment.glsl +1744 -0
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +98 -0
- snappy/raytracing/view_scale_controller.py +98 -0
- snappy/raytracing/zoom_slider/__init__.py +263 -0
- snappy/raytracing/zoom_slider/inward.png +0 -0
- snappy/raytracing/zoom_slider/inward18.png +0 -0
- snappy/raytracing/zoom_slider/outward.png +0 -0
- snappy/raytracing/zoom_slider/outward18.png +0 -0
- snappy/raytracing/zoom_slider/test.py +20 -0
- snappy/sage_helper.py +119 -0
- snappy/settings.py +407 -0
- snappy/shell.py +53 -0
- snappy/snap/__init__.py +117 -0
- snappy/snap/character_varieties.py +375 -0
- snappy/snap/find_field.py +372 -0
- snappy/snap/fox_milnor.py +271 -0
- snappy/snap/fundamental_polyhedron.py +569 -0
- snappy/snap/generators.py +39 -0
- snappy/snap/interval_reps.py +81 -0
- snappy/snap/kernel_structures.py +128 -0
- snappy/snap/mcomplex_base.py +18 -0
- snappy/snap/nsagetools.py +716 -0
- snappy/snap/peripheral/__init__.py +1 -0
- snappy/snap/peripheral/dual_cellulation.py +219 -0
- snappy/snap/peripheral/link.py +127 -0
- snappy/snap/peripheral/peripheral.py +159 -0
- snappy/snap/peripheral/surface.py +522 -0
- snappy/snap/peripheral/test.py +35 -0
- snappy/snap/polished_reps.py +335 -0
- snappy/snap/shapes.py +152 -0
- snappy/snap/slice_obs_HKL/__init__.py +194 -0
- snappy/snap/slice_obs_HKL/basics.py +236 -0
- snappy/snap/slice_obs_HKL/direct.py +217 -0
- snappy/snap/slice_obs_HKL/poly_norm.py +212 -0
- snappy/snap/slice_obs_HKL/rep_theory.py +424 -0
- snappy/snap/t3mlite/__init__.py +2 -0
- snappy/snap/t3mlite/arrow.py +243 -0
- snappy/snap/t3mlite/corner.py +22 -0
- snappy/snap/t3mlite/edge.py +172 -0
- snappy/snap/t3mlite/face.py +37 -0
- snappy/snap/t3mlite/files.py +211 -0
- snappy/snap/t3mlite/homology.py +53 -0
- snappy/snap/t3mlite/linalg.py +419 -0
- snappy/snap/t3mlite/mcomplex.py +1499 -0
- snappy/snap/t3mlite/perm4.py +320 -0
- snappy/snap/t3mlite/setup.py +12 -0
- snappy/snap/t3mlite/simplex.py +199 -0
- snappy/snap/t3mlite/spun.py +297 -0
- snappy/snap/t3mlite/surface.py +519 -0
- snappy/snap/t3mlite/test.py +20 -0
- snappy/snap/t3mlite/test_vs_regina.py +86 -0
- snappy/snap/t3mlite/tetrahedron.py +109 -0
- snappy/snap/t3mlite/vertex.py +42 -0
- snappy/snap/test.py +139 -0
- snappy/snap/utilities.py +288 -0
- snappy/test.py +213 -0
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -0
- snappy/tiling/dict_based_set.py +79 -0
- snappy/tiling/floor.py +49 -0
- snappy/tiling/hyperboloid_dict.py +54 -0
- snappy/tiling/iter_utils.py +78 -0
- snappy/tiling/lifted_tetrahedron.py +22 -0
- snappy/tiling/lifted_tetrahedron_set.py +54 -0
- snappy/tiling/quotient_dict.py +70 -0
- snappy/tiling/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +224 -0
- snappy/tiling/triangle.py +33 -0
- snappy/tkterminal.py +920 -0
- snappy/twister/__init__.py +20 -0
- snappy/twister/main.py +646 -0
- snappy/twister/surfaces/S_0_1 +3 -0
- snappy/twister/surfaces/S_0_2 +3 -0
- snappy/twister/surfaces/S_0_4 +7 -0
- snappy/twister/surfaces/S_0_4_Lantern +8 -0
- snappy/twister/surfaces/S_1 +3 -0
- snappy/twister/surfaces/S_1_1 +4 -0
- snappy/twister/surfaces/S_1_2 +5 -0
- snappy/twister/surfaces/S_1_2_5 +6 -0
- snappy/twister/surfaces/S_2 +6 -0
- snappy/twister/surfaces/S_2_1 +8 -0
- snappy/twister/surfaces/S_2_heeg +10 -0
- snappy/twister/surfaces/S_3 +8 -0
- snappy/twister/surfaces/S_3_1 +10 -0
- snappy/twister/surfaces/S_4_1 +12 -0
- snappy/twister/surfaces/S_5_1 +14 -0
- snappy/twister/surfaces/heeg_fig8 +9 -0
- snappy/twister/twister_core.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/upper_halfspace/__init__.py +146 -0
- snappy/upper_halfspace/ideal_point.py +29 -0
- snappy/verify/__init__.py +13 -0
- snappy/verify/canonical.py +542 -0
- snappy/verify/complex_volume/__init__.py +18 -0
- snappy/verify/complex_volume/adjust_torsion.py +86 -0
- snappy/verify/complex_volume/closed.py +168 -0
- snappy/verify/complex_volume/compute_ptolemys.py +90 -0
- snappy/verify/complex_volume/cusped.py +56 -0
- snappy/verify/complex_volume/extended_bloch.py +201 -0
- snappy/verify/cusp_translations.py +85 -0
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +254 -0
- snappy/verify/hyperbolicity.py +224 -0
- snappy/verify/interval_newton_shapes_engine.py +523 -0
- snappy/verify/interval_tree.py +400 -0
- snappy/verify/krawczyk_shapes_engine.py +518 -0
- snappy/verify/real_algebra.py +286 -0
- snappy/verify/shapes.py +25 -0
- snappy/verify/square_extensions.py +1005 -0
- snappy/verify/test.py +72 -0
- snappy/verify/volume.py +128 -0
- snappy/version.py +2 -0
- snappy-3.3.dist-info/METADATA +58 -0
- snappy-3.3.dist-info/RECORD +541 -0
- snappy-3.3.dist-info/WHEEL +6 -0
- snappy-3.3.dist-info/entry_points.txt +2 -0
- snappy-3.3.dist-info/top_level.txt +28 -0
snappy/len_spec/tile.py
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
from ..tiling.lifted_tetrahedron import LiftedTetrahedron
|
|
2
|
+
from ..tiling.lifted_tetrahedron_set import (LiftedTetrahedronSet,
|
|
3
|
+
get_lifted_tetrahedron_set)
|
|
4
|
+
from ..tiling.iter_utils import merge_iterables
|
|
5
|
+
from ..tiling.hyperboloid_dict import get_hyperboloid_dict
|
|
6
|
+
from ..tiling.dict_based_set import DictBasedSet
|
|
7
|
+
from ..hyperboloid import o13_inverse
|
|
8
|
+
from ..snap.t3mlite import Mcomplex, simplex
|
|
9
|
+
from ..math_basics import correct_min, correct_max, lower # type: ignore
|
|
10
|
+
from ..matrix import make_identity_matrix
|
|
11
|
+
|
|
12
|
+
from .geometry import (
|
|
13
|
+
lower_bound_geodesic_length,
|
|
14
|
+
lower_bound_cosh_distance_r13_point_truncated_tetrahedron)
|
|
15
|
+
|
|
16
|
+
import heapq
|
|
17
|
+
from typing import List, Sequence
|
|
18
|
+
|
|
19
|
+
class LengthSpectrumTile:
|
|
20
|
+
"""
|
|
21
|
+
Represents a translate of the fundamental domain by the given
|
|
22
|
+
o13_matrix used to tile H^3. A corresponding word in the unsimplified
|
|
23
|
+
fundamental group is also given.
|
|
24
|
+
|
|
25
|
+
Note that we drop the base tile where the o13_matrix is the identity.
|
|
26
|
+
|
|
27
|
+
Thus, for every LengthSpectrumTile, the matrix determines a possibly
|
|
28
|
+
degenerate geodesic. Here degenerate means that the two endpoints
|
|
29
|
+
coincide (and the geodesic has length zero) since the matrix is parabolic.
|
|
30
|
+
|
|
31
|
+
LengthSpectrumTile's are emitted by compute_length_spectrum_tiles with
|
|
32
|
+
increasing lower_bound_geodesic_length (more precisely, increasing
|
|
33
|
+
left endpoint if intervals are used). If we are interested only geodesics
|
|
34
|
+
up to length L, we need to iterate over the tiles emitted by
|
|
35
|
+
compute_length_sepctrum_tiles until we have tile where
|
|
36
|
+
lower_bound_geodesic_length is larger than L.
|
|
37
|
+
|
|
38
|
+
Note that the length of the geodesic associated to the o13_matrix can
|
|
39
|
+
actually be shorter than lower_bound_geodesic_length. This can happen
|
|
40
|
+
since we can have a parabolic matrix or a matrix conjugate to an
|
|
41
|
+
earlier matrix we have seen encoding a geodesic we already had seen
|
|
42
|
+
earlier in a different way.
|
|
43
|
+
|
|
44
|
+
This class is similar to snappy.tiling.tile.Tile and
|
|
45
|
+
snappy.tiling.tile._PendingLiftedTetrahedron but specialized to the
|
|
46
|
+
length spectrum and corresponds to tiling by fundamental domains.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(self,
|
|
50
|
+
word : List[int],
|
|
51
|
+
o13_matrix,
|
|
52
|
+
lower_bound_geodesic_length):
|
|
53
|
+
self.word = word
|
|
54
|
+
self.o13_matrix = o13_matrix
|
|
55
|
+
self.lower_bound_geodesic_length = lower_bound_geodesic_length
|
|
56
|
+
|
|
57
|
+
self._key = lower(lower_bound_geodesic_length)
|
|
58
|
+
|
|
59
|
+
def __lt__(self, other):
|
|
60
|
+
"""
|
|
61
|
+
Used so that we can merge streams of tiles with merge_iterables.
|
|
62
|
+
"""
|
|
63
|
+
return self._key < other._key
|
|
64
|
+
|
|
65
|
+
def compute_length_spectrum_tiles(mcomplex : Mcomplex
|
|
66
|
+
) -> Sequence[LengthSpectrumTile]:
|
|
67
|
+
"""
|
|
68
|
+
Given the result of mcomplex_for_len_spec, provides a stream of tiles
|
|
69
|
+
suitable to compute the length spectrum.
|
|
70
|
+
|
|
71
|
+
More precisely, to know all geodesics up to length L, we need to
|
|
72
|
+
iterate the stream until we have a tile with
|
|
73
|
+
tile.lower_bound_geodesic_length > L.
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
# We spawn a separate tiling process for each tetrahedron.
|
|
77
|
+
# This process will start tiling a ball about the basepoint of
|
|
78
|
+
# the given tetrahedron and emits a stream of LengthSpectrumTile's
|
|
79
|
+
# with increasing lower_bound_geodesic_length.
|
|
80
|
+
#
|
|
81
|
+
# We need to merge the result of all these streams to find all
|
|
82
|
+
# geodesics (up to a certain length L).
|
|
83
|
+
#
|
|
84
|
+
# However, we might also find duplicates among these streams.
|
|
85
|
+
# We de-duplicate them here using the visited_dict.
|
|
86
|
+
#
|
|
87
|
+
# For more context:
|
|
88
|
+
# Recall that mcomplex_for_len_spec added a spine to the manifold.
|
|
89
|
+
# Each geodesic has to intersect that spine somewhere.
|
|
90
|
+
#
|
|
91
|
+
# However, the tiling process for one tetrahedron only takes into
|
|
92
|
+
# account the intersection of the spine with that particular
|
|
93
|
+
# tetrahedron.
|
|
94
|
+
#
|
|
95
|
+
# See _compute_length_spectrum_tiles_for_tetrahedron for more details.
|
|
96
|
+
|
|
97
|
+
max_neg_prod_equal, min_neg_prod_distinct = _max_min_prod(mcomplex)
|
|
98
|
+
visited_dict = DictBasedSet(
|
|
99
|
+
get_hyperboloid_dict(max_neg_prod_equal,
|
|
100
|
+
min_neg_prod_distinct,
|
|
101
|
+
mcomplex.verified))
|
|
102
|
+
|
|
103
|
+
# Add (non-translated) base point so that we do not emit the base tile
|
|
104
|
+
# with the identity matrix
|
|
105
|
+
visited_dict.add(mcomplex.R13_baseTetInCenter)
|
|
106
|
+
|
|
107
|
+
for tile in merge_iterables(
|
|
108
|
+
[ _compute_length_spectrum_tiles_for_tetrahedron(mcomplex, tet)
|
|
109
|
+
for tet in mcomplex.Tetrahedra ]):
|
|
110
|
+
if visited_dict.add(tile.o13_matrix * mcomplex.R13_baseTetInCenter):
|
|
111
|
+
yield tile
|
|
112
|
+
|
|
113
|
+
def _compute_length_spectrum_tiles_for_tetrahedron(
|
|
114
|
+
mcomplex, initial_tetrahedron) -> Sequence[LengthSpectrumTile]:
|
|
115
|
+
|
|
116
|
+
"""
|
|
117
|
+
Returns a stream of length spectrum tiles. To know all geodesics
|
|
118
|
+
up to length L that intersect the restriction of the spine to the
|
|
119
|
+
given tetrahedron, we need to iterate the stream until we have a tile
|
|
120
|
+
with tile.lower_bound_geodesic_length > L.
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
# We tile H^3 by lifted tetrahedra by covering a larger and larger ball
|
|
124
|
+
# about the incenter of the initial_tetrahedron.
|
|
125
|
+
#
|
|
126
|
+
# If a lifted tetrahedron is a translated copy of the initial_tetrahedron,
|
|
127
|
+
# we emit a LengthSpectrumTile. The lower_bound_geodesic_length is computed
|
|
128
|
+
# from the radius of the covered ball using lower_bound_geodesic_length.
|
|
129
|
+
|
|
130
|
+
initial_lifted_tetrahedron = LiftedTetrahedron(
|
|
131
|
+
initial_tetrahedron, make_identity_matrix(ring=mcomplex.RF, n=4))
|
|
132
|
+
|
|
133
|
+
# The pending pieces as priority queue - that is, a python list
|
|
134
|
+
# but we use heapq to access it.
|
|
135
|
+
pending_lifted_tetrahedra : Sequence[_PendingLiftedTetrahedron] = []
|
|
136
|
+
|
|
137
|
+
# Start tiling with the initial_tetrahedron.
|
|
138
|
+
heapq.heappush(
|
|
139
|
+
pending_lifted_tetrahedra,
|
|
140
|
+
_PendingLiftedTetrahedron(
|
|
141
|
+
[], initial_lifted_tetrahedron, mcomplex.RF(0)))
|
|
142
|
+
|
|
143
|
+
max_neg_prod_equal, min_neg_prod_distinct = _max_min_prod(mcomplex)
|
|
144
|
+
|
|
145
|
+
# Initialize data structure recording which lifted tetrahedra have
|
|
146
|
+
# already been visited while tiling H^3.
|
|
147
|
+
visited_lifted_tetrahedra : LiftedTetrahedronSet = (
|
|
148
|
+
get_lifted_tetrahedron_set(
|
|
149
|
+
base_point=mcomplex.R13_baseTetInCenter,
|
|
150
|
+
canonical_representatives_function=None,
|
|
151
|
+
act_on_base_point_by_inverse=False,
|
|
152
|
+
max_neg_prod_equal=max_neg_prod_equal,
|
|
153
|
+
min_neg_prod_distinct=min_neg_prod_distinct,
|
|
154
|
+
verified=mcomplex.verified))
|
|
155
|
+
|
|
156
|
+
while True:
|
|
157
|
+
pending_lifted_tetrahedron : _PendingLiftedTetrahedron = (
|
|
158
|
+
heapq.heappop(pending_lifted_tetrahedra))
|
|
159
|
+
|
|
160
|
+
tet = pending_lifted_tetrahedron.lifted_tetrahedron.tet
|
|
161
|
+
m = pending_lifted_tetrahedron.lifted_tetrahedron.o13_matrix
|
|
162
|
+
|
|
163
|
+
if tet is initial_tetrahedron:
|
|
164
|
+
# Emit Tile
|
|
165
|
+
yield LengthSpectrumTile(
|
|
166
|
+
pending_lifted_tetrahedron.word,
|
|
167
|
+
pending_lifted_tetrahedron.lifted_tetrahedron.o13_matrix,
|
|
168
|
+
lower_bound_geodesic_length(
|
|
169
|
+
pending_lifted_tetrahedron.lower_bound_cosh_distance,
|
|
170
|
+
initial_tetrahedron.inv_spine_cosh))
|
|
171
|
+
|
|
172
|
+
# For all faces ...
|
|
173
|
+
for f, new_tet in tet.Neighbor.items():
|
|
174
|
+
# ... except the one that was used to reach this lifted tetrahedron
|
|
175
|
+
if f == pending_lifted_tetrahedron.entry_cell:
|
|
176
|
+
continue
|
|
177
|
+
|
|
178
|
+
entry_face = tet.Gluing[f].image(f)
|
|
179
|
+
|
|
180
|
+
# Inverse of tet.O13_matrices[f]
|
|
181
|
+
new_m = m * new_tet.O13_matrices[entry_face]
|
|
182
|
+
new_lifted_tetrahedron = LiftedTetrahedron(new_tet, new_m)
|
|
183
|
+
|
|
184
|
+
if not visited_lifted_tetrahedra.add(new_lifted_tetrahedron):
|
|
185
|
+
continue
|
|
186
|
+
|
|
187
|
+
# Compute word
|
|
188
|
+
word = pending_lifted_tetrahedron.word
|
|
189
|
+
g = new_tet.GeneratorsInfo[entry_face]
|
|
190
|
+
if g != 0:
|
|
191
|
+
word = word + [ -g ]
|
|
192
|
+
|
|
193
|
+
# We want to compute the distance of the spine_center to the
|
|
194
|
+
# lifted tetrahedron.
|
|
195
|
+
# However, it is cheaper to apply the inverse matrix to the
|
|
196
|
+
# spine center rather than the matrix to the tetrahedron.
|
|
197
|
+
lifted_spine_center = (
|
|
198
|
+
o13_inverse(new_m) * initial_tetrahedron.spine_center)
|
|
199
|
+
|
|
200
|
+
heapq.heappush(
|
|
201
|
+
pending_lifted_tetrahedra,
|
|
202
|
+
_PendingLiftedTetrahedron(
|
|
203
|
+
word,
|
|
204
|
+
new_lifted_tetrahedron,
|
|
205
|
+
lower_bound_cosh_distance_r13_point_truncated_tetrahedron(
|
|
206
|
+
lifted_spine_center,
|
|
207
|
+
new_tet,
|
|
208
|
+
verified=mcomplex.verified),
|
|
209
|
+
entry_cell=entry_face))
|
|
210
|
+
|
|
211
|
+
class _PendingLiftedTetrahedron:
|
|
212
|
+
"""
|
|
213
|
+
A lifted tetrahedron that still needs to be processed to tile
|
|
214
|
+
together with the face used to reach this tetrahedron.
|
|
215
|
+
|
|
216
|
+
The < operator is overloaded so that the piece with the lowest
|
|
217
|
+
lower_bound will be picked up next by a priority queue.
|
|
218
|
+
|
|
219
|
+
If pieces are processed in this order, then the lower_bound of the
|
|
220
|
+
next piece will actually be a lower bound for the distance between L
|
|
221
|
+
and the lifted tetrahedron (with other pending pieces for the same
|
|
222
|
+
lifted tetrahedron having higher values for lower_bound and thus
|
|
223
|
+
being further down the queue).
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
def __init__(self,
|
|
227
|
+
word,
|
|
228
|
+
lifted_tetrahedron : LiftedTetrahedron,
|
|
229
|
+
lower_bound_cosh_distance,
|
|
230
|
+
entry_cell : int = simplex.T):
|
|
231
|
+
self.word = word
|
|
232
|
+
self.lifted_tetrahedron = lifted_tetrahedron
|
|
233
|
+
self.lower_bound_cosh_distance = lower_bound_cosh_distance
|
|
234
|
+
|
|
235
|
+
# Either element of simplex.ZeroSubsimplices (if piece was reached
|
|
236
|
+
# through another piece) or simplex.T (if this pending piece was
|
|
237
|
+
# used to start tiling).
|
|
238
|
+
self.entry_cell = entry_cell
|
|
239
|
+
|
|
240
|
+
# For convenience, lower_bound is an interval but it is only
|
|
241
|
+
# the left value of the interval that is relevant and that we
|
|
242
|
+
# should use: A < B can be False for two intervals even
|
|
243
|
+
# when A's left value is lower than B's left value.
|
|
244
|
+
self._key = lower(lower_bound_cosh_distance)
|
|
245
|
+
|
|
246
|
+
def __lt__(self, other):
|
|
247
|
+
return self._key < other._key
|
|
248
|
+
|
|
249
|
+
def _max_min_prod(mcomplex):
|
|
250
|
+
min_neg_prod_distinct = (mcomplex.baseTetInRadius/2).cosh()
|
|
251
|
+
if mcomplex.verified:
|
|
252
|
+
return (min_neg_prod_distinct, min_neg_prod_distinct)
|
|
253
|
+
else:
|
|
254
|
+
max_neg_prod_equal = min(
|
|
255
|
+
min_neg_prod_distinct,
|
|
256
|
+
1 + _compute_epsilon(mcomplex.RF))
|
|
257
|
+
return (max_neg_prod_equal, min_neg_prod_distinct)
|
|
258
|
+
|
|
259
|
+
def _compute_epsilon(RF):
|
|
260
|
+
p = RF.precision()
|
|
261
|
+
|
|
262
|
+
# We try to be a factor of at least 10^6 smaller than
|
|
263
|
+
# 1/_compute_epsilon_inverse(RF) in hyperboloid_dict.py.
|
|
264
|
+
#
|
|
265
|
+
# This factor will even grow larger as the precision increases.
|
|
266
|
+
#
|
|
267
|
+
# That way, we will hopefully fail in _equality_predicate
|
|
268
|
+
# in hyperboloid_dict rather than failing by not hashing together
|
|
269
|
+
# lifted tetrahedra that should be the same but are not recognised
|
|
270
|
+
# as such because of numerical error.
|
|
271
|
+
|
|
272
|
+
result = RF(1e-5)
|
|
273
|
+
if p > 53:
|
|
274
|
+
result *= RF(0.5) ** ((p - 53) / 2)
|
|
275
|
+
|
|
276
|
+
return result
|
snappy/len_spec/word.py
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
from ..SnapPy import reduce_list_word, inverse_list_word
|
|
2
|
+
|
|
3
|
+
from typing import List
|
|
4
|
+
|
|
5
|
+
def simplify_geodesic_word(word : List[int]) -> List[int]:
|
|
6
|
+
"""
|
|
7
|
+
Simplifies given word. It can change the word by a conjugate or
|
|
8
|
+
invert it.
|
|
9
|
+
|
|
10
|
+
More precisely, it cancels pairs of generator and inverse. First if
|
|
11
|
+
they are next to each other and then if they are at opposite ends of
|
|
12
|
+
the word. It then cyclically rotates the word and its inverse to take
|
|
13
|
+
the lexicographically smallest when ordering the generators as
|
|
14
|
+
1, -1, 2, -2, 3, -3, ...
|
|
15
|
+
|
|
16
|
+
>>> simplify_geodesic_word([])
|
|
17
|
+
[]
|
|
18
|
+
>>> simplify_geodesic_word([1])
|
|
19
|
+
[1]
|
|
20
|
+
>>> simplify_geodesic_word([1, 2])
|
|
21
|
+
[1, 2]
|
|
22
|
+
>>> simplify_geodesic_word([-1, 2, -2, 1])
|
|
23
|
+
[]
|
|
24
|
+
>>> simplify_geodesic_word([-1, 3, 2, -2, 1])
|
|
25
|
+
[3]
|
|
26
|
+
>>> simplify_geodesic_word([-1, 3, 4, 2, -2, 1])
|
|
27
|
+
[3, 4]
|
|
28
|
+
>>> simplify_geodesic_word([-1, 4, 3, 2, -2, 1])
|
|
29
|
+
[3, 4]
|
|
30
|
+
>>> simplify_geodesic_word([-1, -3, -4, 5, 2, -2, 1])
|
|
31
|
+
[3, -5, 4]
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
_rotate_and_optionally_invert(
|
|
36
|
+
_cancel_conjugation(
|
|
37
|
+
reduce_list_word(word))))
|
|
38
|
+
|
|
39
|
+
def _cancel_conjugation(word : List[int]) -> List[int]:
|
|
40
|
+
"""
|
|
41
|
+
Cancels pairs of generator and inverse at opposite ends of
|
|
42
|
+
given word.
|
|
43
|
+
|
|
44
|
+
>>> _cancel_conjugation([])
|
|
45
|
+
[]
|
|
46
|
+
>>> _cancel_conjugation([1])
|
|
47
|
+
[1]
|
|
48
|
+
>>> _cancel_conjugation([1, -1])
|
|
49
|
+
[]
|
|
50
|
+
>>> _cancel_conjugation([1, 2, -1])
|
|
51
|
+
[2]
|
|
52
|
+
>>> _cancel_conjugation([1, 2, 3, -1])
|
|
53
|
+
[2, 3]
|
|
54
|
+
"""
|
|
55
|
+
n = len(word)
|
|
56
|
+
for i in range(n // 2):
|
|
57
|
+
k = n - i - 1
|
|
58
|
+
if word[i] != -word[k]:
|
|
59
|
+
return word[i:k+1]
|
|
60
|
+
return word[n // 2 : (n + 1) // 2]
|
|
61
|
+
|
|
62
|
+
def _rotate_and_optionally_invert(word : List[int]) -> List[int]:
|
|
63
|
+
"""
|
|
64
|
+
Rotate word and its inverse to pick lexicographically smallest when
|
|
65
|
+
ordering the generators as 1, -1, 2, -2, 3, -3, ...
|
|
66
|
+
|
|
67
|
+
>>> _rotate_and_optionally_invert([3, 4, 5])
|
|
68
|
+
[3, 4, 5]
|
|
69
|
+
>>> _rotate_and_optionally_invert([4, 5, 3])
|
|
70
|
+
[3, 4, 5]
|
|
71
|
+
>>> _rotate_and_optionally_invert([-3])
|
|
72
|
+
[3]
|
|
73
|
+
>>> _rotate_and_optionally_invert([5, 3, 4, -3])
|
|
74
|
+
[3, 4, -3, 5]
|
|
75
|
+
"""
|
|
76
|
+
n = len(word)
|
|
77
|
+
|
|
78
|
+
if n == 0:
|
|
79
|
+
return word
|
|
80
|
+
|
|
81
|
+
return min(
|
|
82
|
+
(candidates[i:] + candidates[:i]
|
|
83
|
+
for candidates in [ word, inverse_list_word(word) ]
|
|
84
|
+
for i in range(len(word))),
|
|
85
|
+
key=lambda w: [ 2 * l if l > 0 else 2 * -l + 1
|
|
86
|
+
for l in w ])
|
|
Binary file
|
|
Binary file
|