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/tiling/floor.py
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from ..math_basics import is_RealIntervalFieldElement # type: ignore
|
|
2
|
+
from ..exceptions import InsufficientPrecisionError # type: ignore
|
|
3
|
+
|
|
4
|
+
from typing import Sequence
|
|
5
|
+
|
|
6
|
+
def floor_as_integers(x) -> Sequence[int]:
|
|
7
|
+
"""
|
|
8
|
+
Computes floor of a number or interval, returning a list of integers
|
|
9
|
+
if evaluating floor is ambiguous.
|
|
10
|
+
|
|
11
|
+
sage: from sage.all import RIF
|
|
12
|
+
sage: floor_as_integers(RIF(1.8, 1.9))
|
|
13
|
+
[1]
|
|
14
|
+
sage: floor_as_integers(RIF(1.9, 2.1))
|
|
15
|
+
[1, 2]
|
|
16
|
+
|
|
17
|
+
>>> from snappy.number import *
|
|
18
|
+
>>> def to_number(py_float):
|
|
19
|
+
... return number_to_native_number(SnapPyNumbers(100)(py_float))
|
|
20
|
+
>>> floor_as_integers(to_number(1.4))
|
|
21
|
+
[1]
|
|
22
|
+
>>> floor_as_integers(to_number(2.01))
|
|
23
|
+
[1, 2]
|
|
24
|
+
>>> floor_as_integers(to_number(1.99))
|
|
25
|
+
[1, 2]
|
|
26
|
+
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
if is_RealIntervalFieldElement(x):
|
|
30
|
+
f = x.floor()
|
|
31
|
+
l = f.lower().round()
|
|
32
|
+
u = f.upper().round() + 1
|
|
33
|
+
|
|
34
|
+
n = u - l
|
|
35
|
+
if n > 5:
|
|
36
|
+
raise InsufficientPrecisionError(
|
|
37
|
+
"Too many integers (%d) in given interval to compute floor. "
|
|
38
|
+
"Increasing precision should fix it." % n)
|
|
39
|
+
|
|
40
|
+
return list(range(l, u))
|
|
41
|
+
else:
|
|
42
|
+
f = x.floor()
|
|
43
|
+
int_f = int(f)
|
|
44
|
+
d = x - f
|
|
45
|
+
if d < 0.125:
|
|
46
|
+
return [ int_f - 1, int_f ]
|
|
47
|
+
if d > 0.875:
|
|
48
|
+
return [ int_f, int_f + 1 ]
|
|
49
|
+
return [ int_f ]
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from .real_hash_dict import RealHashDict
|
|
2
|
+
from ..hyperboloid import r13_dot
|
|
3
|
+
from ..exceptions import InsufficientPrecisionError # type: ignore
|
|
4
|
+
|
|
5
|
+
def get_hyperboloid_dict(max_neg_prod_equal, min_neg_prod_distinct,
|
|
6
|
+
verified):
|
|
7
|
+
RF = max_neg_prod_equal.parent()
|
|
8
|
+
return RealHashDict(
|
|
9
|
+
_equality_predicate(max_neg_prod_equal, min_neg_prod_distinct),
|
|
10
|
+
_hash_function(RF),
|
|
11
|
+
_compute_epsilon_inverse(RF),
|
|
12
|
+
verified)
|
|
13
|
+
|
|
14
|
+
def _equality_predicate(max_neg_prod_equal, min_neg_prod_distinct):
|
|
15
|
+
def result(point_0, point_1):
|
|
16
|
+
neg_inner_product = -r13_dot(point_0, point_1)
|
|
17
|
+
if neg_inner_product < max_neg_prod_equal:
|
|
18
|
+
return True
|
|
19
|
+
if neg_inner_product > min_neg_prod_distinct:
|
|
20
|
+
return False
|
|
21
|
+
|
|
22
|
+
raise InsufficientPrecisionError(
|
|
23
|
+
"Could neither verify that the two given tiles are "
|
|
24
|
+
"the same nor that they are distinct.\n"
|
|
25
|
+
"Neg inner product is: %r.\n"
|
|
26
|
+
"Max to be same tile: %r.\n"
|
|
27
|
+
"Min to be distinct tiles: %r." % (
|
|
28
|
+
neg_inner_product, max_neg_prod_equal, min_neg_prod_distinct))
|
|
29
|
+
|
|
30
|
+
return result
|
|
31
|
+
|
|
32
|
+
def _hash_function(RF):
|
|
33
|
+
weights = [ RF(1.2003), RF(0.94553), RF(1.431112), RF(1.2342) ]
|
|
34
|
+
|
|
35
|
+
def result(point):
|
|
36
|
+
return (point[0] * weights[0] +
|
|
37
|
+
point[1] * weights[1] +
|
|
38
|
+
point[2] * weights[2] +
|
|
39
|
+
point[3] * weights[3])
|
|
40
|
+
|
|
41
|
+
return result
|
|
42
|
+
|
|
43
|
+
_default_epsilon_inverse = 128
|
|
44
|
+
|
|
45
|
+
def _compute_epsilon_inverse(RF):
|
|
46
|
+
result = _default_epsilon_inverse
|
|
47
|
+
|
|
48
|
+
p = RF.precision()
|
|
49
|
+
if p > 53:
|
|
50
|
+
result *= 2 ** ((p - 53) // 3)
|
|
51
|
+
|
|
52
|
+
return result
|
|
53
|
+
|
|
54
|
+
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
from itertools import count
|
|
2
|
+
|
|
3
|
+
class IteratorCache:
|
|
4
|
+
def __init__(self, iterator):
|
|
5
|
+
"""
|
|
6
|
+
Takes an iterator and produces an iterable such that an
|
|
7
|
+
iterator created from the iterable produces the same iterated
|
|
8
|
+
values.
|
|
9
|
+
|
|
10
|
+
The iterates values, however, are lazily cached so that
|
|
11
|
+
iterating over another iterator again is faster.
|
|
12
|
+
|
|
13
|
+
(Silly) Example:
|
|
14
|
+
|
|
15
|
+
>>> squares = IterableCache(iter(i ** 2 for i in range(1000)))
|
|
16
|
+
>>> iterator0 = iter(squares)
|
|
17
|
+
>>> next(iterator0)
|
|
18
|
+
0
|
|
19
|
+
>>> next(iterator0)
|
|
20
|
+
1
|
|
21
|
+
>>> next(iterator0)
|
|
22
|
+
4
|
|
23
|
+
>>> iterator1 = iter(squares)
|
|
24
|
+
>>> next(iterator1) # Cached from previous run
|
|
25
|
+
0
|
|
26
|
+
>>> next(iterator1)
|
|
27
|
+
1
|
|
28
|
+
>>> next(iterator1)
|
|
29
|
+
4
|
|
30
|
+
>>> next(iterator1) # Not cached from previous run
|
|
31
|
+
9
|
|
32
|
+
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
self._iterator = iterator
|
|
36
|
+
self._cache = []
|
|
37
|
+
|
|
38
|
+
def __iter__(self):
|
|
39
|
+
for i in count():
|
|
40
|
+
if i == len(self._cache):
|
|
41
|
+
try:
|
|
42
|
+
n = next(self._iterator)
|
|
43
|
+
except StopIteration:
|
|
44
|
+
break
|
|
45
|
+
self._cache.append(n)
|
|
46
|
+
yield self._cache[i]
|
|
47
|
+
|
|
48
|
+
def merge_iterators(iterators):
|
|
49
|
+
"""
|
|
50
|
+
Merges iterators into one iterable picking the smallest element
|
|
51
|
+
(using < operator) from the list of next elements for each iterator.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
elements = [ [ next(iter), i ]
|
|
55
|
+
for i, iter in enumerate(iterators) ]
|
|
56
|
+
|
|
57
|
+
while True:
|
|
58
|
+
element, i = min(elements)
|
|
59
|
+
yield element
|
|
60
|
+
|
|
61
|
+
elements[i][0] = next(iterators[i])
|
|
62
|
+
|
|
63
|
+
def merge_iterables(iterables):
|
|
64
|
+
"""
|
|
65
|
+
Merges iterables into one iterable picking the smallest element
|
|
66
|
+
(using < operator) from the list of next elements for each iterator.
|
|
67
|
+
|
|
68
|
+
Example:
|
|
69
|
+
|
|
70
|
+
>>> squares_and_cubes = iter(merge_iterables([
|
|
71
|
+
... (i ** 2 for i in range(10000)),
|
|
72
|
+
... (i ** 3 for i in range(10000)) ]))
|
|
73
|
+
>>> list(islice(squares_and_cubes, 12))
|
|
74
|
+
[0, 0, 1, 1, 4, 8, 9, 16, 25, 27, 36, 49]
|
|
75
|
+
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
return merge_iterators([ iter(i) for i in iterables ])
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from ..snap.t3mlite import Tetrahedron # type: ignore
|
|
2
|
+
|
|
3
|
+
# @dataclass - not supported until python 3.7. We support 3.6.
|
|
4
|
+
|
|
5
|
+
class LiftedTetrahedron:
|
|
6
|
+
"""
|
|
7
|
+
Represents the lift of a tetrahedron in a manifold to the hyperboloid
|
|
8
|
+
model.
|
|
9
|
+
|
|
10
|
+
That is, if a tetrahedron (as part of the fundamental domain) was assigned
|
|
11
|
+
vertices by calling add_r13_geometry, then the vertices of a
|
|
12
|
+
LiftedTetrahedron l will be given by l.o13_matrices * tet.R13_vertices[v]
|
|
13
|
+
where v in snappy.snap.t3mlite.simplex.ZeroSubsimplices.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def __init__(self,
|
|
17
|
+
tet : Tetrahedron,
|
|
18
|
+
# An O(1,3)-matrix - since this might be a SageMath class or a
|
|
19
|
+
# SimpleMatrix, just using Any as type annotation.
|
|
20
|
+
o13_matrix):
|
|
21
|
+
self.tet = tet
|
|
22
|
+
self.o13_matrix = o13_matrix
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from .lifted_tetrahedron import LiftedTetrahedron
|
|
2
|
+
from .quotient_dict import QuotientDict
|
|
3
|
+
from .dict_based_set import DictBasedProductSet
|
|
4
|
+
from .hyperboloid_dict import get_hyperboloid_dict
|
|
5
|
+
|
|
6
|
+
from ..hyperboloid import o13_inverse
|
|
7
|
+
|
|
8
|
+
class LiftedTetrahedronSet:
|
|
9
|
+
"""
|
|
10
|
+
A set of lifted tetrahedra in H^3 or a quotient space of
|
|
11
|
+
H^3.
|
|
12
|
+
|
|
13
|
+
Which space will be used is determined by the dictionary
|
|
14
|
+
given when LiftedTetrahedronSet is constructed.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, dictionary, base_point, act_on_base_point_by_inverse):
|
|
18
|
+
self._set = DictBasedProductSet(dictionary)
|
|
19
|
+
self._base_point = base_point
|
|
20
|
+
self._act_on_base_point_by_inverse = act_on_base_point_by_inverse
|
|
21
|
+
|
|
22
|
+
def add(self, lifted_tetrahedron : LiftedTetrahedron) -> bool:
|
|
23
|
+
if self._act_on_base_point_by_inverse:
|
|
24
|
+
m = o13_inverse(lifted_tetrahedron.o13_matrix)
|
|
25
|
+
else:
|
|
26
|
+
m = lifted_tetrahedron.o13_matrix
|
|
27
|
+
|
|
28
|
+
return self._set.add(
|
|
29
|
+
m * self._base_point,
|
|
30
|
+
lifted_tetrahedron.tet.Index)
|
|
31
|
+
|
|
32
|
+
def get_lifted_tetrahedron_set(base_point,
|
|
33
|
+
canonical_representatives_function,
|
|
34
|
+
act_on_base_point_by_inverse,
|
|
35
|
+
max_neg_prod_equal, min_neg_prod_distinct,
|
|
36
|
+
verified
|
|
37
|
+
) -> LiftedTetrahedronSet:
|
|
38
|
+
"""
|
|
39
|
+
Returns a set to store lifted tetrahedra in H^3 or a quotient
|
|
40
|
+
space of H^3.
|
|
41
|
+
|
|
42
|
+
The type of geometric object determined which space will be used.
|
|
43
|
+
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
d = get_hyperboloid_dict(max_neg_prod_equal, min_neg_prod_distinct,
|
|
47
|
+
verified)
|
|
48
|
+
|
|
49
|
+
if canonical_representatives_function:
|
|
50
|
+
d = QuotientDict(d, canonical_representatives_function)
|
|
51
|
+
|
|
52
|
+
return LiftedTetrahedronSet(d, base_point, act_on_base_point_by_inverse)
|
|
53
|
+
|
|
54
|
+
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
class QuotientDict:
|
|
2
|
+
"""
|
|
3
|
+
Applies a function to canonize key before looking it up
|
|
4
|
+
or setting it in the supplied dictionary.
|
|
5
|
+
|
|
6
|
+
Note that the function can return a set of multiple
|
|
7
|
+
canidadates for the canonical key. The look-ups in the
|
|
8
|
+
dictionary will work correctly, as long as the true canonical
|
|
9
|
+
key is among the candidates.
|
|
10
|
+
|
|
11
|
+
# Modulo 5, canonical representative is 0, 1, ... 4.
|
|
12
|
+
|
|
13
|
+
>>> d = QuotientDict({}, canonical_representative_function = lambda x : [x % 5])
|
|
14
|
+
>>> d.setdefault(1, []).append('A')
|
|
15
|
+
>>> d.setdefault(2, []).append('B')
|
|
16
|
+
>>> d.setdefault(6, []).append('C')
|
|
17
|
+
>>> d.setdefault(1, [])
|
|
18
|
+
['A', 'C']
|
|
19
|
+
|
|
20
|
+
# Test with a fuzzy "Modulo 5" that always includes
|
|
21
|
+
# the canonical representative in 0, 1, ... 4 but sometimes
|
|
22
|
+
# an additional representative.
|
|
23
|
+
|
|
24
|
+
>>> d = QuotientDict({}, canonical_representative_function = lambda x : x)
|
|
25
|
+
>>> d.setdefault([1], []).append('A')
|
|
26
|
+
>>> d.setdefault([2, 7], []).append('B')
|
|
27
|
+
>>> d.setdefault([1,6], [])
|
|
28
|
+
['A']
|
|
29
|
+
>>> d.setdefault([1,6], []).append('C')
|
|
30
|
+
>>> d.setdefault([1,6], [])
|
|
31
|
+
['A', 'C']
|
|
32
|
+
>>> d.setdefault([1], [])
|
|
33
|
+
['A', 'C']
|
|
34
|
+
>>> d.setdefault([1, 11], [])
|
|
35
|
+
['A', 'C']
|
|
36
|
+
>>> d.setdefault([2], [])
|
|
37
|
+
['B']
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def __init__(self, dictionary, canonical_representative_function):
|
|
41
|
+
self._dictionary = dictionary
|
|
42
|
+
self._canonical_representative_function = canonical_representative_function
|
|
43
|
+
|
|
44
|
+
# Not implemented because it was not needed so far:
|
|
45
|
+
# get
|
|
46
|
+
# __getitem__
|
|
47
|
+
# __setitem__
|
|
48
|
+
|
|
49
|
+
# Note that __setitem__ requires updating all entries in
|
|
50
|
+
# self._dictionary.
|
|
51
|
+
# The easiest way to do this is to wrap the value into
|
|
52
|
+
# wrapped_value = [value], and assign to wrapped_value[0].
|
|
53
|
+
# This would also allow self.setdefault(key, None).
|
|
54
|
+
|
|
55
|
+
def setdefault(self, key, default):
|
|
56
|
+
if default is None:
|
|
57
|
+
raise Exception("Implementation reserved default = None for "
|
|
58
|
+
"internal purposes.")
|
|
59
|
+
|
|
60
|
+
computed_keys = []
|
|
61
|
+
for computed_key in self._canonical_representative_function(key):
|
|
62
|
+
value = self._dictionary.get(computed_key)
|
|
63
|
+
if not value is None:
|
|
64
|
+
return value
|
|
65
|
+
computed_keys.append(computed_key)
|
|
66
|
+
|
|
67
|
+
for computed_key in computed_keys:
|
|
68
|
+
self._dictionary[computed_key] = default
|
|
69
|
+
|
|
70
|
+
return default
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
from ..verify.interval_tree import IntervalTree
|
|
2
|
+
from .floor import floor_as_integers
|
|
3
|
+
|
|
4
|
+
# For experimenting how the performance of the IntervalTree compares
|
|
5
|
+
# to using a python dict.
|
|
6
|
+
#
|
|
7
|
+
# Sadly, the IntervalTree is implemented in slow python and not fast
|
|
8
|
+
# C(++). This is because we do not have access to the mpfi number since
|
|
9
|
+
# we cannot include .pyd files from SageMath :(
|
|
10
|
+
#
|
|
11
|
+
_use_interval_tree = True
|
|
12
|
+
|
|
13
|
+
class RealHashDict:
|
|
14
|
+
"""
|
|
15
|
+
A dictionary (following python dict API) where we provide for the keys:
|
|
16
|
+
- a predicate that decides whether two keys are the same
|
|
17
|
+
- a hash function returning an approximation of a real number
|
|
18
|
+
|
|
19
|
+
The use case is, for example, to use as keys points in a metric space
|
|
20
|
+
that are given by approximate numbers. Two close by approximations are
|
|
21
|
+
probably the same point.
|
|
22
|
+
|
|
23
|
+
The requirements of the hash function has the following requirements:
|
|
24
|
+
- If it is an interval, it has to contain the true hash value, that is
|
|
25
|
+
the true value of the hash function evaluated for the true value of
|
|
26
|
+
the key.
|
|
27
|
+
- If it is an interval and _use_interval_tree is False, the length of
|
|
28
|
+
the interval cannot be much larger than 1/epsilon_inverse.
|
|
29
|
+
- If it is a floating point number, the approximation cannot differ
|
|
30
|
+
from the true value by more than 1/epsilon_inverse/16.
|
|
31
|
+
|
|
32
|
+
Example Z as a discrete subset of R::
|
|
33
|
+
|
|
34
|
+
>>> from snappy.number import *
|
|
35
|
+
>>> def to_number(py_float):
|
|
36
|
+
... return number_to_native_number(SnapPyNumbers(100)(py_float))
|
|
37
|
+
|
|
38
|
+
>>> d = RealHashDict(
|
|
39
|
+
... # If two floating approximations of integers are close by,
|
|
40
|
+
... # they must be the same
|
|
41
|
+
... equality_predicate = lambda x, y: abs(x - y) < to_number(0.5),
|
|
42
|
+
... # For space with more than 1-dimension, use some function
|
|
43
|
+
... # involving the other coordinates
|
|
44
|
+
... hash_function = lambda x : x,
|
|
45
|
+
... epsilon_inverse = 1024,
|
|
46
|
+
... verified = False)
|
|
47
|
+
|
|
48
|
+
# Keys near 1 should be treated as the same.
|
|
49
|
+
>>> d[to_number(1.0)] = 'A'
|
|
50
|
+
>>> d[to_number(1.0000001)] = 'B'
|
|
51
|
+
>>> d.get(to_number(0.9999999))
|
|
52
|
+
'B'
|
|
53
|
+
|
|
54
|
+
>>> d.setdefault(to_number(10 + 0.1 / 1024), []).append('A')
|
|
55
|
+
>>> d.get(to_number(10.0))
|
|
56
|
+
['A']
|
|
57
|
+
>>> d.setdefault(to_number(10 - 0.1 / 1024), []).append('B')
|
|
58
|
+
>>> d.get(to_number(10.0000001))
|
|
59
|
+
['A', 'B']
|
|
60
|
+
|
|
61
|
+
sage: from sage.all import RIF
|
|
62
|
+
sage: def equality_predicate(x, y):
|
|
63
|
+
... d = abs(x - y)
|
|
64
|
+
... if d < RIF(0.1):
|
|
65
|
+
... return True
|
|
66
|
+
... if d > 0:
|
|
67
|
+
... return False
|
|
68
|
+
... raise Exception("Could not determine whether points are the "
|
|
69
|
+
... "same or not")
|
|
70
|
+
sage: d = RealHashDict(
|
|
71
|
+
... equality_predicate = equality_predicate,
|
|
72
|
+
... hash_function = lambda x : x,
|
|
73
|
+
... epsilon_inverse = 1024,
|
|
74
|
+
... verified = True)
|
|
75
|
+
|
|
76
|
+
# Keys near 1 should be treated as the same.
|
|
77
|
+
sage: d[RIF(0.9999999, 1.000001)] = 'A'
|
|
78
|
+
sage: d[RIF(0.9999998, 1.0000001)] = 'B'
|
|
79
|
+
sage: d.get(RIF(0.99999997, 1.0000002))
|
|
80
|
+
'B'
|
|
81
|
+
|
|
82
|
+
sage: d.setdefault(RIF(9.9999999, 10.00001), []).append('A')
|
|
83
|
+
sage: d.get(RIF(10.0))
|
|
84
|
+
['A']
|
|
85
|
+
sage: d.setdefault(RIF(9.9999993, 10.00002), []).append('B')
|
|
86
|
+
sage: d.get(RIF(9.99999999, 10.0000001))
|
|
87
|
+
['A', 'B']
|
|
88
|
+
|
|
89
|
+
sage: from snappy.tiling import real_hash_dict
|
|
90
|
+
sage: original_use_interval_tree = real_hash_dict._use_interval_tree
|
|
91
|
+
sage: real_hash_dict._use_interval_tree = True
|
|
92
|
+
sage: d = RealHashDict(
|
|
93
|
+
... equality_predicate = equality_predicate,
|
|
94
|
+
... hash_function = lambda x : x,
|
|
95
|
+
... epsilon_inverse = 1024,
|
|
96
|
+
... verified = True)
|
|
97
|
+
sage: d[RIF(1.0)] = 'A'
|
|
98
|
+
sage: d[RIF(0.7, 1.3)] = 'B'
|
|
99
|
+
Traceback (most recent call last):
|
|
100
|
+
...
|
|
101
|
+
Exception: Could not determine whether points are the same or not
|
|
102
|
+
sage: real_hash_dict._use_interval_tree = original_use_interval_tree
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
def __init__(self, equality_predicate, hash_function, epsilon_inverse, verified):
|
|
108
|
+
|
|
109
|
+
self._equality_predicate = equality_predicate
|
|
110
|
+
self._hash_function = hash_function
|
|
111
|
+
|
|
112
|
+
if verified and _use_interval_tree:
|
|
113
|
+
self._impl = IntervalTree()
|
|
114
|
+
else:
|
|
115
|
+
self._impl = _Dict(epsilon_inverse)
|
|
116
|
+
|
|
117
|
+
def get(self, key, default = None):
|
|
118
|
+
h = self._hash_function(key)
|
|
119
|
+
|
|
120
|
+
for other_key, value in self._impl.find(h):
|
|
121
|
+
if self._equality_predicate(key, other_key):
|
|
122
|
+
return value
|
|
123
|
+
|
|
124
|
+
return default
|
|
125
|
+
|
|
126
|
+
# Not implemented because it was not needed yet:
|
|
127
|
+
# __getitem__
|
|
128
|
+
|
|
129
|
+
def __setitem__(self, key, value):
|
|
130
|
+
h = self._hash_function(key)
|
|
131
|
+
|
|
132
|
+
for pair in self._impl.find(h):
|
|
133
|
+
if self._equality_predicate(key, pair[0]):
|
|
134
|
+
pair[1] = value
|
|
135
|
+
return
|
|
136
|
+
|
|
137
|
+
self._impl.insert(h, [key, value])
|
|
138
|
+
|
|
139
|
+
def setdefault(self, key, default):
|
|
140
|
+
h = self._hash_function(key)
|
|
141
|
+
|
|
142
|
+
for other_key, value in self._impl.find(h):
|
|
143
|
+
if self._equality_predicate(key, other_key):
|
|
144
|
+
return value
|
|
145
|
+
|
|
146
|
+
self._impl.insert(h, [key, default])
|
|
147
|
+
|
|
148
|
+
return default
|
|
149
|
+
|
|
150
|
+
class _Dict:
|
|
151
|
+
def __init__(self, epsilon_inverse):
|
|
152
|
+
self._epsilon_inverse = epsilon_inverse
|
|
153
|
+
self._dict = {}
|
|
154
|
+
|
|
155
|
+
def insert(self, key, value):
|
|
156
|
+
for computed_key in self._computed_keys(key):
|
|
157
|
+
self._dict.setdefault(computed_key, []).append(value)
|
|
158
|
+
|
|
159
|
+
def find(self, key):
|
|
160
|
+
for computed_key in self._computed_keys(key):
|
|
161
|
+
yield from self._dict.get(computed_key, [])
|
|
162
|
+
|
|
163
|
+
def _computed_keys(self, key):
|
|
164
|
+
return floor_as_integers(key * self._epsilon_inverse)
|
snappy/tiling/test.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from snappy import testing
|
|
2
|
+
import snappy
|
|
3
|
+
|
|
4
|
+
from snappy import tiling
|
|
5
|
+
|
|
6
|
+
modules = [
|
|
7
|
+
tiling.floor,
|
|
8
|
+
tiling.real_hash_dict,
|
|
9
|
+
tiling.quotient_dict,
|
|
10
|
+
tiling.dict_based_set
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
def run_doctests(verbose=False, print_info=True):
|
|
14
|
+
globs = {'Manifold': snappy.Manifold}
|
|
15
|
+
return testing.doctest_modules(modules,
|
|
16
|
+
verbose=verbose,
|
|
17
|
+
print_info=print_info,
|
|
18
|
+
extraglobs=globs)
|
|
19
|
+
|
|
20
|
+
run_doctests.__name__ = tiling.__name__
|
|
21
|
+
|
|
22
|
+
if __name__ == '__main__':
|
|
23
|
+
testing.run_doctests_as_main(run_doctests)
|