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
@@ -1,4 +1,7 @@
|
|
1
|
-
from ..matrix import
|
1
|
+
from ..matrix import make_matrix
|
2
|
+
from ..sage_helper import _within_sage
|
3
|
+
from ..exceptions import InsufficientPrecisionError
|
4
|
+
from ..math_basics import is_ComplexIntervalFieldElement
|
2
5
|
|
3
6
|
"""
|
4
7
|
|
@@ -36,7 +39,7 @@ complex 2x2-matrix and uses the isomorphism PGL(2,C)=PSL(2,C).
|
|
36
39
|
|
37
40
|
|
38
41
|
def sl2c_inverse(A):
|
39
|
-
return
|
42
|
+
return make_matrix([[A[1,1], -A[0, 1]], [-A[1, 0], A[0, 0]]])
|
40
43
|
|
41
44
|
|
42
45
|
def psl2c_to_o13(A):
|
@@ -46,8 +49,10 @@ def psl2c_to_o13(A):
|
|
46
49
|
Python implementation of Moebius_to_O31 in matrix_conversion.c.
|
47
50
|
"""
|
48
51
|
|
49
|
-
|
50
|
-
|
52
|
+
Aadj = _adjoint(A)
|
53
|
+
|
54
|
+
return make_matrix(
|
55
|
+
[ _o13_matrix_column(A, m, Aadj)
|
51
56
|
for m in _basis_vectors_sl2c(A.base_ring()) ]).transpose()
|
52
57
|
|
53
58
|
|
@@ -59,27 +64,83 @@ def pgl2c_to_o13(m):
|
|
59
64
|
"""
|
60
65
|
return psl2c_to_o13(m / m.det().sqrt())
|
61
66
|
|
67
|
+
def complex_length_of_psl2c_matrix(m):
|
68
|
+
"""
|
69
|
+
Complex length of translation corresponding to given PSL(2,C)
|
70
|
+
matrix.
|
62
71
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
[ 1 , 0 ]], ring=CF),
|
70
|
-
matrix([[ 0 , 1j],
|
71
|
-
[-1j, 0 ]], ring=CF) ]
|
72
|
+
Note that there is a branch cut here and we need to pick between
|
73
|
+
+/- 2 * arccosh(trace / 2).
|
74
|
+
|
75
|
+
We pick the cut with non-negative real part.
|
76
|
+
|
77
|
+
For non-verified computations, the real part will be non-negative.
|
72
78
|
|
79
|
+
For verified computations, the real part of the interval will contain
|
80
|
+
the non-negative real length. If the real length is very close to zero,
|
81
|
+
the real part of the interval might contain negative numbers as well.
|
82
|
+
"""
|
83
|
+
|
84
|
+
tr = m.trace()
|
85
|
+
if not tr.real() >= 0:
|
86
|
+
# SageMath's arccosh has a branch cut on (-inf, -1].
|
87
|
+
#
|
88
|
+
# Ideally, the complex interval version would make a choice when
|
89
|
+
# we cross the branch cut (like it does for log).
|
90
|
+
#
|
91
|
+
# However, it returns (-pi, pi) as imaginary part when we cross
|
92
|
+
# branch cut.
|
93
|
+
#
|
94
|
+
# So flip trace to avoid the branch cut.
|
95
|
+
|
96
|
+
tr = -tr
|
97
|
+
|
98
|
+
l = 2 * _arccosh(tr / 2)
|
99
|
+
|
100
|
+
# The result it +/-l. But which one is it?
|
101
|
+
|
102
|
+
if l.real() >= 0:
|
103
|
+
# It is unambiguous.
|
104
|
+
return l
|
105
|
+
if l.real() <= 0:
|
106
|
+
# It is unambiguous.
|
107
|
+
return -l
|
108
|
+
|
109
|
+
if is_ComplexIntervalFieldElement(l):
|
110
|
+
# It is ambiguous. Be conversative and take both.
|
111
|
+
return l.union(-l)
|
112
|
+
|
113
|
+
raise InsufficientPrecisionError(
|
114
|
+
"Encountered NaN when computing complex length of "
|
115
|
+
"matrix.\n"
|
116
|
+
"Trace: %r\n"
|
117
|
+
"Try increasing precision" % tr)
|
118
|
+
|
119
|
+
def _basis_vectors_sl2c(CF):
|
120
|
+
return [ make_matrix([[ 1 , 0 ],
|
121
|
+
[ 0, 1 ]], ring=CF),
|
122
|
+
make_matrix([[ 1 , 0 ],
|
123
|
+
[ 0 ,-1 ]], ring=CF),
|
124
|
+
make_matrix([[ 0 , 1 ],
|
125
|
+
[ 1 , 0 ]], ring=CF),
|
126
|
+
make_matrix([[ 0 , 1j],
|
127
|
+
[-1j, 0 ]], ring=CF) ]
|
73
128
|
|
74
129
|
def _adjoint(m):
|
75
|
-
return
|
76
|
-
|
130
|
+
return make_matrix([[ m[0][0].conjugate(), m[1][0].conjugate()],
|
131
|
+
[ m[0][1].conjugate(), m[1][1].conjugate()]])
|
77
132
|
|
78
133
|
|
79
|
-
def _o13_matrix_column(A, m):
|
80
|
-
fAmj = A * m *
|
134
|
+
def _o13_matrix_column(A, m, Aadj):
|
135
|
+
fAmj = A * m * Aadj
|
81
136
|
|
82
137
|
return [ (fAmj[0][0].real() + fAmj[1][1].real()) / 2,
|
83
138
|
(fAmj[0][0].real() - fAmj[1][1].real()) / 2,
|
84
139
|
fAmj[0][1].real(),
|
85
140
|
fAmj[0][1].imag() ]
|
141
|
+
|
142
|
+
if _within_sage:
|
143
|
+
from ..sage_helper import arccosh as _arccosh
|
144
|
+
else:
|
145
|
+
def _arccosh(z):
|
146
|
+
return z.arccosh()
|
snappy/verify/__init__.py
CHANGED
@@ -1,16 +1,12 @@
|
|
1
1
|
from .interval_newton_shapes_engine import *
|
2
2
|
from .krawczyk_shapes_engine import *
|
3
3
|
|
4
|
-
from .
|
5
|
-
|
6
|
-
from .
|
7
|
-
from .verifyCanonical import *
|
8
|
-
from .cuspTranslations import *
|
9
|
-
from .cusp_shapes import *
|
4
|
+
from .hyperbolicity import *
|
5
|
+
from .canonical import *
|
6
|
+
from .cusp_translations import *
|
10
7
|
from .volume import *
|
11
8
|
from .complex_volume import *
|
12
9
|
from .interval_tree import *
|
13
|
-
from .maximal_cusp_area_matrix import *
|
14
10
|
|
15
11
|
# Choice of algorithm for finding intervals
|
16
12
|
CertifiedShapesEngine = KrawczykShapesEngine
|
@@ -1,15 +1,15 @@
|
|
1
1
|
from ..sage_helper import _within_sage, sage_method
|
2
2
|
|
3
|
-
from .
|
4
|
-
from .
|
5
|
-
|
3
|
+
from ..geometric_structure.cusp_neighborhood.real_cusp_cross_section import RealCuspCrossSection
|
4
|
+
from ..snap.t3mlite import simplex
|
5
|
+
|
6
|
+
from .square_extensions import find_shapes_as_complex_sqrt_lin_combinations
|
7
|
+
from . import edge_equations
|
8
|
+
from . import hyperbolicity
|
6
9
|
from . import exceptions
|
7
10
|
from ..exceptions import SnapPeaFatalError
|
8
11
|
|
9
|
-
from ..snap import t3mlite as t3m
|
10
|
-
|
11
12
|
if _within_sage:
|
12
|
-
from sage.rings.real_mpfi import RealIntervalField
|
13
13
|
from sage.rings.complex_interval_field import ComplexIntervalField
|
14
14
|
from ..pari import prec_dec_to_bits, prec_bits_to_dec
|
15
15
|
|
@@ -26,7 +26,7 @@ default_exact_bits_prec_and_degrees = [( 212, 10),
|
|
26
26
|
(1000, 20),
|
27
27
|
(2000, 20)]
|
28
28
|
|
29
|
-
|
29
|
+
_num_tries_kernel_canonize = 3
|
30
30
|
_max_tries_verify_penalty = 9
|
31
31
|
|
32
32
|
|
@@ -90,7 +90,7 @@ def interval_checked_canonical_triangulation(M, bits_prec=None):
|
|
90
90
|
c = RealCuspCrossSection.fromManifoldAndShapes(M, shapes)
|
91
91
|
|
92
92
|
# Use interval arithmetics to verify hyperbolicity
|
93
|
-
|
93
|
+
hyperbolicity.check_logarithmic_gluing_equations_and_positively_oriented_tets(
|
94
94
|
M, shapes)
|
95
95
|
|
96
96
|
# Normalize cusp area. This is not needed when only 1 cusp
|
@@ -171,10 +171,10 @@ def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
|
|
171
171
|
# Check that the exact solutions form a complete hyperbolic structure
|
172
172
|
# We convert to intervals to check that the shapes are positive and
|
173
173
|
# the angles add up to 2pi and not some other multiple of 2pi.
|
174
|
-
|
174
|
+
edge_equations.check_polynomial_edge_equations_exactly(c.mcomplex)
|
175
175
|
c.check_cusp_development_exactly()
|
176
176
|
CIF = ComplexIntervalField(bits_prec)
|
177
|
-
|
177
|
+
edge_equations.check_logarithmic_edge_equations_and_positivity(c.mcomplex, CIF)
|
178
178
|
|
179
179
|
# Normalize cusp area. This is not needed when only 1 cusp
|
180
180
|
if M.num_cusps() > 1:
|
@@ -204,7 +204,7 @@ def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
|
|
204
204
|
raise exceptions.TiltProvenPositiveNumericalVerifyError(interval)
|
205
205
|
|
206
206
|
def index_of_face_corner(corner):
|
207
|
-
face_index =
|
207
|
+
face_index = simplex.comp(corner.Subsimplex).bit_length() - 1
|
208
208
|
return 4 * corner.Tetrahedron.Index + face_index
|
209
209
|
|
210
210
|
# Opacities of all four faces of each tetrahedron, initialize with None.
|
@@ -221,31 +221,34 @@ def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
|
|
221
221
|
if None in opacities:
|
222
222
|
raise Exception("Mismatch with opacities")
|
223
223
|
|
224
|
-
# If there are transparent faces,
|
224
|
+
# If there are transparent faces, the given triangulation is just the
|
225
225
|
# proto-canonical triangulation. We need to call into the SnapPea
|
226
226
|
# kernel to retriangulate (introduces finite vertices)
|
227
|
-
if
|
227
|
+
if not all(opacities):
|
228
228
|
return M._canonical_retriangulation(opacities)
|
229
229
|
|
230
|
-
# No transparent faces, this triangulation is the canonical
|
230
|
+
# No transparent faces, this triangulation itself is the canonical cell
|
231
|
+
# decomposition.
|
231
232
|
# Return it without introducing finite vertices.
|
232
233
|
return M
|
233
234
|
|
234
235
|
|
235
|
-
def _retrying_canonize(M):
|
236
|
+
def _retrying_canonize(M) -> None:
|
236
237
|
"""
|
237
238
|
Wrapper for SnapPea kernel's function to compute the proto-canonical
|
238
239
|
triangulation in place. It will retry the kernel function if it fails.
|
239
|
-
|
240
|
+
Raises an exception if it did not succeed eventually.
|
240
241
|
"""
|
241
|
-
|
242
|
+
err = ValueError('_num_tries_canonize is not positive.')
|
243
|
+
|
244
|
+
for i in range(_num_tries_kernel_canonize):
|
242
245
|
try:
|
243
246
|
M.canonize()
|
244
|
-
return
|
245
|
-
except (RuntimeError, SnapPeaFatalError):
|
247
|
+
return
|
248
|
+
except (RuntimeError, SnapPeaFatalError) as e:
|
249
|
+
err = e
|
246
250
|
M.randomize()
|
247
|
-
|
248
|
-
|
251
|
+
raise err
|
249
252
|
|
250
253
|
def _retrying_high_precision_canonize(M):
|
251
254
|
"""
|
@@ -253,23 +256,28 @@ def _retrying_high_precision_canonize(M):
|
|
253
256
|
triangulation. It will retry the kernel function if it fails, switching
|
254
257
|
to the quad-double implementation.
|
255
258
|
Returns the proto-canonical triangulation if the kernel function was
|
256
|
-
successful eventually. Otherwise
|
259
|
+
successful eventually. Otherwise, raises an exception.
|
260
|
+
The original manifold is unchanged.
|
257
261
|
"""
|
262
|
+
|
263
|
+
from .. import ManifoldHP
|
264
|
+
|
258
265
|
# Make a copy of the manifold
|
259
266
|
Mcopy = M.copy()
|
260
267
|
|
261
268
|
# Try with the given precision first
|
262
|
-
|
269
|
+
try:
|
270
|
+
_retrying_canonize(Mcopy)
|
263
271
|
return Mcopy
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
272
|
+
except (RuntimeError, SnapPeaFatalError) as e:
|
273
|
+
if isinstance(M, ManifoldHP):
|
274
|
+
# Already using high precision.
|
275
|
+
# Give up.
|
276
|
+
raise e
|
277
|
+
# Then try with high precision.
|
278
|
+
Mhp = M.high_precision()
|
279
|
+
_retrying_canonize(Mhp)
|
280
|
+
return Mhp.low_precision()
|
273
281
|
|
274
282
|
def _print_exception(e):
|
275
283
|
print('%s: %s' % (type(e).__name__, e))
|
@@ -317,9 +325,6 @@ def verified_canonical_retriangulation(
|
|
317
325
|
The exact arithmetics can take a long time. To circumvent it, use
|
318
326
|
``exact_bits_prec_and_degrees = None``.
|
319
327
|
|
320
|
-
More information on the canonical retriangulation can be found in the
|
321
|
-
SnapPea kernel ``canonize_part_2.c`` and in Section 3.1 of
|
322
|
-
`Fominykh, Garoufalidis, Goerner, Tarkaev, Vesnin <http://arxiv.org/abs/1502.00383>`_.
|
323
328
|
|
324
329
|
Canonical cell decomposition of ``m004`` has 2 tetrahedral cells::
|
325
330
|
|
@@ -365,7 +370,11 @@ def verified_canonical_retriangulation(
|
|
365
370
|
non-tetrahedral cells so interval arithmetics can't certify it)::
|
366
371
|
|
367
372
|
sage: M = Manifold("m412")
|
368
|
-
sage: verified_canonical_retriangulation(M, exact_bits_prec_and_degrees = None)
|
373
|
+
sage: verified_canonical_retriangulation(M, exact_bits_prec_and_degrees = None) # doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL
|
374
|
+
Traceback (most recent call last):
|
375
|
+
...
|
376
|
+
snappy.verify.exceptions.TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: ... < 0
|
377
|
+
|
369
378
|
"""
|
370
379
|
|
371
380
|
# This is the "outer" retry loop: it catches those verification
|
@@ -374,6 +383,8 @@ def verified_canonical_retriangulation(
|
|
374
383
|
|
375
384
|
tries_penalty_left = _max_tries_verify_penalty
|
376
385
|
|
386
|
+
err = ValueError("_max_tries_verify_penalty is not positive.")
|
387
|
+
|
377
388
|
while tries_penalty_left > 0:
|
378
389
|
try:
|
379
390
|
# The "inner" retry loop: it catches those verification
|
@@ -391,6 +402,8 @@ def verified_canonical_retriangulation(
|
|
391
402
|
exceptions.TiltProvenPositiveNumericalVerifyError,
|
392
403
|
exceptions.EdgeEquationExactVerifyError) as e:
|
393
404
|
|
405
|
+
err = e
|
406
|
+
|
394
407
|
# These three exceptions are probably raised due to the
|
395
408
|
# SnapPea kernel failures:
|
396
409
|
# - flat tetrahedra in the proto-canonical triangulation
|
@@ -436,50 +449,41 @@ def verified_canonical_retriangulation(
|
|
436
449
|
"proto_canonize.")
|
437
450
|
print("Next step: Give up.")
|
438
451
|
|
439
|
-
|
440
|
-
|
441
|
-
return None
|
452
|
+
raise e
|
442
453
|
|
454
|
+
raise err
|
443
455
|
|
444
456
|
def _verified_canonical_retriangulation(
|
445
457
|
M, interval_bits_precs, exact_bits_prec_and_degrees,
|
446
458
|
verbose):
|
459
|
+
"""
|
460
|
+
Implements the "inner" retry loop of verified_canonical_retriangulation
|
447
461
|
|
448
|
-
|
449
|
-
|
450
|
-
# If this returns None, it means that we have given up
|
451
|
-
# If it leaves Exceptions uncaught, the "outer" loop will randomize
|
452
|
-
# the triangulation.
|
453
|
-
|
454
|
-
num_complete_cusps = 0
|
455
|
-
num_incomplete_cusps = 0
|
456
|
-
for cusp_info in M.cusp_info():
|
457
|
-
if cusp_info['complete?']:
|
458
|
-
num_complete_cusps += 1
|
459
|
-
else:
|
460
|
-
num_incomplete_cusps += 1
|
462
|
+
Returns retriangulation or raises exception.
|
461
463
|
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
464
|
+
Some exceptions are caught by the "outer" loop to retry, using that
|
465
|
+
the SnapPea kernel uses a randomized algorithm to fill incomplete cusps
|
466
|
+
(if applicable) and perform the flips to find the proto-canonical
|
467
|
+
triangulation.
|
468
|
+
"""
|
467
469
|
|
468
|
-
|
469
|
-
if num_incomplete_cusps:
|
470
|
-
Mfilled = M.filled_triangulation()
|
471
|
-
else:
|
470
|
+
if all(M.cusp_info('complete?')):
|
472
471
|
Mfilled = M
|
472
|
+
else:
|
473
|
+
# Dehn-fill manifold first
|
474
|
+
Mfilled = M.filled_triangulation()
|
475
|
+
if not all(Mfilled.cusp_info('complete?')):
|
476
|
+
raise ValueError(
|
477
|
+
'Could not compute filled triangulation. '
|
478
|
+
'Are the filling coefficients co-prime integers?')
|
473
479
|
|
474
480
|
# Try to compute proto-canonical triangulation
|
475
481
|
Mcopy = _retrying_high_precision_canonize(Mfilled)
|
476
482
|
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
return None
|
482
|
-
|
483
|
+
err = ValueError(
|
484
|
+
'Neither interval_bits_precs nor exact_bits_prec_and_degrees was '
|
485
|
+
'non-empty.')
|
486
|
+
|
483
487
|
# First try interval arithmetics to verify
|
484
488
|
if interval_bits_precs:
|
485
489
|
for interval_bits_prec in interval_bits_precs:
|
@@ -489,7 +493,11 @@ def _verified_canonical_retriangulation(
|
|
489
493
|
try:
|
490
494
|
return interval_checked_canonical_triangulation(
|
491
495
|
Mcopy, interval_bits_prec)
|
492
|
-
except (RuntimeError,
|
496
|
+
except (RuntimeError,
|
497
|
+
ValueError, # Manifold.tetrahedra_shapes,
|
498
|
+
# KrawczykShapesEngine.log_gluing_LHSs
|
499
|
+
exceptions.NumericalVerifyError) as e:
|
500
|
+
err = e
|
493
501
|
if verbose:
|
494
502
|
_print_exception(e)
|
495
503
|
if isinstance(e, exceptions.NumericalVerifyError):
|
@@ -509,13 +517,13 @@ def _verified_canonical_retriangulation(
|
|
509
517
|
return exactly_checked_canonical_retriangulation(
|
510
518
|
Mcopy, bits_prec, degree)
|
511
519
|
except FindExactShapesError as e:
|
520
|
+
err = e
|
512
521
|
if verbose:
|
513
522
|
_print_exception(e)
|
514
523
|
print("Failure: Could not find exact shapes.")
|
515
524
|
print("Next step: trying different method/precision")
|
516
525
|
|
517
|
-
|
518
|
-
|
526
|
+
raise err
|
519
527
|
|
520
528
|
_known_canonical_retriangulations = [
|
521
529
|
('m004', '\x02\x0e\x01\x01\x01-\x1b\x87'),
|
@@ -1,21 +1,21 @@
|
|
1
1
|
from ...sage_helper import _within_sage, sage_method
|
2
2
|
from ...math_basics import prod
|
3
3
|
|
4
|
+
from ...geometric_structure.cusp_neighborhood.complex_cusp_cross_section import ComplexCuspCrossSection
|
4
5
|
from ...snap import peripheral
|
6
|
+
from ...snap.t3mlite import simplex
|
5
7
|
|
6
8
|
if _within_sage:
|
7
|
-
from sage.
|
8
|
-
import
|
9
|
+
from sage.symbolic.constants import pi
|
10
|
+
from ...sage_helper import I, xgcd
|
11
|
+
|
12
|
+
from .. import hyperbolicity
|
9
13
|
|
10
14
|
from .adjust_torsion import *
|
11
15
|
from .compute_ptolemys import *
|
12
|
-
from .. import verifyHyperbolicity
|
13
|
-
from ..cuspCrossSection import ComplexCuspCrossSection
|
14
|
-
from ...snap import t3mlite as t3m
|
15
16
|
|
16
17
|
__all__ = ['verified_complex_volume_closed_torsion']
|
17
18
|
|
18
|
-
|
19
19
|
def _compute_holonomy(manifold, shapes):
|
20
20
|
"""
|
21
21
|
Computes the holonomy for the peripheral curves for the given 1-cusped
|
@@ -52,7 +52,7 @@ def zero_lifted_holonomy(manifold, m, l, f):
|
|
52
52
|
multiple_of_pi = RIF(f*pi)
|
53
53
|
|
54
54
|
# (m_fill, l_fill) Dehn-filling
|
55
|
-
m_fill, l_fill =
|
55
|
+
m_fill, l_fill = (int(x) for x in manifold.cusp_info()[0]['filling'])
|
56
56
|
|
57
57
|
# Compute what the peripheral curves goes to right now
|
58
58
|
p_interval = (m_fill * m + l_fill * l).imag() / multiple_of_pi
|
@@ -68,8 +68,8 @@ def zero_lifted_holonomy(manifold, m, l, f):
|
|
68
68
|
|
69
69
|
# Compute by what multiple of 2 pi i to adjust
|
70
70
|
g, a, b = xgcd(m_fill, l_fill)
|
71
|
-
m -= p * a * multiple_of_pi *
|
72
|
-
l -= p * b * multiple_of_pi *
|
71
|
+
m -= p * a * multiple_of_pi * I
|
72
|
+
l -= p * b * multiple_of_pi * I
|
73
73
|
|
74
74
|
# For sanity, double check that we compute it right.
|
75
75
|
p_interval = (m_fill * m + l_fill * l).imag() / multiple_of_pi
|
@@ -116,7 +116,7 @@ def verified_complex_volume_closed_torsion(manifold, bits_prec=None):
|
|
116
116
|
'rect', bits_prec=bits_prec, intervals=True)
|
117
117
|
|
118
118
|
# Check it is a valid hyperbolic structure
|
119
|
-
|
119
|
+
hyperbolicity.check_logarithmic_gluing_equations_and_positively_oriented_tets(
|
120
120
|
manifold, shapes)
|
121
121
|
|
122
122
|
# Compute holonomy
|
@@ -128,8 +128,8 @@ def verified_complex_volume_closed_torsion(manifold, bits_prec=None):
|
|
128
128
|
# Keys for the dual edges in cusp triangulation
|
129
129
|
cusp_dual_edges = [ (i, F, V)
|
130
130
|
for i in range(manifold.num_tetrahedra())
|
131
|
-
for F in
|
132
|
-
for V in
|
131
|
+
for F in simplex.TwoSubsimplices
|
132
|
+
for V in simplex.ZeroSubsimplices
|
133
133
|
if F & V ]
|
134
134
|
|
135
135
|
# Compute 1-cocycle in C^1(boundary; C^*) matching the holonomy
|
@@ -165,4 +165,4 @@ def verified_complex_volume_closed_torsion(manifold, bits_prec=None):
|
|
165
165
|
# I.
|
166
166
|
# Also add multiples of pi^2/2 to try to get the Chern-Simons part
|
167
167
|
# between -pi^2/4 and pi^2/4.
|
168
|
-
return normalize_by_pi_square_over_two(complex_volume) /
|
168
|
+
return normalize_by_pi_square_over_two(complex_volume) / I
|
@@ -1,13 +1,13 @@
|
|
1
1
|
from ...sage_helper import _within_sage, sage_method
|
2
2
|
|
3
3
|
if _within_sage:
|
4
|
-
import
|
4
|
+
from ...sage_helper import I
|
5
|
+
|
6
|
+
from .. import hyperbolicity
|
7
|
+
from ...geometric_structure.cusp_neighborhood.complex_cusp_cross_section import ComplexCuspCrossSection
|
5
8
|
|
6
9
|
from .adjust_torsion import *
|
7
10
|
from .compute_ptolemys import *
|
8
|
-
from .. import verifyHyperbolicity
|
9
|
-
from ..cuspCrossSection import ComplexCuspCrossSection
|
10
|
-
from ...snap import t3mlite as t3m
|
11
11
|
|
12
12
|
__all__ = ['verified_complex_volume_cusped_torsion']
|
13
13
|
|
@@ -32,7 +32,7 @@ def verified_complex_volume_cusped_torsion(manifold, bits_prec=None):
|
|
32
32
|
'rect', bits_prec=bits_prec, intervals=True)
|
33
33
|
|
34
34
|
# Check it is a valid hyperbolic structure
|
35
|
-
|
35
|
+
hyperbolicity.check_logarithmic_gluing_equations_and_positively_oriented_tets(
|
36
36
|
manifold, shapes)
|
37
37
|
|
38
38
|
# Compute cusp cross section. For computation of complex volume,
|
@@ -53,4 +53,4 @@ def verified_complex_volume_cusped_torsion(manifold, bits_prec=None):
|
|
53
53
|
# I.
|
54
54
|
# Also add multiples of pi^2/2 to try to get the Chern-Simons part
|
55
55
|
# between -pi^2/4 and pi^2/4.
|
56
|
-
return normalize_by_pi_square_over_two(complex_volume) /
|
56
|
+
return normalize_by_pi_square_over_two(complex_volume) / I
|
@@ -1,11 +1,8 @@
|
|
1
1
|
from ...sage_helper import _within_sage, sage_method
|
2
2
|
|
3
3
|
if _within_sage:
|
4
|
-
from sage.
|
5
|
-
|
6
|
-
Integer, exp, pi)
|
7
|
-
|
8
|
-
import sage.all
|
4
|
+
from sage.symbolic.constants import pi
|
5
|
+
from ...sage_helper import I, Integer, RealField, ComplexBallField, exp
|
9
6
|
|
10
7
|
|
11
8
|
@sage_method
|
@@ -106,8 +103,8 @@ def compute_Neumanns_Rogers_dilog_from_flattening_w0_w1(w0, w1):
|
|
106
103
|
|
107
104
|
# Note that the values computed for log(z) and log(1-z)
|
108
105
|
# are not verified to have the imaginary part between -pi and pi.
|
109
|
-
logZ = w0 - my_pi * p *
|
110
|
-
logOneMinusZ = - (w1 - my_pi * q *
|
106
|
+
logZ = w0 - my_pi * p * I
|
107
|
+
logOneMinusZ = - (w1 - my_pi * q * I)
|
111
108
|
|
112
109
|
# Neumann's formula for the complex volume is
|
113
110
|
#
|
@@ -143,7 +140,7 @@ def compute_Neumanns_Rogers_dilog_from_flattening_w0_w1(w0, w1):
|
|
143
140
|
# Similar considerations apply to (2) used when Re(z) > 1/2.
|
144
141
|
|
145
142
|
term1 = logZ * logOneMinusZ
|
146
|
-
term2 = my_pi *
|
143
|
+
term2 = my_pi * I * (p * logOneMinusZ + q * logZ)
|
147
144
|
|
148
145
|
if z.real().center() < 0.5:
|
149
146
|
# Check that we can apply equation (1)
|
@@ -1,5 +1,5 @@
|
|
1
|
+
from ..geometric_structure.cusp_neighborhood.complex_cusp_cross_section import ComplexCuspCrossSection
|
1
2
|
from .shapes import compute_hyperbolic_shapes
|
2
|
-
from .cuspCrossSection import ComplexCuspCrossSection
|
3
3
|
|
4
4
|
__all__ = ['cusp_translations_for_manifold',
|
5
5
|
'cusp_translations_for_neighborhood']
|
@@ -0,0 +1,80 @@
|
|
1
|
+
from .exceptions import *
|
2
|
+
|
3
|
+
from ..snap.t3mlite import simplex
|
4
|
+
|
5
|
+
def check_polynomial_edge_equations_exactly(mcomplex):
|
6
|
+
"""
|
7
|
+
Check that the polynomial edge equations are fulfilled exactly.
|
8
|
+
|
9
|
+
We use the conjugate inverse to support non-orientable manifolds.
|
10
|
+
"""
|
11
|
+
|
12
|
+
# For each edge
|
13
|
+
for edge in mcomplex.Edges:
|
14
|
+
# The exact value when evaluating the edge equation
|
15
|
+
val = 1
|
16
|
+
|
17
|
+
# Iterate through edge embeddings
|
18
|
+
for tet, perm in edge.embeddings():
|
19
|
+
# Accumulate shapes of the edge exactly
|
20
|
+
val *= _shape_for_edge_embedding(tet, perm)
|
21
|
+
|
22
|
+
if not val == 1:
|
23
|
+
raise EdgeEquationExactVerifyError(val)
|
24
|
+
|
25
|
+
def check_logarithmic_edge_equations_and_positivity(mcomplex, NumericalField):
|
26
|
+
"""
|
27
|
+
Check that the shapes have positive imaginary part and that the
|
28
|
+
logarithmic gluing equations have small error.
|
29
|
+
|
30
|
+
The shapes are coerced into the field given as argument before the
|
31
|
+
logarithm is computed. It can be, e.g., a ComplexIntervalField.
|
32
|
+
"""
|
33
|
+
|
34
|
+
# For each edge
|
35
|
+
for edge in mcomplex.Edges:
|
36
|
+
|
37
|
+
# The complex interval arithmetic value of the logarithmic
|
38
|
+
# version of the edge equation.
|
39
|
+
log_sum = 0
|
40
|
+
|
41
|
+
# Iterate through edge embeddings
|
42
|
+
for tet, perm in edge.embeddings():
|
43
|
+
|
44
|
+
shape = _shape_for_edge_embedding(tet, perm)
|
45
|
+
|
46
|
+
numerical_shape = NumericalField(shape)
|
47
|
+
|
48
|
+
log_shape = numerical_shape.log()
|
49
|
+
|
50
|
+
# Note that this is true for z in R, R < 0 as well,
|
51
|
+
# but then it would fail for 1 - 1/z or 1 / (1-z)
|
52
|
+
|
53
|
+
if not (log_shape.imag() > 0):
|
54
|
+
raise ShapePositiveImaginaryPartNumericalVerifyError(
|
55
|
+
numerical_shape)
|
56
|
+
|
57
|
+
# Take logarithm and accumulate
|
58
|
+
log_sum += log_shape
|
59
|
+
|
60
|
+
twoPiI = NumericalField.pi() * NumericalField(2j)
|
61
|
+
|
62
|
+
if not abs(log_sum - twoPiI) < NumericalField(1e-7):
|
63
|
+
raise EdgeEquationLogLiftNumericalVerifyError(log_sum)
|
64
|
+
|
65
|
+
def _shape_for_edge_embedding(tet, perm):
|
66
|
+
"""
|
67
|
+
Given an edge embedding, find the shape assignment for it.
|
68
|
+
If the edge embedding flips orientation, apply conjugate inverse.
|
69
|
+
"""
|
70
|
+
|
71
|
+
# Get the shape for this edge embedding
|
72
|
+
subsimplex = perm.image(simplex.E01)
|
73
|
+
|
74
|
+
# Figure out the orientation of this tetrahedron
|
75
|
+
# with respect to the edge, apply conjugate inverse
|
76
|
+
# if differ
|
77
|
+
if perm.sign():
|
78
|
+
return 1 / tet.ShapeParameters[subsimplex].conjugate()
|
79
|
+
else:
|
80
|
+
return tet.ShapeParameters[subsimplex]
|