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,392 @@
|
|
|
1
|
+
from .polynomial import Polynomial
|
|
2
|
+
from .ptolemyVarietyPrimeIdealGroebnerBasis import PtolemyVarietyPrimeIdealGroebnerBasis
|
|
3
|
+
from . import processFileBase
|
|
4
|
+
from . import utilities
|
|
5
|
+
import snappy
|
|
6
|
+
|
|
7
|
+
import re
|
|
8
|
+
import sys
|
|
9
|
+
import tempfile
|
|
10
|
+
import subprocess
|
|
11
|
+
import shutil
|
|
12
|
+
|
|
13
|
+
###############################################################################
|
|
14
|
+
# functions
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def decomposition_from_magma(text):
|
|
18
|
+
|
|
19
|
+
py_eval = processFileBase.get_py_eval(text)
|
|
20
|
+
manifold_thunk = processFileBase.get_manifold_thunk(text)
|
|
21
|
+
|
|
22
|
+
untyped_decomposition = processFileBase.find_section(
|
|
23
|
+
text, "IDEAL=DECOMPOSITION")
|
|
24
|
+
primary_decomposition = processFileBase.find_section(
|
|
25
|
+
text, "PRIMARY=DECOMPOSITION")
|
|
26
|
+
radical_decomposition = processFileBase.find_section(
|
|
27
|
+
text, "RADICAL=DECOMPOSITION")
|
|
28
|
+
|
|
29
|
+
if untyped_decomposition:
|
|
30
|
+
decomposition = untyped_decomposition[0]
|
|
31
|
+
elif primary_decomposition:
|
|
32
|
+
decomposition = primary_decomposition[0]
|
|
33
|
+
elif radical_decomposition:
|
|
34
|
+
decomposition = radical_decomposition[0]
|
|
35
|
+
else:
|
|
36
|
+
raise ValueError(
|
|
37
|
+
"File not recognized as magma output "
|
|
38
|
+
"(missing primary decomposition or radical decomposition)")
|
|
39
|
+
|
|
40
|
+
# Remove "\" at the wrapped lines
|
|
41
|
+
decomposition = utilities.join_long_lines_deleting_whitespace(
|
|
42
|
+
decomposition)
|
|
43
|
+
|
|
44
|
+
# Remove outer square brackets
|
|
45
|
+
decomposition = processFileBase.remove_outer_square_brackets(decomposition)
|
|
46
|
+
|
|
47
|
+
decomposition_comps = [ c.strip() for c in decomposition.split(']') ]
|
|
48
|
+
decomposition_components = [ c + ']' for c in decomposition_comps if c ]
|
|
49
|
+
|
|
50
|
+
free_variables_section = processFileBase.find_section(
|
|
51
|
+
text, "FREE=VARIABLES=IN=COMPONENTS")
|
|
52
|
+
if free_variables_section:
|
|
53
|
+
free_variables = eval(free_variables_section[0])
|
|
54
|
+
else:
|
|
55
|
+
free_variables = len(decomposition_components) * [None]
|
|
56
|
+
|
|
57
|
+
witnesses_section = processFileBase.find_section(
|
|
58
|
+
text, "WITNESSES=FOR=COMPONENTS")
|
|
59
|
+
if witnesses_section:
|
|
60
|
+
witnesses_sections = processFileBase.find_section(
|
|
61
|
+
witnesses_section[0], "WITNESSES")
|
|
62
|
+
else:
|
|
63
|
+
witnesses_sections = len(decomposition_components) * [""]
|
|
64
|
+
|
|
65
|
+
genuses_section = processFileBase.find_section(
|
|
66
|
+
text, "GENUSES=FOR=COMPONENTS")
|
|
67
|
+
if genuses_section:
|
|
68
|
+
genuses_sections = processFileBase.find_section(
|
|
69
|
+
genuses_section[0], "GENUS=FOR=COMPONENT")
|
|
70
|
+
else:
|
|
71
|
+
genuses_sections = len(decomposition_components) * [""]
|
|
72
|
+
|
|
73
|
+
def process_match(i, comp, free_vars, witnesses_txt, genus_txt):
|
|
74
|
+
|
|
75
|
+
if i != 0:
|
|
76
|
+
if not comp[0] == ',':
|
|
77
|
+
raise ValueError("Parsing decomposition, expected "
|
|
78
|
+
"separating comma.")
|
|
79
|
+
comp = comp[1:].strip()
|
|
80
|
+
|
|
81
|
+
if genus_txt.strip():
|
|
82
|
+
genus = int(genus_txt)
|
|
83
|
+
else:
|
|
84
|
+
genus = None
|
|
85
|
+
|
|
86
|
+
witnesses_txts = processFileBase.find_section(
|
|
87
|
+
witnesses_txt, "WITNESS")
|
|
88
|
+
|
|
89
|
+
witnesses = [
|
|
90
|
+
_parse_ideal_groebner_basis(
|
|
91
|
+
utilities.join_long_lines_deleting_whitespace(t).strip(),
|
|
92
|
+
py_eval, manifold_thunk, free_vars, [], genus)
|
|
93
|
+
for t in witnesses_txts ]
|
|
94
|
+
|
|
95
|
+
return _parse_ideal_groebner_basis(comp, py_eval, manifold_thunk,
|
|
96
|
+
free_vars, witnesses, genus)
|
|
97
|
+
|
|
98
|
+
return utilities.MethodMappingList(
|
|
99
|
+
[ process_match(i, comp, free_vars, witnesses, genus_txt)
|
|
100
|
+
for i, (comp, free_vars, witnesses, genus_txt)
|
|
101
|
+
in enumerate(zip(decomposition_components,
|
|
102
|
+
free_variables,
|
|
103
|
+
witnesses_sections,
|
|
104
|
+
genuses_sections)) ])
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _parse_ideal_groebner_basis(text, py_eval, manifold_thunk,
|
|
108
|
+
free_vars, witnesses, genus):
|
|
109
|
+
match = re.match(
|
|
110
|
+
r"Ideal of Polynomial ring of rank.*?\n"
|
|
111
|
+
r"\s*?(Order:\s*?(.*?)|(.*?)\s*?Order)\n"
|
|
112
|
+
r"\s*?Variables:(.*?\n)+"
|
|
113
|
+
r".*?Dimension (\d+).*?\s*([^,]*[Pp]rime)?.*?\n"
|
|
114
|
+
r"(\s*?Size of variety over algebraically closed field: (\d+).*?\n)?"
|
|
115
|
+
r"\s*Groebner basis:\n"
|
|
116
|
+
r"\s*?\[([^\[\]]*)\]$",
|
|
117
|
+
text)
|
|
118
|
+
|
|
119
|
+
if not match:
|
|
120
|
+
raise ValueError("Parsing error in component of "
|
|
121
|
+
"decomposition: %s" % text)
|
|
122
|
+
|
|
123
|
+
(
|
|
124
|
+
tot_order_str, post_order_str, pre_order_str,
|
|
125
|
+
var_str,
|
|
126
|
+
dimension_str, prime_str,
|
|
127
|
+
variety_str, size_str,
|
|
128
|
+
|
|
129
|
+
poly_strs ) = match.groups()
|
|
130
|
+
|
|
131
|
+
dimension = int(dimension_str)
|
|
132
|
+
|
|
133
|
+
if dimension == 0:
|
|
134
|
+
polys = [ Polynomial.parse_string(p)
|
|
135
|
+
for p in poly_strs.replace('\n',' ').split(',') ]
|
|
136
|
+
else:
|
|
137
|
+
polys = []
|
|
138
|
+
|
|
139
|
+
order_str = post_order_str if post_order_str else pre_order_str
|
|
140
|
+
if not order_str:
|
|
141
|
+
raise ValueError("Could not parse order in decomposition")
|
|
142
|
+
|
|
143
|
+
if order_str.strip().lower() == 'lexicographical':
|
|
144
|
+
term_order = 'lex'
|
|
145
|
+
else:
|
|
146
|
+
term_order = 'other'
|
|
147
|
+
|
|
148
|
+
is_prime = (prime_str is None) or (prime_str.lower() == 'prime')
|
|
149
|
+
|
|
150
|
+
return PtolemyVarietyPrimeIdealGroebnerBasis(
|
|
151
|
+
polys=polys,
|
|
152
|
+
term_order=term_order,
|
|
153
|
+
size=processFileBase.parse_int_or_empty(size_str),
|
|
154
|
+
dimension=dimension,
|
|
155
|
+
is_prime=is_prime,
|
|
156
|
+
free_variables=free_vars,
|
|
157
|
+
py_eval=py_eval,
|
|
158
|
+
manifold_thunk=manifold_thunk,
|
|
159
|
+
witnesses=witnesses,
|
|
160
|
+
genus=genus)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def triangulation_from_magma(text):
|
|
164
|
+
"""
|
|
165
|
+
Reads the output from a magma computation and extracts the manifold for
|
|
166
|
+
which this output contains solutions.
|
|
167
|
+
"""
|
|
168
|
+
return processFileBase.get_manifold(text)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def triangulation_from_magma_file(filename):
|
|
172
|
+
"""
|
|
173
|
+
Reads the output from a magma computation from the file with the given
|
|
174
|
+
filename and extracts the manifold for which the file contains solutions.
|
|
175
|
+
"""
|
|
176
|
+
|
|
177
|
+
return processFileBase.get_manifold_from_file(filename)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def contains_magma_output(text):
|
|
181
|
+
return ("IDEAL=DECOMPOSITION=BEGINS" in text or
|
|
182
|
+
"PRIMARY=DECOMPOSITION=BEGINS" in text or
|
|
183
|
+
"RADICAL=DECOMPOSITION=BEGINS" in text)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def solutions_from_magma_file(filename, numerical=False):
|
|
187
|
+
"""
|
|
188
|
+
Obsolete, use processFileDispatch.parse_solutions_from_file instead.
|
|
189
|
+
|
|
190
|
+
Reads the output from a magma computation from the file with the given
|
|
191
|
+
filename and returns a list of solutions. Also see solutions_from_magma.
|
|
192
|
+
A non-zero dimensional component of the variety is reported as
|
|
193
|
+
NonZeroDimensionalComponent.
|
|
194
|
+
"""
|
|
195
|
+
|
|
196
|
+
return solutions_from_magma(open(filename).read(), numerical)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def solutions_from_magma(output, numerical=False):
|
|
200
|
+
"""
|
|
201
|
+
Obsolete, use processFileDispatch.parse_solutions instead.
|
|
202
|
+
|
|
203
|
+
Assumes the given string is the output of a magma computation, parses
|
|
204
|
+
it and returns a list of solutions.
|
|
205
|
+
A non-zero dimensional component of the variety is reported as
|
|
206
|
+
NonZeroDimensionalComponent.
|
|
207
|
+
"""
|
|
208
|
+
|
|
209
|
+
return decomposition_from_magma(output).solutions(
|
|
210
|
+
numerical=numerical)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def magma_executable():
|
|
214
|
+
for name in ['magma', 'magma.exe']:
|
|
215
|
+
if shutil.which(name):
|
|
216
|
+
return name
|
|
217
|
+
return None
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def run_magma(content,
|
|
221
|
+
filename_base, memory_limit, directory, verbose):
|
|
222
|
+
"""
|
|
223
|
+
call magma on the given content and
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
magma = magma_executable()
|
|
227
|
+
if magma is None:
|
|
228
|
+
raise ValueError('Sorry, could not find the Magma executable')
|
|
229
|
+
|
|
230
|
+
if directory:
|
|
231
|
+
resolved_dir = directory
|
|
232
|
+
if not resolved_dir[-1] == '/':
|
|
233
|
+
resolved_dir = resolved_dir + '/'
|
|
234
|
+
else:
|
|
235
|
+
resolved_dir = tempfile.mkdtemp() + '/'
|
|
236
|
+
|
|
237
|
+
in_file = resolved_dir + filename_base + '.magma'
|
|
238
|
+
out_file = resolved_dir + filename_base + '.magma_out'
|
|
239
|
+
|
|
240
|
+
if verbose:
|
|
241
|
+
print("Writing to file:", in_file)
|
|
242
|
+
|
|
243
|
+
open(in_file, 'wb').write(content.encode('ascii'))
|
|
244
|
+
|
|
245
|
+
if verbose:
|
|
246
|
+
print("Magma's output in:", out_file)
|
|
247
|
+
|
|
248
|
+
if sys.platform.startswith('win'):
|
|
249
|
+
cmd = 'echo | %s "%s" > "%s"' % (magma, in_file, out_file)
|
|
250
|
+
else:
|
|
251
|
+
cmd = 'ulimit -m %d; echo | %s "%s" > "%s"' % (
|
|
252
|
+
int(memory_limit / 1024), magma, in_file, out_file)
|
|
253
|
+
|
|
254
|
+
if verbose:
|
|
255
|
+
print("Command:", cmd)
|
|
256
|
+
print("Starting magma...")
|
|
257
|
+
|
|
258
|
+
retcode = subprocess.call(cmd, shell=True)
|
|
259
|
+
|
|
260
|
+
result = open(out_file, 'r').read()
|
|
261
|
+
|
|
262
|
+
if verbose:
|
|
263
|
+
print("magma finished.")
|
|
264
|
+
print("Parsing magma result...")
|
|
265
|
+
|
|
266
|
+
return decomposition_from_magma(result)
|
|
267
|
+
|
|
268
|
+
###############################################################################
|
|
269
|
+
# magma test
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
_magma_output_for_4_1__sl3 = """
|
|
273
|
+
==TRIANGULATION=BEGINS==
|
|
274
|
+
% Triangulation
|
|
275
|
+
4_1
|
|
276
|
+
geometric_solution 2.02988321
|
|
277
|
+
oriented_manifold
|
|
278
|
+
CS_known -0.0000000000000001
|
|
279
|
+
|
|
280
|
+
1 0
|
|
281
|
+
torus 0.000000000000 0.000000000000
|
|
282
|
+
|
|
283
|
+
2
|
|
284
|
+
1 1 1 1
|
|
285
|
+
0132 1302 1023 2031
|
|
286
|
+
0 0 0 0
|
|
287
|
+
0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0
|
|
288
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|
289
|
+
0 1 0 -1 -1 0 2 -1 0 -1 0 1 0 1 -1 0
|
|
290
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|
291
|
+
0.500000000000 0.866025403784
|
|
292
|
+
|
|
293
|
+
0 0 0 0
|
|
294
|
+
0132 1302 1023 2031
|
|
295
|
+
0 0 0 0
|
|
296
|
+
0 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|
297
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|
298
|
+
0 1 -2 1 1 0 0 -1 0 1 0 -1 0 -1 1 0
|
|
299
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|
300
|
+
0.500000000000 0.866025403784
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
==TRIANGULATION=ENDS==
|
|
304
|
+
PY=EVAL=SECTION=BEGINS=HERE
|
|
305
|
+
{'variable_dict' :
|
|
306
|
+
(lambda d, negation = (lambda x:-x): {
|
|
307
|
+
'c_1020_0' : d['c_0012_1'],
|
|
308
|
+
'c_1020_1' : d['1'],
|
|
309
|
+
'c_0201_0' : d['c_0201_0'],
|
|
310
|
+
'c_0201_1' : d['c_0201_0'],
|
|
311
|
+
'c_2100_0' : d['1'],
|
|
312
|
+
'c_2100_1' : d['c_0012_1'],
|
|
313
|
+
'c_2010_0' : d['1'],
|
|
314
|
+
'c_2010_1' : d['c_0012_1'],
|
|
315
|
+
'c_0102_0' : d['c_0102_0'],
|
|
316
|
+
'c_0102_1' : d['c_0102_0'],
|
|
317
|
+
'c_1101_0' : d['c_1101_0'],
|
|
318
|
+
'c_1101_1' : negation(d['c_1101_0']),
|
|
319
|
+
'c_1200_0' : d['c_0012_1'],
|
|
320
|
+
'c_1200_1' : d['1'],
|
|
321
|
+
'c_1110_0' : negation(d['c_1011_1']),
|
|
322
|
+
'c_1110_1' : negation(d['c_1011_0']),
|
|
323
|
+
'c_0120_0' : d['c_0102_0'],
|
|
324
|
+
'c_0120_1' : d['c_0102_0'],
|
|
325
|
+
'c_2001_0' : d['c_0201_0'],
|
|
326
|
+
'c_2001_1' : d['c_0201_0'],
|
|
327
|
+
'c_0012_0' : d['1'],
|
|
328
|
+
'c_0012_1' : d['c_0012_1'],
|
|
329
|
+
'c_0111_0' : d['1'],
|
|
330
|
+
'c_0111_1' : negation(d['1']),
|
|
331
|
+
'c_0210_0' : d['c_0201_0'],
|
|
332
|
+
'c_0210_1' : d['c_0201_0'],
|
|
333
|
+
'c_1002_0' : d['c_0102_0'],
|
|
334
|
+
'c_1002_1' : d['c_0102_0'],
|
|
335
|
+
'c_1011_0' : d['c_1011_0'],
|
|
336
|
+
'c_1011_1' : d['c_1011_1'],
|
|
337
|
+
'c_0021_0' : d['c_0012_1'],
|
|
338
|
+
'c_0021_1' : d['1']})}
|
|
339
|
+
PY=EVAL=SECTION=ENDS=HERE
|
|
340
|
+
PRIMARY=DECOMPOSITION=BEGINS=HERE
|
|
341
|
+
[
|
|
342
|
+
Ideal of Polynomial ring of rank 7 over Rational Field
|
|
343
|
+
Lexicographical Order
|
|
344
|
+
Variables: t, c_0012_1, c_0102_0, c_0201_0, c_1011_0, c_1011_1, c_1101_0
|
|
345
|
+
Dimension 0, Radical, Prime
|
|
346
|
+
Size of variety over algebraically closed field: 2
|
|
347
|
+
Groebner basis:
|
|
348
|
+
[
|
|
349
|
+
t - 3/8*c_1011_1 - 1/2,
|
|
350
|
+
c_0012_1 + 1/2*c_1011_1 + 3/2,
|
|
351
|
+
c_0102_0 + 1/2*c_1011_1 + 1/2,
|
|
352
|
+
c_0201_0 + 1/2*c_1011_1 + 1/2,
|
|
353
|
+
c_1011_0 - c_1011_1 - 3,
|
|
354
|
+
c_1011_1^2 + 3*c_1011_1 + 4,
|
|
355
|
+
c_1101_0 - 1
|
|
356
|
+
],
|
|
357
|
+
Ideal of Polynomial ring of rank 7 over Rational Field
|
|
358
|
+
Lexicographical Order
|
|
359
|
+
Variables: t, c_0012_1, c_0102_0, c_0201_0, c_1011_0, c_1011_1, c_1101_0
|
|
360
|
+
Dimension 0, Radical, Prime
|
|
361
|
+
Size of variety over algebraically closed field: 2
|
|
362
|
+
Groebner basis:
|
|
363
|
+
[
|
|
364
|
+
t - 1/2*c_1101_0 - 15/8,
|
|
365
|
+
c_0012_1 - 1,
|
|
366
|
+
c_0102_0 + 4/3*c_1101_0 - 2/3,
|
|
367
|
+
c_0201_0 - 4/3*c_1101_0 - 1/3,
|
|
368
|
+
c_1011_0 - 1/3*c_1101_0 - 1/3,
|
|
369
|
+
c_1011_1 + 1/3*c_1101_0 + 1/3,
|
|
370
|
+
c_1101_0^2 - 1/4*c_1101_0 + 1
|
|
371
|
+
],
|
|
372
|
+
Ideal of Polynomial ring of rank 7 over Rational Field
|
|
373
|
+
Lexicographical Order
|
|
374
|
+
Variables: t, c_0012_1, c_0102_0, c_0201_0, c_1011_0, c_1011_1, c_1101_0
|
|
375
|
+
Dimension 0, Radical, Prime
|
|
376
|
+
Size of variety over algebraically closed field: 2
|
|
377
|
+
Groebner basis:
|
|
378
|
+
[
|
|
379
|
+
t - c_1011_1 - 1,
|
|
380
|
+
c_0012_1 - 1,
|
|
381
|
+
c_0102_0 - c_1011_1,
|
|
382
|
+
c_0201_0 - c_1011_1,
|
|
383
|
+
c_1011_0 + c_1011_1,
|
|
384
|
+
c_1011_1^2 + c_1011_1 + 1,
|
|
385
|
+
c_1101_0 - 1
|
|
386
|
+
]
|
|
387
|
+
]
|
|
388
|
+
PRIMARY=DECOMPOSITION=ENDS=HERE
|
|
389
|
+
CPUTIME : 0.020
|
|
390
|
+
|
|
391
|
+
Total time: 0.419 seconds, Total memory usage: 5.62MB
|
|
392
|
+
"""
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
from .utilities import MethodMappingList
|
|
4
|
+
from .component import NonZeroDimensionalComponent
|
|
5
|
+
from .coordinates import PtolemyCoordinates
|
|
6
|
+
from .rur import RUR
|
|
7
|
+
from . import processFileBase
|
|
8
|
+
from ..pari import pari
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def contains_rur(text):
|
|
12
|
+
return 'RUR=DECOMPOSITION=BEGINS' in text
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def decomposition_from_rur(text):
|
|
16
|
+
|
|
17
|
+
py_eval = processFileBase.get_py_eval(text)
|
|
18
|
+
manifold_thunk = processFileBase.get_manifold_thunk(text)
|
|
19
|
+
|
|
20
|
+
rursection = processFileBase.find_unique_section(text, "RUR=DECOMPOSITION")
|
|
21
|
+
|
|
22
|
+
rurs = processFileBase.find_section(rursection, "COMPONENT")
|
|
23
|
+
|
|
24
|
+
result = MethodMappingList(
|
|
25
|
+
[ SolutionContainer(
|
|
26
|
+
_process_rur_component(rur, py_eval, manifold_thunk))
|
|
27
|
+
for rur in rurs ])
|
|
28
|
+
|
|
29
|
+
return result
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _process_rur_component(text, py_eval, manifold_thunk):
|
|
33
|
+
lines = text.split('\n')
|
|
34
|
+
|
|
35
|
+
dimension = None
|
|
36
|
+
is_prime = False
|
|
37
|
+
format = None
|
|
38
|
+
|
|
39
|
+
body = ""
|
|
40
|
+
for line in lines:
|
|
41
|
+
m = re.match(r'==(.*):(.*)', line)
|
|
42
|
+
if m:
|
|
43
|
+
key, val = m.groups()
|
|
44
|
+
val = val.strip()
|
|
45
|
+
if key == "DIMENSION":
|
|
46
|
+
dimension = int(val)
|
|
47
|
+
elif key == "IS_PRIME":
|
|
48
|
+
if val == "TRUE":
|
|
49
|
+
is_prime = True
|
|
50
|
+
elif val != "FALSE":
|
|
51
|
+
raise Exception("IS_PRIME needs to be TRUE or FALSE")
|
|
52
|
+
elif key == "FORMAT":
|
|
53
|
+
format = val
|
|
54
|
+
else:
|
|
55
|
+
raise Exception("Unrecognized key %s" % key)
|
|
56
|
+
else:
|
|
57
|
+
body += line + "\n"
|
|
58
|
+
|
|
59
|
+
if dimension is None:
|
|
60
|
+
return NonZeroDimensionalComponent()
|
|
61
|
+
if dimension > 0:
|
|
62
|
+
return NonZeroDimensionalComponent(dimension=dimension)
|
|
63
|
+
|
|
64
|
+
if format is None:
|
|
65
|
+
raise Exception("No format specified")
|
|
66
|
+
|
|
67
|
+
if format == "MAPLE-LIKE":
|
|
68
|
+
d = parse_maple_like_rur(body.strip())
|
|
69
|
+
return PtolemyCoordinates(d, is_numerical=False,
|
|
70
|
+
py_eval_section=py_eval,
|
|
71
|
+
manifold_thunk=manifold_thunk)
|
|
72
|
+
else:
|
|
73
|
+
raise Exception("Unknown format %s" % format)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def parse_maple_like_rur(text):
|
|
77
|
+
|
|
78
|
+
m = re.match(r"(.*?)\s*=\s*0\s*,\s*\{(.*?)\}", text, re.DOTALL)
|
|
79
|
+
|
|
80
|
+
if not m:
|
|
81
|
+
raise Exception("Format not detected")
|
|
82
|
+
|
|
83
|
+
poly_text, assignments_text = m.groups()
|
|
84
|
+
var = _find_var_of_poly(poly_text)
|
|
85
|
+
|
|
86
|
+
poly = pari(poly_text.replace(var, 'x'))
|
|
87
|
+
assignments_text = assignments_text.replace(var, 'x')
|
|
88
|
+
|
|
89
|
+
return dict([_parse_assignment(assignment, poly)
|
|
90
|
+
for assignment in assignments_text.split(',')])
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def parse_rs_rur(text, variables):
|
|
94
|
+
|
|
95
|
+
m = re.match(r'\[([^,\]]+),\s*([^,\]]+),\s*\[([^\]]+)\]\s*,\s*\[\s*\]\s*\]',
|
|
96
|
+
text, re.DOTALL)
|
|
97
|
+
|
|
98
|
+
if not m:
|
|
99
|
+
raise Exception("Format not detected")
|
|
100
|
+
|
|
101
|
+
extension_str, denominator_str, numerators_str = m.groups()
|
|
102
|
+
|
|
103
|
+
var = _find_var_of_poly(extension_str)
|
|
104
|
+
|
|
105
|
+
extension = pari(extension_str.replace(var, 'x'))
|
|
106
|
+
denominator = pari(denominator_str.replace(var, 'x'))
|
|
107
|
+
numerators = [ pari(numerator_str.replace(var, 'x'))
|
|
108
|
+
for numerator_str in numerators_str.split(',') ]
|
|
109
|
+
|
|
110
|
+
fracs = [
|
|
111
|
+
RUR( [ ( numerator.Mod(extension), 1),
|
|
112
|
+
(denominator.Mod(extension), -1) ] )
|
|
113
|
+
for numerator in numerators ]
|
|
114
|
+
|
|
115
|
+
return dict(list(zip(variables, fracs)) + [('1', RUR.from_int(1))])
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _find_var_of_poly(text):
|
|
119
|
+
return re.search(r'[_A-Za-z][_A-Za-z0-9]*',text).group(0)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _parse_assignment(text, poly):
|
|
123
|
+
var, expression = re.match(r'\s*([_A-Za-z][_A-Za-z0-9]*)\s*=\s*(.*)$',
|
|
124
|
+
text).groups()
|
|
125
|
+
|
|
126
|
+
return (
|
|
127
|
+
var,
|
|
128
|
+
RUR.from_pari_fraction_and_number_field(pari(expression), poly))
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
_test_case = """
|
|
132
|
+
_Z^6-3*_Z^5+3*_Z^4-2*_Z^3+_Z-1 = 0,
|
|
133
|
+
{c_0012_0 = 1, c_0012_2 = _Z^5-3*_Z^4+3*_Z^3-_Z^2-2*_Z+1, c_0111_2 = -_Z*(_Z^4-2*_Z^3+_Z-1), c_1011_0 = -_Z^2*(-1+_Z), c_1101_0 = -_Z*(-1+_Z), c_1101_1 = _Z*(-1+_Z), c_1110_0 = _Z, a = (_Z^3+_Z^2)/(_Z^3+34*_Z^2+3)}
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class SolutionContainer():
|
|
138
|
+
def __init__(self, solutions):
|
|
139
|
+
self._solutions = solutions
|
|
140
|
+
|
|
141
|
+
def solutions(self, numerical=False):
|
|
142
|
+
if numerical:
|
|
143
|
+
return self._solutions.numerical()
|
|
144
|
+
else:
|
|
145
|
+
return self._solutions
|
|
146
|
+
|
|
147
|
+
def number_field(self):
|
|
148
|
+
return self._solutions.number_field()
|
|
149
|
+
|
|
150
|
+
# print parse_maple_like_rur(_test_case)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
from . import matrix
|
|
2
|
+
from .polynomial import Polynomial
|
|
3
|
+
from ..pari import pari
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class PtolemyGeneralizedObstructionClass():
|
|
7
|
+
"""
|
|
8
|
+
Represents an obstruction cocycle of a PSL(n,C) representation in
|
|
9
|
+
H^2(M,partial M;Z/n).
|
|
10
|
+
|
|
11
|
+
>>> from snappy import Manifold
|
|
12
|
+
>>> M = Manifold("m004")
|
|
13
|
+
|
|
14
|
+
Create an obstruction class, this has to be in the kernel of d^2:
|
|
15
|
+
|
|
16
|
+
>>> c = PtolemyGeneralizedObstructionClass([2,0,0,1])
|
|
17
|
+
|
|
18
|
+
For better accounting, give it an index:
|
|
19
|
+
|
|
20
|
+
>>> c = PtolemyGeneralizedObstructionClass([2,0,0,1], index = 1)
|
|
21
|
+
|
|
22
|
+
Get corresponding ptolemy variety:
|
|
23
|
+
|
|
24
|
+
>>> p = M.ptolemy_variety(N=3, obstruction_class=c)
|
|
25
|
+
|
|
26
|
+
Canonical filename base:
|
|
27
|
+
|
|
28
|
+
>>> p.filename_base()
|
|
29
|
+
'm004__sl3_c1'
|
|
30
|
+
|
|
31
|
+
Now pick something not in the kernel:
|
|
32
|
+
|
|
33
|
+
>>> c = PtolemyGeneralizedObstructionClass([1,0,0,1])
|
|
34
|
+
>>> p = M.ptolemy_variety(N=3, obstruction_class=c)
|
|
35
|
+
Traceback (most recent call last):
|
|
36
|
+
...
|
|
37
|
+
AssertionError: PtolemyGeneralizedObstructionClass not in kernel of d2
|
|
38
|
+
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(self, H2_class, index=None, N=None, manifold=None):
|
|
42
|
+
|
|
43
|
+
self.H2_class = H2_class
|
|
44
|
+
self._index = index
|
|
45
|
+
self._N = N
|
|
46
|
+
self._manifold = manifold
|
|
47
|
+
|
|
48
|
+
def _checkManifoldAndN(self, manifold, N):
|
|
49
|
+
if self._manifold is not None:
|
|
50
|
+
assert manifold == self._manifold, (
|
|
51
|
+
"PtolemyGeneralizedObstructionClass for wrong manifold")
|
|
52
|
+
|
|
53
|
+
if self._N is not None:
|
|
54
|
+
assert N == self._N, (
|
|
55
|
+
"PtolemyGeneralizedObstructionClass for wrong N")
|
|
56
|
+
|
|
57
|
+
assert len(self.H2_class) == 2 * manifold.num_tetrahedra(), (
|
|
58
|
+
"PtolemyGeneralizedObstructionClass does not match number of "
|
|
59
|
+
"face classes")
|
|
60
|
+
|
|
61
|
+
# compute boundary maps for cellular chain complex
|
|
62
|
+
chain_d3, dummy_rows, dummy_columns = (
|
|
63
|
+
manifold._ptolemy_equations_boundary_map_3())
|
|
64
|
+
|
|
65
|
+
# transpose to compute cohomology
|
|
66
|
+
cochain_d2 = matrix.matrix_transpose(chain_d3)
|
|
67
|
+
|
|
68
|
+
assert matrix.is_vector_zero(
|
|
69
|
+
matrix.vector_modulo(
|
|
70
|
+
matrix.matrix_mult_vector(cochain_d2, self.H2_class),
|
|
71
|
+
N)), ("PtolemyGeneralizedObstructionClass not in kernel of "
|
|
72
|
+
"d2")
|
|
73
|
+
|
|
74
|
+
def _is_non_trivial(self, N):
|
|
75
|
+
for h in self.H2_class:
|
|
76
|
+
if h % N != 0:
|
|
77
|
+
return True
|
|
78
|
+
return False
|
|
79
|
+
|
|
80
|
+
def _get_equation_for_u(self, N):
|
|
81
|
+
|
|
82
|
+
# the information about the root of unity u we use:
|
|
83
|
+
# returns order_of_u, identified_variables, equations
|
|
84
|
+
|
|
85
|
+
if self._is_non_trivial(N):
|
|
86
|
+
|
|
87
|
+
# If we have a non-trivial obstruction class
|
|
88
|
+
|
|
89
|
+
if N == 2:
|
|
90
|
+
# For N == 2, we set u to -1, no extra equations necessary
|
|
91
|
+
return 2, []
|
|
92
|
+
|
|
93
|
+
else:
|
|
94
|
+
# Return the cyclotomic polynomial as extra equation in u
|
|
95
|
+
cyclo = Polynomial.parse_string(str(pari.polcyclo(N, 'u')))
|
|
96
|
+
return N, [cyclo]
|
|
97
|
+
else:
|
|
98
|
+
# If we have the trivial cohomology class, no u returned
|
|
99
|
+
return 1, []
|
|
100
|
+
|
|
101
|
+
def __repr__(self):
|
|
102
|
+
return "PtolemyGeneralizedObstructionClass(%s)" % self.H2_class
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
class PtolemyObstructionClass():
|
|
2
|
+
"""
|
|
3
|
+
Represents an obstruction cocycle of a pSL(n,C) representation as
|
|
4
|
+
described in Definition 1.7 of
|
|
5
|
+
|
|
6
|
+
Garoufalidis, Thurston, Zickert
|
|
7
|
+
The Complex Volume of SL(n,C)-Representations of 3-Manifolds
|
|
8
|
+
https://arxiv.org/abs/1111.2828
|
|
9
|
+
|
|
10
|
+
To generate such an obstruction class, call:
|
|
11
|
+
|
|
12
|
+
>>> from snappy import Manifold
|
|
13
|
+
>>> M = Manifold("4_1")
|
|
14
|
+
>>> cs = M.ptolemy_obstruction_classes()
|
|
15
|
+
|
|
16
|
+
Print out the values:
|
|
17
|
+
|
|
18
|
+
>>> for c in cs: print(c)
|
|
19
|
+
PtolemyObstructionClass(s_0_0 - 1, s_1_0 - 1, s_2_0 - 1, s_3_0 - 1, s_0_0 - s_0_1, s_1_0 - s_3_1, s_2_0 - s_2_1, s_3_0 - s_1_1)
|
|
20
|
+
PtolemyObstructionClass(s_0_0 + 1, s_1_0 - 1, s_2_0 - 1, s_3_0 + 1, s_0_0 - s_0_1, s_1_0 - s_3_1, s_2_0 - s_2_1, s_3_0 - s_1_1)
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(self, manifold, index, H2_element, explain_basis,
|
|
24
|
+
identified_face_classes):
|
|
25
|
+
|
|
26
|
+
self._manifold = manifold
|
|
27
|
+
self._index = index
|
|
28
|
+
self._H2_element = H2_element
|
|
29
|
+
self._explain_basis = explain_basis
|
|
30
|
+
self._identified_face_classes = identified_face_classes
|
|
31
|
+
|
|
32
|
+
def H2_element_entry_to_identified_variable(entry, variable):
|
|
33
|
+
return ((-1)**entry, 0, variable, 1)
|
|
34
|
+
|
|
35
|
+
self.identified_variables = (
|
|
36
|
+
[H2_element_entry_to_identified_variable(entry, variable)
|
|
37
|
+
for entry, variable in zip(H2_element, explain_basis)] +
|
|
38
|
+
[(+1, 0, var1, var2)
|
|
39
|
+
for sign, power, var1, var2 in self._identified_face_classes])
|
|
40
|
+
|
|
41
|
+
def _checkManifoldAndN(self, manifold, N):
|
|
42
|
+
if self._manifold is not None:
|
|
43
|
+
assert manifold == self._manifold, (
|
|
44
|
+
"PtolemyObstructionClass for wrong manifold")
|
|
45
|
+
|
|
46
|
+
assert N % 2 == 0, (
|
|
47
|
+
"PtolemyObstructionClass only makes sense for even N, "
|
|
48
|
+
"try PtolemyGeneralizedObstructionClass")
|
|
49
|
+
|
|
50
|
+
def __repr__(self):
|
|
51
|
+
|
|
52
|
+
def to_string(i):
|
|
53
|
+
sign, power, var1, var2 = i
|
|
54
|
+
var2 = str(var2)
|
|
55
|
+
|
|
56
|
+
assert sign in [+1, -1]
|
|
57
|
+
|
|
58
|
+
if sign == +1:
|
|
59
|
+
return var1 + " - " + var2
|
|
60
|
+
else:
|
|
61
|
+
return var1 + " + " + var2
|
|
62
|
+
|
|
63
|
+
return "PtolemyObstructionClass(%s)" % ', '.join(
|
|
64
|
+
to_string(i) for i in self.identified_variables)
|