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/tiling/test.py
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
from snappy import testing
|
2
|
+
import snappy
|
3
|
+
|
4
|
+
from snappy import tiling
|
5
|
+
|
6
|
+
modules = [
|
7
|
+
tiling.floor,
|
8
|
+
tiling.real_hash_dict,
|
9
|
+
tiling.canonical_key_dict,
|
10
|
+
tiling.dict_based_set
|
11
|
+
]
|
12
|
+
|
13
|
+
def run_doctests(verbose=False, print_info=True):
|
14
|
+
globs = {'Manifold': snappy.Manifold}
|
15
|
+
return testing.doctest_modules(modules,
|
16
|
+
verbose=verbose,
|
17
|
+
print_info=print_info,
|
18
|
+
extraglobs=globs)
|
19
|
+
|
20
|
+
run_doctests.__name__ = tiling.__name__
|
21
|
+
|
22
|
+
if __name__ == '__main__':
|
23
|
+
testing.run_doctests_as_main(run_doctests)
|
snappy/tiling/tile.py
ADDED
@@ -0,0 +1,215 @@
|
|
1
|
+
from .lifted_tetrahedron import LiftedTetrahedron
|
2
|
+
from .lifted_tetrahedron_set import (LiftedTetrahedronSet,
|
3
|
+
get_lifted_tetrahedron_set)
|
4
|
+
|
5
|
+
from ..hyperboloid.distances import lower_bound_distance_to_r13_triangle
|
6
|
+
from ..hyperboloid.triangle import R13IdealTriangle
|
7
|
+
from ..hyperboloid import o13_inverse
|
8
|
+
from ..snap.t3mlite import Mcomplex, Tetrahedron, simplex
|
9
|
+
from ..math_basics import is_RealIntervalFieldElement, lower # type: ignore
|
10
|
+
from ..sage_helper import _within_sage # type: ignore
|
11
|
+
|
12
|
+
if _within_sage:
|
13
|
+
from ..sage_helper import Infinity
|
14
|
+
|
15
|
+
import heapq
|
16
|
+
|
17
|
+
from typing import Sequence, Union
|
18
|
+
|
19
|
+
class Tile:
|
20
|
+
def __init__(self,
|
21
|
+
lower_bound_distance,
|
22
|
+
inverse_lifted_geometric_object,
|
23
|
+
lifted_tetrahedron : LiftedTetrahedron,
|
24
|
+
object_index = None):
|
25
|
+
self.lower_bound_distance = lower_bound_distance
|
26
|
+
self.inverse_lifted_geometric_object = inverse_lifted_geometric_object
|
27
|
+
self.lifted_tetrahedron = lifted_tetrahedron
|
28
|
+
# Used in maximal_cusp_area_matrix
|
29
|
+
self.object_index = object_index
|
30
|
+
|
31
|
+
def compute_tiles(*, # Everything is a keyword argument
|
32
|
+
geometric_object,
|
33
|
+
visited_lifted_tetrahedra : LiftedTetrahedronSet,
|
34
|
+
initial_lifted_tetrahedra : Sequence[LiftedTetrahedron],
|
35
|
+
replace_lifted_tetrahedron_function = None,
|
36
|
+
verified : bool
|
37
|
+
) -> Sequence[Tile]:
|
38
|
+
|
39
|
+
"""
|
40
|
+
Returns a stream of tiles where each tile is a tetrahedron lifted
|
41
|
+
to H^3 or a quotient of H^3.
|
42
|
+
|
43
|
+
That is, imagine a growing neighborhood about the given
|
44
|
+
geometric_object (such as an R13Point, R13Line or R13Horoball) in
|
45
|
+
H^3 or a quotient of H^3. The stream returns the tiles in the order
|
46
|
+
as they are intersected by the growing neighborhood.
|
47
|
+
|
48
|
+
Note that this is not precisely true since we only compute a lower
|
49
|
+
bound for the distance of the geometric object to the tetrahedra.
|
50
|
+
|
51
|
+
What is true is that tile.lower_bound_distance is (not strictly)
|
52
|
+
increasing in the stream and that if we look at all tiles up to
|
53
|
+
a certain point, then those tiles cover the neighborhood of radius
|
54
|
+
tile.lower_bound_distance about the geometric_object.
|
55
|
+
|
56
|
+
base_point is used to determine whether two lifted tetrahedra
|
57
|
+
are the same in H^3 or a quotient space of H^3.
|
58
|
+
|
59
|
+
visited_lifted_tetrahedra: data structure (passed in as empty) which
|
60
|
+
will be used here to record which lifted tetrahedra have already been
|
61
|
+
visited and been added to the result while tiling the quotient space.
|
62
|
+
|
63
|
+
An optional replace_lifted_tetrahedron_function callback can be
|
64
|
+
specified. This callback is invoked on any new lifted tetrahedron
|
65
|
+
and can return None or a list of lifted tetrahedra to replace the given
|
66
|
+
lifted tetrahedra. This is used when developing a geodesic (tube) to
|
67
|
+
skip over the pieces of a geodesic completely contained in a tube
|
68
|
+
about a core curve.
|
69
|
+
"""
|
70
|
+
|
71
|
+
RF = visited_lifted_tetrahedra._base_point[0].parent()
|
72
|
+
|
73
|
+
if verified:
|
74
|
+
minus_infinity = RF(-Infinity)
|
75
|
+
else:
|
76
|
+
minus_infinity = RF(-1e20)
|
77
|
+
|
78
|
+
# The pending pieces as priority queue - that is, a python list
|
79
|
+
# but we use heapq to access it.
|
80
|
+
pending_lifted_tetrahedra : Sequence[_PendingLiftedTetrahedron] = []
|
81
|
+
|
82
|
+
# Start tiling the neighborhood about the geometric object using
|
83
|
+
# the given lifted tetrahedra.
|
84
|
+
#
|
85
|
+
# It is assumed that at least one of the given lifted tetraheedra
|
86
|
+
# intersects the given geometric object for the tiling to be correct.
|
87
|
+
#
|
88
|
+
# If this assumption is false, we could fail in the following way:
|
89
|
+
# assume that the given lifted tetrahedra are far away from the given
|
90
|
+
# object. Then the algorithm below thinks we are done, before we
|
91
|
+
# even started properly tiling - and we obviously get an incomplete
|
92
|
+
# result.
|
93
|
+
#
|
94
|
+
for lifted_tetrahedron in initial_lifted_tetrahedra:
|
95
|
+
heapq.heappush(
|
96
|
+
pending_lifted_tetrahedra,
|
97
|
+
_PendingLiftedTetrahedron(
|
98
|
+
lifted_tetrahedron, minus_infinity))
|
99
|
+
|
100
|
+
while True:
|
101
|
+
pending_lifted_tetrahedron : _PendingLiftedTetrahedron = (
|
102
|
+
heapq.heappop(pending_lifted_tetrahedra))
|
103
|
+
|
104
|
+
if not visited_lifted_tetrahedra.add(
|
105
|
+
pending_lifted_tetrahedron.lifted_tetrahedron):
|
106
|
+
continue
|
107
|
+
|
108
|
+
tet = pending_lifted_tetrahedron.lifted_tetrahedron.tet
|
109
|
+
m = pending_lifted_tetrahedron.lifted_tetrahedron.o13_matrix
|
110
|
+
|
111
|
+
# Imagine the fixed lift of the given geometric object and how it
|
112
|
+
# relates to the lifted tetrahedron which is the image of
|
113
|
+
# the tetrahedron in the fundamental domain under the matrix.
|
114
|
+
#
|
115
|
+
# Applying the inverse matrix moves the tetrahedron back into
|
116
|
+
# the fundamental domain and thus we obtain the (inverse) lift of
|
117
|
+
# the geometric object intresecting the fundamental domain.
|
118
|
+
#
|
119
|
+
inverse_lifted_geometric_object = (
|
120
|
+
geometric_object.transformed(o13_inverse(m)))
|
121
|
+
|
122
|
+
if replace_lifted_tetrahedron_function:
|
123
|
+
new_lifted_tetrahedra = replace_lifted_tetrahedron_function(
|
124
|
+
pending_lifted_tetrahedron.lifted_tetrahedron,
|
125
|
+
geometric_object,
|
126
|
+
inverse_lifted_geometric_object,
|
127
|
+
verified)
|
128
|
+
if new_lifted_tetrahedra is not None:
|
129
|
+
for lifted_tetrahedron in new_lifted_tetrahedra:
|
130
|
+
heapq.heappush(
|
131
|
+
pending_lifted_tetrahedra,
|
132
|
+
_PendingLiftedTetrahedron(
|
133
|
+
lifted_tetrahedron, minus_infinity))
|
134
|
+
continue
|
135
|
+
|
136
|
+
# Emit Tile
|
137
|
+
yield Tile(pending_lifted_tetrahedron.lower_bound_distance,
|
138
|
+
inverse_lifted_geometric_object,
|
139
|
+
pending_lifted_tetrahedron.lifted_tetrahedron)
|
140
|
+
|
141
|
+
# For all faces ...
|
142
|
+
for f, new_tet in tet.Neighbor.items():
|
143
|
+
# ... except the one that was used to reach this lifted tetrahedron
|
144
|
+
if f == pending_lifted_tetrahedron.entry_cell:
|
145
|
+
continue
|
146
|
+
|
147
|
+
entry_face = tet.Gluing[f].image(f)
|
148
|
+
heapq.heappush(
|
149
|
+
pending_lifted_tetrahedra,
|
150
|
+
_PendingLiftedTetrahedron(
|
151
|
+
LiftedTetrahedron(
|
152
|
+
new_tet,
|
153
|
+
# Inverse of tet.O13_matrices[f]
|
154
|
+
m * new_tet.O13_matrices[entry_face]),
|
155
|
+
# Distance of this face to inverse lifted
|
156
|
+
# geometric object
|
157
|
+
# (equal to distance of face entry_face of
|
158
|
+
# new_tet)
|
159
|
+
lower_bound_distance_to_r13_triangle(
|
160
|
+
inverse_lifted_geometric_object,
|
161
|
+
tet.R13_triangles[f],
|
162
|
+
verified),
|
163
|
+
entry_cell=entry_face))
|
164
|
+
|
165
|
+
class _PendingLiftedTetrahedron:
|
166
|
+
"""
|
167
|
+
A lifted tetrahedron that still needs to be processed by by compute_tiles
|
168
|
+
together with the face through which this lifted tetrahedron was
|
169
|
+
reached.
|
170
|
+
|
171
|
+
The lifted tetrahedron lives in a (potentially trivial) quotient space of
|
172
|
+
the hyperboloid model.
|
173
|
+
|
174
|
+
The algorithm in compute_tile might add the same lifted tetrahedron
|
175
|
+
multiple times to the queue of pending pieces as there are four
|
176
|
+
neighboring lifted tetrahedra from which this lifted tetrahedron can
|
177
|
+
be reached.
|
178
|
+
|
179
|
+
Let L be the geometric object (in the quotient space) about which we
|
180
|
+
develop a neighborhood. lower_bound is a lower bound on the distance between
|
181
|
+
L and the face through which this lifted tetrahedron was reached.
|
182
|
+
Note that lower_bound might be larger than the distance between L and
|
183
|
+
this lifted tetrahedron (which is the minimum of all distances between
|
184
|
+
L and any of the faces of this lifted tetrahedron).
|
185
|
+
|
186
|
+
The < operator is overloaded so that the piece with the lowest
|
187
|
+
lower_bound will be picked up next by a priority queue.
|
188
|
+
|
189
|
+
If pieces are processed in this order, then the lower_bound of the
|
190
|
+
next piece will actually be a lower bound for the distance between L
|
191
|
+
and the lifted tetrahedron (with other pending pieces for the same
|
192
|
+
lifted tetrahedron having higher values for lower_bound and thus
|
193
|
+
being further down the queue).
|
194
|
+
"""
|
195
|
+
|
196
|
+
def __init__(self,
|
197
|
+
lifted_tetrahedron : LiftedTetrahedron,
|
198
|
+
lower_bound_distance,
|
199
|
+
entry_cell : int = simplex.T):
|
200
|
+
self.lifted_tetrahedron = lifted_tetrahedron
|
201
|
+
self.lower_bound_distance = lower_bound_distance
|
202
|
+
|
203
|
+
# Either element of simplex.ZeroSubsimplices (if piece was reached
|
204
|
+
# through another piece) or simplex.T (if this pending piece was
|
205
|
+
# used to start tiling).
|
206
|
+
self.entry_cell = entry_cell
|
207
|
+
|
208
|
+
# For convenience, lower_bound is an interval but it is only
|
209
|
+
# the left value of the interval that is relevant and that we
|
210
|
+
# should use: A < B can be False for two intervals even
|
211
|
+
# when A's left value is lower than B's left value.
|
212
|
+
self._key = lower(lower_bound_distance)
|
213
|
+
|
214
|
+
def __lt__(self, other):
|
215
|
+
return self._key < other._key
|
@@ -0,0 +1,33 @@
|
|
1
|
+
from ..snap.t3mlite import Mcomplex, Tetrahedron, simplex
|
2
|
+
|
3
|
+
from ..hyperboloid.line import R13Line
|
4
|
+
from ..hyperboloid.triangle import R13IdealTriangle, triangle_bounding_plane
|
5
|
+
|
6
|
+
__all__ = ['add_triangles_to_tetrahedra']
|
7
|
+
|
8
|
+
def add_triangles_to_tetrahedra(mcomplex : Mcomplex) -> None:
|
9
|
+
for tet in mcomplex.Tetrahedra:
|
10
|
+
_add_triangles_to_tetrahedron(tet)
|
11
|
+
|
12
|
+
def _add_triangles_to_tetrahedron(tet : Tetrahedron) -> None:
|
13
|
+
edges = {
|
14
|
+
e: R13Line([tet.R13_vertices[simplex.Head[e]],
|
15
|
+
tet.R13_vertices[simplex.Tail[e]]])
|
16
|
+
for e in simplex.OneSubsimplices }
|
17
|
+
|
18
|
+
tet.R13_triangles = {
|
19
|
+
f : R13IdealTriangle(
|
20
|
+
tet.R13_planes[f],
|
21
|
+
[ _triangle_bounding_plane_for_face_edge(tet, f, f & other_f)
|
22
|
+
for other_f in simplex.TwoSubsimplices
|
23
|
+
if f != other_f ],
|
24
|
+
[ edges[f & other_f]
|
25
|
+
for other_f in simplex.TwoSubsimplices
|
26
|
+
if f != other_f ])
|
27
|
+
for f in simplex.TwoSubsimplices }
|
28
|
+
|
29
|
+
def _triangle_bounding_plane_for_face_edge(tet, face, edge):
|
30
|
+
return triangle_bounding_plane(
|
31
|
+
tet.R13_vertices[face - edge],
|
32
|
+
tet.R13_vertices[simplex.Head[edge]],
|
33
|
+
tet.R13_vertices[simplex.Tail[edge]])
|
snappy/tkterminal.py
CHANGED
@@ -3,16 +3,13 @@ import os
|
|
3
3
|
import sys
|
4
4
|
import re
|
5
5
|
from urllib.request import pathname2url
|
6
|
-
|
7
|
-
from
|
8
|
-
from
|
9
|
-
|
10
|
-
import snappy
|
11
|
-
from .gui import *
|
6
|
+
import tkinter as Tk_
|
7
|
+
from tkinter import ttk
|
8
|
+
from tkinter.font import Font
|
9
|
+
from tkinter.font import families as font_families
|
12
10
|
from tkinter.messagebox import askyesno
|
11
|
+
from IPython.utils import io
|
13
12
|
|
14
|
-
snappy_path = os.path.abspath(os.path.dirname(snappy.__file__))
|
15
|
-
icon_file = os.path.join(snappy_path, 'info_icon.gif')
|
16
13
|
debug_Tk = True
|
17
14
|
ansi_seqs = re.compile(r'(?:\x01*\x1b\[((?:[0-9]*;)*[0-9]*.)\x02*)*([^\x01\x1b]*)',
|
18
15
|
re.MULTILINE)
|
@@ -35,6 +32,40 @@ ansi_colors = {'0;30m': 'Black',
|
|
35
32
|
delims = re.compile(r'[\s\[\]\{\}\(\)\+\-\=\'`~!@#\$\^\&\*]+')
|
36
33
|
|
37
34
|
|
35
|
+
class FontChoice:
|
36
|
+
def __init__(self, family, size, weight, slant):
|
37
|
+
self.family = family
|
38
|
+
self.size = size
|
39
|
+
self.weight = weight
|
40
|
+
self.slant = slant
|
41
|
+
self.rest = f'{self.weight} {self.slant}'
|
42
|
+
|
43
|
+
def as_tuple(self):
|
44
|
+
size = self.size
|
45
|
+
if sys.platform == 'darwin' and Tk_.TkVersion >= 9.0:
|
46
|
+
size = int(size/1.3)
|
47
|
+
return (self.family, size, self.rest)
|
48
|
+
|
49
|
+
def __repr__(self):
|
50
|
+
return 'FontChoice' + repr((self.family, self.size, self.weight, self.slant))
|
51
|
+
|
52
|
+
def bold(self):
|
53
|
+
return FontChoice(self.family, self.size, 'bold', self.slant)
|
54
|
+
|
55
|
+
|
56
|
+
def default_terminal_font():
|
57
|
+
size = 13 if sys.platform == 'darwin' else 11
|
58
|
+
family = Font(font='TkFixedFont').actual()['family']
|
59
|
+
if sys.platform == 'win32':
|
60
|
+
# Default is Courier New which is ugly and appears blurry.
|
61
|
+
available = font_families()
|
62
|
+
for better in ['Consolas', 'Cascadia Mono SemiLight']:
|
63
|
+
if better in available:
|
64
|
+
family = better
|
65
|
+
|
66
|
+
return FontChoice(family, size, 'normal', 'roman')
|
67
|
+
|
68
|
+
|
38
69
|
class Tk(Tk_.Tk):
|
39
70
|
def __init__(self, error_handler=None):
|
40
71
|
Tk_.Tk.__init__(self, className='snappy')
|
@@ -42,15 +73,9 @@ class Tk(Tk_.Tk):
|
|
42
73
|
# calls this function to report their occurrence.
|
43
74
|
if error_handler:
|
44
75
|
self.report_callback_exception = error_handler
|
45
|
-
# In Python 2.7 the _default root does not get set correctly.
|
46
|
-
if not Tk_._default_root:
|
47
|
-
Tk_._default_root = self
|
48
76
|
|
49
|
-
# Some ideas for the TkTerm class were borrowed from code written by
|
50
|
-
# Eitan Isaacson, IBM Corp.
|
51
77
|
|
52
|
-
|
53
|
-
class TkTerm:
|
78
|
+
class TkTerminalBase:
|
54
79
|
"""
|
55
80
|
A Tkinter terminal window that runs an IPython shell. This class
|
56
81
|
supports the IOStream interface, and can function as a replacement
|
@@ -62,8 +87,6 @@ class TkTerm:
|
|
62
87
|
io.stdout = sys.stdout = self
|
63
88
|
else:
|
64
89
|
self.window = window = Tk(self.report_callback_exception)
|
65
|
-
# self.encoding = sys.stdout.encoding
|
66
|
-
# self.saved_io = (sys.stdout, sys.stderr)
|
67
90
|
io.stdout = io.stderr = sys.stdout = sys.stderr = self
|
68
91
|
self._input_buffer = ''
|
69
92
|
self._current_indent = 0
|
@@ -71,7 +94,6 @@ class TkTerm:
|
|
71
94
|
window.option_add('*Menu.tearOff', 0)
|
72
95
|
window.title(name)
|
73
96
|
window.protocol("WM_DELETE_WINDOW", self.close)
|
74
|
-
self.icon = Tk_.PhotoImage(file=icon_file)
|
75
97
|
self.frame = frame = Tk_.Frame(window)
|
76
98
|
self.text = text = Tk_.Text(frame,
|
77
99
|
width=85,
|
@@ -83,7 +105,7 @@ class TkTerm:
|
|
83
105
|
highlightthickness=0,
|
84
106
|
relief=Tk_.FLAT
|
85
107
|
)
|
86
|
-
self.set_font(
|
108
|
+
self.set_font(default_terminal_font())
|
87
109
|
self.scroller = scroller = Tk_.Scrollbar(frame, command=text.yview)
|
88
110
|
text.config(yscrollcommand=scroller.set)
|
89
111
|
scroller.pack(side=Tk_.RIGHT, fill=Tk_.Y, pady=10)
|
@@ -180,7 +202,7 @@ class TkTerm:
|
|
180
202
|
self.blockers = {}
|
181
203
|
self.can_quit = True
|
182
204
|
self.close_callback = lambda :None
|
183
|
-
|
205
|
+
|
184
206
|
# Emulate a ListedWindow. We are listed, even though we are unique.
|
185
207
|
def bring_to_front(self):
|
186
208
|
self.window.deiconify()
|
@@ -251,18 +273,18 @@ class TkTerm:
|
|
251
273
|
sys.last_traceback = traceback
|
252
274
|
self.IP.showtraceback()
|
253
275
|
|
254
|
-
def set_font(self,
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
self.bold_font.config(weight='bold')
|
276
|
+
def set_font(self, font_choice):
|
277
|
+
normal_tuple = font_choice.as_tuple()
|
278
|
+
bold_tuple = font_choice.bold().as_tuple()
|
279
|
+
normal_font = Font(font=font_choice.as_tuple())
|
259
280
|
self.char_size = normal_font.measure('M')
|
281
|
+
self.text.config(font=normal_tuple)
|
260
282
|
text = self.text
|
261
|
-
text.tag_config('output', font=
|
262
|
-
text.tag_config('Prompt', foreground='#0000cc', font=
|
263
|
-
text.tag_config('PromptNum', foreground='#0000bb', font=
|
264
|
-
text.tag_config('OutPrompt', foreground='#cc0000', font=
|
265
|
-
text.tag_config('OutPromptNum', foreground='#bb0000', font=
|
283
|
+
text.tag_config('output', font=normal_tuple)
|
284
|
+
text.tag_config('Prompt', foreground='#0000cc', font=normal_tuple)
|
285
|
+
text.tag_config('PromptNum', foreground='#0000bb', font=bold_tuple)
|
286
|
+
text.tag_config('OutPrompt', foreground='#cc0000', font=normal_tuple)
|
287
|
+
text.tag_config('OutPromptNum', foreground='#bb0000', font=bold_tuple)
|
266
288
|
|
267
289
|
def add_blocker(self, window, message):
|
268
290
|
self.blockers[window] = message
|
@@ -365,29 +387,37 @@ class TkTerm:
|
|
365
387
|
self.text.tag_add('history', 'output_end', Tk_.INSERT)
|
366
388
|
|
367
389
|
def handle_return(self, event=None):
|
390
|
+
# If the input consists of one complete line of code we run it,
|
391
|
+
# regardless of where the insert cursor is located. Otherwise we only
|
392
|
+
# run the code if the cursor is at the end of the input
|
368
393
|
self.clear_completions()
|
394
|
+
if self.running_code:
|
395
|
+
return 'break'
|
396
|
+
cursor = int(self.text.index(Tk_.INSERT).split('.')[0])
|
397
|
+
last = int(self.text.index(Tk_.END).split('.')[0])
|
398
|
+
first = int(self.text.index('output_end').split('.')[0])
|
399
|
+
if cursor == first == last - 1: # single line input
|
400
|
+
self.text.mark_set(Tk_.INSERT, Tk_.END)
|
369
401
|
self.text.insert(Tk_.INSERT, '\n')
|
370
|
-
|
371
|
-
cell = self.text.get('output_end', Tk_.INSERT)
|
372
|
-
self.process_return(cell)
|
373
|
-
return 'break'
|
374
|
-
|
375
|
-
def handle_shift_return(self, event):
|
376
|
-
self.text.mark_set(Tk_.INSERT, Tk_.END)
|
377
|
-
return self.handle_return()
|
378
|
-
|
379
|
-
def process_return(self, cell):
|
402
|
+
cell = self.text.get('output_end', Tk_.INSERT)
|
380
403
|
try:
|
381
404
|
self.interact_handle_input(cell)
|
382
405
|
except KeyboardInterrupt:
|
383
406
|
self.write('(IP) Keyboard Interrupt: ')
|
384
407
|
self.reset()
|
408
|
+
self.hist_pointer = 0
|
409
|
+
self.hist_stem = ''
|
385
410
|
self.interact_prompt()
|
386
411
|
self.text.see(Tk_.INSERT)
|
387
412
|
if self.IP.more:
|
388
413
|
self.text.insert(Tk_.INSERT, ' '*self._current_indent, ())
|
389
414
|
self.hist_pointer = 0
|
390
415
|
self.hist_stem = ''
|
416
|
+
return 'break'
|
417
|
+
|
418
|
+
def handle_shift_return(self, event):
|
419
|
+
self.text.mark_set(Tk_.INSERT, Tk_.END)
|
420
|
+
return self.handle_return()
|
391
421
|
|
392
422
|
def jump_up(self, event):
|
393
423
|
return self.handle_up(event, jump=True)
|
@@ -463,25 +493,35 @@ class TkTerm:
|
|
463
493
|
line = self.text.get('output_end', self.tab_index).strip('\n')
|
464
494
|
word = delims.split(line)[-1]
|
465
495
|
try:
|
466
|
-
completions = self.IP.complete(word)
|
496
|
+
stem, completions = self.IP.complete(word)
|
467
497
|
except TypeError:
|
468
498
|
completions = []
|
469
499
|
if word.find('_') == -1:
|
470
500
|
completions = [x for x in completions
|
471
501
|
if x.find('__') == -1 and x.find('._') == -1]
|
472
|
-
|
502
|
+
# No meaningful completions. Ring the bell.
|
503
|
+
if len(completions) == 0 or len(completions) == 1 and completions[0] == stem:
|
473
504
|
self.window.bell()
|
474
505
|
self.tab_count = 0
|
475
506
|
return 'break'
|
476
|
-
|
477
|
-
if len(
|
478
|
-
self.do_completion(
|
479
|
-
|
480
|
-
|
507
|
+
# Only one completion. Use it.
|
508
|
+
if len(completions) == 1:
|
509
|
+
self.do_completion(stem, completions[0])
|
510
|
+
self.tab_count = 0
|
511
|
+
return 'break'
|
512
|
+
max_stem = self.max_stem(stem, completions)
|
513
|
+
# Add the maximal stem of all completions if it extends the word,
|
514
|
+
if len(max_stem) > len(word):
|
515
|
+
self.do_completion(stem, max_stem)
|
516
|
+
self.tab_count = 0
|
517
|
+
return 'break'
|
518
|
+
# Show the possible completions, with a warning if there are lots.
|
519
|
+
if len(completions) > 60 and self.tab_count == 1:
|
520
|
+
self.show_completions('', '',
|
481
521
|
['%s possibilities -- hit tab again to view them all' %
|
482
|
-
|
522
|
+
len(completions)])
|
483
523
|
else:
|
484
|
-
self.show_completions(completions)
|
524
|
+
self.show_completions(word, stem, completions)
|
485
525
|
if len(completions) <= 60:
|
486
526
|
self.tab_count += 1
|
487
527
|
return 'break'
|
@@ -490,20 +530,21 @@ class TkTerm:
|
|
490
530
|
self.text.mark_set(Tk_.INSERT, 'output_end')
|
491
531
|
return 'break'
|
492
532
|
|
493
|
-
def do_completion(self,
|
494
|
-
tail = completion[len(
|
533
|
+
def do_completion(self, stem, completion):
|
534
|
+
tail = completion[len(stem):]
|
495
535
|
self.text.insert(self.tab_index, tail)
|
496
536
|
self.tab_index = Tk_.END
|
497
537
|
self.tab_count = 0
|
498
538
|
|
499
|
-
def show_completions(self, comps):
|
539
|
+
def show_completions(self, word, stem, comps):
|
540
|
+
n = len(stem)
|
541
|
+
comps = [word + c[n:] for c in comps]
|
500
542
|
self.text.delete(self.tab_index, Tk_.END)
|
501
543
|
width = self.text.winfo_width()
|
502
|
-
|
503
|
-
charwidth = width//self.char_size
|
544
|
+
charwidth = width // self.char_size
|
504
545
|
biggest = 2 + max([len(x) for x in comps])
|
505
|
-
num_cols = charwidth//biggest
|
506
|
-
num_rows = (len(comps) + num_cols - 1)//num_cols
|
546
|
+
num_cols = max(charwidth // biggest, 1)
|
547
|
+
num_rows = (len(comps) + num_cols - 1) // num_cols
|
507
548
|
rows = []
|
508
549
|
format = '%%-%ds' % biggest
|
509
550
|
for n in range(num_rows):
|
@@ -519,17 +560,17 @@ class TkTerm:
|
|
519
560
|
self.tab_index = None
|
520
561
|
self.tab_count = 0
|
521
562
|
|
522
|
-
def
|
523
|
-
if len(
|
524
|
-
return
|
525
|
-
result =
|
526
|
-
for n in range(1,100):
|
527
|
-
heads =
|
563
|
+
def max_stem(self, stem, completions):
|
564
|
+
if len(completions) == 1:
|
565
|
+
return completions[0]
|
566
|
+
result = stem
|
567
|
+
for n in range(len(stem) + 1, 100):
|
568
|
+
heads = {w[:n] for w in completions}
|
528
569
|
if len(heads) > 1:
|
529
570
|
return result
|
530
571
|
elif len(heads) == 1:
|
531
572
|
result = heads.pop()
|
532
|
-
return
|
573
|
+
return result
|
533
574
|
|
534
575
|
def write_continuation_prompt(self):
|
535
576
|
prompt_tokens = self._continuation_prompt(self._prompt_size)
|
@@ -673,28 +714,16 @@ class TkTerm:
|
|
673
714
|
|
674
715
|
def start_interaction(self):
|
675
716
|
"""
|
676
|
-
|
717
|
+
Display a banner and prepare to begin interaction.
|
677
718
|
"""
|
678
|
-
|
679
|
-
banner_label = Tk_.Label(self.text,
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
justify=Tk_.LEFT,
|
684
|
-
font=self.settings['font'])
|
719
|
+
# Subclasses should override this method
|
720
|
+
banner_label = Tk_.Label(self.text,
|
721
|
+
text="Please override the start_interaction method.",
|
722
|
+
anchor=Tk_.W,
|
723
|
+
justify=Tk_.LEFT)
|
685
724
|
self.text.window_create(Tk_.END, window=banner_label)
|
686
725
|
self.text.insert(Tk_.END, '\n')
|
687
726
|
self.text.mark_set('output_end', '2.0')
|
688
|
-
# Set a reasonable default directory for files to be saved to.
|
689
|
-
try:
|
690
|
-
home = os.environ['HOME']
|
691
|
-
except KeyError:
|
692
|
-
home = os.path.expanduser("~")
|
693
|
-
desktop = os.path.join(home, "Desktop")
|
694
|
-
default_save_dir = desktop if os.path.exists(desktop) else home
|
695
|
-
self.IP.magics_manager.magics['line']['cd']("-q " + default_save_dir)
|
696
|
-
# Create the prompt and go!
|
697
|
-
self.interact_prompt()
|
698
727
|
|
699
728
|
def _input_prompt(self):
|
700
729
|
result = [('Prompt', 'In['),
|
@@ -733,7 +762,7 @@ class TkTerm:
|
|
733
762
|
"""
|
734
763
|
if not code.strip():
|
735
764
|
return '\n'
|
736
|
-
lines =
|
765
|
+
lines = list(code.split('\n'))
|
737
766
|
clean_lines = [lines[0].lstrip()]
|
738
767
|
for line in lines[1:]:
|
739
768
|
try:
|
@@ -749,7 +778,6 @@ class TkTerm:
|
|
749
778
|
prompt and set the 'more' flag. If the code is valid and
|
750
779
|
complete then run the code.
|
751
780
|
"""
|
752
|
-
transformer = self.IP.input_transformer_manager
|
753
781
|
assert cell.endswith('\n')
|
754
782
|
if not cell.strip():
|
755
783
|
self._current_indent = 0
|
@@ -758,7 +786,8 @@ class TkTerm:
|
|
758
786
|
self._input_buffer += cell
|
759
787
|
else:
|
760
788
|
self._input_buffer = self.clean_code(cell)
|
761
|
-
|
789
|
+
transformed_cell = self.IP.transform_cell(self._input_buffer)
|
790
|
+
status, indent = self.IP.check_complete(transformed_cell)
|
762
791
|
self._current_indent = indent or 0
|
763
792
|
if status == 'incomplete':
|
764
793
|
self.IP.more = True
|
snappy/twister/main.py
CHANGED
@@ -8,12 +8,6 @@ import snappy
|
|
8
8
|
from plink import LinkManager
|
9
9
|
from .twister_core import build_bundle, build_splitting, twister_version
|
10
10
|
|
11
|
-
# Python 3 compatibility
|
12
|
-
try:
|
13
|
-
basestring
|
14
|
-
except NameError: # Python 3
|
15
|
-
basestring = unicode = str
|
16
|
-
|
17
11
|
surface_database_path = os.path.join(os.path.dirname(__file__), 'surfaces')
|
18
12
|
surface_database = set(os.listdir(surface_database_path))
|
19
13
|
version = twister_version()
|
@@ -22,7 +16,7 @@ def _get_surface(surface):
|
|
22
16
|
if isinstance(surface, tuple) and len(surface) == 2 and isinstance(surface[0], int) and isinstance(surface[1], int):
|
23
17
|
return LP_surface(surface[0], surface[1])
|
24
18
|
|
25
|
-
if isinstance(surface,
|
19
|
+
if isinstance(surface, str):
|
26
20
|
# If surface is actually the contents of a surface file.
|
27
21
|
if surface.startswith('# A Twister surface file'):
|
28
22
|
return surface
|
Binary file
|