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,173 @@
|
|
|
1
|
+
from .component import NonZeroDimensionalComponent
|
|
2
|
+
from . import processFileBase
|
|
3
|
+
from . import processRurFile
|
|
4
|
+
from . import utilities
|
|
5
|
+
from . import coordinates
|
|
6
|
+
from .polynomial import Polynomial
|
|
7
|
+
from .ptolemyVarietyPrimeIdealGroebnerBasis import PtolemyVarietyPrimeIdealGroebnerBasis
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def contains_ideal_components(text):
|
|
11
|
+
return "IDEAL=COMPONENTS=BEGIN" in text
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def decomposition_from_components(text):
|
|
15
|
+
|
|
16
|
+
py_eval = processFileBase.get_py_eval(text)
|
|
17
|
+
manifold_thunk = processFileBase.get_manifold_thunk(text)
|
|
18
|
+
|
|
19
|
+
variables_section = processFileBase.find_unique_section(
|
|
20
|
+
text, "VARIABLES")
|
|
21
|
+
|
|
22
|
+
variables = [ remove_optional_quotes(v.strip())
|
|
23
|
+
for v in variables_section.split(',') if v.strip() ]
|
|
24
|
+
|
|
25
|
+
decomposition = processFileBase.find_unique_section(
|
|
26
|
+
text, "IDEAL=COMPONENTS")
|
|
27
|
+
|
|
28
|
+
params, body = processFileBase.extract_parameters_and_body_from_section(
|
|
29
|
+
decomposition)
|
|
30
|
+
|
|
31
|
+
if "TYPE" not in params.keys():
|
|
32
|
+
raise Exception("No TYPE given for IDEAL=COMPONENTS")
|
|
33
|
+
|
|
34
|
+
type = params["TYPE"].strip()
|
|
35
|
+
|
|
36
|
+
if not type == "PTOLEMY":
|
|
37
|
+
raise Exception("TYPE '%s' not supported" % type)
|
|
38
|
+
|
|
39
|
+
components = processFileBase.find_section(text, "COMPONENT")
|
|
40
|
+
|
|
41
|
+
return utilities.MethodMappingList(
|
|
42
|
+
[ process_component(py_eval, manifold_thunk, variables,
|
|
43
|
+
component)
|
|
44
|
+
for component in components ])
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def remove_optional_quotes(s):
|
|
48
|
+
if s[0] in ['"', "'"]:
|
|
49
|
+
assert s[0] == s[-1]
|
|
50
|
+
return s[1:-1]
|
|
51
|
+
return s
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def process_component(py_eval, manifold_thunk, variables,
|
|
55
|
+
component):
|
|
56
|
+
|
|
57
|
+
params, body = processFileBase.extract_parameters_and_body_from_section(
|
|
58
|
+
component)
|
|
59
|
+
|
|
60
|
+
if "DIMENSION" not in params.keys():
|
|
61
|
+
raise Exception("No DIMENSION for COMPONENT of IDEAL=COMPONENTS")
|
|
62
|
+
|
|
63
|
+
dimension = int(params["DIMENSION"].strip())
|
|
64
|
+
|
|
65
|
+
free_variables = None
|
|
66
|
+
|
|
67
|
+
if dimension > 0 and "FREE=VARIABLES" in params.keys():
|
|
68
|
+
free_vars_str = processFileBase.remove_optional_outer_square_brackets(
|
|
69
|
+
params["FREE=VARIABLES"])
|
|
70
|
+
|
|
71
|
+
free_variables = [ remove_optional_quotes(v.strip())
|
|
72
|
+
for v in free_vars_str.split() ]
|
|
73
|
+
|
|
74
|
+
if dimension == 0:
|
|
75
|
+
return process_solutions_provider(py_eval, manifold_thunk, body, 0,
|
|
76
|
+
variables)
|
|
77
|
+
else:
|
|
78
|
+
witnesses = []
|
|
79
|
+
witnesses_sections = processFileBase.find_section(body, "WITNESSES")
|
|
80
|
+
if witnesses_sections:
|
|
81
|
+
assert len(witnesses_sections) == 1
|
|
82
|
+
witnesses = process_witnesses(
|
|
83
|
+
py_eval, manifold_thunk, witnesses_sections[0], dimension,
|
|
84
|
+
variables)
|
|
85
|
+
|
|
86
|
+
# process Groebner Basis ???, add to NonZeroDimensionalComponent ???
|
|
87
|
+
|
|
88
|
+
return NonZeroDimensionalComponent(
|
|
89
|
+
witnesses=witnesses,
|
|
90
|
+
dimension=dimension,
|
|
91
|
+
free_variables=free_variables)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def process_witnesses(py_eval, manifold_thunk, witnesses_section, for_dimension,
|
|
95
|
+
variables):
|
|
96
|
+
|
|
97
|
+
return [ process_solutions_provider(
|
|
98
|
+
py_eval, manifold_thunk, witness_section, for_dimension, variables)
|
|
99
|
+
for witness_section
|
|
100
|
+
in processFileBase.find_section(witnesses_section, "WITNESS") ]
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def process_solutions_provider(py_eval, manifold_thunk, text, for_dimension,
|
|
104
|
+
variables):
|
|
105
|
+
|
|
106
|
+
rur_section = processFileBase.find_section(text, "MAPLE=LIKE=RUR")
|
|
107
|
+
if rur_section:
|
|
108
|
+
assert len(rur_section) == 1
|
|
109
|
+
|
|
110
|
+
return SolutionContainer(
|
|
111
|
+
coordinates.PtolemyCoordinates(
|
|
112
|
+
processRurFile.parse_maple_like_rur(rur_section[0]),
|
|
113
|
+
is_numerical=False,
|
|
114
|
+
py_eval_section=py_eval,
|
|
115
|
+
manifold_thunk=manifold_thunk))
|
|
116
|
+
|
|
117
|
+
gb_section = processFileBase.find_section(text, "GROEBNER=BASIS")
|
|
118
|
+
|
|
119
|
+
if gb_section:
|
|
120
|
+
assert len(gb_section) == 1
|
|
121
|
+
|
|
122
|
+
params, body = (
|
|
123
|
+
processFileBase.extract_parameters_and_body_from_section(
|
|
124
|
+
gb_section[0]))
|
|
125
|
+
|
|
126
|
+
body = processFileBase.remove_optional_outer_square_brackets(
|
|
127
|
+
utilities.join_long_lines_deleting_whitespace(body))
|
|
128
|
+
|
|
129
|
+
polys = [ Polynomial.parse_string(p)
|
|
130
|
+
for p in body.replace('\n', ' ').split(',') ]
|
|
131
|
+
|
|
132
|
+
if 'TERM=ORDER' not in params.keys():
|
|
133
|
+
raise Exception("No term order given for Groebner basis")
|
|
134
|
+
|
|
135
|
+
term_order = params["TERM=ORDER"].strip().lower()
|
|
136
|
+
|
|
137
|
+
return PtolemyVarietyPrimeIdealGroebnerBasis(
|
|
138
|
+
polys=polys,
|
|
139
|
+
term_order=term_order,
|
|
140
|
+
size=None,
|
|
141
|
+
dimension=0,
|
|
142
|
+
is_prime=True,
|
|
143
|
+
free_variables=None,
|
|
144
|
+
py_eval=py_eval,
|
|
145
|
+
manifold_thunk=manifold_thunk)
|
|
146
|
+
|
|
147
|
+
rs_rur = processFileBase.find_section(text, "RS=RUR")
|
|
148
|
+
|
|
149
|
+
if rs_rur:
|
|
150
|
+
assert len(rs_rur) == 1
|
|
151
|
+
|
|
152
|
+
return SolutionContainer(
|
|
153
|
+
coordinates.PtolemyCoordinates(
|
|
154
|
+
processRurFile.parse_rs_rur(rs_rur[0], variables),
|
|
155
|
+
is_numerical=False,
|
|
156
|
+
py_eval_section=py_eval,
|
|
157
|
+
manifold_thunk=manifold_thunk))
|
|
158
|
+
|
|
159
|
+
raise Exception("No parsable solution type given: %s..." % text[:100])
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class SolutionContainer():
|
|
163
|
+
def __init__(self, solutions):
|
|
164
|
+
self._solutions = solutions
|
|
165
|
+
|
|
166
|
+
def solutions(self, numerical=False):
|
|
167
|
+
if numerical:
|
|
168
|
+
return self._solutions.numerical()
|
|
169
|
+
else:
|
|
170
|
+
return self._solutions
|
|
171
|
+
|
|
172
|
+
def number_field(self):
|
|
173
|
+
return self._solutions.number_field()
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
from . import utilities
|
|
4
|
+
from .ptolemyObstructionClass import PtolemyObstructionClass
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
Basic functions to read a ptolemy solutions file.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
class PtolemyPrecomputedObstructionClassMismatchError(Exception):
|
|
11
|
+
def __init__(self, index, actual_class, precomputed_class):
|
|
12
|
+
|
|
13
|
+
msg = (
|
|
14
|
+
"The obstruction class in the pre-computed file does not match "
|
|
15
|
+
"the obstruction class of the Ptolemy variety (index %d). "
|
|
16
|
+
"The underlying reason is that the pari's implementation of the "
|
|
17
|
+
"Smith normal form has changed affecting the order in which we "
|
|
18
|
+
"list the cohomology classes or the cocycles we use as "
|
|
19
|
+
"representatives. A pre-computed file for the new cocycle has "
|
|
20
|
+
"not yet been computed.") % index
|
|
21
|
+
|
|
22
|
+
Exception.__init__(self, msg)
|
|
23
|
+
self.index = index
|
|
24
|
+
self.actual_class = actual_class
|
|
25
|
+
self.precomputed_class = precomputed_class
|
|
26
|
+
|
|
27
|
+
def find_section(text, name):
|
|
28
|
+
"""
|
|
29
|
+
Finds all sections of the form
|
|
30
|
+
|
|
31
|
+
NAME=BEGINS=HERE
|
|
32
|
+
stuff
|
|
33
|
+
stuff
|
|
34
|
+
stuff
|
|
35
|
+
NAME=ENDS=HERE
|
|
36
|
+
|
|
37
|
+
or
|
|
38
|
+
|
|
39
|
+
==NAME=BEGINS==
|
|
40
|
+
stuff
|
|
41
|
+
stuff
|
|
42
|
+
stuff
|
|
43
|
+
==NAME=ENDS==
|
|
44
|
+
|
|
45
|
+
in text where NAME has to be replaced by name.
|
|
46
|
+
|
|
47
|
+
>>> t = (
|
|
48
|
+
... "abc abc\\n"
|
|
49
|
+
... "==FOO=BEGINS==\\n"
|
|
50
|
+
... "bar bar\\n"
|
|
51
|
+
... "==FOO=ENDS==\\n")
|
|
52
|
+
>>> find_section(t, "FOO")
|
|
53
|
+
['bar bar']
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
old_style_regex = (name + "=BEGINS=HERE" +
|
|
57
|
+
"(.*?)" +
|
|
58
|
+
name + "=ENDS=HERE")
|
|
59
|
+
new_style_regex = ("==" + name + "=BEGINS?==" +
|
|
60
|
+
"(.*?)" +
|
|
61
|
+
"==" + name + "=ENDS?==")
|
|
62
|
+
regexs = [ old_style_regex, new_style_regex ]
|
|
63
|
+
|
|
64
|
+
if not isinstance(text, str):
|
|
65
|
+
text = text.decode('ascii')
|
|
66
|
+
|
|
67
|
+
return [ s.strip()
|
|
68
|
+
for regex in regexs
|
|
69
|
+
for s in re.findall(regex, text, re.DOTALL) ]
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def find_unique_section(text, name):
|
|
73
|
+
"""
|
|
74
|
+
Like find_section but ensures that there is only a single
|
|
75
|
+
such section. Exceptions in all other cases.
|
|
76
|
+
|
|
77
|
+
>>> t = "abc abc\\n==FOO=BEGINS==\\nbar bar\\n==FOO=ENDS==\\n"
|
|
78
|
+
>>> find_unique_section(t, "FOO")
|
|
79
|
+
'bar bar'
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
sections = find_section(text, name)
|
|
83
|
+
if len(sections) > 1:
|
|
84
|
+
raise Exception("Section %s more than once in file" % name)
|
|
85
|
+
if not sections:
|
|
86
|
+
raise Exception("No section %s in file" % name)
|
|
87
|
+
return sections[0]
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def extract_parameters_and_body_from_section(section_text):
|
|
91
|
+
"""
|
|
92
|
+
Turns patterns of the form "==KEY:VALUE" at the beginning lines
|
|
93
|
+
into a dictionary and returns the remaining text.
|
|
94
|
+
|
|
95
|
+
>>> t = "==A:1\\n==B:2\\nBody\\nBody"
|
|
96
|
+
>>> extract_parameters_and_body_from_section(t)[0]['A']
|
|
97
|
+
'1'
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
params = {}
|
|
101
|
+
|
|
102
|
+
while True:
|
|
103
|
+
m = re.match("==(.*):(.*)\n", section_text)
|
|
104
|
+
if not m:
|
|
105
|
+
return params, section_text
|
|
106
|
+
|
|
107
|
+
k, v = m.groups()
|
|
108
|
+
params[k] = v
|
|
109
|
+
section_text = section_text.split('\n',1)[1]
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def remove_outer_square_brackets(text):
|
|
113
|
+
"""
|
|
114
|
+
Checks that test is of the form "[...]" and returns result between
|
|
115
|
+
brackets.
|
|
116
|
+
|
|
117
|
+
>>> remove_outer_square_brackets("[a*b*c]")
|
|
118
|
+
'a*b*c'
|
|
119
|
+
>>> remove_outer_square_brackets("[[a,b]")
|
|
120
|
+
'[a,b'
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
if text[0] != '[' or text[-1] != ']':
|
|
124
|
+
raise ValueError("Error while parsing: outer square brackets missing")
|
|
125
|
+
|
|
126
|
+
return text[1:-1]
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def remove_optional_outer_square_brackets(text):
|
|
130
|
+
|
|
131
|
+
if text[0] == '[':
|
|
132
|
+
return remove_outer_square_brackets(text)
|
|
133
|
+
|
|
134
|
+
return text
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def parse_int_or_empty(s):
|
|
138
|
+
"""
|
|
139
|
+
>>> parse_int_or_empty('3')
|
|
140
|
+
3
|
|
141
|
+
>>> parse_int_or_empty('') is None
|
|
142
|
+
True
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
if s:
|
|
146
|
+
return int(s)
|
|
147
|
+
return None
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def get_py_eval(text):
|
|
151
|
+
"""
|
|
152
|
+
From a ptolemy solutions file, extract the PY=EVAL=SECTION
|
|
153
|
+
"""
|
|
154
|
+
|
|
155
|
+
return eval(
|
|
156
|
+
utilities.join_long_lines(
|
|
157
|
+
find_unique_section(text, "PY=EVAL=SECTION")))
|
|
158
|
+
|
|
159
|
+
# A dict-like object we can feed into the variable dict
|
|
160
|
+
# function in the pre-computed solution file.
|
|
161
|
+
#
|
|
162
|
+
# It is sufficient to evaluate the obstruction class but
|
|
163
|
+
# returns 1 for all other keys.
|
|
164
|
+
#
|
|
165
|
+
class _DummyDict:
|
|
166
|
+
def __getitem__(self, key):
|
|
167
|
+
if key == '1' or key[0] == 'c':
|
|
168
|
+
return 1
|
|
169
|
+
raise KeyError(key)
|
|
170
|
+
|
|
171
|
+
def check_obstruction_class_for_variable_dict_function(
|
|
172
|
+
variable_dict_function, obstruction_class):
|
|
173
|
+
|
|
174
|
+
if not isinstance(obstruction_class, PtolemyObstructionClass):
|
|
175
|
+
# Note that no obstruction class has always been
|
|
176
|
+
# corresponding to index 0 ("c0" in file name).
|
|
177
|
+
# So nothing to check.
|
|
178
|
+
#
|
|
179
|
+
# We also don't check for the generalized
|
|
180
|
+
# obstruction class.
|
|
181
|
+
#
|
|
182
|
+
# We should double check that our solutions
|
|
183
|
+
# for PSL(n,C) with n>2 are still fine...
|
|
184
|
+
#
|
|
185
|
+
return
|
|
186
|
+
|
|
187
|
+
variable_dict = variable_dict_function(_DummyDict())
|
|
188
|
+
precomputed_class = [
|
|
189
|
+
variable_dict[var_name]
|
|
190
|
+
for var_name in obstruction_class._explain_basis ]
|
|
191
|
+
|
|
192
|
+
# Obstruction class contains element in Z/2 as additive group.
|
|
193
|
+
# We need to convert it to be in multiplicative group {-1, 1}.
|
|
194
|
+
actual_class = [
|
|
195
|
+
(-1) ** i for i in obstruction_class._H2_element ]
|
|
196
|
+
|
|
197
|
+
if actual_class != precomputed_class:
|
|
198
|
+
raise PtolemyPrecomputedObstructionClassMismatchError(
|
|
199
|
+
obstruction_class._index,
|
|
200
|
+
actual_class,
|
|
201
|
+
precomputed_class)
|
|
202
|
+
|
|
203
|
+
def get_manifold_thunk(text):
|
|
204
|
+
"""
|
|
205
|
+
From a ptolemy solutions file, extract the manifold.
|
|
206
|
+
Returned as thunk that evaluates to a snappy manifold.
|
|
207
|
+
"""
|
|
208
|
+
|
|
209
|
+
def get_manifold(text=text):
|
|
210
|
+
triangulation_text = utilities.join_long_lines(
|
|
211
|
+
find_unique_section(text, "TRIANGULATION"))
|
|
212
|
+
|
|
213
|
+
if triangulation_text[:15] == '% Triangulation':
|
|
214
|
+
|
|
215
|
+
from snappy import Manifold
|
|
216
|
+
|
|
217
|
+
return Manifold(triangulation_text)
|
|
218
|
+
|
|
219
|
+
if ('<?xml' in triangulation_text and
|
|
220
|
+
'<reginadata' in triangulation_text and
|
|
221
|
+
'<packet' in triangulation_text):
|
|
222
|
+
|
|
223
|
+
from reginaWrapper import NTriangulationForPtolemy
|
|
224
|
+
|
|
225
|
+
return NTriangulationForPtolemy.from_xml(triangulation_text)
|
|
226
|
+
|
|
227
|
+
raise Exception("Triangulation format not supported: %s..." %
|
|
228
|
+
triangulation_text[:20])
|
|
229
|
+
|
|
230
|
+
return get_manifold
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def get_manifold(text):
|
|
234
|
+
"""
|
|
235
|
+
From a ptolemy solutions file, extract the manifold.
|
|
236
|
+
Returned as snappy Manifold.
|
|
237
|
+
"""
|
|
238
|
+
|
|
239
|
+
return get_manifold_thunk(text)()
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def get_manifold_from_file(filename):
|
|
243
|
+
"""
|
|
244
|
+
As get_manifold but takes filename. Returns a byte sequence.
|
|
245
|
+
"""
|
|
246
|
+
|
|
247
|
+
return get_manifold(open(filename, 'rb').read())
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module takes a textual representation of the solutions to a
|
|
3
|
+
Ptolemy variety and parses it by detecting the type of the textual
|
|
4
|
+
representation and dispatching it to the corresponding module.
|
|
5
|
+
"""
|
|
6
|
+
from . import processMagmaFile
|
|
7
|
+
from . import processRurFile
|
|
8
|
+
from . import processComponents
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def parse_decomposition(text):
|
|
12
|
+
if processMagmaFile.contains_magma_output(text):
|
|
13
|
+
return processMagmaFile.decomposition_from_magma(text)
|
|
14
|
+
|
|
15
|
+
# Deprecated, will be removed soon!
|
|
16
|
+
if processRurFile.contains_rur(text):
|
|
17
|
+
return processRurFile.decomposition_from_rur(text)
|
|
18
|
+
|
|
19
|
+
if processComponents.contains_ideal_components(text):
|
|
20
|
+
return processComponents.decomposition_from_components(text)
|
|
21
|
+
|
|
22
|
+
raise Exception("solution file format not recognized")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def parse_decomposition_from_file(filename):
|
|
26
|
+
with open(filename, 'r') as f:
|
|
27
|
+
return parse_decomposition(f.read())
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def parse_solutions(text, numerical=False):
|
|
31
|
+
"""
|
|
32
|
+
Reads the text containing the solutions from a magma computation
|
|
33
|
+
or a rur computation and returns a list of solutions.
|
|
34
|
+
|
|
35
|
+
A non-zero dimensional component of the variety is reported as
|
|
36
|
+
NonZeroDimensionalComponent.
|
|
37
|
+
"""
|
|
38
|
+
return parse_decomposition(text).solutions(numerical)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def parse_solutions_from_file(filename, numerical=False):
|
|
42
|
+
"""
|
|
43
|
+
As parse_solutions, but takes a filename instead.
|
|
44
|
+
"""
|
|
45
|
+
with open(filename, 'r') as f:
|
|
46
|
+
return parse_solutions(f.read(), numerical)
|