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/len_spec/tile.py
ADDED
@@ -0,0 +1,275 @@
|
|
1
|
+
from ..tiling.lifted_tetrahedron import LiftedTetrahedron
|
2
|
+
from ..tiling.lifted_tetrahedron_set import (LiftedTetrahedronSet,
|
3
|
+
get_lifted_tetrahedron_set)
|
4
|
+
from ..tiling.iter_utils import merge_iterables
|
5
|
+
from ..tiling.hyperboloid_dict import get_hyperboloid_dict
|
6
|
+
from ..tiling.dict_based_set import DictBasedSet
|
7
|
+
from ..hyperboloid import o13_inverse
|
8
|
+
from ..snap.t3mlite import Mcomplex, simplex
|
9
|
+
from ..math_basics import correct_min, correct_max, lower # type: ignore
|
10
|
+
from ..matrix import make_identity_matrix
|
11
|
+
|
12
|
+
from .geometry import (lower_bound_geodesic_length,
|
13
|
+
lower_bound_distance_r13_point_truncated_tetrahedron)
|
14
|
+
|
15
|
+
import heapq
|
16
|
+
from typing import List, Sequence
|
17
|
+
|
18
|
+
class LengthSpectrumTile:
|
19
|
+
"""
|
20
|
+
Represents a translate of the fundamental domain by the given
|
21
|
+
o13_matrix used to tile H^3. A corresponding word in the unsimplified
|
22
|
+
fundamental group is also given.
|
23
|
+
|
24
|
+
Note that we drop the base tile where the o13_matrix is the identity.
|
25
|
+
|
26
|
+
Thus, for every LengthSpectrumTile, the matrix determines a possibly
|
27
|
+
degenerate geodesic. Here degenerate means that the two endpoints
|
28
|
+
coincide (and the geodesic has length zero) since the matrix is parabolic.
|
29
|
+
|
30
|
+
LengthSpectrumTile's are emitted by compute_length_spectrum_tiles with
|
31
|
+
increasing lower_bound_geodesic_length (more precisely, increasing
|
32
|
+
left endpoint if intervals are used). If we are interested only geodesics
|
33
|
+
up to length L, we need to iterate over the tiles emitted by
|
34
|
+
compute_length_sepctrum_tiles until we have tile where
|
35
|
+
lower_bound_geodesic_length is larger than L.
|
36
|
+
|
37
|
+
Note that the length of the geodesic associated to the o13_matrix can
|
38
|
+
actually be shorter than lower_bound_geodesic_length. This can happen
|
39
|
+
since we can have a parabolic matrix or a matrix conjugate to an
|
40
|
+
earlier matrix we have seen encoding a geodesic we already had seen
|
41
|
+
earlier in a different way.
|
42
|
+
|
43
|
+
This class is similar to snappy.tiling.tile.Tile and
|
44
|
+
snappy.tiling.tile._PendingLiftedTetrahedron but specialized to the
|
45
|
+
length spectrum and corresponds to tiling by fundamental domains.
|
46
|
+
"""
|
47
|
+
|
48
|
+
def __init__(self,
|
49
|
+
word : List[int],
|
50
|
+
o13_matrix,
|
51
|
+
lower_bound_geodesic_length):
|
52
|
+
self.word = word
|
53
|
+
self.o13_matrix = o13_matrix
|
54
|
+
self.lower_bound_geodesic_length = lower_bound_geodesic_length
|
55
|
+
|
56
|
+
self._key = lower(lower_bound_geodesic_length)
|
57
|
+
|
58
|
+
def __lt__(self, other):
|
59
|
+
"""
|
60
|
+
Used so that we can merge streams of tiles with merge_iterables.
|
61
|
+
"""
|
62
|
+
return self._key < other._key
|
63
|
+
|
64
|
+
def compute_length_spectrum_tiles(mcomplex : Mcomplex
|
65
|
+
) -> Sequence[LengthSpectrumTile]:
|
66
|
+
"""
|
67
|
+
Given the result of mcomplex_for_len_spec, provides a stream of tiles
|
68
|
+
suitable to compute the length spectrum.
|
69
|
+
|
70
|
+
More precisely, to know all geodesics up to length L, we need to
|
71
|
+
iterate the stream until we have a tile with
|
72
|
+
tile.lower_bound_geodesic_length > L.
|
73
|
+
"""
|
74
|
+
|
75
|
+
# We spawn a separate tiling process for each tetrahedron.
|
76
|
+
# This process will start tiling a ball about the basepoint of
|
77
|
+
# the given tetrahedron and emits a stream of LengthSpectrumTile's
|
78
|
+
# with increasing lower_bound_geodesic_length.
|
79
|
+
#
|
80
|
+
# We need to merge the result of all these streams to find all
|
81
|
+
# geodesics (up to a certain length L).
|
82
|
+
#
|
83
|
+
# However, we might also find duplicates among these streams.
|
84
|
+
# We de-duplicate them here using the visited_dict.
|
85
|
+
#
|
86
|
+
# For more context:
|
87
|
+
# Recall that mcomplex_for_len_spec added a spine to the manifold.
|
88
|
+
# Each geodesic has to intersect that spine somewhere.
|
89
|
+
#
|
90
|
+
# However, the tiling process for one tetrahedron only takes into
|
91
|
+
# account the intersection of the spine with that particular
|
92
|
+
# tetrahedron.
|
93
|
+
#
|
94
|
+
# See _compute_length_spectrum_tiles_for_tetrahedron for more details.
|
95
|
+
|
96
|
+
max_neg_prod_equal, min_neg_prod_distinct = _max_min_prod(mcomplex)
|
97
|
+
visited_dict = DictBasedSet(
|
98
|
+
get_hyperboloid_dict(max_neg_prod_equal,
|
99
|
+
min_neg_prod_distinct,
|
100
|
+
mcomplex.verified))
|
101
|
+
|
102
|
+
# Add (non-translated) base point so that we do not emit the base tile
|
103
|
+
# with the identity matrix
|
104
|
+
visited_dict.add(mcomplex.R13_baseTetInCenter)
|
105
|
+
|
106
|
+
for tile in merge_iterables(
|
107
|
+
[ _compute_length_spectrum_tiles_for_tetrahedron(mcomplex, tet)
|
108
|
+
for tet in mcomplex.Tetrahedra ]):
|
109
|
+
if visited_dict.add(tile.o13_matrix * mcomplex.R13_baseTetInCenter):
|
110
|
+
yield tile
|
111
|
+
|
112
|
+
def _compute_length_spectrum_tiles_for_tetrahedron(
|
113
|
+
mcomplex, initial_tetrahedron) -> Sequence[LengthSpectrumTile]:
|
114
|
+
|
115
|
+
"""
|
116
|
+
Returns a stream of length spectrum tiles. To know all geodesics
|
117
|
+
up to length L that intersect the restriction of the spine to the
|
118
|
+
given tetrahedron, we need to iterate the stream until we have a tile
|
119
|
+
with tile.lower_bound_geodesic_length > L.
|
120
|
+
"""
|
121
|
+
|
122
|
+
# We tile H^3 by lifted tetrahedra by covering a larger and larger ball
|
123
|
+
# about the incenter of the initial_tetrahedron.
|
124
|
+
#
|
125
|
+
# If a lifted tetrahedron is a translated copy of the initial_tetrahedron,
|
126
|
+
# we emit a LengthSpectrumTile. The lower_bound_geodesic_length is computed
|
127
|
+
# from the radius of the covered ball using lower_bound_geodesic_length.
|
128
|
+
|
129
|
+
initial_lifted_tetrahedron = LiftedTetrahedron(
|
130
|
+
initial_tetrahedron, make_identity_matrix(ring=mcomplex.RF, n=4))
|
131
|
+
|
132
|
+
# The pending pieces as priority queue - that is, a python list
|
133
|
+
# but we use heapq to access it.
|
134
|
+
pending_lifted_tetrahedra : Sequence[_PendingLiftedTetrahedron] = []
|
135
|
+
|
136
|
+
# Start tiling with the initial_tetrahedron.
|
137
|
+
heapq.heappush(
|
138
|
+
pending_lifted_tetrahedra,
|
139
|
+
_PendingLiftedTetrahedron(
|
140
|
+
[], initial_lifted_tetrahedron, mcomplex.RF(0)))
|
141
|
+
|
142
|
+
max_neg_prod_equal, min_neg_prod_distinct = _max_min_prod(mcomplex)
|
143
|
+
|
144
|
+
# Initialize data structure recording which lifted tetrahedra have
|
145
|
+
# already been visited while tiling H^3.
|
146
|
+
visited_lifted_tetrahedra : LiftedTetrahedronSet = (
|
147
|
+
get_lifted_tetrahedron_set(
|
148
|
+
base_point=mcomplex.R13_baseTetInCenter,
|
149
|
+
canonical_keys_function=None,
|
150
|
+
act_on_base_point_by_inverse=False,
|
151
|
+
max_neg_prod_equal=max_neg_prod_equal,
|
152
|
+
min_neg_prod_distinct=min_neg_prod_distinct,
|
153
|
+
verified=mcomplex.verified))
|
154
|
+
|
155
|
+
while True:
|
156
|
+
pending_lifted_tetrahedron : _PendingLiftedTetrahedron = (
|
157
|
+
heapq.heappop(pending_lifted_tetrahedra))
|
158
|
+
|
159
|
+
tet = pending_lifted_tetrahedron.lifted_tetrahedron.tet
|
160
|
+
m = pending_lifted_tetrahedron.lifted_tetrahedron.o13_matrix
|
161
|
+
|
162
|
+
if tet is initial_tetrahedron:
|
163
|
+
# Emit Tile
|
164
|
+
yield LengthSpectrumTile(
|
165
|
+
pending_lifted_tetrahedron.word,
|
166
|
+
pending_lifted_tetrahedron.lifted_tetrahedron.o13_matrix,
|
167
|
+
lower_bound_geodesic_length(
|
168
|
+
pending_lifted_tetrahedron.lower_bound_distance,
|
169
|
+
initial_tetrahedron.inv_spine_cosh))
|
170
|
+
|
171
|
+
# For all faces ...
|
172
|
+
for f, new_tet in tet.Neighbor.items():
|
173
|
+
# ... except the one that was used to reach this lifted tetrahedron
|
174
|
+
if f == pending_lifted_tetrahedron.entry_cell:
|
175
|
+
continue
|
176
|
+
|
177
|
+
entry_face = tet.Gluing[f].image(f)
|
178
|
+
|
179
|
+
# Inverse of tet.O13_matrices[f]
|
180
|
+
new_m = m * new_tet.O13_matrices[entry_face]
|
181
|
+
new_lifted_tetrahedron = LiftedTetrahedron(new_tet, new_m)
|
182
|
+
|
183
|
+
if not visited_lifted_tetrahedra.add(new_lifted_tetrahedron):
|
184
|
+
continue
|
185
|
+
|
186
|
+
# Compute word
|
187
|
+
word = pending_lifted_tetrahedron.word
|
188
|
+
g = new_tet.GeneratorsInfo[entry_face]
|
189
|
+
if g != 0:
|
190
|
+
word = word + [ -g ]
|
191
|
+
|
192
|
+
# We want to compute the distance of the spine_center to the
|
193
|
+
# lifted tetrahedron.
|
194
|
+
# However, it is cheaper to apply the inverse matrix to the
|
195
|
+
# spine center rather than the matrix to the tetrahedron.
|
196
|
+
lifted_spine_center = (
|
197
|
+
o13_inverse(new_m) * initial_tetrahedron.spine_center)
|
198
|
+
|
199
|
+
heapq.heappush(
|
200
|
+
pending_lifted_tetrahedra,
|
201
|
+
_PendingLiftedTetrahedron(
|
202
|
+
word,
|
203
|
+
new_lifted_tetrahedron,
|
204
|
+
lower_bound_distance_r13_point_truncated_tetrahedron(
|
205
|
+
lifted_spine_center,
|
206
|
+
new_tet,
|
207
|
+
mcomplex.verified),
|
208
|
+
entry_cell=entry_face))
|
209
|
+
|
210
|
+
class _PendingLiftedTetrahedron:
|
211
|
+
"""
|
212
|
+
A lifted tetrahedron that still needs to be processed to tile
|
213
|
+
together with the face used to reach this tetrahedron.
|
214
|
+
|
215
|
+
The < operator is overloaded so that the piece with the lowest
|
216
|
+
lower_bound will be picked up next by a priority queue.
|
217
|
+
|
218
|
+
If pieces are processed in this order, then the lower_bound of the
|
219
|
+
next piece will actually be a lower bound for the distance between L
|
220
|
+
and the lifted tetrahedron (with other pending pieces for the same
|
221
|
+
lifted tetrahedron having higher values for lower_bound and thus
|
222
|
+
being further down the queue).
|
223
|
+
"""
|
224
|
+
|
225
|
+
def __init__(self,
|
226
|
+
word,
|
227
|
+
lifted_tetrahedron : LiftedTetrahedron,
|
228
|
+
lower_bound_distance,
|
229
|
+
entry_cell : int = simplex.T):
|
230
|
+
self.word = word
|
231
|
+
self.lifted_tetrahedron = lifted_tetrahedron
|
232
|
+
self.lower_bound_distance = lower_bound_distance
|
233
|
+
|
234
|
+
# Either element of simplex.ZeroSubsimplices (if piece was reached
|
235
|
+
# through another piece) or simplex.T (if this pending piece was
|
236
|
+
# used to start tiling).
|
237
|
+
self.entry_cell = entry_cell
|
238
|
+
|
239
|
+
# For convenience, lower_bound is an interval but it is only
|
240
|
+
# the left value of the interval that is relevant and that we
|
241
|
+
# should use: A < B can be False for two intervals even
|
242
|
+
# when A's left value is lower than B's left value.
|
243
|
+
self._key = lower(lower_bound_distance)
|
244
|
+
|
245
|
+
def __lt__(self, other):
|
246
|
+
return self._key < other._key
|
247
|
+
|
248
|
+
def _max_min_prod(mcomplex):
|
249
|
+
min_neg_prod_distinct = (mcomplex.baseTetInRadius/2).cosh()
|
250
|
+
if mcomplex.verified:
|
251
|
+
return (min_neg_prod_distinct, min_neg_prod_distinct)
|
252
|
+
else:
|
253
|
+
max_neg_prod_equal = min(
|
254
|
+
min_neg_prod_distinct,
|
255
|
+
1 + _compute_epsilon(mcomplex.RF))
|
256
|
+
return (max_neg_prod_equal, min_neg_prod_distinct)
|
257
|
+
|
258
|
+
def _compute_epsilon(RF):
|
259
|
+
p = RF.precision()
|
260
|
+
|
261
|
+
# We try to be a factor of at least 10^6 smaller than
|
262
|
+
# 1/_compute_epsilon_inverse(RF) in hyperboloid_dict.py.
|
263
|
+
#
|
264
|
+
# This factor will even grow larger as the precision increases.
|
265
|
+
#
|
266
|
+
# That way, we will hopefully fail in _equality_predicate
|
267
|
+
# in hyperboloid_dict rather than failing by not hashing together
|
268
|
+
# lifted tetrahedra that should be the same but are not recognised
|
269
|
+
# as such because of numerical error.
|
270
|
+
|
271
|
+
result = RF(1e-5)
|
272
|
+
if p > 53:
|
273
|
+
result *= RF(0.5) ** ((p - 53) / 2)
|
274
|
+
|
275
|
+
return result
|
snappy/len_spec/word.py
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
from ..SnapPy import reduce_list_word, inverse_list_word
|
2
|
+
|
3
|
+
from typing import List
|
4
|
+
|
5
|
+
def simplify_geodesic_word(word : List[int]) -> List[int]:
|
6
|
+
"""
|
7
|
+
Simplifies given word. It can change the word by a conjugate or
|
8
|
+
invert it.
|
9
|
+
|
10
|
+
More precisely, it cancels pairs of generator and inverse. First if
|
11
|
+
they are next to each other and then if they are at opposite ends of
|
12
|
+
the word. It then cyclically rotates the word and its inverse to take
|
13
|
+
the lexicographically smallest when ordering the generators as
|
14
|
+
1, -1, 2, -2, 3, -3, ...
|
15
|
+
|
16
|
+
>>> simplify_geodesic_word([])
|
17
|
+
[]
|
18
|
+
>>> simplify_geodesic_word([1])
|
19
|
+
[1]
|
20
|
+
>>> simplify_geodesic_word([1, 2])
|
21
|
+
[1, 2]
|
22
|
+
>>> simplify_geodesic_word([-1, 2, -2, 1])
|
23
|
+
[]
|
24
|
+
>>> simplify_geodesic_word([-1, 3, 2, -2, 1])
|
25
|
+
[3]
|
26
|
+
>>> simplify_geodesic_word([-1, 3, 4, 2, -2, 1])
|
27
|
+
[3, 4]
|
28
|
+
>>> simplify_geodesic_word([-1, 4, 3, 2, -2, 1])
|
29
|
+
[3, 4]
|
30
|
+
>>> simplify_geodesic_word([-1, -3, -4, 5, 2, -2, 1])
|
31
|
+
[3, -5, 4]
|
32
|
+
"""
|
33
|
+
|
34
|
+
return (
|
35
|
+
_rotate_and_optionally_invert(
|
36
|
+
_cancel_conjugation(
|
37
|
+
reduce_list_word(word))))
|
38
|
+
|
39
|
+
def _cancel_conjugation(word : List[int]) -> List[int]:
|
40
|
+
"""
|
41
|
+
Cancels pairs of generator and inverse at opposite ends of
|
42
|
+
given word.
|
43
|
+
|
44
|
+
>>> _cancel_conjugation([])
|
45
|
+
[]
|
46
|
+
>>> _cancel_conjugation([1])
|
47
|
+
[1]
|
48
|
+
>>> _cancel_conjugation([1, -1])
|
49
|
+
[]
|
50
|
+
>>> _cancel_conjugation([1, 2, -1])
|
51
|
+
[2]
|
52
|
+
>>> _cancel_conjugation([1, 2, 3, -1])
|
53
|
+
[2, 3]
|
54
|
+
"""
|
55
|
+
n = len(word)
|
56
|
+
for i in range(n // 2):
|
57
|
+
k = n - i - 1
|
58
|
+
if word[i] != -word[k]:
|
59
|
+
return word[i:k+1]
|
60
|
+
return word[n // 2 : (n + 1) // 2]
|
61
|
+
|
62
|
+
def _rotate_and_optionally_invert(word : List[int]) -> List[int]:
|
63
|
+
"""
|
64
|
+
Rotate word and its inverse to pick lexicographically smallest when
|
65
|
+
ordering the generators as 1, -1, 2, -2, 3, -3, ...
|
66
|
+
|
67
|
+
>>> _rotate_and_optionally_invert([3, 4, 5])
|
68
|
+
[3, 4, 5]
|
69
|
+
>>> _rotate_and_optionally_invert([4, 5, 3])
|
70
|
+
[3, 4, 5]
|
71
|
+
>>> _rotate_and_optionally_invert([-3])
|
72
|
+
[3]
|
73
|
+
>>> _rotate_and_optionally_invert([5, 3, 4, -3])
|
74
|
+
[3, 4, -3, 5]
|
75
|
+
"""
|
76
|
+
n = len(word)
|
77
|
+
|
78
|
+
if n == 0:
|
79
|
+
return word
|
80
|
+
|
81
|
+
return min(
|
82
|
+
(candidates[i:] + candidates[:i]
|
83
|
+
for candidates in [ word, inverse_list_word(word) ]
|
84
|
+
for i in range(len(word))),
|
85
|
+
key=lambda w: [ 2 * l if l > 0 else 2 * -l + 1
|
86
|
+
for l in w ])
|
snappy/math_basics.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
from .sage_helper import _within_sage
|
2
|
+
from .exceptions import InsufficientPrecisionError
|
2
3
|
|
3
4
|
from functools import reduce
|
4
5
|
import operator
|
@@ -6,21 +7,30 @@ import operator
|
|
6
7
|
__all__ = ['prod',
|
7
8
|
'xgcd',
|
8
9
|
'is_RealIntervalFieldElement',
|
10
|
+
'is_ComplexIntervalFieldElement'
|
9
11
|
'is_Interval',
|
10
12
|
'correct_min',
|
11
|
-
'correct_max'
|
13
|
+
'correct_max',
|
14
|
+
'lower']
|
15
|
+
|
16
|
+
def is_Interval(x):
|
17
|
+
"""
|
18
|
+
Returns True is x is either a real or complex interval as constructed
|
19
|
+
with RealIntervalField or ComplexIntervalField, respectively.
|
20
|
+
"""
|
21
|
+
return is_RealIntervalFieldElement(x) or is_ComplexIntervalFieldElement(x)
|
12
22
|
|
13
23
|
if _within_sage:
|
14
|
-
from
|
15
|
-
from sage.rings.real_mpfi import is_RealIntervalFieldElement
|
16
|
-
from sage.rings.complex_interval import is_ComplexIntervalFieldElement
|
24
|
+
from .sage_helper import prod, xgcd
|
17
25
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
26
|
+
from sage.rings.real_mpfi import RealIntervalFieldElement
|
27
|
+
from sage.rings.complex_interval import ComplexIntervalFieldElement
|
28
|
+
|
29
|
+
def is_RealIntervalFieldElement(x):
|
30
|
+
return isinstance(x, RealIntervalFieldElement)
|
31
|
+
|
32
|
+
def is_ComplexIntervalFieldElement(x):
|
33
|
+
return isinstance(x, ComplexIntervalFieldElement)
|
24
34
|
|
25
35
|
else:
|
26
36
|
|
@@ -75,10 +85,16 @@ else:
|
|
75
85
|
# so always return False.
|
76
86
|
return False
|
77
87
|
|
78
|
-
def
|
79
|
-
|
80
|
-
|
88
|
+
def is_ComplexIntervalFieldElement(x):
|
89
|
+
"""
|
90
|
+
is_ComplexIntervalFieldElement returns whether x is a complex
|
91
|
+
interval (constructed with ComplexIntervalField(precision)(value)).
|
92
|
+
"""
|
81
93
|
|
94
|
+
# We do not support interval arithmetic outside of SnapPy,
|
95
|
+
# so always return False.
|
96
|
+
return False
|
97
|
+
|
82
98
|
def correct_min(l):
|
83
99
|
"""
|
84
100
|
A version of min that works correctly even when l is a list of
|
@@ -148,3 +164,13 @@ def correct_max(l):
|
|
148
164
|
raise ValueError(
|
149
165
|
"Trying to compute max of array containing NaN.")
|
150
166
|
return max(l)
|
167
|
+
|
168
|
+
def lower(x):
|
169
|
+
if is_RealIntervalFieldElement(x):
|
170
|
+
if x.is_NaN():
|
171
|
+
raise InsufficientPrecisionError(
|
172
|
+
"A NaN was encountered during a verified computation. "
|
173
|
+
"Increasing the precision will probably fix this.")
|
174
|
+
return x.lower()
|
175
|
+
else:
|
176
|
+
return x
|
snappy/matrix.py
CHANGED
@@ -3,13 +3,51 @@ from .sage_helper import _within_sage
|
|
3
3
|
from . import number
|
4
4
|
from .math_basics import is_Interval
|
5
5
|
|
6
|
+
def snappy_make_vector(entries, *, ring=None):
|
7
|
+
return SimpleVector(entries, ring)
|
8
|
+
|
9
|
+
def snappy_make_matrix(entries, *, ring=None):
|
10
|
+
return SimpleMatrix(entries, ring)
|
11
|
+
|
12
|
+
def snappy_make_identity_matrix(*, n, ring):
|
13
|
+
return SimpleMatrix.identity(ring, n)
|
14
|
+
|
15
|
+
if _within_sage:
|
16
|
+
from sage.modules.free_module_element import vector as _sage_vector
|
17
|
+
from sage.matrix.constructor import matrix as _sage_matrix
|
18
|
+
|
19
|
+
def sage_make_vector(entries, *, ring=None):
|
20
|
+
if ring is None:
|
21
|
+
return _sage_vector(entries)
|
22
|
+
else:
|
23
|
+
return _sage_vector(ring, entries)
|
24
|
+
|
25
|
+
def sage_make_matrix(entries, *, ring=None):
|
26
|
+
if ring is None:
|
27
|
+
return _sage_matrix(entries)
|
28
|
+
else:
|
29
|
+
return _sage_matrix(ring, entries)
|
30
|
+
|
31
|
+
def sage_make_identity_matrix(*, n, ring):
|
32
|
+
return _sage_matrix.identity(ring, n)
|
33
|
+
|
34
|
+
make_vector = sage_make_vector
|
35
|
+
make_matrix = sage_make_matrix
|
36
|
+
make_identity_matrix = sage_make_identity_matrix
|
37
|
+
else:
|
38
|
+
make_vector = snappy_make_vector
|
39
|
+
make_matrix = snappy_make_matrix
|
40
|
+
make_identity_matrix = snappy_make_identity_matrix
|
6
41
|
|
7
42
|
class SimpleVector(number.SupportsMultiplicationByNumber):
|
8
|
-
def __init__(self,
|
9
|
-
|
43
|
+
def __init__(self, entries, ring=None):
|
44
|
+
if ring is None:
|
45
|
+
self.data = entries
|
46
|
+
else:
|
47
|
+
self.data = [ ring(e) for e in entries ]
|
10
48
|
try:
|
11
49
|
self.type = type(self.data[0])
|
12
|
-
self.shape = (len(
|
50
|
+
self.shape = (len(entries),)
|
13
51
|
except IndexError:
|
14
52
|
self.type = type(0)
|
15
53
|
self.shape = (0,)
|
@@ -36,7 +74,7 @@ class SimpleVector(number.SupportsMultiplicationByNumber):
|
|
36
74
|
self.data[key] = value
|
37
75
|
|
38
76
|
def entries(self):
|
39
|
-
return
|
77
|
+
return list(self.data)
|
40
78
|
|
41
79
|
def list(self):
|
42
80
|
return self.entries()
|
@@ -79,24 +117,29 @@ class SimpleVector(number.SupportsMultiplicationByNumber):
|
|
79
117
|
def __truediv__(self, other):
|
80
118
|
return SimpleVector([ x / other for x in self.data])
|
81
119
|
|
120
|
+
def __neg__(self):
|
121
|
+
return SimpleVector([ -e for e in self.data ])
|
122
|
+
|
82
123
|
def base_ring(self):
|
83
124
|
try:
|
84
125
|
return self.data[0].parent()
|
85
126
|
except IndexError:
|
86
127
|
return self.type
|
87
128
|
|
88
|
-
|
89
129
|
# A very basic matrix class
|
90
130
|
class SimpleMatrix(number.SupportsMultiplicationByNumber):
|
91
131
|
"""
|
92
132
|
A simple matrix class that wraps a list of lists.
|
93
133
|
"""
|
94
|
-
def __init__(self, list_of_lists, ring=None):
|
134
|
+
def __init__(self, list_of_lists, base_ring=None, ring=None):
|
95
135
|
|
96
136
|
if isinstance(list_of_lists, SimpleMatrix):
|
97
137
|
list_of_lists = list_of_lists.data
|
98
|
-
if
|
99
|
-
|
138
|
+
if base_ring is None:
|
139
|
+
base_ring = ring # Sage has deprecated "ring"
|
140
|
+
if base_ring is not None:
|
141
|
+
self.data = [ [ base_ring(e) for e in row ]
|
142
|
+
for row in list_of_lists ]
|
100
143
|
else:
|
101
144
|
# XXX
|
102
145
|
# We should really copy the data here since otherwise we might
|
@@ -479,4 +522,4 @@ def mat_solve(m, v, epsilon=0):
|
|
479
522
|
# Return the last column
|
480
523
|
# (11/7, -164/133, 46/133, 32/133)
|
481
524
|
|
482
|
-
return
|
525
|
+
return make_vector([ row[-1] for row in m1])
|
snappy/number.py
CHANGED
@@ -11,7 +11,7 @@ left_zeros = re.compile(r'0\.0*')
|
|
11
11
|
precision_of_exact_GEN = pari(0).precision()
|
12
12
|
|
13
13
|
if _within_sage:
|
14
|
-
from
|
14
|
+
from .sage_helper import RealField, Integer, Rational, ZZ, QQ, RR, CC
|
15
15
|
from sage.structure.parent import Parent
|
16
16
|
from sage.structure.unique_representation import UniqueRepresentation
|
17
17
|
from sage.categories.homset import Hom
|
@@ -66,8 +66,13 @@ if _within_sage:
|
|
66
66
|
self._precision = precision
|
67
67
|
self.register_coercion(MorphismToSPN(ZZ, self, self._precision))
|
68
68
|
self.register_coercion(MorphismToSPN(QQ, self, self._precision))
|
69
|
-
|
70
|
-
|
69
|
+
try:
|
70
|
+
from sage.symbolic.ring import SR
|
71
|
+
except ImportError:
|
72
|
+
pass
|
73
|
+
else:
|
74
|
+
to_SR = Hom(self, SR, Sets())(lambda x: SR(x.sage()))
|
75
|
+
SR.register_coercion(to_SR)
|
71
76
|
|
72
77
|
def _repr_(self):
|
73
78
|
return "SnapPy Numbers with %s bits precision" % self._precision
|
@@ -193,7 +198,7 @@ else: # We are not in Sage
|
|
193
198
|
|
194
199
|
def __new__(cls, precision=53):
|
195
200
|
if precision not in SnapPyNumbers._cache:
|
196
|
-
obj = super(
|
201
|
+
obj = super().__new__(cls)
|
197
202
|
obj._precision = precision
|
198
203
|
SnapPyNumbers._cache[precision] = obj
|
199
204
|
return obj
|
@@ -295,7 +300,8 @@ class Number(Number_baseclass):
|
|
295
300
|
self.accuracy = self.decimal_precision
|
296
301
|
else:
|
297
302
|
if accuracy is None:
|
298
|
-
accuracy =
|
303
|
+
accuracy = prec_bits_to_dec(64 * (self.gen.sizeword() - 2))
|
304
|
+
|
299
305
|
self.accuracy = min(accuracy, self.decimal_precision)
|
300
306
|
self._parent = SnapPyNumbers(self._precision)
|
301
307
|
if _within_sage:
|
@@ -575,7 +581,7 @@ class Number(Number_baseclass):
|
|
575
581
|
def sqrtn(self, n):
|
576
582
|
"""
|
577
583
|
>>> r = Number(2.0, precision=100)
|
578
|
-
>>> r.sqrtn(10)
|
584
|
+
>>> r.sqrtn(10) # doctest: +NUMERIC27
|
579
585
|
(1.071773462536293164213006325023, 0.809016994374947424102293417183 + 0.587785252292473129168705954639*I)
|
580
586
|
"""
|
581
587
|
a, b = self.gen.sqrtn(n, precision=self._precision)
|
snappy/numeric_output_checker.py
CHANGED
@@ -319,7 +319,7 @@ class NumericOutputChecker(doctest.OutputChecker):
|
|
319
319
|
return base_result + '\nReason for failure: ' + compare_result + '\n'
|
320
320
|
|
321
321
|
|
322
|
-
def run_doctests(verbose=False):
|
322
|
+
def run_doctests(verbose=False, print_info=True):
|
323
323
|
failed, attempted = 0, 0
|
324
324
|
|
325
325
|
finder = doctest.DocTestFinder()
|
@@ -342,5 +342,4 @@ def run_doctests(verbose=False):
|
|
342
342
|
|
343
343
|
return doctest.TestResults(failed, attempted)
|
344
344
|
|
345
|
-
|
346
|
-
run_doctests.__name__ = 'NumericOutputChecker'
|
345
|
+
run_doctests.__name__ = __name__
|
snappy/pari.py
CHANGED
@@ -3,7 +3,8 @@ Import pari and associated classes and functions here, to be more DRY,
|
|
3
3
|
while supporting both old and new versions of cypari and sage.pari and
|
4
4
|
accounting for all of the various idiosyncrasies.
|
5
5
|
"""
|
6
|
-
|
6
|
+
|
7
|
+
from packaging.version import parse as parse_version
|
7
8
|
from .sage_helper import _within_sage
|
8
9
|
|
9
10
|
if _within_sage:
|
@@ -13,11 +14,14 @@ if _within_sage:
|
|
13
14
|
raise ValueError("you need a more recent version of SageMath")
|
14
15
|
from sage.libs.pari import pari
|
15
16
|
from cypari2 import Gen
|
16
|
-
from cypari2.pari_instance import (
|
17
|
-
prec_words_to_bits,
|
17
|
+
from cypari2.pari_instance import (prec_words_to_bits,
|
18
18
|
prec_bits_to_dec,
|
19
19
|
prec_dec_to_bits)
|
20
|
-
|
20
|
+
try:
|
21
|
+
from sage.all import PariError
|
22
|
+
except ImportError:
|
23
|
+
from sage.libs.pari.all import PariError
|
24
|
+
|
21
25
|
shut_up = lambda: None
|
22
26
|
speak_up = lambda: None
|
23
27
|
|
snappy/phone_home.py
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
import sys
|
2
2
|
from threading import Thread
|
3
3
|
from .version import version as current
|
4
|
-
from
|
4
|
+
from packaging.version import parse as parse_version
|
5
|
+
|
5
6
|
import ssl
|
6
7
|
from urllib import request
|
7
8
|
version_url = 'http://snappy.computop.org/current.txt'
|