snappy 3.3__cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- snappy/CyOpenGL.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.ico +0 -0
- snappy/SnapPy.png +0 -0
- snappy/SnapPyHP.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/__init__.py +534 -0
- snappy/app.py +604 -0
- snappy/app_menus.py +372 -0
- snappy/browser.py +998 -0
- snappy/cache.py +25 -0
- snappy/canonical.py +249 -0
- snappy/cusps/__init__.py +280 -0
- snappy/cusps/cusp_area_matrix.py +98 -0
- snappy/cusps/cusp_areas_from_matrix.py +96 -0
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/short_slopes_for_cusp.py +217 -0
- snappy/cusps/test.py +22 -0
- snappy/cusps/trig_cusp_area_matrix.py +63 -0
- snappy/database.py +454 -0
- snappy/db_utilities.py +79 -0
- snappy/decorated_isosig.py +717 -0
- snappy/dev/__init__.py +0 -0
- snappy/dev/extended_ptolemy/__init__.py +8 -0
- snappy/dev/extended_ptolemy/closed.py +106 -0
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
- snappy/dev/extended_ptolemy/direct.py +42 -0
- snappy/dev/extended_ptolemy/extended.py +406 -0
- snappy/dev/extended_ptolemy/giac_helper.py +43 -0
- snappy/dev/extended_ptolemy/giac_rur.py +129 -0
- snappy/dev/extended_ptolemy/gluing.py +46 -0
- snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
- snappy/dev/extended_ptolemy/printMatrices.py +70 -0
- snappy/dev/vericlosed/__init__.py +1 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
- snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
- snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
- snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
- snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
- snappy/dev/vericlosed/orb/__init__.py +1 -0
- snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
- snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
- snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
- snappy/dev/vericlosed/test.py +54 -0
- snappy/dev/vericlosed/truncatedComplex.py +176 -0
- snappy/dev/vericlosed/verificationError.py +58 -0
- snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
- snappy/doc/_images/SnapPy-196.png +0 -0
- snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
- snappy/doc/_images/m125_paper_plane.jpg +0 -0
- snappy/doc/_images/mac.png +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
- snappy/doc/_images/plink-action.png +0 -0
- snappy/doc/_images/ubuntu.png +0 -0
- snappy/doc/_images/win7.png +0 -0
- snappy/doc/_sources/additional_classes.rst.txt +40 -0
- snappy/doc/_sources/bugs.rst.txt +14 -0
- snappy/doc/_sources/censuses.rst.txt +52 -0
- snappy/doc/_sources/credits.rst.txt +81 -0
- snappy/doc/_sources/development.rst.txt +261 -0
- snappy/doc/_sources/index.rst.txt +215 -0
- snappy/doc/_sources/installing.rst.txt +249 -0
- snappy/doc/_sources/manifold.rst.txt +6 -0
- snappy/doc/_sources/manifoldhp.rst.txt +46 -0
- snappy/doc/_sources/news.rst.txt +425 -0
- snappy/doc/_sources/other.rst.txt +25 -0
- snappy/doc/_sources/platonic_census.rst.txt +20 -0
- snappy/doc/_sources/plink.rst.txt +102 -0
- snappy/doc/_sources/ptolemy.rst.txt +66 -0
- snappy/doc/_sources/ptolemy_classes.rst.txt +42 -0
- snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -0
- snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -0
- snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -0
- snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -0
- snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -0
- snappy/doc/_sources/screenshots.rst.txt +21 -0
- snappy/doc/_sources/snap.rst.txt +87 -0
- snappy/doc/_sources/snappy.rst.txt +28 -0
- snappy/doc/_sources/spherogram.rst.txt +103 -0
- snappy/doc/_sources/todo.rst.txt +47 -0
- snappy/doc/_sources/triangulation.rst.txt +11 -0
- snappy/doc/_sources/tutorial.rst.txt +49 -0
- snappy/doc/_sources/verify.rst.txt +210 -0
- snappy/doc/_sources/verify_internals.rst.txt +79 -0
- snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
- snappy/doc/_static/SnapPy.ico +0 -0
- snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
- snappy/doc/_static/basic.css +906 -0
- snappy/doc/_static/css/badge_only.css +1 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
- snappy/doc/_static/css/theme.css +4 -0
- snappy/doc/_static/doctools.js +149 -0
- snappy/doc/_static/documentation_options.js +13 -0
- snappy/doc/_static/file.png +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
- snappy/doc/_static/jquery.js +2 -0
- snappy/doc/_static/js/badge_only.js +1 -0
- snappy/doc/_static/js/theme.js +1 -0
- snappy/doc/_static/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +192 -0
- snappy/doc/_static/minus.png +0 -0
- snappy/doc/_static/plus.png +0 -0
- snappy/doc/_static/pygments.css +75 -0
- snappy/doc/_static/searchtools.js +635 -0
- snappy/doc/_static/snappy_furo.css +33 -0
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
- snappy/doc/_static/sphinx_highlight.js +154 -0
- snappy/doc/additional_classes.html +1500 -0
- snappy/doc/bugs.html +132 -0
- snappy/doc/censuses.html +453 -0
- snappy/doc/credits.html +184 -0
- snappy/doc/development.html +385 -0
- snappy/doc/doc-latest/additional_classes.html +1500 -0
- snappy/doc/doc-latest/bugs.html +132 -0
- snappy/doc/doc-latest/censuses.html +453 -0
- snappy/doc/doc-latest/credits.html +184 -0
- snappy/doc/doc-latest/development.html +385 -0
- snappy/doc/doc-latest/genindex.html +1349 -0
- snappy/doc/doc-latest/index.html +287 -0
- snappy/doc/doc-latest/installing.html +346 -0
- snappy/doc/doc-latest/manifold.html +3632 -0
- snappy/doc/doc-latest/manifoldhp.html +180 -0
- snappy/doc/doc-latest/news.html +438 -0
- snappy/doc/doc-latest/objects.inv +0 -0
- snappy/doc/doc-latest/other.html +160 -0
- snappy/doc/doc-latest/platonic_census.html +376 -0
- snappy/doc/doc-latest/plink.html +210 -0
- snappy/doc/doc-latest/ptolemy.html +253 -0
- snappy/doc/doc-latest/ptolemy_classes.html +1144 -0
- snappy/doc/doc-latest/ptolemy_examples1.html +409 -0
- snappy/doc/doc-latest/ptolemy_examples2.html +471 -0
- snappy/doc/doc-latest/ptolemy_examples3.html +414 -0
- snappy/doc/doc-latest/ptolemy_examples4.html +195 -0
- snappy/doc/doc-latest/ptolemy_prelim.html +248 -0
- snappy/doc/doc-latest/py-modindex.html +165 -0
- snappy/doc/doc-latest/screenshots.html +141 -0
- snappy/doc/doc-latest/search.html +135 -0
- snappy/doc/doc-latest/searchindex.js +1 -0
- snappy/doc/doc-latest/snap.html +202 -0
- snappy/doc/doc-latest/snappy.html +181 -0
- snappy/doc/doc-latest/spherogram.html +1346 -0
- snappy/doc/doc-latest/todo.html +166 -0
- snappy/doc/doc-latest/triangulation.html +1676 -0
- snappy/doc/doc-latest/tutorial.html +159 -0
- snappy/doc/doc-latest/verify.html +330 -0
- snappy/doc/doc-latest/verify_internals.html +1235 -0
- snappy/doc/genindex.html +1349 -0
- snappy/doc/index.html +287 -0
- snappy/doc/installing.html +346 -0
- snappy/doc/manifold.html +3632 -0
- snappy/doc/manifoldhp.html +180 -0
- snappy/doc/news.html +438 -0
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +160 -0
- snappy/doc/platonic_census.html +376 -0
- snappy/doc/plink.html +210 -0
- snappy/doc/ptolemy.html +253 -0
- snappy/doc/ptolemy_classes.html +1144 -0
- snappy/doc/ptolemy_examples1.html +409 -0
- snappy/doc/ptolemy_examples2.html +471 -0
- snappy/doc/ptolemy_examples3.html +414 -0
- snappy/doc/ptolemy_examples4.html +195 -0
- snappy/doc/ptolemy_prelim.html +248 -0
- snappy/doc/py-modindex.html +165 -0
- snappy/doc/screenshots.html +141 -0
- snappy/doc/search.html +135 -0
- snappy/doc/searchindex.js +1 -0
- snappy/doc/snap.html +202 -0
- snappy/doc/snappy.html +181 -0
- snappy/doc/spherogram.html +1346 -0
- snappy/doc/todo.html +166 -0
- snappy/doc/triangulation.html +1676 -0
- snappy/doc/tutorial.html +159 -0
- snappy/doc/verify.html +330 -0
- snappy/doc/verify_internals.html +1235 -0
- snappy/drilling/__init__.py +456 -0
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +5 -0
- snappy/drilling/crush.py +270 -0
- snappy/drilling/cusps.py +125 -0
- snappy/drilling/debug.py +242 -0
- snappy/drilling/epsilons.py +6 -0
- snappy/drilling/exceptions.py +55 -0
- snappy/drilling/moves.py +620 -0
- snappy/drilling/peripheral_curves.py +210 -0
- snappy/drilling/perturb.py +188 -0
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +274 -0
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +132 -0
- snappy/drilling/tracing.py +351 -0
- snappy/exceptions.py +26 -0
- snappy/export_stl.py +120 -0
- snappy/exterior_to_link/__init__.py +2 -0
- snappy/exterior_to_link/barycentric_geometry.py +463 -0
- snappy/exterior_to_link/exceptions.py +6 -0
- snappy/exterior_to_link/geodesic_map.json +14408 -0
- snappy/exterior_to_link/hyp_utils.py +112 -0
- snappy/exterior_to_link/link_projection.py +323 -0
- snappy/exterior_to_link/main.py +198 -0
- snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
- snappy/exterior_to_link/mcomplex_with_link.py +687 -0
- snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
- snappy/exterior_to_link/pl_utils.py +491 -0
- snappy/exterior_to_link/put_in_S3.py +156 -0
- snappy/exterior_to_link/rational_linear_algebra.py +130 -0
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
- snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
- snappy/exterior_to_link/stored_moves.py +475 -0
- snappy/exterior_to_link/test.py +31 -0
- snappy/filedialog.py +28 -0
- snappy/geometric_structure/__init__.py +212 -0
- snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
- snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +691 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +480 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +41 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +294 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +156 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +35 -0
- snappy/geometric_structure/geodesic/__init__.py +0 -0
- snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
- snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
- snappy/geometric_structure/geodesic/canonical_representatives.py +52 -0
- snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
- snappy/geometric_structure/geodesic/constants.py +6 -0
- snappy/geometric_structure/geodesic/exceptions.py +22 -0
- snappy/geometric_structure/geodesic/fixed_points.py +106 -0
- snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
- snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
- snappy/geometric_structure/geodesic/line.py +30 -0
- snappy/geometric_structure/geodesic/multiplicity.py +127 -0
- snappy/geometric_structure/geodesic/tiles_for_geodesic.py +128 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +121 -0
- snappy/horoviewer.py +443 -0
- snappy/hyperboloid/__init__.py +212 -0
- snappy/hyperboloid/distances.py +259 -0
- snappy/hyperboloid/horoball.py +19 -0
- snappy/hyperboloid/line.py +35 -0
- snappy/hyperboloid/point.py +9 -0
- snappy/hyperboloid/triangle.py +29 -0
- snappy/info_icon.gif +0 -0
- snappy/infowindow.py +65 -0
- snappy/isometry_signature.py +389 -0
- snappy/len_spec/__init__.py +609 -0
- snappy/len_spec/geodesic_info.py +129 -0
- snappy/len_spec/geodesic_key_info_dict.py +116 -0
- snappy/len_spec/geodesic_piece.py +146 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +136 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +185 -0
- snappy/len_spec/spine.py +128 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +276 -0
- snappy/len_spec/word.py +86 -0
- snappy/manifolds/HTWKnots/alternating.gz +0 -0
- snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
- snappy/manifolds/__init__.py +3 -0
- snappy/margulis/__init__.py +332 -0
- snappy/margulis/cusp_neighborhood_neighborhood.py +66 -0
- snappy/margulis/geodesic_neighborhood.py +152 -0
- snappy/margulis/margulis_info.py +21 -0
- snappy/margulis/mu_from_neighborhood_pair.py +175 -0
- snappy/margulis/neighborhood.py +29 -0
- snappy/margulis/test.py +22 -0
- snappy/math_basics.py +187 -0
- snappy/matrix.py +525 -0
- snappy/number.py +657 -0
- snappy/numeric_output_checker.py +345 -0
- snappy/pari.py +41 -0
- snappy/phone_home.py +57 -0
- snappy/polyviewer.py +259 -0
- snappy/ptolemy/__init__.py +17 -0
- snappy/ptolemy/component.py +103 -0
- snappy/ptolemy/coordinates.py +2290 -0
- snappy/ptolemy/fieldExtensions.py +153 -0
- snappy/ptolemy/findLoops.py +473 -0
- snappy/ptolemy/geometricRep.py +59 -0
- snappy/ptolemy/homology.py +165 -0
- snappy/ptolemy/magma/default.magma_template +229 -0
- snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
- snappy/ptolemy/manifoldMethods.py +395 -0
- snappy/ptolemy/matrix.py +350 -0
- snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
- snappy/ptolemy/polynomial.py +856 -0
- snappy/ptolemy/processComponents.py +173 -0
- snappy/ptolemy/processFileBase.py +247 -0
- snappy/ptolemy/processFileDispatch.py +46 -0
- snappy/ptolemy/processMagmaFile.py +392 -0
- snappy/ptolemy/processRurFile.py +150 -0
- snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
- snappy/ptolemy/ptolemyObstructionClass.py +64 -0
- snappy/ptolemy/ptolemyVariety.py +995 -0
- snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
- snappy/ptolemy/reginaWrapper.py +698 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/rur.py +545 -0
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
- snappy/ptolemy/test.py +1126 -0
- snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
- snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
- snappy/ptolemy/utilities.py +236 -0
- snappy/raytracing/__init__.py +64 -0
- snappy/raytracing/additional_horospheres.py +64 -0
- snappy/raytracing/additional_len_spec_choices.py +63 -0
- snappy/raytracing/cohomology_fractal.py +197 -0
- snappy/raytracing/eyeball.py +124 -0
- snappy/raytracing/finite_raytracing_data.py +237 -0
- snappy/raytracing/finite_viewer.py +590 -0
- snappy/raytracing/geodesic_tube_info.py +174 -0
- snappy/raytracing/geodesics.py +246 -0
- snappy/raytracing/geodesics_window.py +258 -0
- snappy/raytracing/gui_utilities.py +293 -0
- snappy/raytracing/hyperboloid_navigation.py +556 -0
- snappy/raytracing/hyperboloid_utilities.py +234 -0
- snappy/raytracing/ideal_raytracing_data.py +592 -0
- snappy/raytracing/inside_viewer.py +974 -0
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +126 -0
- snappy/raytracing/raytracing_view.py +454 -0
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +101 -0
- snappy/raytracing/shaders/fragment.glsl +1744 -0
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +98 -0
- snappy/raytracing/view_scale_controller.py +98 -0
- snappy/raytracing/zoom_slider/__init__.py +263 -0
- snappy/raytracing/zoom_slider/inward.png +0 -0
- snappy/raytracing/zoom_slider/inward18.png +0 -0
- snappy/raytracing/zoom_slider/outward.png +0 -0
- snappy/raytracing/zoom_slider/outward18.png +0 -0
- snappy/raytracing/zoom_slider/test.py +20 -0
- snappy/sage_helper.py +119 -0
- snappy/settings.py +407 -0
- snappy/shell.py +53 -0
- snappy/snap/__init__.py +117 -0
- snappy/snap/character_varieties.py +375 -0
- snappy/snap/find_field.py +372 -0
- snappy/snap/fox_milnor.py +271 -0
- snappy/snap/fundamental_polyhedron.py +569 -0
- snappy/snap/generators.py +39 -0
- snappy/snap/interval_reps.py +81 -0
- snappy/snap/kernel_structures.py +128 -0
- snappy/snap/mcomplex_base.py +18 -0
- snappy/snap/nsagetools.py +716 -0
- snappy/snap/peripheral/__init__.py +1 -0
- snappy/snap/peripheral/dual_cellulation.py +219 -0
- snappy/snap/peripheral/link.py +127 -0
- snappy/snap/peripheral/peripheral.py +159 -0
- snappy/snap/peripheral/surface.py +522 -0
- snappy/snap/peripheral/test.py +35 -0
- snappy/snap/polished_reps.py +335 -0
- snappy/snap/shapes.py +152 -0
- snappy/snap/slice_obs_HKL/__init__.py +194 -0
- snappy/snap/slice_obs_HKL/basics.py +236 -0
- snappy/snap/slice_obs_HKL/direct.py +217 -0
- snappy/snap/slice_obs_HKL/poly_norm.py +212 -0
- snappy/snap/slice_obs_HKL/rep_theory.py +424 -0
- snappy/snap/t3mlite/__init__.py +2 -0
- snappy/snap/t3mlite/arrow.py +243 -0
- snappy/snap/t3mlite/corner.py +22 -0
- snappy/snap/t3mlite/edge.py +172 -0
- snappy/snap/t3mlite/face.py +37 -0
- snappy/snap/t3mlite/files.py +211 -0
- snappy/snap/t3mlite/homology.py +53 -0
- snappy/snap/t3mlite/linalg.py +419 -0
- snappy/snap/t3mlite/mcomplex.py +1499 -0
- snappy/snap/t3mlite/perm4.py +320 -0
- snappy/snap/t3mlite/setup.py +12 -0
- snappy/snap/t3mlite/simplex.py +199 -0
- snappy/snap/t3mlite/spun.py +297 -0
- snappy/snap/t3mlite/surface.py +519 -0
- snappy/snap/t3mlite/test.py +20 -0
- snappy/snap/t3mlite/test_vs_regina.py +86 -0
- snappy/snap/t3mlite/tetrahedron.py +109 -0
- snappy/snap/t3mlite/vertex.py +42 -0
- snappy/snap/test.py +139 -0
- snappy/snap/utilities.py +288 -0
- snappy/test.py +213 -0
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -0
- snappy/tiling/dict_based_set.py +79 -0
- snappy/tiling/floor.py +49 -0
- snappy/tiling/hyperboloid_dict.py +54 -0
- snappy/tiling/iter_utils.py +78 -0
- snappy/tiling/lifted_tetrahedron.py +22 -0
- snappy/tiling/lifted_tetrahedron_set.py +54 -0
- snappy/tiling/quotient_dict.py +70 -0
- snappy/tiling/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +224 -0
- snappy/tiling/triangle.py +33 -0
- snappy/tkterminal.py +920 -0
- snappy/twister/__init__.py +20 -0
- snappy/twister/main.py +646 -0
- snappy/twister/surfaces/S_0_1 +3 -0
- snappy/twister/surfaces/S_0_2 +3 -0
- snappy/twister/surfaces/S_0_4 +7 -0
- snappy/twister/surfaces/S_0_4_Lantern +8 -0
- snappy/twister/surfaces/S_1 +3 -0
- snappy/twister/surfaces/S_1_1 +4 -0
- snappy/twister/surfaces/S_1_2 +5 -0
- snappy/twister/surfaces/S_1_2_5 +6 -0
- snappy/twister/surfaces/S_2 +6 -0
- snappy/twister/surfaces/S_2_1 +8 -0
- snappy/twister/surfaces/S_2_heeg +10 -0
- snappy/twister/surfaces/S_3 +8 -0
- snappy/twister/surfaces/S_3_1 +10 -0
- snappy/twister/surfaces/S_4_1 +12 -0
- snappy/twister/surfaces/S_5_1 +14 -0
- snappy/twister/surfaces/heeg_fig8 +9 -0
- snappy/twister/twister_core.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/upper_halfspace/__init__.py +146 -0
- snappy/upper_halfspace/ideal_point.py +29 -0
- snappy/verify/__init__.py +13 -0
- snappy/verify/canonical.py +542 -0
- snappy/verify/complex_volume/__init__.py +18 -0
- snappy/verify/complex_volume/adjust_torsion.py +86 -0
- snappy/verify/complex_volume/closed.py +168 -0
- snappy/verify/complex_volume/compute_ptolemys.py +90 -0
- snappy/verify/complex_volume/cusped.py +56 -0
- snappy/verify/complex_volume/extended_bloch.py +201 -0
- snappy/verify/cusp_translations.py +85 -0
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +254 -0
- snappy/verify/hyperbolicity.py +224 -0
- snappy/verify/interval_newton_shapes_engine.py +523 -0
- snappy/verify/interval_tree.py +400 -0
- snappy/verify/krawczyk_shapes_engine.py +518 -0
- snappy/verify/real_algebra.py +286 -0
- snappy/verify/shapes.py +25 -0
- snappy/verify/square_extensions.py +1005 -0
- snappy/verify/test.py +72 -0
- snappy/verify/volume.py +128 -0
- snappy/version.py +2 -0
- snappy-3.3.dist-info/METADATA +58 -0
- snappy-3.3.dist-info/RECORD +541 -0
- snappy-3.3.dist-info/WHEEL +6 -0
- snappy-3.3.dist-info/entry_points.txt +2 -0
- snappy-3.3.dist-info/top_level.txt +28 -0
snappy/sage_helper.py
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Helper code for dealing with additional functionality when Sage is
|
|
3
|
+
present.
|
|
4
|
+
|
|
5
|
+
Any method which works only in Sage should be decorated with
|
|
6
|
+
"@sage_method" and any doctests (in Sage methods or not) which should
|
|
7
|
+
be run only in Sage should be styled with input prompt "sage:" rather
|
|
8
|
+
than the usual ">>>".
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
import sage.structure.sage_object
|
|
13
|
+
_within_sage = True
|
|
14
|
+
except ImportError:
|
|
15
|
+
_within_sage = False
|
|
16
|
+
|
|
17
|
+
class SageNotAvailable(Exception):
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
if _within_sage:
|
|
21
|
+
def sage_method(function):
|
|
22
|
+
function._sage_method = True
|
|
23
|
+
return function
|
|
24
|
+
|
|
25
|
+
try:
|
|
26
|
+
# Monolithic Sage library
|
|
27
|
+
from sage.all import RealField, RealDoubleElement, gcd, xgcd, prod, powerset
|
|
28
|
+
from sage.all import MatrixSpace, matrix, vector, ZZ
|
|
29
|
+
from sage.all import Integer, Rational, QQ, RR, CC
|
|
30
|
+
from sage.all import sqrt
|
|
31
|
+
from sage.all import I, Infinity
|
|
32
|
+
from sage.all import arccosh
|
|
33
|
+
from sage.all import RIF, CIF
|
|
34
|
+
from sage.all import (cached_method, real_part, imag_part, round, ceil, floor, log,
|
|
35
|
+
CDF, ComplexDoubleField, ComplexField, CyclotomicField, NumberField, PolynomialRing, identity_matrix)
|
|
36
|
+
from sage.all import FiniteField as GF
|
|
37
|
+
from sage.all import VectorSpace, ChainComplex
|
|
38
|
+
from sage.all import ComplexBallField, exp, sin, block_matrix, prime_range, det
|
|
39
|
+
from sage.all import LaurentPolynomialRing, AbelianGroup, GroupAlgebra
|
|
40
|
+
from sage.all import is_prime, is_prime_power, is_power_of_two, prime_range, prime_powers
|
|
41
|
+
from sage.all import gap
|
|
42
|
+
except ImportError:
|
|
43
|
+
# Modularized Sage library
|
|
44
|
+
from sage.algebras.group_algebra import GroupAlgebra
|
|
45
|
+
from sage.arith.misc import (gcd, xgcd, is_prime, is_prime_power,
|
|
46
|
+
is_power_of_two, prime_range, prime_powers)
|
|
47
|
+
from sage.combinat.subset import powerset
|
|
48
|
+
from sage.functions.hyperbolic import arccosh
|
|
49
|
+
from sage.functions.log import exp
|
|
50
|
+
from sage.functions.other import (real as real_part,
|
|
51
|
+
imag as imag_part,
|
|
52
|
+
ceil,
|
|
53
|
+
floor)
|
|
54
|
+
from sage.functions.trig import sin
|
|
55
|
+
from sage.groups.abelian_gps.abelian_group import AbelianGroup
|
|
56
|
+
from sage.homology.chain_complex import ChainComplex
|
|
57
|
+
from sage.matrix.constructor import Matrix as matrix
|
|
58
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
59
|
+
from sage.matrix.special import block_matrix, identity_matrix
|
|
60
|
+
from sage.misc.cachefunc import cached_method
|
|
61
|
+
from sage.misc.functional import det, log, round, sqrt
|
|
62
|
+
from sage.misc.misc_c import prod
|
|
63
|
+
from sage.modules.free_module import VectorSpace
|
|
64
|
+
from sage.modules.free_module_element import free_module_element as vector
|
|
65
|
+
from sage.rings.cc import CC
|
|
66
|
+
from sage.rings.cif import CIF
|
|
67
|
+
from sage.rings.complex_arb import ComplexBallField
|
|
68
|
+
from sage.rings.complex_double import CDF, ComplexDoubleField
|
|
69
|
+
from sage.rings.complex_mpfr import ComplexField
|
|
70
|
+
from sage.rings.fast_arith import prime_range
|
|
71
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField as GF
|
|
72
|
+
from sage.rings.imaginary_unit import I
|
|
73
|
+
from sage.rings.infinity import Infinity
|
|
74
|
+
from sage.rings.integer import Integer
|
|
75
|
+
from sage.rings.integer_ring import ZZ
|
|
76
|
+
from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing
|
|
77
|
+
from sage.rings.number_field.number_field import CyclotomicField, NumberField
|
|
78
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
79
|
+
from sage.rings.rational import Rational
|
|
80
|
+
from sage.rings.rational_field import QQ
|
|
81
|
+
from sage.rings.real_double import RealDoubleElement
|
|
82
|
+
from sage.rings.real_mpfi import RIF
|
|
83
|
+
from sage.rings.real_mpfr import RealField, RealNumber, RR
|
|
84
|
+
|
|
85
|
+
from sage.rings.complex_interval_field import ComplexIntervalField
|
|
86
|
+
from sage.rings.real_mpfi import RealIntervalFieldElement, RealIntervalField
|
|
87
|
+
from sage.rings.real_mpfr import RealNumber, RealField_class
|
|
88
|
+
from sage.structure.sage_object import SageObject
|
|
89
|
+
|
|
90
|
+
try: # Sage >= 9.3, see https://trac.sagemath.org/ticket/24483
|
|
91
|
+
from sage.rings.complex_mpfr import (ComplexField,
|
|
92
|
+
ComplexField_class,
|
|
93
|
+
create_ComplexNumber)
|
|
94
|
+
except ImportError:
|
|
95
|
+
from sage.rings.complex_field import ComplexField, ComplexField_class
|
|
96
|
+
from sage.rings.complex_number import create_ComplexNumber
|
|
97
|
+
|
|
98
|
+
else:
|
|
99
|
+
import decorator
|
|
100
|
+
|
|
101
|
+
def _sage_method(function, *args, **kw):
|
|
102
|
+
raise SageNotAvailable('Sorry, this feature requires using SnapPy inside Sage.')
|
|
103
|
+
|
|
104
|
+
def sage_method(function):
|
|
105
|
+
return decorator.decorator(_sage_method, function)
|
|
106
|
+
|
|
107
|
+
# Not currently used, but could be exploited by an interpreter to hide
|
|
108
|
+
# sage_methods when in plain Python.
|
|
109
|
+
|
|
110
|
+
def sage_methods(obj):
|
|
111
|
+
ans = []
|
|
112
|
+
for attr in dir(obj):
|
|
113
|
+
try:
|
|
114
|
+
methods = getattr(obj, attr)
|
|
115
|
+
if methods._sage_method is True:
|
|
116
|
+
ans.append(methods)
|
|
117
|
+
except AttributeError:
|
|
118
|
+
pass
|
|
119
|
+
return ans
|
snappy/settings.py
ADDED
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
import plistlib
|
|
4
|
+
from .gui import *
|
|
5
|
+
from .app_menus import ListedWindow
|
|
6
|
+
from .tkterminal import FontChoice, default_terminal_font
|
|
7
|
+
|
|
8
|
+
def clip_font_size(size):
|
|
9
|
+
try:
|
|
10
|
+
value = int(size)
|
|
11
|
+
except:
|
|
12
|
+
return 13 if sys.platform == 'darwin' else 11
|
|
13
|
+
if value < 10:
|
|
14
|
+
return 10
|
|
15
|
+
if value > 36:
|
|
16
|
+
return 36
|
|
17
|
+
return size
|
|
18
|
+
|
|
19
|
+
class Settings:
|
|
20
|
+
def __init__(self):
|
|
21
|
+
self.setting_dict = {
|
|
22
|
+
'autocall' : False,
|
|
23
|
+
'font' : self.default_font(),
|
|
24
|
+
'cusp_horoballs' : True,
|
|
25
|
+
'cusp_triangulation' : True,
|
|
26
|
+
'cusp_ford_domain' : True,
|
|
27
|
+
'cusp_parallelogram' : True,
|
|
28
|
+
'cusp_labels' : False,
|
|
29
|
+
'cusp_cutoff' : '0.1000',
|
|
30
|
+
'keyboard' : 'QWERTY'}
|
|
31
|
+
self.cache = {}
|
|
32
|
+
self.cache_settings()
|
|
33
|
+
self.find_settings()
|
|
34
|
+
self.read_settings()
|
|
35
|
+
|
|
36
|
+
def __getitem__(self, x):
|
|
37
|
+
return self.setting_dict[x]
|
|
38
|
+
|
|
39
|
+
def __setitem__(self, x, y):
|
|
40
|
+
self.setting_dict[x] = y
|
|
41
|
+
|
|
42
|
+
def __repr__(self):
|
|
43
|
+
return str(self.setting_dict)
|
|
44
|
+
|
|
45
|
+
def items(self):
|
|
46
|
+
return self.setting_dict.items()
|
|
47
|
+
|
|
48
|
+
def get(self, key, default):
|
|
49
|
+
return self.setting_dict.get(key, default)
|
|
50
|
+
|
|
51
|
+
def default_font(self):
|
|
52
|
+
return default_terminal_font()
|
|
53
|
+
|
|
54
|
+
def find_settings(self):
|
|
55
|
+
if sys.platform == 'darwin':
|
|
56
|
+
home = os.environ['HOME']
|
|
57
|
+
# File is 'Preferences' rather than 'Settings' for backwards
|
|
58
|
+
# compatibility.
|
|
59
|
+
self.setting_file = os.path.join(home, 'Library',
|
|
60
|
+
'Preferences',
|
|
61
|
+
'org.computop.SnapPy.plist')
|
|
62
|
+
elif sys.platform == 'linux2' or sys.platform == 'linux':
|
|
63
|
+
home = os.environ['HOME']
|
|
64
|
+
self.setting_file = os.path.join(home, '.SnapPy.plist')
|
|
65
|
+
elif sys.platform == 'win32':
|
|
66
|
+
home = os.environ['USERPROFILE']
|
|
67
|
+
self.setting_file = os.path.join(home, '.SnapPy.plist')
|
|
68
|
+
else:
|
|
69
|
+
self.setting_file = None
|
|
70
|
+
|
|
71
|
+
def read_settings(self):
|
|
72
|
+
if self.setting_file and os.path.exists(self.setting_file):
|
|
73
|
+
with open(self.setting_file, 'rb') as setting_file:
|
|
74
|
+
new_settings = plistlib.load(setting_file)
|
|
75
|
+
|
|
76
|
+
if 'font' in new_settings:
|
|
77
|
+
family, size, info = new_settings['font']
|
|
78
|
+
# Guard against crazy values in the settings plist file.
|
|
79
|
+
size = clip_font_size(size)
|
|
80
|
+
weight, slant = info.split()
|
|
81
|
+
new_settings['font'] = FontChoice(family, size, weight, slant)
|
|
82
|
+
|
|
83
|
+
self.setting_dict.update(new_settings)
|
|
84
|
+
|
|
85
|
+
def write_settings(self):
|
|
86
|
+
if self.setting_file:
|
|
87
|
+
setting_dict = self.setting_dict.copy()
|
|
88
|
+
font = self.setting_dict['font']
|
|
89
|
+
setting_dict['font'] = (font.family, font.size, font.rest)
|
|
90
|
+
if hasattr(plistlib, 'dump'):
|
|
91
|
+
with open(self.setting_file, 'wb') as setting_file:
|
|
92
|
+
plistlib.dump(setting_dict, setting_file)
|
|
93
|
+
else:
|
|
94
|
+
plistlib.writePlist(setting_dict, self.setting_file)
|
|
95
|
+
|
|
96
|
+
def cache_settings(self):
|
|
97
|
+
self.cache.update(self.setting_dict)
|
|
98
|
+
|
|
99
|
+
def revert_settings(self):
|
|
100
|
+
self.setting_dict.update(self.cache)
|
|
101
|
+
self.apply_settings()
|
|
102
|
+
|
|
103
|
+
def changed(self):
|
|
104
|
+
return [key for key in self.cache.keys() if
|
|
105
|
+
self.cache[key] != self.setting_dict[key]]
|
|
106
|
+
|
|
107
|
+
# Override this in a subclass.
|
|
108
|
+
def apply_settings(self):
|
|
109
|
+
print(self.setting_dict)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class SettingsDialog(Dialog):
|
|
113
|
+
def __init__(self, parent, settings, title='SnapPy Settings'):
|
|
114
|
+
self.parent = parent
|
|
115
|
+
self.style = SnapPyStyle()
|
|
116
|
+
self.settings = settings
|
|
117
|
+
self.settings.cache_settings()
|
|
118
|
+
self.okay = False
|
|
119
|
+
Tk_.Toplevel.__init__(self, master=parent, class_='snappy')
|
|
120
|
+
frame = ttk.Frame(self, padding=(0, 10, 0, 0))
|
|
121
|
+
self.title(title)
|
|
122
|
+
self.notebook = notebook = ttk.Notebook(frame)
|
|
123
|
+
self.build_font_pane(notebook)
|
|
124
|
+
self.build_shell_pane(notebook)
|
|
125
|
+
self.build_cusp_pane(notebook)
|
|
126
|
+
self.build_inside_pane(notebook)
|
|
127
|
+
notebook.add(self.font_frame, text='Font')
|
|
128
|
+
notebook.add(self.shell_frame, text='Shell')
|
|
129
|
+
notebook.add(self.cusp_frame, text='Cusps')
|
|
130
|
+
notebook.add(self.inside_frame, text='Inside')
|
|
131
|
+
notebook.grid(row=0, column=0)
|
|
132
|
+
self.buttonbox()
|
|
133
|
+
notebook.pack(padx=0, pady=0)
|
|
134
|
+
frame.pack()
|
|
135
|
+
self.button_frame.pack(fill=Tk_.X)
|
|
136
|
+
self.protocol('WM_DELETE_WINDOW', self.cancel)
|
|
137
|
+
self.attributes('-topmost', True)
|
|
138
|
+
|
|
139
|
+
def run(self):
|
|
140
|
+
self.wait_window(self)
|
|
141
|
+
|
|
142
|
+
def validate(self):
|
|
143
|
+
cutoff = self.cutoff.get()
|
|
144
|
+
try:
|
|
145
|
+
float(cutoff)
|
|
146
|
+
self.settings['cusp_cutoff'] = cutoff
|
|
147
|
+
except ValueError:
|
|
148
|
+
showerror('Invalid input',
|
|
149
|
+
'Please enter a number for the cutoff.')
|
|
150
|
+
return False
|
|
151
|
+
self.settings.apply_settings()
|
|
152
|
+
self.okay = True
|
|
153
|
+
return True
|
|
154
|
+
|
|
155
|
+
def revert(self):
|
|
156
|
+
self.settings.revert_settings()
|
|
157
|
+
self.cancel()
|
|
158
|
+
|
|
159
|
+
def buttonbox(self):
|
|
160
|
+
self.button_frame = box = ttk.Frame(self, padding=(0, 0, 0, 20))
|
|
161
|
+
box.grid_columnconfigure(0, weight=1)
|
|
162
|
+
box.grid_columnconfigure(2, weight=1)
|
|
163
|
+
OK = ttk.Button(box, text="OK", width=10, command=self.ok,
|
|
164
|
+
default=Tk_.ACTIVE)
|
|
165
|
+
OK.grid(row=0, column=0, sticky=Tk_.NE, padx=5)
|
|
166
|
+
Apply = ttk.Button(box, text="Apply", width=10,
|
|
167
|
+
command=self.settings.apply_settings)
|
|
168
|
+
Apply.grid(row=0, column=1, sticky=Tk_.N, padx=5)
|
|
169
|
+
Cancel = ttk.Button(box, text="Cancel", width=10, command=self.revert)
|
|
170
|
+
Cancel.grid(row=0, column=2, sticky=Tk_.NW, padx=5)
|
|
171
|
+
self.bind("<Return>", lambda event : OK.focus_set())
|
|
172
|
+
self.bind("<Escape>", self.cancel)
|
|
173
|
+
|
|
174
|
+
def show_body(self):
|
|
175
|
+
self.body_frame.grid(row=1, column=0, padx=5, pady=5,
|
|
176
|
+
sticky=Tk_.N + Tk_.S + Tk_.W + Tk_.E)
|
|
177
|
+
self.body_frame.focus_set()
|
|
178
|
+
|
|
179
|
+
def build_font_pane(self, parent):
|
|
180
|
+
current_font = self.settings['font']
|
|
181
|
+
groupBG = self.style.groupBG
|
|
182
|
+
self.font_frame = font_frame = ttk.Frame(parent)
|
|
183
|
+
font_frame.columnconfigure(2, weight=1)
|
|
184
|
+
font_frame.columnconfigure(0, weight=1)
|
|
185
|
+
self.list_frame = list_frame = ttk.Frame(font_frame)
|
|
186
|
+
self.font_list = font_list = Tk_.Listbox(list_frame,
|
|
187
|
+
selectmode=Tk_.SINGLE)
|
|
188
|
+
font_list.grid(row=0, column=0, pady=(20,30))
|
|
189
|
+
font_scroller = ttk.Scrollbar(list_frame,
|
|
190
|
+
command=font_list.yview)
|
|
191
|
+
font_list.config(yscrollcommand=font_scroller.set)
|
|
192
|
+
font_scroller.grid(row=0, column=1, sticky=Tk_.N + Tk_.S, pady=(20,30))
|
|
193
|
+
list_frame.grid(rowspan=6, column=0)
|
|
194
|
+
|
|
195
|
+
label = ttk.Label(self.font_frame, text='Size: ')
|
|
196
|
+
label.grid(row=0, column=1, sticky=Tk_.E, pady=(20,0))
|
|
197
|
+
self.font_sizer = sizer = Spinbox(font_frame, from_=10, to_=36, width=4,
|
|
198
|
+
command=self.set_font_sample)
|
|
199
|
+
def check_font_size(size):
|
|
200
|
+
try:
|
|
201
|
+
value = int(size)
|
|
202
|
+
except:
|
|
203
|
+
sizer.set(13 if sys.platform == 'darwin' else 11)
|
|
204
|
+
return False
|
|
205
|
+
if value < 10:
|
|
206
|
+
sizer.set(10)
|
|
207
|
+
return False
|
|
208
|
+
if value > 36:
|
|
209
|
+
sizer.set(36)
|
|
210
|
+
return False
|
|
211
|
+
return True
|
|
212
|
+
validator = parent.register(check_font_size)
|
|
213
|
+
sizer.config(validate ="key", validatecommand =(validator, '%P'))
|
|
214
|
+
sizer.delete(0,2)
|
|
215
|
+
sizer.insert(0, clip_font_size(current_font.size))
|
|
216
|
+
sizer.bind('<Return>', self.set_font_sample)
|
|
217
|
+
sizer.bind('<Tab>', self.set_font_sample)
|
|
218
|
+
self.current_size = current_font.size
|
|
219
|
+
sizer.grid(row=0, column=2, sticky=Tk_.W, pady=(20,0))
|
|
220
|
+
label = ttk.Label(font_frame, text='Weight: ')
|
|
221
|
+
label.grid(row=1, column=1, sticky=Tk_.E)
|
|
222
|
+
self.font_weight = weight = Tk_.StringVar(value=current_font.weight)
|
|
223
|
+
radio = ttk.Radiobutton(font_frame, text='normal', variable=weight,
|
|
224
|
+
value='normal', command=self.set_font_sample)
|
|
225
|
+
radio.grid(row=1, column=2, sticky=Tk_.W)
|
|
226
|
+
radio = ttk.Radiobutton(font_frame, text='bold', variable=weight,
|
|
227
|
+
value='bold', command=self.set_font_sample)
|
|
228
|
+
radio.grid(row=2, column=2, sticky=Tk_.W)
|
|
229
|
+
label = ttk.Label(font_frame, text='Slant: ')
|
|
230
|
+
label.grid(row=3, column=1, sticky=Tk_.E)
|
|
231
|
+
self.font_slant = slant = Tk_.StringVar(value=current_font.slant)
|
|
232
|
+
radio = ttk.Radiobutton(font_frame, text='roman', variable=slant,
|
|
233
|
+
value='roman', command=self.set_font_sample)
|
|
234
|
+
radio.grid(row=3, column=2, sticky=Tk_.W)
|
|
235
|
+
radio = ttk.Radiobutton(font_frame, text='italic', variable=slant,
|
|
236
|
+
value='italic', command=self.set_font_sample)
|
|
237
|
+
radio.grid(row=4, column=2, sticky=Tk_.W)
|
|
238
|
+
|
|
239
|
+
self.fixed_only = Tk_.BooleanVar(value=True)
|
|
240
|
+
self.check_fixed = ttk.Checkbutton(font_frame, variable=self.fixed_only,
|
|
241
|
+
text='Fixed-width fonts only',
|
|
242
|
+
command=self.set_font_families)
|
|
243
|
+
self.check_fixed.grid(row=6, column=0, pady=(0, 10), sticky=Tk_.N)
|
|
244
|
+
self.sample = sample = Tk_.Text(font_frame,
|
|
245
|
+
width=40, height=6,
|
|
246
|
+
highlightthickness=0,
|
|
247
|
+
relief=Tk_.FLAT,
|
|
248
|
+
font=self.settings['font'].as_tuple())
|
|
249
|
+
self.sample.bind('<Button-1>', lambda event: 'break')
|
|
250
|
+
self.sample.insert(Tk_.INSERT, '\nABCDEFGHIJKLMNOPQRSTUVWXYZ\n'
|
|
251
|
+
'abcdefghijklmnopqrstuvwxyz')
|
|
252
|
+
sample.tag_add('all', '1.0', Tk_.END)
|
|
253
|
+
font_list.bind('<ButtonRelease-1>', self.set_font_sample)
|
|
254
|
+
self.sample.grid(row=7, columnspan=4, padx=10, pady=10, sticky=Tk_.E+Tk_.W)
|
|
255
|
+
self.set_font_families()
|
|
256
|
+
self.set_font_sample()
|
|
257
|
+
|
|
258
|
+
def set_font_families(self):
|
|
259
|
+
families = {f for f in font_families()
|
|
260
|
+
if f[0] != '@' and f.lower().find('emoji') < 0} # omit vertical fonts, emojis
|
|
261
|
+
if self.fixed_only.get():
|
|
262
|
+
families = {f for f in families if Font(family=f).metrics('fixed')}
|
|
263
|
+
families.add(self.settings['font'].family)
|
|
264
|
+
self.families = families = sorted(families)
|
|
265
|
+
if self.font_list.size() > 0:
|
|
266
|
+
self.font_list.delete(0, self.font_list.size() - 1)
|
|
267
|
+
for family in families:
|
|
268
|
+
self.font_list.insert(Tk_.END, family)
|
|
269
|
+
self.current_family = families.index(self.settings['font'].family)
|
|
270
|
+
self.font_list.selection_set(self.current_family)
|
|
271
|
+
self.font_list.see(self.current_family)
|
|
272
|
+
|
|
273
|
+
def get_font(self):
|
|
274
|
+
selection = self.font_list.curselection()
|
|
275
|
+
if selection:
|
|
276
|
+
index = int(selection[0])
|
|
277
|
+
self.current_family = index
|
|
278
|
+
else:
|
|
279
|
+
index = self.current_family
|
|
280
|
+
family = self.families[index]
|
|
281
|
+
try:
|
|
282
|
+
size = int(self.font_sizer.get())
|
|
283
|
+
except ValueError:
|
|
284
|
+
size = self.current_size
|
|
285
|
+
self.font_sizer.delete(0, Tk_.END)
|
|
286
|
+
self.font_sizer.insert(0, str(size))
|
|
287
|
+
self.font_list.selection_set(self.current_family)
|
|
288
|
+
return FontChoice(family, size,
|
|
289
|
+
self.font_weight.get(), self.font_slant.get())
|
|
290
|
+
|
|
291
|
+
def set_font_sample(self, event=None):
|
|
292
|
+
new_font = self.get_font()
|
|
293
|
+
self.settings['font'] = new_font
|
|
294
|
+
self.sample.tag_config('all', justify=Tk_.CENTER,
|
|
295
|
+
font=new_font.as_tuple())
|
|
296
|
+
|
|
297
|
+
def build_shell_pane(self, parent):
|
|
298
|
+
groupBG = self.style.groupBG
|
|
299
|
+
self.autocall = Tk_.BooleanVar(value=self.settings['autocall'])
|
|
300
|
+
self.update_idletasks()
|
|
301
|
+
self.shell_frame = shell_frame = ttk.Frame(parent)
|
|
302
|
+
shell_frame.rowconfigure(3, weight=1)
|
|
303
|
+
shell_frame.columnconfigure(0, weight=1)
|
|
304
|
+
shell_frame.columnconfigure(3, weight=1)
|
|
305
|
+
# Keep the height the same as the height of the font pane.
|
|
306
|
+
strut = ttk.Frame(shell_frame, width=1)
|
|
307
|
+
strut.grid(rowspan=5, column=0)
|
|
308
|
+
next_label = ttk.Label(shell_frame, anchor=Tk_.W,
|
|
309
|
+
text='Which IPython features would you like to enable?')
|
|
310
|
+
next_label.grid(row=0, column=1, columnspan=2, sticky=Tk_.W, pady=(20,0))
|
|
311
|
+
next_check = ttk.Checkbutton(shell_frame, variable=self.autocall,
|
|
312
|
+
text='IPython autocall',
|
|
313
|
+
command=self.set_autocall)
|
|
314
|
+
next_check.grid(row=1, column=1, sticky=Tk_.W, pady=(10,0))
|
|
315
|
+
next_check.grid(row=2, column=1, sticky=Tk_.W, pady=(5,0))
|
|
316
|
+
|
|
317
|
+
def set_autocall(self):
|
|
318
|
+
self.settings['autocall'] = self.autocall.get()
|
|
319
|
+
|
|
320
|
+
def build_cusp_pane(self, parent):
|
|
321
|
+
groupBG = self.style.groupBG
|
|
322
|
+
self.cusp_frame = cusp_frame = ttk.Frame(parent)
|
|
323
|
+
self.horoballs = Tk_.BooleanVar(value=self.settings['cusp_horoballs'])
|
|
324
|
+
self.triangulation = Tk_.BooleanVar(value=self.settings['cusp_triangulation'])
|
|
325
|
+
self.ford = Tk_.BooleanVar(value=self.settings['cusp_ford_domain'])
|
|
326
|
+
self.labels = Tk_.BooleanVar(value=self.settings['cusp_labels'])
|
|
327
|
+
self.parallelogram = Tk_.BooleanVar(value=self.settings['cusp_parallelogram'])
|
|
328
|
+
self.cutoff = Tk_.StringVar(value=self.settings['cusp_cutoff'])
|
|
329
|
+
self.update_idletasks()
|
|
330
|
+
cusp_frame.rowconfigure(8, weight=1)
|
|
331
|
+
cusp_frame.columnconfigure(0, weight=1)
|
|
332
|
+
cusp_frame.columnconfigure(3, weight=1)
|
|
333
|
+
strut = ttk.Frame(cusp_frame, width=1)
|
|
334
|
+
strut.grid(rowspan=8, column=0)
|
|
335
|
+
next_label = ttk.Label(cusp_frame,
|
|
336
|
+
text='Which elements should be visible when you first '
|
|
337
|
+
'view the cusp neighborhood?')
|
|
338
|
+
next_label.grid(row=0, column=1, columnspan=2, sticky=Tk_.W, pady=(20,10))
|
|
339
|
+
next_check = ttk.Checkbutton(cusp_frame, variable=self.horoballs,
|
|
340
|
+
text='Horoballs',
|
|
341
|
+
command=self.set_horoballs)
|
|
342
|
+
next_check.grid(row=1, column=1, sticky=Tk_.W, padx=(30, 0))
|
|
343
|
+
next_check = ttk.Checkbutton(cusp_frame, variable=self.triangulation,
|
|
344
|
+
text='Triangulation',
|
|
345
|
+
command=self.set_triangulation)
|
|
346
|
+
next_check.grid(row=2, column=1, sticky=Tk_.W, padx=(30, 0))
|
|
347
|
+
next_check = ttk.Checkbutton(cusp_frame, variable=self.ford,
|
|
348
|
+
text='Ford domain',
|
|
349
|
+
command=self.set_ford)
|
|
350
|
+
next_check.grid(row=3, column=1, sticky=Tk_.W, padx=(30, 0))
|
|
351
|
+
next_check = ttk.Checkbutton(cusp_frame, variable=self.labels,
|
|
352
|
+
text='Labels',
|
|
353
|
+
command=self.set_labels)
|
|
354
|
+
next_check.grid(row=4, column=1, sticky=Tk_.W, padx=(30, 0))
|
|
355
|
+
next_check = ttk.Checkbutton(cusp_frame, variable=self.parallelogram,
|
|
356
|
+
text='Parallelogram',
|
|
357
|
+
command=self.set_parallelogram)
|
|
358
|
+
next_check.grid(row=5, column=1, sticky=Tk_.W, padx=(30, 0))
|
|
359
|
+
next_label = ttk.Label(cusp_frame,
|
|
360
|
+
text='What should the initial cutoff be?')
|
|
361
|
+
next_label.grid(row=6, column=1, columnspan=2, pady=(20,10), sticky=Tk_.W)
|
|
362
|
+
cutoff_entry = ttk.Entry(cusp_frame, textvariable=self.cutoff, width=15)
|
|
363
|
+
cutoff_entry.grid(row=7, column=1, columnspan=2, sticky=Tk_.W,
|
|
364
|
+
pady=(0,10), padx=(30,0))
|
|
365
|
+
|
|
366
|
+
def set_horoballs(self):
|
|
367
|
+
self.settings['cusp_horoballs'] = self.horoballs.get()
|
|
368
|
+
|
|
369
|
+
def set_triangulation(self):
|
|
370
|
+
self.settings['cusp_triangulation'] = self.triangulation.get()
|
|
371
|
+
|
|
372
|
+
def set_ford(self):
|
|
373
|
+
self.settings['cusp_ford_domain'] = self.ford.get()
|
|
374
|
+
|
|
375
|
+
def set_labels(self):
|
|
376
|
+
self.settings['cusp_labels'] = self.labels.get()
|
|
377
|
+
|
|
378
|
+
def set_parallelogram(self):
|
|
379
|
+
self.settings['cusp_parallelogram'] = self.parallelogram.get()
|
|
380
|
+
|
|
381
|
+
def build_inside_pane(self, parent):
|
|
382
|
+
groupBG = self.style.groupBG
|
|
383
|
+
self.keyboard = Tk_.Variable(value=self.settings['keyboard'])
|
|
384
|
+
self.inside_frame = frame = ttk.Frame(parent)
|
|
385
|
+
frame.rowconfigure(3, weight=1)
|
|
386
|
+
frame.columnconfigure(0, weight=1)
|
|
387
|
+
frame.columnconfigure(3, weight=1)
|
|
388
|
+
# Keep the height the same as the height of the font pane.
|
|
389
|
+
strut = ttk.Frame(frame, width=1)
|
|
390
|
+
strut.grid(rowspan=5, column=0)
|
|
391
|
+
keyboard_label = ttk.Label(frame, anchor=Tk_.W,
|
|
392
|
+
text='Which keyboard layout are you using?')
|
|
393
|
+
keyboard_label.grid(row=0, column=1, columnspan=2, sticky=Tk_.W, pady=(20,0))
|
|
394
|
+
keyboard_button = ttk.OptionMenu(frame, self.keyboard, self.keyboard.get(),
|
|
395
|
+
'QWERTY', 'AZERTY', 'QWERTZ', command=self.set_keyboard)
|
|
396
|
+
keyboard_button.grid(row=1, column=1, columnspan=2, sticky=Tk_.W, pady=(10, 0))
|
|
397
|
+
|
|
398
|
+
def set_keyboard(self, value):
|
|
399
|
+
self.settings['keyboard'] = value
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
if __name__ == '__main__':
|
|
403
|
+
parent = Tk_.Tk(className='snappy')
|
|
404
|
+
settings = Settings()
|
|
405
|
+
settings.apply_settings()
|
|
406
|
+
SettingsDialog(parent, settings)
|
|
407
|
+
parent.mainloop()
|
snappy/shell.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# SnapPy's subclass of the IPython InteractiveShellEmbed
|
|
3
|
+
from IPython.core.displayhook import DisplayHook
|
|
4
|
+
try:
|
|
5
|
+
from IPython.terminal.embed import InteractiveShellEmbed
|
|
6
|
+
except ImportError:
|
|
7
|
+
from IPython.frontend.terminal.embed import InteractiveShellEmbed
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SnapPyPromptDisplayHook(DisplayHook):
|
|
11
|
+
"""
|
|
12
|
+
A DisplayHook used when displaying SnapPy's output prompts. This
|
|
13
|
+
subclass overrides one method in order to write the output prompt
|
|
14
|
+
into the SnapPy console instead of sys.stdout.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def write_output_prompt(self):
|
|
18
|
+
output = self.shell.output
|
|
19
|
+
output.write(self.shell.separate_out)
|
|
20
|
+
# If we're not displaying a prompt, it effectively ends with a newline,
|
|
21
|
+
# because the output will be left-aligned.
|
|
22
|
+
self.prompt_end_newline = True
|
|
23
|
+
if self.do_full_cache:
|
|
24
|
+
tokens = self.shell.prompts.out_prompt_tokens()
|
|
25
|
+
prompt_txt = ''.join(s for t, s in tokens)
|
|
26
|
+
if prompt_txt and not prompt_txt.endswith('\n'):
|
|
27
|
+
# Ask for a newline before multiline output
|
|
28
|
+
self.prompt_end_newline = False
|
|
29
|
+
for token, text in tokens:
|
|
30
|
+
output.write(text, style=(token[0],))
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class SnapPyInteractiveShellEmbed(InteractiveShellEmbed):
|
|
34
|
+
"""
|
|
35
|
+
An embedded IPython shell which can use a TkTerm for all of its
|
|
36
|
+
input and output, including the output prompt.
|
|
37
|
+
"""
|
|
38
|
+
readline_use = False
|
|
39
|
+
autoindent_use = False
|
|
40
|
+
colors_force = True
|
|
41
|
+
separate_out = '\n'
|
|
42
|
+
separate_in = ''
|
|
43
|
+
show_rewritten_input = False
|
|
44
|
+
pt_app = None
|
|
45
|
+
|
|
46
|
+
def __init__(self, *args, **kwargs):
|
|
47
|
+
super(InteractiveShellEmbed, self).__init__(*args, **kwargs)
|
|
48
|
+
# Currently, using jedi means no completions at all.
|
|
49
|
+
self.Completer.use_jedi = False
|
|
50
|
+
self.magics_manager.magics['line']['colors']('LightBG')
|
|
51
|
+
|
|
52
|
+
def _displayhook_class_default(self):
|
|
53
|
+
return SnapPyPromptDisplayHook
|