snappy 3.1.1__cp311-cp311-win_amd64.whl → 3.2__cp311-cp311-win_amd64.whl
Sign up to get free protection for your applications and to get access to all the features.
- snappy/CyOpenGL.cp311-win_amd64.pyd +0 -0
- snappy/SnapPy.cp311-win_amd64.pyd +0 -0
- snappy/SnapPyHP.cp311-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.cp311-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 +26 -11
- 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-311.pyc +0 -0
- snappy/__pycache__/browser.cpython-311.pyc +0 -0
- snappy/__pycache__/cache.cpython-311.pyc +0 -0
- snappy/__pycache__/database.cpython-311.pyc +0 -0
- snappy/__pycache__/db_utilities.cpython-311.pyc +0 -0
- snappy/__pycache__/decorated_isosig.cpython-311.pyc +0 -0
- snappy/__pycache__/exceptions.cpython-311.pyc +0 -0
- snappy/__pycache__/export_stl.cpython-311.pyc +0 -0
- snappy/__pycache__/filedialog.cpython-311.pyc +0 -0
- snappy/__pycache__/gui.cpython-311.pyc +0 -0
- snappy/__pycache__/horoviewer.cpython-311.pyc +0 -0
- snappy/__pycache__/math_basics.cpython-311.pyc +0 -0
- snappy/__pycache__/matrix.cpython-311.pyc +0 -0
- snappy/__pycache__/number.cpython-311.pyc +0 -0
- snappy/__pycache__/numeric_output_checker.cpython-311.pyc +0 -0
- snappy/__pycache__/pari.cpython-311.pyc +0 -0
- snappy/__pycache__/polyviewer.cpython-311.pyc +0 -0
- snappy/__pycache__/sage_helper.cpython-311.pyc +0 -0
- snappy/__pycache__/version.cpython-311.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-311.pyc +0 -0
- snappy/drilling/__pycache__/constants.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/crush.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/cusps.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/debug.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/epsilons.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/exceptions.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/fixed_points.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_info.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_tube.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/geometric_structure.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/line.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/moves.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/peripheral_curves.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/perturb.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/quotient_space.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/spatial_dict.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/subdivide.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/tracing.cpython-311.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-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/exceptions.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/hyp_utils.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/link_projection.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/main.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/pl_utils.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/put_in_S3.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/stored_moves.cpython-311.pyc +0 -0
- snappy/hyperboloid/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/manifolds/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/component.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/coordinates.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/fieldExtensions.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/findLoops.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/homology.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/manifoldMethods.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/matrix.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/polynomial.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/processComponents.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileBase.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileDispatch.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/processMagmaFile.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/processRurFile.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVariety.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/rur.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/utilities.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/character_varieties.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/fundamental_polyhedron.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/interval_reps.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/kernel_structures.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/mcomplex_base.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/nsagetools.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/polished_reps.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/shapes.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/slice_obs_HKL.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/utilities.cpython-311.pyc +0 -0
- snappy/snap/peripheral/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-311.pyc +0 -0
- snappy/snap/peripheral/__pycache__/link.cpython-311.pyc +0 -0
- snappy/snap/peripheral/__pycache__/peripheral.cpython-311.pyc +0 -0
- snappy/snap/peripheral/__pycache__/surface.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/arrow.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/corner.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/edge.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/face.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/files.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/homology.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/linalg.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/mcomplex.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/perm4.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/simplex.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/spun.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/surface.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/vertex.cpython-311.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-311.pyc +0 -0
- snappy/twister/__pycache__/main.cpython-311.pyc +0 -0
- snappy/upper_halfspace/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/upper_halfspace/__pycache__/ideal_point.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/cuspCrossSection.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/cuspTranslations.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/cusp_areas.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/cusp_shapes.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/exceptions.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/interval_tree.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/realAlgebra.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/shapes.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/short_slopes.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/squareExtensions.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/verifyCanonical.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/verifyHyperbolicity.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/volume.cpython-311.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-311.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/closed.cpython-311.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-311.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/cusped.cpython-311.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-311.pyc +0 -0
- snappy/verify/cuspCrossSection.py +0 -1422
- snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-311.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-311.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-311.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-311.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-311.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
|