snappy 3.1.1__cp38-cp38-win_amd64.whl → 3.2__cp38-cp38-win_amd64.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.cp38-win_amd64.pyd +0 -0
- snappy/SnapPy.cp38-win_amd64.pyd +0 -0
- snappy/SnapPyHP.cp38-win_amd64.pyd +0 -0
- snappy/__init__.py +299 -402
- snappy/app.py +70 -20
- snappy/browser.py +18 -17
- snappy/canonical.py +249 -0
- snappy/{verify/cusp_shapes.py → cusps/__init__.py} +8 -18
- snappy/cusps/cusp_area_matrix.py +101 -0
- snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +23 -39
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/test.py +21 -0
- snappy/cusps/trig_cusp_area_matrix.py +63 -0
- snappy/database.py +10 -9
- snappy/decorated_isosig.py +337 -114
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +40 -7
- snappy/dev/extended_ptolemy/extended.py +3 -3
- snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +1 -1
- snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
- snappy/doc/_images/m125_paper_plane.jpg +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/_sources/additional_classes.rst.txt +40 -40
- snappy/doc/_sources/bugs.rst.txt +14 -14
- snappy/doc/_sources/censuses.rst.txt +51 -51
- snappy/doc/_sources/credits.rst.txt +75 -75
- snappy/doc/_sources/development.rst.txt +259 -239
- snappy/doc/_sources/index.rst.txt +182 -115
- snappy/doc/_sources/installing.rst.txt +247 -264
- snappy/doc/_sources/manifold.rst.txt +6 -6
- snappy/doc/_sources/manifoldhp.rst.txt +46 -46
- snappy/doc/_sources/news.rst.txt +355 -283
- snappy/doc/_sources/other.rst.txt +25 -25
- snappy/doc/_sources/platonic_census.rst.txt +20 -20
- snappy/doc/_sources/plink.rst.txt +102 -102
- snappy/doc/_sources/ptolemy.rst.txt +66 -66
- snappy/doc/_sources/ptolemy_classes.rst.txt +42 -42
- snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -297
- snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -363
- snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -301
- snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -61
- snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -105
- snappy/doc/_sources/screenshots.rst.txt +21 -21
- snappy/doc/_sources/snap.rst.txt +87 -87
- snappy/doc/_sources/snappy.rst.txt +28 -28
- snappy/doc/_sources/spherogram.rst.txt +103 -103
- snappy/doc/_sources/todo.rst.txt +47 -47
- snappy/doc/_sources/triangulation.rst.txt +11 -11
- snappy/doc/_sources/tutorial.rst.txt +49 -49
- snappy/doc/_sources/verify.rst.txt +210 -150
- snappy/doc/_sources/verify_internals.rst.txt +79 -90
- snappy/doc/_static/basic.css +924 -902
- snappy/doc/_static/css/badge_only.css +1 -1
- snappy/doc/_static/css/theme.css +1 -1
- snappy/doc/_static/doctools.js +1 -1
- snappy/doc/_static/documentation_options.js +12 -13
- 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/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +199 -199
- snappy/doc/_static/pygments.css +74 -73
- snappy/doc/_static/searchtools.js +125 -71
- snappy/doc/_static/snappy_furo.css +33 -33
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
- snappy/doc/_static/sphinx_highlight.js +13 -3
- snappy/doc/additional_classes.html +1499 -1330
- snappy/doc/bugs.html +131 -134
- snappy/doc/censuses.html +426 -445
- snappy/doc/credits.html +180 -183
- snappy/doc/development.html +383 -363
- snappy/doc/genindex.html +1330 -1409
- snappy/doc/index.html +261 -206
- snappy/doc/installing.html +345 -363
- snappy/doc/manifold.html +3451 -2839
- snappy/doc/manifoldhp.html +179 -182
- snappy/doc/news.html +387 -329
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +160 -162
- snappy/doc/platonic_census.html +374 -377
- snappy/doc/plink.html +209 -212
- snappy/doc/ptolemy.html +253 -255
- snappy/doc/ptolemy_classes.html +1143 -1146
- snappy/doc/ptolemy_examples1.html +408 -410
- snappy/doc/ptolemy_examples2.html +470 -473
- snappy/doc/ptolemy_examples3.html +413 -416
- snappy/doc/ptolemy_examples4.html +194 -197
- snappy/doc/ptolemy_prelim.html +247 -250
- snappy/doc/py-modindex.html +164 -167
- snappy/doc/screenshots.html +140 -142
- snappy/doc/search.html +134 -137
- snappy/doc/searchindex.js +1 -1
- snappy/doc/snap.html +201 -204
- snappy/doc/snappy.html +180 -182
- snappy/doc/spherogram.html +1210 -1213
- snappy/doc/todo.html +165 -168
- snappy/doc/triangulation.html +1583 -1474
- snappy/doc/tutorial.html +158 -161
- snappy/doc/verify.html +329 -275
- snappy/doc/verify_internals.html +1234 -1691
- snappy/drilling/__init__.py +153 -235
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +0 -2
- snappy/drilling/crush.py +56 -130
- snappy/drilling/cusps.py +12 -6
- snappy/drilling/debug.py +2 -1
- snappy/drilling/exceptions.py +7 -40
- snappy/drilling/moves.py +302 -243
- snappy/drilling/perturb.py +63 -37
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +0 -5
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +126 -0
- snappy/drilling/tracing.py +9 -37
- snappy/exceptions.py +18 -5
- snappy/exterior_to_link/barycentric_geometry.py +2 -4
- snappy/exterior_to_link/main.py +8 -7
- snappy/exterior_to_link/mcomplex_with_link.py +2 -2
- snappy/exterior_to_link/rational_linear_algebra.py +1 -1
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
- snappy/exterior_to_link/test.py +21 -33
- 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 +697 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -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_keys.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/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
- snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
- 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 +101 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +23 -13
- snappy/horoviewer.py +7 -7
- snappy/hyperboloid/__init__.py +96 -31
- snappy/hyperboloid/distances.py +245 -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/isometry_signature.py +382 -0
- snappy/len_spec/__init__.py +596 -0
- snappy/len_spec/geodesic_info.py +110 -0
- snappy/len_spec/geodesic_key_info_dict.py +117 -0
- snappy/len_spec/geodesic_piece.py +143 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +80 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
- snappy/len_spec/spine.py +206 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +275 -0
- snappy/len_spec/word.py +86 -0
- snappy/math_basics.py +39 -13
- snappy/matrix.py +52 -9
- snappy/number.py +12 -6
- snappy/numeric_output_checker.py +2 -3
- snappy/pari.py +8 -4
- snappy/phone_home.py +2 -1
- snappy/polyviewer.py +8 -8
- snappy/ptolemy/__init__.py +1 -1
- snappy/ptolemy/component.py +2 -2
- snappy/ptolemy/coordinates.py +25 -25
- snappy/ptolemy/findLoops.py +9 -9
- snappy/ptolemy/manifoldMethods.py +27 -29
- snappy/ptolemy/polynomial.py +50 -57
- snappy/ptolemy/processFileBase.py +60 -0
- snappy/ptolemy/ptolemyVariety.py +109 -41
- snappy/ptolemy/reginaWrapper.py +4 -4
- snappy/ptolemy/rur.py +1 -1
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
- snappy/ptolemy/test.py +99 -54
- snappy/ptolemy/utilities.py +1 -1
- 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 +0 -3
- snappy/raytracing/eyeball.py +123 -0
- snappy/raytracing/finite_raytracing_data.py +17 -17
- snappy/raytracing/finite_viewer.py +15 -15
- snappy/raytracing/geodesic_tube_info.py +93 -63
- snappy/raytracing/geodesics.py +94 -64
- snappy/raytracing/geodesics_window.py +56 -34
- snappy/raytracing/gui_utilities.py +21 -6
- snappy/raytracing/hyperboloid_navigation.py +29 -4
- snappy/raytracing/hyperboloid_utilities.py +73 -73
- snappy/raytracing/ideal_raytracing_data.py +121 -91
- snappy/raytracing/inside_viewer.py +199 -66
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +37 -25
- snappy/raytracing/raytracing_view.py +70 -65
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +39 -3
- snappy/raytracing/shaders/fragment.glsl +451 -133
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +42 -9
- snappy/sage_helper.py +67 -134
- snappy/settings.py +90 -77
- snappy/shell.py +2 -0
- snappy/snap/character_varieties.py +2 -2
- snappy/snap/find_field.py +4 -3
- snappy/snap/fundamental_polyhedron.py +2 -2
- snappy/snap/kernel_structures.py +5 -1
- snappy/snap/nsagetools.py +9 -8
- snappy/snap/peripheral/dual_cellulation.py +4 -3
- snappy/snap/peripheral/peripheral.py +2 -2
- snappy/snap/peripheral/surface.py +5 -5
- snappy/snap/peripheral/test.py +1 -1
- snappy/snap/polished_reps.py +8 -8
- snappy/snap/slice_obs_HKL.py +16 -14
- snappy/snap/t3mlite/arrow.py +3 -3
- snappy/snap/t3mlite/edge.py +3 -3
- snappy/snap/t3mlite/homology.py +2 -2
- snappy/snap/t3mlite/mcomplex.py +3 -3
- snappy/snap/t3mlite/simplex.py +12 -0
- snappy/snap/t3mlite/spun.py +18 -17
- snappy/snap/t3mlite/test_vs_regina.py +4 -4
- snappy/snap/test.py +37 -53
- snappy/snap/utilities.py +4 -5
- snappy/test.py +121 -138
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -0
- snappy/tiling/canonical_key_dict.py +59 -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/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +215 -0
- snappy/tiling/triangle.py +33 -0
- snappy/tkterminal.py +113 -84
- snappy/twister/main.py +1 -7
- snappy/twister/twister_core.cp38-win_amd64.pyd +0 -0
- snappy/upper_halfspace/__init__.py +78 -17
- snappy/verify/__init__.py +3 -7
- snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
- snappy/verify/complex_volume/adjust_torsion.py +1 -2
- snappy/verify/complex_volume/closed.py +13 -13
- snappy/verify/complex_volume/cusped.py +6 -6
- snappy/verify/complex_volume/extended_bloch.py +5 -8
- snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +0 -55
- snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
- snappy/verify/interval_newton_shapes_engine.py +7 -5
- snappy/verify/interval_tree.py +5 -5
- snappy/verify/krawczyk_shapes_engine.py +17 -18
- snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
- snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
- snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
- snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
- snappy/verify/shapes.py +5 -3
- snappy/verify/short_slopes.py +39 -41
- snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
- snappy/verify/test.py +57 -60
- snappy/verify/upper_halfspace/extended_matrix.py +1 -1
- snappy/verify/upper_halfspace/finite_point.py +3 -4
- snappy/verify/upper_halfspace/ideal_point.py +9 -9
- snappy/verify/volume.py +2 -2
- snappy/version.py +2 -2
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +14 -10
- snappy-3.2.dist-info/RECORD +503 -0
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
- snappy/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/__pycache__/browser.cpython-38.pyc +0 -0
- snappy/__pycache__/cache.cpython-38.pyc +0 -0
- snappy/__pycache__/database.cpython-38.pyc +0 -0
- snappy/__pycache__/db_utilities.cpython-38.pyc +0 -0
- snappy/__pycache__/decorated_isosig.cpython-38.pyc +0 -0
- snappy/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/__pycache__/export_stl.cpython-38.pyc +0 -0
- snappy/__pycache__/filedialog.cpython-38.pyc +0 -0
- snappy/__pycache__/gui.cpython-38.pyc +0 -0
- snappy/__pycache__/horoviewer.cpython-38.pyc +0 -0
- snappy/__pycache__/math_basics.cpython-38.pyc +0 -0
- snappy/__pycache__/matrix.cpython-38.pyc +0 -0
- snappy/__pycache__/number.cpython-38.pyc +0 -0
- snappy/__pycache__/numeric_output_checker.cpython-38.pyc +0 -0
- snappy/__pycache__/pari.cpython-38.pyc +0 -0
- snappy/__pycache__/polyviewer.cpython-38.pyc +0 -0
- snappy/__pycache__/sage_helper.cpython-38.pyc +0 -0
- snappy/__pycache__/version.cpython-38.pyc +0 -0
- snappy/doc/_sources/verify_canon.rst.txt +0 -90
- snappy/doc/_static/jquery-3.6.0.js +0 -10881
- snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
- snappy/doc/_static/js/html5shiv.min.js +0 -4
- snappy/doc/_static/underscore-1.13.1.js +0 -2042
- snappy/doc/_static/underscore.js +0 -6
- snappy/doc/verify_canon.html +0 -304
- snappy/drilling/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/constants.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/crush.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/cusps.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/debug.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/epsilons.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/fixed_points.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_info.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_tube.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geometric_structure.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/line.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/moves.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/peripheral_curves.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/perturb.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/quotient_space.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/spatial_dict.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/subdivide.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/tracing.cpython-38.pyc +0 -0
- snappy/drilling/geodesic_tube.py +0 -441
- snappy/drilling/geometric_structure.py +0 -366
- snappy/drilling/line.py +0 -122
- snappy/drilling/quotient_space.py +0 -94
- snappy/drilling/spatial_dict.py +0 -128
- snappy/exterior_to_link/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/hyp_utils.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/link_projection.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/main.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/pl_utils.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/put_in_S3.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/stored_moves.cpython-38.pyc +0 -0
- snappy/hyperboloid/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/manifolds/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/component.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/coordinates.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/fieldExtensions.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/findLoops.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/homology.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/manifoldMethods.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/matrix.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/polynomial.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processComponents.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileBase.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileDispatch.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processMagmaFile.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processRurFile.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVariety.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/rur.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/utilities.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/character_varieties.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/fundamental_polyhedron.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/interval_reps.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/kernel_structures.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/mcomplex_base.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/nsagetools.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/polished_reps.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/shapes.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/slice_obs_HKL.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/utilities.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/link.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/peripheral.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/surface.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/arrow.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/corner.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/edge.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/face.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/files.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/homology.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/linalg.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/mcomplex.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/perm4.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/simplex.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/spun.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/surface.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/vertex.cpython-38.pyc +0 -0
- snappy/togl/__init__.py +0 -3
- snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
- snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
- snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
- snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
- snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
- snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
- snappy/twister/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/twister/__pycache__/main.cpython-38.pyc +0 -0
- snappy/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cuspCrossSection.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cuspTranslations.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cusp_areas.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cusp_shapes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/interval_tree.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/realAlgebra.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/shapes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/short_slopes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/squareExtensions.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/verifyCanonical.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/verifyHyperbolicity.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/volume.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/closed.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/cusped.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-38.pyc +0 -0
- snappy/verify/cuspCrossSection.py +0 -1422
- snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-38.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
- snappy-3.1.1.dist-info/RECORD +0 -575
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
snappy/app.py
CHANGED
@@ -22,7 +22,7 @@ from .settings import Settings, SettingsDialog
|
|
22
22
|
from .phone_home import update_needed
|
23
23
|
from .SnapPy import SnapPea_interrupt, msg_stream
|
24
24
|
from .shell import SnapPyInteractiveShellEmbed
|
25
|
-
from .tkterminal import
|
25
|
+
from .tkterminal import TkTerminalBase
|
26
26
|
|
27
27
|
from plink import LinkEditor
|
28
28
|
from plink.smooth import Smoother
|
@@ -34,7 +34,7 @@ if 'SNAPPYHOME' in os.environ:
|
|
34
34
|
os.environ['HOME'] = os.environ['SNAPPYHOME']
|
35
35
|
|
36
36
|
|
37
|
-
class SnapPyTerm(
|
37
|
+
class SnapPyTerm(TkTerminalBase, ListedWindow):
|
38
38
|
"""
|
39
39
|
The main window of the SnapPy app, which runs an embedded IPython shell.
|
40
40
|
"""
|
@@ -47,9 +47,10 @@ class SnapPyTerm(TkTerm, ListedWindow):
|
|
47
47
|
self.main_window = self
|
48
48
|
self.menu_title = 'SnapPy Shell'
|
49
49
|
self.register_window(self)
|
50
|
-
|
50
|
+
TkTerminalBase.__init__(self, shell, name='SnapPy Command Shell')
|
51
51
|
self.settings = SnapPySettings(self)
|
52
52
|
self.start_interaction()
|
53
|
+
self.interact_prompt()
|
53
54
|
if sys.platform == 'darwin':
|
54
55
|
assert str(self.window) == "."
|
55
56
|
# Under OS X, the main window shouldn't be closable.
|
@@ -61,6 +62,34 @@ class SnapPyTerm(TkTerm, ListedWindow):
|
|
61
62
|
self.window.tk.call('set', '::tk::dialog::file::showHiddenVar', '0')
|
62
63
|
self.encoding = None
|
63
64
|
|
65
|
+
def start_interaction(self):
|
66
|
+
"""
|
67
|
+
Display a banner and prepare to begin interaction.
|
68
|
+
"""
|
69
|
+
snappy_path = os.path.abspath(os.path.dirname(__file__))
|
70
|
+
icon_file = os.path.join(snappy_path, 'info_icon.gif')
|
71
|
+
# Keep a reference to the icon.
|
72
|
+
self.icon = Tk_.PhotoImage(file=icon_file)
|
73
|
+
|
74
|
+
self.text.image_create(Tk_.END, image=self.icon)
|
75
|
+
banner_label = Tk_.Label(self.text, text=self.banner,
|
76
|
+
background='#ec0fffec0',
|
77
|
+
foreground='DarkGreen',
|
78
|
+
anchor=Tk_.W,
|
79
|
+
justify=Tk_.LEFT,
|
80
|
+
font=self.settings['font'].as_tuple())
|
81
|
+
self.text.window_create(Tk_.END, window=banner_label)
|
82
|
+
self.text.insert(Tk_.END, '\n')
|
83
|
+
self.text.mark_set('output_end', '2.0')
|
84
|
+
# Set a reasonable default directory for files to be saved to.
|
85
|
+
try:
|
86
|
+
home = os.environ['HOME']
|
87
|
+
except KeyError:
|
88
|
+
home = os.path.expanduser("~")
|
89
|
+
desktop = os.path.join(home, "Desktop")
|
90
|
+
default_save_dir = desktop if os.path.exists(desktop) else home
|
91
|
+
self.IP.magics_manager.magics['line']['cd']("-q " + default_save_dir)
|
92
|
+
|
64
93
|
def add_bindings(self):
|
65
94
|
self.window.bind('<<Paste>>', self.edit_paste)
|
66
95
|
|
@@ -237,8 +266,10 @@ class SnapPyBrowser(Browser, ListedWindow):
|
|
237
266
|
self.dirichlet_viewer.help_button.configure(command=self.dirichlet_help)
|
238
267
|
|
239
268
|
def close(self, event=None):
|
269
|
+
terminal.window.focus_force()
|
240
270
|
self.unregister_window(self)
|
241
|
-
self.
|
271
|
+
self.withdraw()
|
272
|
+
self.after(100, self.destroy)
|
242
273
|
|
243
274
|
def apply_settings(self):
|
244
275
|
if self.inside_view:
|
@@ -359,8 +390,9 @@ class SnapPyPolyhedronViewer(PolyhedronViewer):
|
|
359
390
|
def help_window(self):
|
360
391
|
window = self.parent
|
361
392
|
if not hasattr(window, 'polyhedron_help'):
|
362
|
-
window.polyhedron_help = InfoWindow(
|
363
|
-
|
393
|
+
window.polyhedron_help = InfoWindow(
|
394
|
+
window, 'Polyhedron Viewer Help',
|
395
|
+
self.widget.help_text, 'polyhedron_help')
|
364
396
|
else:
|
365
397
|
window.polyhedron_help.deiconify()
|
366
398
|
window.polyhedron_help.lift()
|
@@ -394,7 +426,7 @@ class SnapPyInsideViewer(InsideViewer):
|
|
394
426
|
class SnapPySettings(Settings, ListedWindow):
|
395
427
|
def __init__(self, terminal):
|
396
428
|
self.terminal = terminal
|
397
|
-
Settings.__init__(self
|
429
|
+
Settings.__init__(self)
|
398
430
|
self.apply_settings()
|
399
431
|
|
400
432
|
def apply_settings(self):
|
@@ -402,16 +434,10 @@ class SnapPySettings(Settings, ListedWindow):
|
|
402
434
|
changed = self.changed()
|
403
435
|
IP = self.terminal.IP
|
404
436
|
self.terminal.quiet = True
|
405
|
-
if 'autocall'
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
IP.magics_manager.magics['line']['autocall'](0)
|
410
|
-
if 'automagic' in changed:
|
411
|
-
if self.setting_dict['automagic']:
|
412
|
-
IP.magics_manager.magics['line']['automagic']('on')
|
413
|
-
else:
|
414
|
-
IP.magics_manager.magics['line']['automagic']('off')
|
437
|
+
if self.setting_dict['autocall']:
|
438
|
+
IP.magics_manager.magics['line']['autocall']('2')
|
439
|
+
else:
|
440
|
+
IP.magics_manager.magics['line']['autocall']('0')
|
415
441
|
self.terminal.quiet = False
|
416
442
|
for window in self.window_list:
|
417
443
|
window.apply_settings()
|
@@ -477,18 +503,19 @@ def set_icon(window):
|
|
477
503
|
if sys.platform == 'win32':
|
478
504
|
try:
|
479
505
|
import snappy
|
480
|
-
ico = os.path.join(os.path.dirname(
|
506
|
+
ico = os.path.join(os.path.dirname(__file__), 'SnapPy.ico')
|
481
507
|
window.iconbitmap(default=ico)
|
482
508
|
except:
|
483
509
|
pass
|
484
510
|
if sys.platform == 'darwin':
|
485
511
|
if not sys.executable.endswith('SnapPy.app/Contents/MacOS/python'):
|
512
|
+
snappy_path = os.path.abspath(os.path.dirname(__file__))
|
513
|
+
icon_file = os.path.join(snappy_path, 'info_icon.gif')
|
486
514
|
image_file = os.path.join(snappy_path, 'SnapPy.png')
|
487
515
|
if os.path.exists(image_file):
|
488
516
|
dock_icon = Tk_.PhotoImage(file=image_file)
|
489
517
|
window.eval('wm iconphoto . -default %s' % dock_icon)
|
490
518
|
|
491
|
-
|
492
519
|
# from multiprocessing import Process
|
493
520
|
class SnapPyKernelServer():
|
494
521
|
"""
|
@@ -521,7 +548,9 @@ def main():
|
|
521
548
|
terminal = SnapPyTerm()
|
522
549
|
sys.stdout = terminal
|
523
550
|
set_icon(terminal.window)
|
524
|
-
|
551
|
+
terminal.window.call('bind', 'TNotebook', '<Right>', '')
|
552
|
+
terminal.window.call('bind', 'TNotebook', '<Left>', '')
|
553
|
+
SnapPy_ns = {x: getattr(snappy, x) for x in snappy.__all__}
|
525
554
|
# SnapPy_ns['kernel_server'] = kernel_server
|
526
555
|
SnapPy_ns['exit'] = SnapPy_ns['quit'] = SnapPyExit()
|
527
556
|
SnapPy_ns['pager'] = None
|
@@ -546,6 +575,27 @@ def main():
|
|
546
575
|
LP.UI_callback = HP.UI_callback = terminal.SnapPea_callback
|
547
576
|
# if not snappy.SnapPy._within_sage:
|
548
577
|
# snappy.pari.UI_callback = terminal.PARI_callback
|
578
|
+
|
579
|
+
"""
|
580
|
+
Experimental optional Tk themes on linux. You need to install
|
581
|
+
tksvg from source for Python 3.10 or newer like so::
|
582
|
+
|
583
|
+
sudo apt install cmake build-essential tcl-dev tk-dev python3-tk
|
584
|
+
python -m pip install scikit-build
|
585
|
+
git clone --recursive https://github.com/TkinterEP/python-tksvg.git
|
586
|
+
cd python-tksvg
|
587
|
+
python -m pip install .
|
588
|
+
|
589
|
+
then you can do::
|
590
|
+
|
591
|
+
python -m pip install python-awthemes
|
592
|
+
|
593
|
+
and uncomment the next four lines.
|
594
|
+
"""
|
595
|
+
# terminal.window.call('tk', 'scaling', 2.0) # Not sure this actually does anything
|
596
|
+
# import awthemes
|
597
|
+
# style = awthemes.AwthemesStyle(terminal.window)
|
598
|
+
# style.theme_use('awbreeze')
|
549
599
|
terminal.window.lift()
|
550
600
|
terminal.window.mainloop()
|
551
601
|
# kernel_server.stop()
|
snappy/browser.py
CHANGED
@@ -190,9 +190,8 @@ class Browser(Tk_.Toplevel):
|
|
190
190
|
self.protocol("WM_DELETE_WINDOW", self.close)
|
191
191
|
if sys.platform == 'darwin':
|
192
192
|
self.bind_all('<Command-Key-w>', self.close)
|
193
|
-
elif sys.platform == '
|
193
|
+
elif sys.platform == 'linux':
|
194
194
|
self.bind_all('<Alt-Key-F4>', self.close)
|
195
|
-
|
196
195
|
self.side_panel = side_panel = self.build_side_panel()
|
197
196
|
|
198
197
|
self.notebook = notebook = ttk.Notebook(self)
|
@@ -224,7 +223,7 @@ class Browser(Tk_.Toplevel):
|
|
224
223
|
notebook.add(invariants_tab, text='Invariants', padding=[0])
|
225
224
|
notebook.add(self.dirichlet_viewer, text='Dirichlet')
|
226
225
|
notebook.add(self.horoball_viewer, text='Cusp Nbhds')
|
227
|
-
notebook.add(self.build_inside_view(), text='Inside
|
226
|
+
notebook.add(self.build_inside_view(), text='Inside View')
|
228
227
|
notebook.add(symmetry_tab, text='Symmetry', padding=[0])
|
229
228
|
if link_tab:
|
230
229
|
notebook.add(link_tab.canvas, text='Link')
|
@@ -240,6 +239,9 @@ class Browser(Tk_.Toplevel):
|
|
240
239
|
self.modeline.pack(fill=Tk_.BOTH, expand=True, padx=30)
|
241
240
|
self.update_modeline()
|
242
241
|
self.update_idletasks()
|
242
|
+
self.wm_geometry(self.wm_geometry())
|
243
|
+
# Make sure the invariants get computed, even on Windows.
|
244
|
+
self.after_idle(self.update_current_tab)
|
243
245
|
|
244
246
|
def __repr__(self):
|
245
247
|
return 'Browser window for %s\n' % self.manifold
|
@@ -345,7 +347,7 @@ class Browser(Tk_.Toplevel):
|
|
345
347
|
self.aka_viewer = aka_viewer = ttk.Treeview(
|
346
348
|
self.aka,
|
347
349
|
selectmode='none',
|
348
|
-
height=4,
|
350
|
+
height=2 if sys.platform == 'linux' else 4,
|
349
351
|
columns=['manifold', 'as_link'],
|
350
352
|
show='headings')
|
351
353
|
aka_viewer.heading('manifold', text='Manifold')
|
@@ -505,6 +507,8 @@ class Browser(Tk_.Toplevel):
|
|
505
507
|
elif tab_name == 'Link':
|
506
508
|
self.update_menus(self.menubar)
|
507
509
|
self.link_tab.draw()
|
510
|
+
elif tab_name == 'Inside View':
|
511
|
+
self.inside_view.widget.focus_set()
|
508
512
|
elif tab_name == 'Symmetry':
|
509
513
|
self.update_menus(self.menubar)
|
510
514
|
self.update_symmetry()
|
@@ -538,8 +542,8 @@ class Browser(Tk_.Toplevel):
|
|
538
542
|
except ValueError:
|
539
543
|
self.homology.set('')
|
540
544
|
self.compute_pi_one()
|
541
|
-
self.update_length_spectrum()
|
542
545
|
self.update_dirichlet()
|
546
|
+
self.update_length_spectrum()
|
543
547
|
self.update_aka()
|
544
548
|
self.recompute_invariants = False
|
545
549
|
|
@@ -752,12 +756,13 @@ class Browser(Tk_.Toplevel):
|
|
752
756
|
def horoball_help(self):
|
753
757
|
self.horoball_viewer.widget.help()
|
754
758
|
|
755
|
-
def test(self):
|
759
|
+
def test(self, use_modernopengl=True):
|
756
760
|
self.update_idletasks()
|
757
761
|
print('Testing browser')
|
758
762
|
self.after(1000, self.notebook.select, self.dirichlet_viewer)
|
759
763
|
self.after(2500, self.notebook.select, self.horoball_viewer)
|
760
|
-
|
764
|
+
if use_modernopengl:
|
765
|
+
self.after(4000, self.notebook.select, self.inside_view)
|
761
766
|
if self.link_tab:
|
762
767
|
self.after(5500, self.notebook.select, self.link_tab.canvas)
|
763
768
|
self.after(7000, self.close)
|
@@ -781,7 +786,7 @@ class Driller(SimpleDialog):
|
|
781
786
|
top_frame = ttk.Frame(self.root)
|
782
787
|
top_frame.grid_columnconfigure(0, weight=1)
|
783
788
|
top_frame.grid_rowconfigure(2, weight=1)
|
784
|
-
msg_font =
|
789
|
+
msg_font = dict(family=style.font_info['family'],
|
785
790
|
weight='bold',
|
786
791
|
size=int(style.font_info['size']*1.2))
|
787
792
|
msg = ttk.Label(top_frame, font=msg_font,
|
@@ -877,16 +882,15 @@ class Coverer(SimpleDialog):
|
|
877
882
|
top_frame.grid_rowconfigure(2, weight=1)
|
878
883
|
top_frame.grid_columnconfigure(0, weight=1)
|
879
884
|
top_frame.grid_columnconfigure(1, weight=1)
|
880
|
-
msg_font =
|
885
|
+
msg_font = dict(family=style.font_info['family'],
|
881
886
|
weight='bold',
|
882
887
|
size=int(style.font_info['size']*1.2))
|
883
888
|
msg = ttk.Label(top_frame, font=msg_font,
|
884
889
|
text='Choose covering spaces to browse:')
|
885
890
|
msg.grid(row=0, column=0, columnspan=3, pady=10)
|
886
891
|
degree_frame = ttk.Frame(top_frame)
|
887
|
-
degree_frame.grid_columnconfigure(
|
892
|
+
degree_frame.grid_columnconfigure(2, weight=1)
|
888
893
|
self.degree_var = degree_var = Tk_.StringVar()
|
889
|
-
degree_var.trace('w', self.show_covers)
|
890
894
|
ttk.Label(degree_frame, text='Degree: ').grid(
|
891
895
|
row=0, column=0, sticky=Tk_.E)
|
892
896
|
self.degree_option = degree_option = ttk.OptionMenu(
|
@@ -897,15 +901,11 @@ class Coverer(SimpleDialog):
|
|
897
901
|
)
|
898
902
|
degree_option.grid(row=0, column=1)
|
899
903
|
self.cyclic_var = cyclic_var = Tk_.BooleanVar()
|
900
|
-
cyclic_var.trace('w', self.show_covers)
|
901
904
|
cyclic_or_not = ttk.Checkbutton(degree_frame,
|
902
905
|
variable=cyclic_var,
|
903
906
|
text='cyclic covers only',
|
904
907
|
)
|
905
908
|
cyclic_or_not.grid(row=0, column=2, padx=6, sticky=Tk_.W)
|
906
|
-
self.action = action = ttk.Button(degree_frame, text='Recompute',
|
907
|
-
command=self.show_covers)
|
908
|
-
action.grid(row=0, column=3, padx=8, sticky=Tk_.W)
|
909
909
|
degree_frame.grid(row=1, column=0, pady=2, padx=6, sticky=Tk_.EW)
|
910
910
|
self.covers = covers = ttk.Treeview(
|
911
911
|
top_frame,
|
@@ -941,17 +941,18 @@ class Coverer(SimpleDialog):
|
|
941
941
|
degree_var.set('2')
|
942
942
|
cyclic_var.set(True)
|
943
943
|
self.show_covers()
|
944
|
+
degree_var.trace_add('write', self.show_covers)
|
945
|
+
cyclic_var.trace_add('write', self.show_covers)
|
946
|
+
|
944
947
|
|
945
948
|
def clear_list(self, *args):
|
946
949
|
self.covers.delete(*self.covers.get_children())
|
947
950
|
self.browse.config(default='normal')
|
948
|
-
self.action.config(default='active')
|
949
951
|
self.state = 'not ready'
|
950
952
|
|
951
953
|
def show_covers(self, *args):
|
952
954
|
self.state = 'ready'
|
953
955
|
self.browse.config(default='active')
|
954
|
-
self.action.config(default='normal')
|
955
956
|
self.covers.delete(*self.covers.get_children())
|
956
957
|
degree = int(self.degree_var.get())
|
957
958
|
if self.cyclic_var.get():
|
snappy/canonical.py
ADDED
@@ -0,0 +1,249 @@
|
|
1
|
+
from . import verify
|
2
|
+
from . import Triangulation, TriangulationHP, Manifold, ManifoldHP
|
3
|
+
|
4
|
+
from typing import Optional, Union, Sequence, Tuple
|
5
|
+
|
6
|
+
__all__ = ['canonical_retriangulation', 'canonical_retriangulation_hp']
|
7
|
+
|
8
|
+
def _canonical_retriangulation(
|
9
|
+
manifold : Union[Manifold, ManifoldHP],
|
10
|
+
verified : bool,
|
11
|
+
interval_bits_precs : Sequence[int],
|
12
|
+
exact_bits_prec_and_degrees : Sequence[Tuple[int, int]],
|
13
|
+
verbose : bool) -> Union[Triangulation, TriangulationHP,
|
14
|
+
Manifold, ManifoldHP]:
|
15
|
+
"""
|
16
|
+
Returns a triangulation canonically associated to the hyperbolic manifold.
|
17
|
+
That is, the triangulation is (up to combinatorial isomorphism relabeling
|
18
|
+
the tetrahedra and vertices) completely determined by the isometry type of
|
19
|
+
the hyperbolic manifold.
|
20
|
+
|
21
|
+
Manifolds with incomplete cusps are rejected (unlike in the case of
|
22
|
+
:meth:`isometry_signature <snappy.Manifold.isometry_signature>`).
|
23
|
+
|
24
|
+
We now describe the canonical retriangulation. If all cells of
|
25
|
+
the canonical cell decomposition (defined by `Epstein and Penner '88
|
26
|
+
<https://projecteuclid.org/euclid.jdg/1214441650>`_) are tetrahedral,
|
27
|
+
:meth:`canonical_retriangulation <Manifold.canonical_retriangulation>`
|
28
|
+
simply returns that ideal triangulation as a
|
29
|
+
:class:`Manifold <snappy.Manifold>`. Here is an example::
|
30
|
+
|
31
|
+
>>> M = Manifold("m015")
|
32
|
+
>>> K = M.canonical_retriangulation()
|
33
|
+
>>> K.has_finite_vertices()
|
34
|
+
False
|
35
|
+
>>> K.solution_type()
|
36
|
+
'all tetrahedra positively oriented'
|
37
|
+
|
38
|
+
If there are non-tetrahedral cells,
|
39
|
+
:meth:`canonical_retriangulation <Manifold.canonical_retriangulation>`
|
40
|
+
subdivides the canonical cell decomposition. It introduces a finite vertex
|
41
|
+
for each canonical cell resulting in a
|
42
|
+
:class:`Triangulation <snappy.Triangulation>`. Here is an example where the
|
43
|
+
canonical cell is a cube::
|
44
|
+
|
45
|
+
>>> M = Manifold("m412")
|
46
|
+
>>> K = M.canonical_retriangulation()
|
47
|
+
>>> K.has_finite_vertices()
|
48
|
+
True
|
49
|
+
|
50
|
+
The canonical retriangulation can be used to find the symmetries of a
|
51
|
+
single manifold. It also can compute the isometries between two
|
52
|
+
manifolds. We do this using
|
53
|
+
:meth:`isomorphisms_to <snappy.Triangulation.isomorphisms_to>`::
|
54
|
+
|
55
|
+
>>> M = Manifold("5_2").canonical_retriangulation()
|
56
|
+
>>> N = Manifold("m015").canonical_retriangulation()
|
57
|
+
>>> M.isomorphisms_to(M) #doctest: +ELLIPSIS
|
58
|
+
[0 -> 0
|
59
|
+
[1 0]
|
60
|
+
[0 1]
|
61
|
+
...
|
62
|
+
>>> M.isomorphisms_to(N) #doctest: +ELLIPSIS
|
63
|
+
[0 -> 0
|
64
|
+
[-1 2]
|
65
|
+
[ 0 -1]
|
66
|
+
...
|
67
|
+
|
68
|
+
The canonical retriangulation is also the basis for the
|
69
|
+
:meth:`isometry_signature <snappy.Manifold.isometry_signature>`.
|
70
|
+
|
71
|
+
**Subdivision**
|
72
|
+
|
73
|
+
If the canonical cell decomposition has a non-tetrahedral cell, the method
|
74
|
+
subdivides. You can think of the subdivision in either of the following
|
75
|
+
(equivalent) ways:
|
76
|
+
|
77
|
+
- A coarsening of the barycentric subdivision with only a quarter of the
|
78
|
+
number of tetrahedra. That is, take the barycentric subdivision and
|
79
|
+
merge the four tetrahedra adjacent to a barycentric edge connecting
|
80
|
+
an edge midpoint to a face midpoint.
|
81
|
+
- Taking the double suspension of each face (which is an ideal n-gon)
|
82
|
+
about the centers of the two neighboring 3-cells. Then split each
|
83
|
+
such topological "lens" into n tetrahedra along its central axis.
|
84
|
+
|
85
|
+
**Verified computations**
|
86
|
+
|
87
|
+
While the canonical retriangulation is combinatorial, some intermediate
|
88
|
+
computations are numerical. Thus, if :attr:`verified = False`,
|
89
|
+
floating-point issues can arise.
|
90
|
+
(Arguably this gave rise to a mistake in the
|
91
|
+
non-orientable census. ``x101`` and ``x103`` were later identified as
|
92
|
+
the same by `Burton '14 <http://arxiv.org/abs/1311.7615>`_.)
|
93
|
+
|
94
|
+
The method can be made :ref:`verified <verify-primer>` by passing
|
95
|
+
:attr:`verified = True`::
|
96
|
+
|
97
|
+
sage: M = Manifold("v2986")
|
98
|
+
sage: K = M.canonical_retriangulation(verified = True)
|
99
|
+
sage: K.has_finite_vertices() # Cell decomposition verified to be tetrahedral
|
100
|
+
False
|
101
|
+
sage: K.triangulation_isosig(decorated=False) # Verified isometry signature.
|
102
|
+
'jvLALQQdeefgihihiokcmmwwswg'
|
103
|
+
sage: len(K.isomorphisms_to(K)) # Verified to have no (non-trivial) symmetries.
|
104
|
+
1
|
105
|
+
|
106
|
+
Interval arithmetic can only be used to verify the canonical cell decomposition
|
107
|
+
if all cells are tetrahedral. For non-tetrahedral cells, the method
|
108
|
+
automatically switches to
|
109
|
+
exact methods to verify the canonical cell decomposition. That is, it uses
|
110
|
+
snap-like methods
|
111
|
+
(`LLL-algorithm <http://en.wikipedia.org/wiki/Lenstra%E2%80%93Lenstra%E2%80%93Lov%C3%A1sz_lattice_basis_reduction_algorithm>`_)
|
112
|
+
to guess a representation of the
|
113
|
+
shapes in the shape field. It then uses exact arithmetic to verify the
|
114
|
+
shapes form a valid geometric structure and compute the necessary tilts
|
115
|
+
to verify the canonical cell decomposition. Note that this can take a
|
116
|
+
long time!
|
117
|
+
|
118
|
+
Here is an example where exact methods are used::
|
119
|
+
|
120
|
+
sage: M = Manifold("m412")
|
121
|
+
sage: K = M.canonical_retriangulation(verified = True)
|
122
|
+
sage: K.has_finite_vertices() # Has non-tetrahedral cell
|
123
|
+
True
|
124
|
+
|
125
|
+
If the canonical retriangulation cannot be verified, an exception will be
|
126
|
+
raised. (Note that this is new (and safer) in Version 3.2. Prior to that
|
127
|
+
version, :meth:`Manifold.canonical_retriangulation` could return ``None``
|
128
|
+
instead.)
|
129
|
+
|
130
|
+
Here is an example where we skip the (potentially lengthy) exact methods
|
131
|
+
needed to verify a non-tetrahedral cell. The method fails (early
|
132
|
+
and with an exception) since the cells are actually tetrahedral::
|
133
|
+
|
134
|
+
sage: M = Manifold("m412")
|
135
|
+
sage: K = M.canonical_retriangulation(verified = True, exact_bits_prec_and_degrees = []) # doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL
|
136
|
+
Traceback (most recent call last):
|
137
|
+
...
|
138
|
+
snappy.verify.exceptions.TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: ... < 0
|
139
|
+
|
140
|
+
:param verified:
|
141
|
+
Use :ref:`verified computation <verify-primer>`.
|
142
|
+
:param interval_bits_precs:
|
143
|
+
Only relevant if :attr:`verified = True`.
|
144
|
+
A list of (increasing) precisions used to try to
|
145
|
+
certify the canonical cell decomposition using intervals. Each
|
146
|
+
precision is tried until we succeed. If none succeeded, we move on
|
147
|
+
to exact methods.
|
148
|
+
:param exact_bits_prec_and_degrees:
|
149
|
+
Only relevant if :attr:`verified = True`.
|
150
|
+
A list of pairs (precision, max degree) used when the
|
151
|
+
LLL-algorithm is trying to find the defining
|
152
|
+
polynomial of the shape field with
|
153
|
+
``ListOfApproximateAlgebraicNumbers.find_field``.
|
154
|
+
Each pair is tried until we succeed.
|
155
|
+
:param verbose:
|
156
|
+
Print information about the methods tried to compute and verify the
|
157
|
+
canonical retriangulation.
|
158
|
+
:return:
|
159
|
+
If the canonical cell decomposition exists entirely of
|
160
|
+
(hyperbolic ideal) tetrahedra, a :class:`Manifold` with those
|
161
|
+
tetrahedra.
|
162
|
+
Otherwise, a :class:`Triangulation` that is a subdivision of the
|
163
|
+
canonical cell decomposition.
|
164
|
+
"""
|
165
|
+
|
166
|
+
# More information on the canonical retriangulation can be found in the
|
167
|
+
# SnapPea kernel ``canonize_part_2.c`` and in Section 3.1 of
|
168
|
+
# `Fominykh, Garoufalidis, Goerner, Tarkaev, Vesnin <http://arxiv.org/abs/1502.00383>`_.
|
169
|
+
|
170
|
+
if not all(manifold.cusp_info('complete?')):
|
171
|
+
# It is unclear what to do when there are filling coefficients.
|
172
|
+
# The SnapPea kernel ignores them and uses the complete structure
|
173
|
+
# to compute the canonical retriangulation.
|
174
|
+
#
|
175
|
+
# That makes sense to, e.g., compute a canonical representation
|
176
|
+
# of a surgery diagram.
|
177
|
+
#
|
178
|
+
# In other situations, it makes perfectly sense to fill the cusps
|
179
|
+
# instead. That is, e.g., what the isometry_signature does.
|
180
|
+
#
|
181
|
+
# Since it is ambiguous, I decided to simply reject it here.
|
182
|
+
#
|
183
|
+
# It is easy enough for a user to either call fill_triangulation
|
184
|
+
# or to save the coefficients and unfill all cusps.
|
185
|
+
#
|
186
|
+
raise ValueError(
|
187
|
+
'Canonical retriangulation needs all cusps to be complete.')
|
188
|
+
|
189
|
+
if verified:
|
190
|
+
# verified_canonical_retriangulation has code to check
|
191
|
+
# for incomplete cusps and fill them that never gets
|
192
|
+
# executed because of the above "if"
|
193
|
+
return verify.verified_canonical_retriangulation(
|
194
|
+
manifold,
|
195
|
+
interval_bits_precs=interval_bits_precs,
|
196
|
+
exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
|
197
|
+
verbose=verbose)
|
198
|
+
else:
|
199
|
+
# Note that the SnapPea kernel actually ignores Dehn-fillings
|
200
|
+
# when computing the canonical retriangulation.
|
201
|
+
if not all(manifold.cusp_info('complete?')):
|
202
|
+
# Never executed because of above "if".
|
203
|
+
manifold = manifold.filled_triangulation()
|
204
|
+
if not all(manifold.cusp_info('complete?')):
|
205
|
+
raise ValueError(
|
206
|
+
'Could not compute filled triangulation. '
|
207
|
+
'Are the filling coefficients co-prime integers?')
|
208
|
+
|
209
|
+
K = manifold._canonical_retriangulation()
|
210
|
+
if K.has_finite_vertices():
|
211
|
+
return K
|
212
|
+
else:
|
213
|
+
if isinstance(manifold, ManifoldHP):
|
214
|
+
return ManifoldHP(K)
|
215
|
+
else:
|
216
|
+
return Manifold(K)
|
217
|
+
|
218
|
+
# Wraps _canonical_retriangulation to have the correct return type
|
219
|
+
def canonical_retriangulation(
|
220
|
+
manifold : Manifold,
|
221
|
+
verified : bool = False,
|
222
|
+
interval_bits_precs : Sequence[int] = verify.default_interval_bits_precs,
|
223
|
+
exact_bits_prec_and_degrees : Sequence[Tuple[int, int]] = verify.default_exact_bits_prec_and_degrees,
|
224
|
+
verbose : bool = False) -> Union[Triangulation, Manifold]:
|
225
|
+
return _canonical_retriangulation(
|
226
|
+
manifold,
|
227
|
+
verified = verified,
|
228
|
+
interval_bits_precs = interval_bits_precs,
|
229
|
+
exact_bits_prec_and_degrees = exact_bits_prec_and_degrees,
|
230
|
+
verbose = verbose)
|
231
|
+
canonical_retriangulation.__doc__ = _canonical_retriangulation.__doc__
|
232
|
+
|
233
|
+
# Wraps _canonical_retriangulation to have the correct return type
|
234
|
+
def canonical_retriangulation_hp(
|
235
|
+
manifold : ManifoldHP,
|
236
|
+
verified : bool = False,
|
237
|
+
interval_bits_precs : Sequence[int] = verify.default_interval_bits_precs,
|
238
|
+
exact_bits_prec_and_degrees : Sequence[Tuple[int, int]] = verify.default_exact_bits_prec_and_degrees,
|
239
|
+
verbose : bool = False) -> Union[TriangulationHP, ManifoldHP]:
|
240
|
+
return _canonical_retriangulation(
|
241
|
+
manifold,
|
242
|
+
verified = verified,
|
243
|
+
interval_bits_precs = interval_bits_precs,
|
244
|
+
exact_bits_prec_and_degrees = exact_bits_prec_and_degrees,
|
245
|
+
verbose = verbose)
|
246
|
+
canonical_retriangulation_hp.__doc__ = _canonical_retriangulation.__doc__
|
247
|
+
|
248
|
+
|
249
|
+
|
@@ -1,25 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
class NonorientableManifoldError(RuntimeError):
|
8
|
-
"""
|
9
|
-
Exception raised when trying to compute cusp shapes for a non-orientable
|
10
|
-
manifold.
|
11
|
-
"""
|
12
|
-
def __init__(self, manifold):
|
13
|
-
self.manifold = manifold
|
14
|
-
|
15
|
-
def __str__(self):
|
16
|
-
return (('Cannot compute cusp shapes for non-orientable '
|
17
|
-
'manifold %s') % self.manifold)
|
1
|
+
"""
|
2
|
+
Computing data about cusps such as cusp matrix, shape, translations
|
3
|
+
and exceptional slopes.
|
4
|
+
"""
|
18
5
|
|
6
|
+
from ..geometric_structure.cusp_neighborhood.complex_cusp_cross_section import ComplexCuspCrossSection
|
7
|
+
from ..verify.shapes import compute_hyperbolic_shapes
|
8
|
+
from ..exceptions import NonorientableManifoldError
|
19
9
|
|
20
10
|
def compute_cusp_shapes(manifold, verified, bits_prec=None):
|
21
11
|
"""
|
22
|
-
Compute
|
12
|
+
Compute cusp shapes. Following the SnapPea kernel convention,
|
23
13
|
it returns the conjugate of the quotient of the translations
|
24
14
|
corresponding to the longitude and meridian for each cusp.
|
25
15
|
|