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,345 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Provides the NumericOutputChecker implementing doctest's OutputChecker.
|
|
3
|
+
|
|
4
|
+
It provides a set of extra flags NUMERIC6, NUMERIC9, ... for doctests
|
|
5
|
+
allowing numbers in an example to differ by an epsilon = 1e-6, 1e-9, ...
|
|
6
|
+
|
|
7
|
+
See init_precisions(...) for the precisions we support.
|
|
8
|
+
|
|
9
|
+
See documentation of NumericExample for more.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class NumericExample:
|
|
14
|
+
"""
|
|
15
|
+
The actual result (3.141592653589793) differs from the given result,
|
|
16
|
+
but the difference is less than 1e-6, so it still passes::
|
|
17
|
+
|
|
18
|
+
>>> 1.5707963267948966 * 2 # doctest: +NUMERIC6
|
|
19
|
+
3.14159285
|
|
20
|
+
|
|
21
|
+
The text pieces between the numbers are also compared, performing
|
|
22
|
+
white-space normalization::
|
|
23
|
+
|
|
24
|
+
>>> ['a', 4.5, 6.9] # doctest: +NUMERIC6
|
|
25
|
+
['a', 4.5, 6.9000000001]
|
|
26
|
+
|
|
27
|
+
Intervals in the notation emitted by sage are allowed::
|
|
28
|
+
|
|
29
|
+
>>> print("4.5?e-1") # doctest: +NUMERIC6
|
|
30
|
+
4.50000000001?e-1
|
|
31
|
+
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
import doctest
|
|
36
|
+
import re
|
|
37
|
+
import decimal
|
|
38
|
+
|
|
39
|
+
# Generate flags NUMERIC6, ...
|
|
40
|
+
|
|
41
|
+
# Store as pairs (precision, FLAG)
|
|
42
|
+
NUMERIC_LIST = []
|
|
43
|
+
# Store in dict precision : FLAG
|
|
44
|
+
NUMERIC_DICT = {}
|
|
45
|
+
# All or'ed together
|
|
46
|
+
ALL_NUMERIC = 0
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def init_precisions(precisions):
|
|
50
|
+
"""
|
|
51
|
+
Register flags for given precisions with doctest module.
|
|
52
|
+
|
|
53
|
+
Unfortunately, doctest doesn't seem to support a more generic mechanism
|
|
54
|
+
such as "# doctest: +NUMERIC: 6" to specify the precision and we need to
|
|
55
|
+
unroll each precision we want to its own flag.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
global NUMERIC_LIST
|
|
59
|
+
global NUMERIC_DICT
|
|
60
|
+
global ALL_NUMERIC
|
|
61
|
+
|
|
62
|
+
for precision in precisions:
|
|
63
|
+
# Check key such that clients having demand for different
|
|
64
|
+
# precisions could register them.
|
|
65
|
+
if precision not in NUMERIC_DICT:
|
|
66
|
+
flag = doctest.register_optionflag('NUMERIC%d' % precision)
|
|
67
|
+
NUMERIC_LIST.append((precision, flag))
|
|
68
|
+
NUMERIC_DICT[precision] = flag
|
|
69
|
+
ALL_NUMERIC |= flag
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
# The precisions NUMERIC0, ... we support are hard-coded here:
|
|
73
|
+
init_precisions(range(0,33,3))
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def get_precision(optionflags):
|
|
77
|
+
"""
|
|
78
|
+
Get precision from optionflags
|
|
79
|
+
"""
|
|
80
|
+
for precision, flag in NUMERIC_LIST:
|
|
81
|
+
if optionflags & flag:
|
|
82
|
+
return precision
|
|
83
|
+
|
|
84
|
+
# Regular expressions matching numbers and intervals such as
|
|
85
|
+
# 23, 2.3, 3.5e-4, 3.4 E-5, 3.4?, 5.6?e-3
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
mantissa_pat = r'(-?[0-9]+(?:\.[0-9]+)?)'
|
|
89
|
+
# Intervals can be 3.4? or 3.4?e-2, account for the "?"
|
|
90
|
+
interval_pat = r'(\?)?'
|
|
91
|
+
# Pari prints 3.4E-3 as "3.4 E-3", account for the space
|
|
92
|
+
exponent_pat = r'(?:\ ?([eE][+-]?[0-9]+))?'
|
|
93
|
+
|
|
94
|
+
# 4.5?e-3 would split into groups ('4.5?e-3', '4.5', '?", 'e-3').
|
|
95
|
+
number_re = re.compile('(' + mantissa_pat + interval_pat + exponent_pat + ')')
|
|
96
|
+
number_group_count = 4
|
|
97
|
+
number_split_stride = number_group_count + 1
|
|
98
|
+
|
|
99
|
+
# Use whitespace normalization for text pieces
|
|
100
|
+
NUMERIC_DEFAULT_OPTIONFLAGS = doctest.NORMALIZE_WHITESPACE
|
|
101
|
+
|
|
102
|
+
# Given the above groups, e.g., ('4.5?e-3', '4.5', '?", 'e-3'), return
|
|
103
|
+
# decimal.Decimal("4.5E-3")
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def to_decimal(groups):
|
|
107
|
+
number, mantissa, interval, exponent = groups
|
|
108
|
+
if exponent:
|
|
109
|
+
n = mantissa + exponent
|
|
110
|
+
else:
|
|
111
|
+
n = mantissa
|
|
112
|
+
return decimal.Decimal(n)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class NumericOutputChecker(doctest.OutputChecker):
|
|
116
|
+
"""
|
|
117
|
+
Implements doctest's OutputChecker, see documentation of
|
|
118
|
+
NumericExample for examples.
|
|
119
|
+
|
|
120
|
+
>>> N = NumericOutputChecker()
|
|
121
|
+
|
|
122
|
+
>>> a = "[3.499e-8, 4.5?e-8]"
|
|
123
|
+
>>> b = "[3.499e-8, 4.5?e-8]"
|
|
124
|
+
|
|
125
|
+
>>> N.check_output(a, b, NUMERIC_DICT[12])
|
|
126
|
+
True
|
|
127
|
+
|
|
128
|
+
>>> b = "[3.499999e-8, 3.2?e-8]"
|
|
129
|
+
>>> N.check_output(a, b, NUMERIC_DICT[6])
|
|
130
|
+
True
|
|
131
|
+
>>> N.check_output(a, b, NUMERIC_DICT[9])
|
|
132
|
+
False
|
|
133
|
+
>>> N.formatted_compare_numeric(a, b, NUMERIC_DICT[9])
|
|
134
|
+
'Numbers differed by 1.3E-8\\n\\nExpected : 3.499e-8\\nGot : 3.499999e-8\\nDifference : 9.99E-12\\n\\nExpected : 4.5?e-8\\nGot : 3.2?e-8\\nDifference (FAILURE): 1.3E-8\\n'
|
|
135
|
+
>>> N.compare_numeric(a, b, NUMERIC_DICT[12])
|
|
136
|
+
('NUMERIC', ([('3.499e-8', '3.499999e-8', True, Decimal('9.99E-12')), ('4.5?e-8', '3.2?e-8', True, Decimal('1.3E-8'))], Decimal('1.3E-8')))
|
|
137
|
+
|
|
138
|
+
>>> b = "[3.4999e-8, 4.5e-8]"
|
|
139
|
+
>>> N.formatted_compare_numeric(a, b, NUMERIC_DICT[6])
|
|
140
|
+
'Expected interval, but got 4.5e-8.'
|
|
141
|
+
|
|
142
|
+
>>> b = "[3.4999?e-8, 4.5e-8]"
|
|
143
|
+
>>> N.formatted_compare_numeric(a, b, NUMERIC_DICT[6])
|
|
144
|
+
'Expected number, but got 3.4999?e-8.'
|
|
145
|
+
|
|
146
|
+
>>> b = "a = [3.4999e-8, 4.5?e-8]"
|
|
147
|
+
>>> N.formatted_compare_numeric(a, b, NUMERIC_DICT[6])
|
|
148
|
+
'Text between numbers differs: Expected "[" but got "a = [" at position 0'
|
|
149
|
+
|
|
150
|
+
>>> b = "[3.4999e-8, 4.5?e-8, 5.63]"
|
|
151
|
+
>>> N.formatted_compare_numeric(a, b, NUMERIC_DICT[6])
|
|
152
|
+
'Expected 2 numbers but got 3 numbers.'
|
|
153
|
+
|
|
154
|
+
>>> a = "[4.5, 6.7e1, 2e+3]"
|
|
155
|
+
>>> b = "[4.5000001, 67.00000001, 2.0000000000000000001e+3]"
|
|
156
|
+
>>> N.compare_numeric(a, b, NUMERIC_DICT[6])
|
|
157
|
+
('OK', None)
|
|
158
|
+
>>> N.compare_numeric(a, b, NUMERIC_DICT[12])
|
|
159
|
+
('NUMERIC', ([('4.5', '4.5000001', True, Decimal('1E-7')), ('6.7e1', '67.00000001', True, Decimal('1E-8')), ('2e+3', '2.0000000000000000001e+3', False, Decimal('1E-16'))], Decimal('1E-7')))
|
|
160
|
+
|
|
161
|
+
Account for pari adding a space before the E::
|
|
162
|
+
|
|
163
|
+
>>> a = "4.5e-9"
|
|
164
|
+
>>> b = "4.5 E-9"
|
|
165
|
+
>>> N.compare_numeric(a, b, NUMERIC_DICT[12])
|
|
166
|
+
('OK', None)
|
|
167
|
+
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
def compare_numeric(self, want, got, optionflags):
|
|
171
|
+
"""
|
|
172
|
+
Compares want and got by scanning for numbers. The numbers are
|
|
173
|
+
compared using an epsilon extracted from optionflags. The text
|
|
174
|
+
pieces between the numbers are compared falling back to the
|
|
175
|
+
default implementation of OutputChecker.
|
|
176
|
+
|
|
177
|
+
Returns a pair (status, data) where status is 'OK' if the
|
|
178
|
+
comparison passed or indicates how it failed with data containing
|
|
179
|
+
information that can be used to format the text explaining the
|
|
180
|
+
differences.
|
|
181
|
+
"""
|
|
182
|
+
|
|
183
|
+
# "[4.5e-9]" yields ('[', '4.5e-9', '4.5', None, 'e-9', ']')
|
|
184
|
+
split_want = re.split(number_re, want)
|
|
185
|
+
split_got = re.split(number_re, got)
|
|
186
|
+
|
|
187
|
+
# Check same number of numbers
|
|
188
|
+
if len(split_want) != len(split_got):
|
|
189
|
+
return ('COUNT',
|
|
190
|
+
(len(split_want) // number_split_stride,
|
|
191
|
+
len(split_got) // number_split_stride))
|
|
192
|
+
|
|
193
|
+
# Compare text pieces between numbers
|
|
194
|
+
flags = optionflags | NUMERIC_DEFAULT_OPTIONFLAGS
|
|
195
|
+
|
|
196
|
+
for i in range(0, len(split_want), number_split_stride):
|
|
197
|
+
if not doctest.OutputChecker.check_output(
|
|
198
|
+
self, split_want[i], split_got[i], flags):
|
|
199
|
+
return ('TEXT', (split_want[i], split_got[i], i))
|
|
200
|
+
|
|
201
|
+
epsilon = decimal.Decimal(0.1) ** get_precision(optionflags)
|
|
202
|
+
|
|
203
|
+
rows = []
|
|
204
|
+
max_diff = 0
|
|
205
|
+
|
|
206
|
+
for i in range(1, len(split_want), number_split_stride):
|
|
207
|
+
# Number how it literally appears
|
|
208
|
+
number_want = split_want[i]
|
|
209
|
+
number_got = split_got[i]
|
|
210
|
+
|
|
211
|
+
# Check whether both intervals or numbers
|
|
212
|
+
is_interval_want = bool(split_want[i + 2])
|
|
213
|
+
is_interval_got = bool(split_got[i + 2])
|
|
214
|
+
if is_interval_want != is_interval_got:
|
|
215
|
+
return ('TYPE', (is_interval_want, number_got))
|
|
216
|
+
|
|
217
|
+
# Number (or crushed interval) as decimal.Decimal
|
|
218
|
+
decimal_want = to_decimal(split_want[i: i + number_group_count])
|
|
219
|
+
decimal_got = to_decimal(split_got[i: i + number_group_count])
|
|
220
|
+
|
|
221
|
+
# Compute diff
|
|
222
|
+
diff = abs(decimal_want - decimal_got)
|
|
223
|
+
failed = (diff > epsilon)
|
|
224
|
+
|
|
225
|
+
max_diff = max(max_diff, diff)
|
|
226
|
+
|
|
227
|
+
# Record data
|
|
228
|
+
rows.append((number_want, number_got, failed, diff))
|
|
229
|
+
|
|
230
|
+
if max_diff > epsilon:
|
|
231
|
+
# Larger than epsilon: failed
|
|
232
|
+
return ('NUMERIC', (rows, max_diff))
|
|
233
|
+
|
|
234
|
+
# Ok
|
|
235
|
+
return ('OK', None)
|
|
236
|
+
|
|
237
|
+
def format_compare_numeric_result(self, status, data):
|
|
238
|
+
"""
|
|
239
|
+
Formats a nice text from the result of compare_numeric.
|
|
240
|
+
"""
|
|
241
|
+
|
|
242
|
+
if status == 'COUNT':
|
|
243
|
+
return 'Expected %d numbers but got %d numbers.' % data
|
|
244
|
+
elif status == 'TEXT':
|
|
245
|
+
return 'Text between numbers differs: Expected "%s" but got "%s" at position %d' % data
|
|
246
|
+
elif status == 'TYPE':
|
|
247
|
+
is_interval_want, number_got = data
|
|
248
|
+
if is_interval_want:
|
|
249
|
+
k = 'interval'
|
|
250
|
+
else:
|
|
251
|
+
k = 'number'
|
|
252
|
+
return 'Expected %s, but got %s.' % (k, number_got)
|
|
253
|
+
elif status == 'NUMERIC':
|
|
254
|
+
rows, max_diff = data
|
|
255
|
+
result = 'Numbers differed by %s\n' % max_diff
|
|
256
|
+
for number_want, number_got, failed, diff in rows:
|
|
257
|
+
if result:
|
|
258
|
+
result += '\n'
|
|
259
|
+
result += 'Expected : %s\n' % number_want
|
|
260
|
+
result += 'Got : %s\n' % number_got
|
|
261
|
+
if failed:
|
|
262
|
+
result += 'Difference (FAILURE): %s\n' % diff
|
|
263
|
+
else:
|
|
264
|
+
result += 'Difference : %s\n' % diff
|
|
265
|
+
return result
|
|
266
|
+
else:
|
|
267
|
+
raise Exception('Internal error in OutputChecker.')
|
|
268
|
+
|
|
269
|
+
def formatted_compare_numeric(self, want, got, optionflags):
|
|
270
|
+
"""
|
|
271
|
+
Performs comparison of compare_numeric and returns formatted
|
|
272
|
+
text.
|
|
273
|
+
|
|
274
|
+
Only supposed to be used if comparison failed.
|
|
275
|
+
"""
|
|
276
|
+
|
|
277
|
+
status, data = self.compare_numeric(want, got, optionflags)
|
|
278
|
+
|
|
279
|
+
return self.format_compare_numeric_result(status, data)
|
|
280
|
+
|
|
281
|
+
def check_output(self, want, got, optionflags):
|
|
282
|
+
"""
|
|
283
|
+
Implementation of OutputChecker method.
|
|
284
|
+
"""
|
|
285
|
+
|
|
286
|
+
if want == got:
|
|
287
|
+
# Early bail
|
|
288
|
+
return True
|
|
289
|
+
|
|
290
|
+
if optionflags & ALL_NUMERIC:
|
|
291
|
+
# Use our method if any NUMERIC flag set
|
|
292
|
+
status, data = self.compare_numeric(want, got, optionflags)
|
|
293
|
+
return status == 'OK'
|
|
294
|
+
else:
|
|
295
|
+
# Otherwise fallback to base implementation.
|
|
296
|
+
return doctest.OutputChecker.check_output(
|
|
297
|
+
self, want, got, optionflags)
|
|
298
|
+
|
|
299
|
+
def output_difference(self, example, got, optionflags):
|
|
300
|
+
"""
|
|
301
|
+
Implementation of OutputChecker method.
|
|
302
|
+
"""
|
|
303
|
+
if (not optionflags & ALL_NUMERIC) or example.exc_msg:
|
|
304
|
+
# Fallback to base implementation if no NUMERIC flag
|
|
305
|
+
# set or there was an exception.
|
|
306
|
+
return doctest.OutputChecker.output_difference(
|
|
307
|
+
self, example, got, optionflags)
|
|
308
|
+
else:
|
|
309
|
+
# Result of base implementation
|
|
310
|
+
flags = optionflags | NUMERIC_DEFAULT_OPTIONFLAGS
|
|
311
|
+
base_result = doctest.OutputChecker.output_difference(
|
|
312
|
+
self, example, got, flags)
|
|
313
|
+
|
|
314
|
+
# Our compare result
|
|
315
|
+
compare_result = self.formatted_compare_numeric(
|
|
316
|
+
example.want, got, optionflags)
|
|
317
|
+
|
|
318
|
+
# Concatenate together
|
|
319
|
+
return base_result + '\nReason for failure: ' + compare_result + '\n'
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
def run_doctests(verbose=False, print_info=True):
|
|
323
|
+
failed, attempted = 0, 0
|
|
324
|
+
|
|
325
|
+
finder = doctest.DocTestFinder()
|
|
326
|
+
|
|
327
|
+
# Use the default docTest.OutputChecker to test our NumericOutputChecker
|
|
328
|
+
runner = doctest.DocTestRunner(verbose=verbose)
|
|
329
|
+
for test in finder.find(NumericOutputChecker):
|
|
330
|
+
runner.run(test)
|
|
331
|
+
result = runner.summarize()
|
|
332
|
+
failed += result.failed
|
|
333
|
+
attempted += result.attempted
|
|
334
|
+
|
|
335
|
+
# Test our NumericOutputChecker in action!
|
|
336
|
+
runner = doctest.DocTestRunner(checker=NumericOutputChecker(), verbose=verbose)
|
|
337
|
+
for test in finder.find(NumericExample):
|
|
338
|
+
runner.run(test)
|
|
339
|
+
result = runner.summarize()
|
|
340
|
+
failed += result.failed
|
|
341
|
+
attempted += result.attempted
|
|
342
|
+
|
|
343
|
+
return doctest.TestResults(failed, attempted)
|
|
344
|
+
|
|
345
|
+
run_doctests.__name__ = __name__
|
snappy/pari.py
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Import pari and associated classes and functions here, to be more DRY,
|
|
3
|
+
while supporting both old and new versions of cypari and sage.pari and
|
|
4
|
+
accounting for all of the various idiosyncrasies.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from packaging.version import parse as parse_version
|
|
8
|
+
from .sage_helper import _within_sage
|
|
9
|
+
|
|
10
|
+
if _within_sage:
|
|
11
|
+
from sage.version import version as s_version
|
|
12
|
+
sage_version = parse_version(s_version)
|
|
13
|
+
if sage_version < parse_version('9.0'):
|
|
14
|
+
raise ValueError("you need a more recent version of SageMath")
|
|
15
|
+
from sage.libs.pari import pari
|
|
16
|
+
from cypari2 import Gen
|
|
17
|
+
from cypari2.pari_instance import (prec_words_to_bits,
|
|
18
|
+
prec_bits_to_dec,
|
|
19
|
+
prec_dec_to_bits)
|
|
20
|
+
try:
|
|
21
|
+
from sage.all import PariError
|
|
22
|
+
except ImportError:
|
|
23
|
+
from sage.libs.pari.all import PariError
|
|
24
|
+
|
|
25
|
+
shut_up = lambda: None
|
|
26
|
+
speak_up = lambda: None
|
|
27
|
+
|
|
28
|
+
else: # Plain Python, use CyPari
|
|
29
|
+
import cypari
|
|
30
|
+
cypari_version = parse_version(cypari.__version__)
|
|
31
|
+
if cypari_version < parse_version('2.3'):
|
|
32
|
+
raise ValueError("you need a more recent version of CyPari")
|
|
33
|
+
from cypari import pari
|
|
34
|
+
from cypari._pari import (Gen,
|
|
35
|
+
PariError,
|
|
36
|
+
prec_words_to_dec,
|
|
37
|
+
prec_words_to_bits,
|
|
38
|
+
prec_bits_to_dec,
|
|
39
|
+
prec_dec_to_bits)
|
|
40
|
+
shut_up = lambda: pari.shut_up()
|
|
41
|
+
speak_up = lambda: pari.speak_up()
|
snappy/phone_home.py
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from threading import Thread
|
|
3
|
+
from .version import version as current
|
|
4
|
+
from packaging.version import parse as parse_version
|
|
5
|
+
|
|
6
|
+
import ssl
|
|
7
|
+
from urllib import request
|
|
8
|
+
version_url = 'http://snappy.computop.org/current.txt'
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Phoner(Thread):
|
|
12
|
+
def __init__(self):
|
|
13
|
+
Thread.__init__(self)
|
|
14
|
+
self.answer = None
|
|
15
|
+
|
|
16
|
+
def run(self):
|
|
17
|
+
this_version = parse_version(current)
|
|
18
|
+
latest = None
|
|
19
|
+
try:
|
|
20
|
+
# Below code would allow switching to https urls in our
|
|
21
|
+
# macOS app where certs are broken.
|
|
22
|
+
#
|
|
23
|
+
# ctx = ssl.create_default_context()
|
|
24
|
+
# ctx.check_hostname = False
|
|
25
|
+
# ctx.verify_mode = ssl.CERT_NONE
|
|
26
|
+
# with request.urlopen(version_url, context=ctx) as response:
|
|
27
|
+
with request.urlopen(version_url) as response:
|
|
28
|
+
latest = response.read().decode('ascii').strip()
|
|
29
|
+
latest_version = parse_version(latest)
|
|
30
|
+
except Exception:
|
|
31
|
+
return
|
|
32
|
+
if latest and latest_version > this_version:
|
|
33
|
+
self.answer = (latest, current)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def update_needed():
|
|
37
|
+
ET = Phoner()
|
|
38
|
+
ET.start()
|
|
39
|
+
ET.join(1.0) # Wait up to 1.0 seconds for an answer
|
|
40
|
+
if ET.is_alive():
|
|
41
|
+
return ''
|
|
42
|
+
elif ET.answer:
|
|
43
|
+
return ("**Please upgrade to %s from %s via "
|
|
44
|
+
"http://snappy.computop.org**\n" % ET.answer)
|
|
45
|
+
else:
|
|
46
|
+
return ''
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
if __name__ == '__main__':
|
|
50
|
+
if len(sys.argv) > 1:
|
|
51
|
+
current = '0.0.0'
|
|
52
|
+
else:
|
|
53
|
+
print('To provoke an update response add an argument.')
|
|
54
|
+
import time
|
|
55
|
+
start = time.time()
|
|
56
|
+
print(update_needed())
|
|
57
|
+
print('Elapsed time: %ss' % (time.time() - start))
|