snappy 3.1__cp38-cp38-win_amd64.whl → 3.2__cp38-cp38-win_amd64.whl
Sign up to get free protection for your applications and to get access to all the features.
- 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 -70
- 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 -180
- 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 +116 -86
- 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.dist-info → snappy-3.2.dist-info}/METADATA +14 -10
- snappy-3.2.dist-info/RECORD +503 -0
- {snappy-3.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
- {snappy-3.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.dist-info/RECORD +0 -575
- {snappy-3.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]
|