snappy 3.0.3__cp38-cp38-macosx_11_0_arm64.whl → 3.2__cp38-cp38-macosx_11_0_arm64.whl
Sign up to get free protection for your applications and to get access to all the features.
- snappy/CyOpenGL.cpython-38-darwin.so +0 -0
- snappy/SnapPy.cpython-38-darwin.so +0 -0
- snappy/SnapPyHP.cpython-38-darwin.so +0 -0
- snappy/__init__.py +373 -426
- snappy/app.py +240 -75
- snappy/app_menus.py +93 -78
- snappy/browser.py +87 -63
- snappy/cache.py +5 -8
- snappy/canonical.py +249 -0
- snappy/{verify/cusp_shapes.py → cusps/__init__.py} +11 -19
- snappy/cusps/cusp_area_matrix.py +101 -0
- snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +39 -54
- 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 +40 -31
- snappy/db_utilities.py +13 -14
- snappy/decorated_isosig.py +377 -133
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +42 -9
- snappy/dev/extended_ptolemy/extended.py +32 -25
- snappy/dev/extended_ptolemy/giac_rur.py +23 -8
- snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
- snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +2 -1
- snappy/dev/vericlosed/gimbalLoopFinder.py +5 -5
- snappy/dev/vericlosed/hyperbolicStructure.py +3 -3
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +2 -2
- snappy/dev/vericlosed/truncatedComplex.py +3 -2
- snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +4 -3
- snappy/doc/_images/geodesics.jpg +0 -0
- 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 +1 -0
- snappy/doc/_sources/credits.rst.txt +6 -1
- snappy/doc/_sources/development.rst.txt +69 -50
- snappy/doc/_sources/index.rst.txt +101 -66
- snappy/doc/_sources/installing.rst.txt +148 -165
- snappy/doc/_sources/news.rst.txt +136 -32
- snappy/doc/_sources/ptolemy.rst.txt +1 -1
- snappy/doc/_sources/ptolemy_examples1.rst.txt +9 -8
- snappy/doc/_sources/ptolemy_examples2.rst.txt +3 -3
- snappy/doc/_sources/ptolemy_examples3.rst.txt +14 -14
- snappy/doc/_sources/ptolemy_prelim.rst.txt +1 -1
- snappy/doc/_sources/snap.rst.txt +2 -2
- snappy/doc/_sources/snappy.rst.txt +1 -1
- snappy/doc/_sources/triangulation.rst.txt +3 -2
- snappy/doc/_sources/verify.rst.txt +89 -29
- snappy/doc/_sources/verify_internals.rst.txt +5 -16
- snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
- snappy/doc/_static/SnapPy.ico +0 -0
- snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
- snappy/doc/_static/basic.css +47 -27
- snappy/doc/_static/css/badge_only.css +1 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
- snappy/doc/_static/css/theme.css +4 -0
- snappy/doc/_static/doctools.js +107 -274
- snappy/doc/_static/documentation_options.js +6 -5
- 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/jquery.js +2 -2
- snappy/doc/_static/js/badge_only.js +1 -0
- snappy/doc/_static/js/theme.js +1 -0
- snappy/doc/_static/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +3 -101
- snappy/doc/_static/pygments.css +1 -0
- snappy/doc/_static/searchtools.js +489 -398
- snappy/doc/_static/snappy_furo.css +33 -0
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
- snappy/doc/_static/sphinx_highlight.js +154 -0
- snappy/doc/additional_classes.html +688 -263
- snappy/doc/bugs.html +107 -94
- snappy/doc/censuses.html +155 -127
- snappy/doc/credits.html +115 -104
- snappy/doc/development.html +184 -146
- snappy/doc/genindex.html +287 -204
- snappy/doc/index.html +189 -150
- snappy/doc/installing.html +259 -266
- snappy/doc/manifold.html +1626 -592
- snappy/doc/manifoldhp.html +119 -105
- snappy/doc/news.html +198 -104
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +117 -105
- snappy/doc/platonic_census.html +161 -114
- snappy/doc/plink.html +113 -105
- snappy/doc/ptolemy.html +131 -108
- snappy/doc/ptolemy_classes.html +242 -223
- snappy/doc/ptolemy_examples1.html +144 -130
- snappy/doc/ptolemy_examples2.html +141 -129
- snappy/doc/ptolemy_examples3.html +148 -132
- snappy/doc/ptolemy_examples4.html +131 -111
- snappy/doc/ptolemy_prelim.html +162 -138
- snappy/doc/py-modindex.html +104 -69
- snappy/doc/screenshots.html +117 -108
- snappy/doc/search.html +115 -84
- snappy/doc/searchindex.js +1 -1
- snappy/doc/snap.html +109 -96
- snappy/doc/snappy.html +134 -97
- snappy/doc/spherogram.html +259 -187
- snappy/doc/todo.html +107 -94
- snappy/doc/triangulation.html +1380 -111
- snappy/doc/tutorial.html +107 -94
- snappy/doc/verify.html +194 -125
- snappy/doc/verify_internals.html +248 -686
- snappy/drilling/__init__.py +456 -0
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +5 -0
- snappy/drilling/crush.py +270 -0
- snappy/drilling/cusps.py +125 -0
- snappy/drilling/debug.py +242 -0
- snappy/drilling/epsilons.py +6 -0
- snappy/drilling/exceptions.py +55 -0
- snappy/drilling/moves.py +620 -0
- snappy/drilling/peripheral_curves.py +210 -0
- snappy/drilling/perturb.py +188 -0
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +274 -0
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +126 -0
- snappy/drilling/tracing.py +351 -0
- snappy/exceptions.py +23 -3
- snappy/export_stl.py +20 -14
- snappy/exterior_to_link/__init__.py +2 -0
- snappy/exterior_to_link/barycentric_geometry.py +463 -0
- snappy/exterior_to_link/exceptions.py +6 -0
- snappy/exterior_to_link/geodesic_map.json +14408 -0
- snappy/exterior_to_link/hyp_utils.py +112 -0
- snappy/exterior_to_link/link_projection.py +323 -0
- snappy/exterior_to_link/main.py +197 -0
- snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
- snappy/exterior_to_link/mcomplex_with_link.py +687 -0
- snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
- snappy/exterior_to_link/pl_utils.py +491 -0
- snappy/exterior_to_link/put_in_S3.py +156 -0
- snappy/exterior_to_link/rational_linear_algebra.py +123 -0
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
- snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
- snappy/exterior_to_link/stored_moves.py +475 -0
- snappy/exterior_to_link/test.py +31 -0
- 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/geometric_structure/geodesic/fixed_points.py +93 -0
- snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
- 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 +36 -36
- snappy/horoviewer.py +50 -48
- snappy/hyperboloid/__init__.py +212 -0
- 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/{infodialog.py → infowindow.py} +32 -33
- 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/manifolds/__init__.py +1 -1
- snappy/math_basics.py +176 -0
- snappy/matrix.py +525 -0
- snappy/number.py +97 -21
- snappy/numeric_output_checker.py +37 -27
- snappy/pari.py +30 -69
- snappy/phone_home.py +25 -20
- snappy/polyviewer.py +39 -37
- snappy/ptolemy/__init__.py +4 -6
- snappy/ptolemy/component.py +14 -12
- snappy/ptolemy/coordinates.py +312 -295
- snappy/ptolemy/fieldExtensions.py +14 -12
- snappy/ptolemy/findLoops.py +43 -31
- snappy/ptolemy/geometricRep.py +24 -26
- snappy/ptolemy/homology.py +12 -7
- snappy/ptolemy/manifoldMethods.py +69 -70
- snappy/ptolemy/matrix.py +65 -26
- snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +18 -14
- snappy/ptolemy/polynomial.py +125 -119
- snappy/ptolemy/processComponents.py +36 -30
- snappy/ptolemy/processFileBase.py +79 -18
- snappy/ptolemy/processFileDispatch.py +13 -14
- snappy/ptolemy/processMagmaFile.py +44 -39
- snappy/ptolemy/processRurFile.py +18 -11
- snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +20 -17
- snappy/ptolemy/ptolemyObstructionClass.py +13 -17
- snappy/ptolemy/ptolemyVariety.py +190 -121
- snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +20 -19
- snappy/ptolemy/reginaWrapper.py +25 -29
- snappy/ptolemy/rur.py +6 -14
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +27 -22
- snappy/ptolemy/test.py +247 -188
- snappy/ptolemy/utilities.py +41 -43
- 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 +10 -6
- snappy/raytracing/eyeball.py +123 -0
- snappy/raytracing/finite_raytracing_data.py +48 -38
- snappy/raytracing/finite_viewer.py +218 -210
- snappy/raytracing/geodesic_tube_info.py +174 -0
- snappy/raytracing/geodesics.py +246 -0
- snappy/raytracing/geodesics_window.py +258 -0
- snappy/raytracing/gui_utilities.py +152 -40
- snappy/raytracing/hyperboloid_navigation.py +102 -52
- snappy/raytracing/hyperboloid_utilities.py +114 -261
- snappy/raytracing/ideal_raytracing_data.py +256 -179
- snappy/raytracing/inside_viewer.py +522 -253
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +46 -34
- snappy/raytracing/raytracing_view.py +190 -109
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +60 -4
- snappy/raytracing/shaders/fragment.glsl +575 -148
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +98 -0
- snappy/raytracing/view_scale_controller.py +98 -0
- snappy/raytracing/zoom_slider/__init__.py +32 -29
- snappy/raytracing/zoom_slider/test.py +2 -0
- snappy/sage_helper.py +69 -123
- snappy/{preferences.py → settings.py} +167 -145
- snappy/shell.py +4 -0
- snappy/snap/__init__.py +12 -8
- snappy/snap/character_varieties.py +24 -18
- snappy/snap/find_field.py +35 -34
- snappy/snap/fundamental_polyhedron.py +99 -85
- snappy/snap/generators.py +6 -8
- snappy/snap/interval_reps.py +18 -6
- snappy/snap/kernel_structures.py +8 -3
- snappy/snap/mcomplex_base.py +1 -2
- snappy/snap/nsagetools.py +107 -53
- snappy/snap/peripheral/__init__.py +1 -1
- snappy/snap/peripheral/dual_cellulation.py +15 -7
- snappy/snap/peripheral/link.py +20 -16
- snappy/snap/peripheral/peripheral.py +22 -14
- snappy/snap/peripheral/surface.py +47 -50
- snappy/snap/peripheral/test.py +8 -8
- snappy/snap/polished_reps.py +65 -40
- snappy/snap/shapes.py +41 -22
- snappy/snap/slice_obs_HKL.py +64 -25
- snappy/snap/t3mlite/arrow.py +88 -51
- snappy/snap/t3mlite/corner.py +5 -6
- snappy/snap/t3mlite/edge.py +32 -21
- snappy/snap/t3mlite/face.py +7 -9
- snappy/snap/t3mlite/files.py +31 -23
- snappy/snap/t3mlite/homology.py +14 -10
- snappy/snap/t3mlite/linalg.py +158 -56
- snappy/snap/t3mlite/mcomplex.py +739 -291
- snappy/snap/t3mlite/perm4.py +236 -84
- snappy/snap/t3mlite/setup.py +9 -10
- snappy/snap/t3mlite/simplex.py +65 -48
- snappy/snap/t3mlite/spun.py +42 -30
- snappy/snap/t3mlite/surface.py +45 -45
- snappy/snap/t3mlite/test.py +3 -0
- snappy/snap/t3mlite/test_vs_regina.py +17 -13
- snappy/snap/t3mlite/tetrahedron.py +25 -24
- snappy/snap/t3mlite/vertex.py +8 -13
- snappy/snap/test.py +45 -52
- snappy/snap/utilities.py +66 -65
- snappy/test.py +155 -158
- 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 +313 -203
- snappy/twister/main.py +1 -8
- snappy/twister/twister_core.cpython-38-darwin.so +0 -0
- snappy/upper_halfspace/__init__.py +146 -0
- snappy/upper_halfspace/ideal_point.py +26 -0
- snappy/verify/__init__.py +4 -8
- snappy/verify/{verifyCanonical.py → canonical.py} +114 -97
- snappy/verify/complex_volume/__init__.py +3 -2
- snappy/verify/complex_volume/adjust_torsion.py +13 -11
- snappy/verify/complex_volume/closed.py +29 -24
- snappy/verify/complex_volume/compute_ptolemys.py +8 -6
- snappy/verify/complex_volume/cusped.py +10 -9
- snappy/verify/complex_volume/extended_bloch.py +14 -12
- snappy/verify/{cuspTranslations.py → cusp_translations.py} +15 -14
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +23 -56
- snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +19 -15
- snappy/verify/interval_newton_shapes_engine.py +51 -211
- snappy/verify/interval_tree.py +27 -25
- snappy/verify/krawczyk_shapes_engine.py +47 -50
- snappy/verify/maximal_cusp_area_matrix/__init__.py +17 -86
- snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +58 -48
- snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +53 -57
- snappy/verify/{realAlgebra.py → real_algebra.py} +26 -20
- snappy/verify/shapes.py +10 -7
- snappy/verify/short_slopes.py +41 -42
- snappy/verify/{squareExtensions.py → square_extensions.py} +96 -92
- snappy/verify/test.py +59 -57
- snappy/verify/upper_halfspace/extended_matrix.py +5 -5
- snappy/verify/upper_halfspace/finite_point.py +44 -31
- snappy/verify/upper_halfspace/ideal_point.py +69 -57
- snappy/verify/volume.py +15 -12
- snappy/version.py +2 -3
- {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/METADATA +14 -12
- snappy-3.2.dist-info/RECORD +503 -0
- {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
- {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -1
- {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/top_level.txt +10 -1
- snappy/doc/_sources/verify_canon.rst.txt +0 -90
- snappy/doc/_static/classic.css +0 -266
- snappy/doc/_static/jquery-3.5.1.js +0 -10872
- snappy/doc/_static/sidebar.js +0 -159
- snappy/doc/_static/underscore-1.13.1.js +0 -2042
- snappy/doc/_static/underscore.js +0 -6
- snappy/doc/verify_canon.html +0 -283
- snappy/ppm_to_png.py +0 -243
- 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/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/verify/cuspCrossSection.py +0 -1413
- snappy/verify/mathHelpers.py +0 -64
- snappy-3.0.3.dist-info/RECORD +0 -360
snappy/twister/main.py
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
### Required modules:
|
2
2
|
# Some standard modules.
|
3
|
-
from __future__ import print_function
|
4
3
|
import os
|
5
4
|
from random import choice
|
6
5
|
from itertools import combinations
|
@@ -9,12 +8,6 @@ import snappy
|
|
9
8
|
from plink import LinkManager
|
10
9
|
from .twister_core import build_bundle, build_splitting, twister_version
|
11
10
|
|
12
|
-
# Python 3 compatibility
|
13
|
-
try:
|
14
|
-
basestring
|
15
|
-
except NameError: # Python 3
|
16
|
-
basestring = unicode = str
|
17
|
-
|
18
11
|
surface_database_path = os.path.join(os.path.dirname(__file__), 'surfaces')
|
19
12
|
surface_database = set(os.listdir(surface_database_path))
|
20
13
|
version = twister_version()
|
@@ -23,7 +16,7 @@ def _get_surface(surface):
|
|
23
16
|
if isinstance(surface, tuple) and len(surface) == 2 and isinstance(surface[0], int) and isinstance(surface[1], int):
|
24
17
|
return LP_surface(surface[0], surface[1])
|
25
18
|
|
26
|
-
if isinstance(surface,
|
19
|
+
if isinstance(surface, str):
|
27
20
|
# If surface is actually the contents of a surface file.
|
28
21
|
if surface.startswith('# A Twister surface file'):
|
29
22
|
return surface
|
Binary file
|
@@ -0,0 +1,146 @@
|
|
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
|
5
|
+
|
6
|
+
"""
|
7
|
+
|
8
|
+
upper_halfspace contains methods relating to the upper halfspace model
|
9
|
+
|
10
|
+
H^3 = { w = z + ti : t > 0 }
|
11
|
+
|
12
|
+
with a PSL(2,C)-matrix m = [[a,b],[c,d]] acting as
|
13
|
+
|
14
|
+
w |-> (a * w + b)^-1 * (c * w + d)
|
15
|
+
|
16
|
+
It also contains methods converting from the upper halfspace model to
|
17
|
+
other models of hyperbolic space including the conversion psl2c_to_o13.
|
18
|
+
|
19
|
+
Points on the boundary C union {infty} of H^3 can be stored by either
|
20
|
+
assigning a complex number or the sentinel
|
21
|
+
upper_halfspace.ideal_point.Infinity to a variable. Functions using this
|
22
|
+
representations of the boundary of H^3 are in ideal_point.
|
23
|
+
|
24
|
+
Conventions:
|
25
|
+
|
26
|
+
A SL(2,C)-matrix is a matrix constructed by snappy.matrix.matrix(...)
|
27
|
+
(that is either snappy's own SimpleMatrix or a SageMath matrix type)
|
28
|
+
with base_ring being a complex type (either a SnapPy.Number or one
|
29
|
+
of SageMath's complex types including ComplexIntervalField, but not
|
30
|
+
python's native complex type, e.g., 1 + 1j) and determinant being one.
|
31
|
+
|
32
|
+
psl2c in a function name indicates that the function takes an SL(2,C)-matrix
|
33
|
+
and the result (at least up rounding errors) does change when multiplying
|
34
|
+
by -1.
|
35
|
+
|
36
|
+
pgl2c in a function name indicates that the function takes any non-degenerate
|
37
|
+
complex 2x2-matrix and uses the isomorphism PGL(2,C)=PSL(2,C).
|
38
|
+
"""
|
39
|
+
|
40
|
+
|
41
|
+
def sl2c_inverse(A):
|
42
|
+
return make_matrix([[A[1,1], -A[0, 1]], [-A[1, 0], A[0, 0]]])
|
43
|
+
|
44
|
+
|
45
|
+
def psl2c_to_o13(A):
|
46
|
+
"""
|
47
|
+
Converts matrix in PSL(2,C) to O13.
|
48
|
+
|
49
|
+
Python implementation of Moebius_to_O31 in matrix_conversion.c.
|
50
|
+
"""
|
51
|
+
|
52
|
+
Aadj = _adjoint(A)
|
53
|
+
|
54
|
+
return make_matrix(
|
55
|
+
[ _o13_matrix_column(A, m, Aadj)
|
56
|
+
for m in _basis_vectors_sl2c(A.base_ring()) ]).transpose()
|
57
|
+
|
58
|
+
|
59
|
+
def pgl2c_to_o13(m):
|
60
|
+
"""
|
61
|
+
Converts matrix in PGL(2,C) to O13.
|
62
|
+
|
63
|
+
Python implementation of Moebius_to_O31 in matrix_conversion.c.
|
64
|
+
"""
|
65
|
+
return psl2c_to_o13(m / m.det().sqrt())
|
66
|
+
|
67
|
+
def complex_length_of_psl2c_matrix(m):
|
68
|
+
"""
|
69
|
+
Complex length of translation corresponding to given PSL(2,C)
|
70
|
+
matrix.
|
71
|
+
|
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.
|
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) ]
|
128
|
+
|
129
|
+
def _adjoint(m):
|
130
|
+
return make_matrix([[ m[0][0].conjugate(), m[1][0].conjugate()],
|
131
|
+
[ m[0][1].conjugate(), m[1][1].conjugate()]])
|
132
|
+
|
133
|
+
|
134
|
+
def _o13_matrix_column(A, m, Aadj):
|
135
|
+
fAmj = A * m * Aadj
|
136
|
+
|
137
|
+
return [ (fAmj[0][0].real() + fAmj[1][1].real()) / 2,
|
138
|
+
(fAmj[0][0].real() - fAmj[1][1].real()) / 2,
|
139
|
+
fAmj[0][1].real(),
|
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()
|
@@ -0,0 +1,26 @@
|
|
1
|
+
from ..matrix import vector
|
2
|
+
|
3
|
+
__all__ = ['Infinity', 'ideal_point_to_r13']
|
4
|
+
|
5
|
+
Infinity = 'Infinity'
|
6
|
+
|
7
|
+
|
8
|
+
def ideal_point_to_r13(z, RF):
|
9
|
+
"""
|
10
|
+
Takes a boundary point z of H^3, that is either a complex number
|
11
|
+
or Infinite, and a real field type.
|
12
|
+
|
13
|
+
Returns the corresponding unit light vector in the hyperboloid model.
|
14
|
+
"""
|
15
|
+
if z == Infinity:
|
16
|
+
return vector([RF(1), RF(1), RF(0), RF(0)])
|
17
|
+
|
18
|
+
z_re = z.real()
|
19
|
+
z_im = z.imag()
|
20
|
+
z_abs_sqr = z_re**2 + z_im**2
|
21
|
+
denom = z_abs_sqr + 1
|
22
|
+
|
23
|
+
return vector([RF(1),
|
24
|
+
(z_abs_sqr - 1) / denom,
|
25
|
+
2 * z_re / denom,
|
26
|
+
2 * z_im / denom])
|
snappy/verify/__init__.py
CHANGED
@@ -1,17 +1,13 @@
|
|
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
|
17
|
-
#CertifiedShapesEngine = IntervalNewtonShapesEngine
|
13
|
+
# CertifiedShapesEngine = IntervalNewtonShapesEngine
|
@@ -1,17 +1,15 @@
|
|
1
|
-
from __future__ import print_function
|
2
|
-
|
3
1
|
from ..sage_helper import _within_sage, sage_method
|
4
2
|
|
5
|
-
from .
|
6
|
-
from .
|
7
|
-
|
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
|
8
9
|
from . import exceptions
|
9
10
|
from ..exceptions import SnapPeaFatalError
|
10
11
|
|
11
|
-
from ..snap import t3mlite as t3m
|
12
|
-
|
13
12
|
if _within_sage:
|
14
|
-
from sage.rings.real_mpfi import RealIntervalField
|
15
13
|
from sage.rings.complex_interval_field import ComplexIntervalField
|
16
14
|
from ..pari import prec_dec_to_bits, prec_bits_to_dec
|
17
15
|
|
@@ -28,23 +26,25 @@ default_exact_bits_prec_and_degrees = [( 212, 10),
|
|
28
26
|
(1000, 20),
|
29
27
|
(2000, 20)]
|
30
28
|
|
31
|
-
|
29
|
+
_num_tries_kernel_canonize = 3
|
32
30
|
_max_tries_verify_penalty = 9
|
33
31
|
|
32
|
+
|
34
33
|
class FindExactShapesError(RuntimeError):
|
35
34
|
"""
|
36
35
|
Raised when snap failed to find the exact shapes using the LLL-algorithm
|
37
36
|
for a manifold.
|
38
37
|
"""
|
39
38
|
|
39
|
+
|
40
40
|
@sage_method
|
41
|
-
def interval_checked_canonical_triangulation(M, bits_prec
|
41
|
+
def interval_checked_canonical_triangulation(M, bits_prec=None):
|
42
42
|
"""
|
43
43
|
Given a canonical triangulation of a cusped (possibly non-orientable)
|
44
44
|
manifold M, return this triangulation if it has tetrahedral cells and can
|
45
45
|
be verified using interval arithmetics with the optional, given precision.
|
46
46
|
Otherwise, raises an Exception.
|
47
|
-
|
47
|
+
|
48
48
|
It fails when we call it on something which is not the canonical
|
49
49
|
triangulation::
|
50
50
|
|
@@ -70,7 +70,7 @@ def interval_checked_canonical_triangulation(M, bits_prec = None):
|
|
70
70
|
Traceback (most recent call last):
|
71
71
|
...
|
72
72
|
TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: 0.?e-1... < 0
|
73
|
-
|
73
|
+
|
74
74
|
Has a cubical canonical cell::
|
75
75
|
|
76
76
|
sage: M = Manifold("m412")
|
@@ -79,20 +79,20 @@ def interval_checked_canonical_triangulation(M, bits_prec = None):
|
|
79
79
|
Traceback (most recent call last):
|
80
80
|
...
|
81
81
|
TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: 0.?e-1... < 0
|
82
|
-
|
82
|
+
|
83
83
|
"""
|
84
84
|
|
85
85
|
# Get verified shape intervals
|
86
|
-
shapes = M.tetrahedra_shapes('rect', intervals
|
87
|
-
bits_prec
|
86
|
+
shapes = M.tetrahedra_shapes('rect', intervals=True,
|
87
|
+
bits_prec=bits_prec)
|
88
88
|
|
89
89
|
# Compute cusp cross sections
|
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
|
97
97
|
if M.num_cusps() > 1:
|
98
98
|
c.normalize_cusps()
|
@@ -121,6 +121,7 @@ def interval_checked_canonical_triangulation(M, bits_prec = None):
|
|
121
121
|
# Return M
|
122
122
|
return M
|
123
123
|
|
124
|
+
|
124
125
|
@sage_method
|
125
126
|
def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
|
126
127
|
"""
|
@@ -136,12 +137,12 @@ def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
|
|
136
137
|
sage: K = exactly_checked_canonical_retriangulation(M, 300, 4)
|
137
138
|
|
138
139
|
M's canonical cell decomposition has a cube, so non-tetrahedral::
|
139
|
-
|
140
|
+
|
140
141
|
sage: K.has_finite_vertices()
|
141
142
|
True
|
142
143
|
|
143
144
|
Has 12 tetrahedra after the retrianglation::
|
144
|
-
|
145
|
+
|
145
146
|
sage: K.num_tetrahedra()
|
146
147
|
12
|
147
148
|
|
@@ -170,10 +171,10 @@ def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
|
|
170
171
|
# Check that the exact solutions form a complete hyperbolic structure
|
171
172
|
# We convert to intervals to check that the shapes are positive and
|
172
173
|
# the angles add up to 2pi and not some other multiple of 2pi.
|
173
|
-
|
174
|
+
edge_equations.check_polynomial_edge_equations_exactly(c.mcomplex)
|
174
175
|
c.check_cusp_development_exactly()
|
175
176
|
CIF = ComplexIntervalField(bits_prec)
|
176
|
-
|
177
|
+
edge_equations.check_logarithmic_edge_equations_and_positivity(c.mcomplex, CIF)
|
177
178
|
|
178
179
|
# Normalize cusp area. This is not needed when only 1 cusp
|
179
180
|
if M.num_cusps() > 1:
|
@@ -193,56 +194,61 @@ def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
|
|
193
194
|
# Tilt is negative, return True
|
194
195
|
if sign < 0:
|
195
196
|
return True
|
196
|
-
|
197
|
+
|
197
198
|
# Tilt is zero, return False
|
198
199
|
if sign == 0:
|
199
200
|
return False
|
200
|
-
|
201
|
+
|
201
202
|
# Tilt is positive, raise exception
|
202
203
|
if sign > 0:
|
203
204
|
raise exceptions.TiltProvenPositiveNumericalVerifyError(interval)
|
204
205
|
|
205
206
|
def index_of_face_corner(corner):
|
206
|
-
face_index =
|
207
|
+
face_index = simplex.comp(corner.Subsimplex).bit_length() - 1
|
207
208
|
return 4 * corner.Tetrahedron.Index + face_index
|
208
209
|
|
209
210
|
# Opacities of all four faces of each tetrahedron, initialize with None.
|
210
211
|
# The format is opacity of face 0, 1, 2, 3 of the first tetrahedron,
|
211
212
|
# ... of second tetrahedron, ...
|
212
213
|
opacities = (4 * len(c.mcomplex.Tetrahedra)) * [ None ]
|
213
|
-
|
214
|
+
|
214
215
|
# For each face of the triangulation
|
215
216
|
for face in c.mcomplex.Faces:
|
216
217
|
opacity = get_opacity(face.Tilt)
|
217
218
|
for corner in face.Corners:
|
218
219
|
opacities[index_of_face_corner(corner)] = opacity
|
219
|
-
|
220
|
+
|
220
221
|
if None in opacities:
|
221
222
|
raise Exception("Mismatch with opacities")
|
222
223
|
|
223
|
-
# If there are transparent faces,
|
224
|
+
# If there are transparent faces, the given triangulation is just the
|
224
225
|
# proto-canonical triangulation. We need to call into the SnapPea
|
225
226
|
# kernel to retriangulate (introduces finite vertices)
|
226
|
-
if
|
227
|
+
if not all(opacities):
|
227
228
|
return M._canonical_retriangulation(opacities)
|
228
229
|
|
229
|
-
# No transparent faces, this triangulation is the canonical
|
230
|
+
# No transparent faces, this triangulation itself is the canonical cell
|
231
|
+
# decomposition.
|
230
232
|
# Return it without introducing finite vertices.
|
231
233
|
return M
|
232
234
|
|
233
|
-
|
235
|
+
|
236
|
+
def _retrying_canonize(M) -> None:
|
234
237
|
"""
|
235
238
|
Wrapper for SnapPea kernel's function to compute the proto-canonical
|
236
239
|
triangulation in place. It will retry the kernel function if it fails.
|
237
|
-
|
240
|
+
Raises an exception if it did not succeed eventually.
|
238
241
|
"""
|
239
|
-
|
242
|
+
err = ValueError('_num_tries_canonize is not positive.')
|
243
|
+
|
244
|
+
for i in range(_num_tries_kernel_canonize):
|
240
245
|
try:
|
241
246
|
M.canonize()
|
242
|
-
return
|
243
|
-
except (RuntimeError, SnapPeaFatalError):
|
247
|
+
return
|
248
|
+
except (RuntimeError, SnapPeaFatalError) as e:
|
249
|
+
err = e
|
244
250
|
M.randomize()
|
245
|
-
|
251
|
+
raise err
|
246
252
|
|
247
253
|
def _retrying_high_precision_canonize(M):
|
248
254
|
"""
|
@@ -250,43 +256,49 @@ def _retrying_high_precision_canonize(M):
|
|
250
256
|
triangulation. It will retry the kernel function if it fails, switching
|
251
257
|
to the quad-double implementation.
|
252
258
|
Returns the proto-canonical triangulation if the kernel function was
|
253
|
-
successful eventually. Otherwise
|
259
|
+
successful eventually. Otherwise, raises an exception.
|
260
|
+
The original manifold is unchanged.
|
254
261
|
"""
|
262
|
+
|
263
|
+
from .. import ManifoldHP
|
264
|
+
|
255
265
|
# Make a copy of the manifold
|
256
266
|
Mcopy = M.copy()
|
257
|
-
|
267
|
+
|
258
268
|
# Try with the given precision first
|
259
|
-
|
269
|
+
try:
|
270
|
+
_retrying_canonize(Mcopy)
|
260
271
|
return Mcopy
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
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()
|
269
281
|
|
270
282
|
def _print_exception(e):
|
271
283
|
print('%s: %s' % (type(e).__name__, e))
|
272
284
|
|
285
|
+
|
273
286
|
@sage_method
|
274
287
|
def verified_canonical_retriangulation(
|
275
288
|
M,
|
276
|
-
interval_bits_precs
|
277
|
-
exact_bits_prec_and_degrees
|
278
|
-
verbose
|
279
|
-
|
289
|
+
interval_bits_precs=default_interval_bits_precs,
|
290
|
+
exact_bits_prec_and_degrees=default_exact_bits_prec_and_degrees,
|
291
|
+
verbose=False):
|
280
292
|
"""
|
281
293
|
Given some triangulation of a cusped (possibly non-orientable) manifold ``M``,
|
282
294
|
return its canonical retriangulation. Return ``None`` if it could not certify
|
283
295
|
the result.
|
284
296
|
|
285
|
-
To compute the canonical retriangulation, it first prepares the manifold
|
297
|
+
To compute the canonical retriangulation, it first prepares the manifold
|
286
298
|
(filling all Dehn-filled cusps and trying to find a proto-canonical
|
287
299
|
triangulation).
|
288
300
|
It then tries to certify the canonical triangulation using interval
|
289
|
-
arithmetics. If this fails, it uses snap (using `LLL-algorithm
|
301
|
+
arithmetics. If this fails, it uses snap (using `LLL-algorithm
|
290
302
|
<http://en.wikipedia.org/wiki/Lenstra%E2%80%93Lenstra%E2%80%93Lov%C3%A1sz_lattice_basis_reduction_algorithm>`_)
|
291
303
|
to guess
|
292
304
|
exact representations of the shapes in the shape field and then certifies
|
@@ -313,9 +325,6 @@ def verified_canonical_retriangulation(
|
|
313
325
|
The exact arithmetics can take a long time. To circumvent it, use
|
314
326
|
``exact_bits_prec_and_degrees = None``.
|
315
327
|
|
316
|
-
More information on the canonical retriangulation can be found in the
|
317
|
-
SnapPea kernel ``canonize_part_2.c`` and in Section 3.1 of
|
318
|
-
`Fominykh, Garoufalidis, Goerner, Tarkaev, Vesnin <http://arxiv.org/abs/1502.00383>`_.
|
319
328
|
|
320
329
|
Canonical cell decomposition of ``m004`` has 2 tetrahedral cells::
|
321
330
|
|
@@ -335,7 +344,7 @@ def verified_canonical_retriangulation(
|
|
335
344
|
True
|
336
345
|
sage: K.num_tetrahedra()
|
337
346
|
18
|
338
|
-
|
347
|
+
|
339
348
|
Canonical cell decomposition of ``m412`` is a cube and has exactly 8
|
340
349
|
symmetries::
|
341
350
|
|
@@ -361,15 +370,21 @@ def verified_canonical_retriangulation(
|
|
361
370
|
non-tetrahedral cells so interval arithmetics can't certify it)::
|
362
371
|
|
363
372
|
sage: M = Manifold("m412")
|
364
|
-
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
|
+
|
365
378
|
"""
|
366
379
|
|
367
380
|
# This is the "outer" retry loop: it catches those verification
|
368
381
|
# failures that can probably be fixed by taking a different
|
369
382
|
# triangulation
|
370
|
-
|
383
|
+
|
371
384
|
tries_penalty_left = _max_tries_verify_penalty
|
372
385
|
|
386
|
+
err = ValueError("_max_tries_verify_penalty is not positive.")
|
387
|
+
|
373
388
|
while tries_penalty_left > 0:
|
374
389
|
try:
|
375
390
|
# The "inner" retry loop: it catches those verification
|
@@ -383,11 +398,13 @@ def verified_canonical_retriangulation(
|
|
383
398
|
M, interval_bits_precs, exact_bits_prec_and_degrees,
|
384
399
|
verbose)
|
385
400
|
|
386
|
-
except (ZeroDivisionError,
|
401
|
+
except (ZeroDivisionError,
|
387
402
|
exceptions.TiltProvenPositiveNumericalVerifyError,
|
388
403
|
exceptions.EdgeEquationExactVerifyError) as e:
|
389
404
|
|
390
|
-
|
405
|
+
err = e
|
406
|
+
|
407
|
+
# These three exceptions are probably raised due to the
|
391
408
|
# SnapPea kernel failures:
|
392
409
|
# - flat tetrahedra in the proto-canonical triangulation
|
393
410
|
# - this provably not being the proto-canonical triangulation
|
@@ -432,49 +449,41 @@ def verified_canonical_retriangulation(
|
|
432
449
|
"proto_canonize.")
|
433
450
|
print("Next step: Give up.")
|
434
451
|
|
435
|
-
|
436
|
-
|
437
|
-
|
452
|
+
raise e
|
453
|
+
|
454
|
+
raise err
|
438
455
|
|
439
456
|
def _verified_canonical_retriangulation(
|
440
457
|
M, interval_bits_precs, exact_bits_prec_and_degrees,
|
441
458
|
verbose):
|
459
|
+
"""
|
460
|
+
Implements the "inner" retry loop of verified_canonical_retriangulation
|
442
461
|
|
443
|
-
|
444
|
-
|
445
|
-
# If this returns None, it means that we have given up
|
446
|
-
# If it leaves Exceptions uncaught, the "outer" loop will randomize
|
447
|
-
# the triangulation.
|
448
|
-
|
449
|
-
num_complete_cusps = 0
|
450
|
-
num_incomplete_cusps = 0
|
451
|
-
for cusp_info in M.cusp_info():
|
452
|
-
if cusp_info['complete?']:
|
453
|
-
num_complete_cusps += 1
|
454
|
-
else:
|
455
|
-
num_incomplete_cusps += 1
|
462
|
+
Returns retriangulation or raises exception.
|
456
463
|
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
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
|
+
"""
|
462
469
|
|
463
|
-
|
464
|
-
if num_incomplete_cusps:
|
465
|
-
Mfilled = M.filled_triangulation()
|
466
|
-
else:
|
470
|
+
if all(M.cusp_info('complete?')):
|
467
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?')
|
468
479
|
|
469
480
|
# Try to compute proto-canonical triangulation
|
470
481
|
Mcopy = _retrying_high_precision_canonize(Mfilled)
|
471
482
|
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
return None
|
477
|
-
|
483
|
+
err = ValueError(
|
484
|
+
'Neither interval_bits_precs nor exact_bits_prec_and_degrees was '
|
485
|
+
'non-empty.')
|
486
|
+
|
478
487
|
# First try interval arithmetics to verify
|
479
488
|
if interval_bits_precs:
|
480
489
|
for interval_bits_prec in interval_bits_precs:
|
@@ -484,7 +493,11 @@ def _verified_canonical_retriangulation(
|
|
484
493
|
try:
|
485
494
|
return interval_checked_canonical_triangulation(
|
486
495
|
Mcopy, interval_bits_prec)
|
487
|
-
except (RuntimeError,
|
496
|
+
except (RuntimeError,
|
497
|
+
ValueError, # Manifold.tetrahedra_shapes,
|
498
|
+
# KrawczykShapesEngine.log_gluing_LHSs
|
499
|
+
exceptions.NumericalVerifyError) as e:
|
500
|
+
err = e
|
488
501
|
if verbose:
|
489
502
|
_print_exception(e)
|
490
503
|
if isinstance(e, exceptions.NumericalVerifyError):
|
@@ -504,22 +517,26 @@ def _verified_canonical_retriangulation(
|
|
504
517
|
return exactly_checked_canonical_retriangulation(
|
505
518
|
Mcopy, bits_prec, degree)
|
506
519
|
except FindExactShapesError as e:
|
520
|
+
err = e
|
507
521
|
if verbose:
|
508
522
|
_print_exception(e)
|
509
523
|
print("Failure: Could not find exact shapes.")
|
510
524
|
print("Next step: trying different method/precision")
|
511
525
|
|
512
|
-
|
526
|
+
raise err
|
513
527
|
|
514
528
|
_known_canonical_retriangulations = [
|
515
529
|
('m004', '\x02\x0e\x01\x01\x01-\x1b\x87'),
|
516
530
|
('m412', '\x0c\x80\xac\xff\x07\x05\x07\t\n\t\x08\t\n\x0b\x0b\n\x0b\xe4\xe4\xe4\xe4\xe4\xe1\xe1\xe1\xe1\xe1\xe1\xe1\xe1'),
|
517
531
|
('m137', '\x12\x00\xb0\xfa\xaf\x0f\x04\t\x0b\x08\x07\x07\n\x0c\x0e\r\n\x0f\x0f\r\x11\x11\x10\x10\x11\xb4\xe4\xe1\xe1\xe1\xb4\xe1\xe1\xb1\xe1\xb4\xe4\xe4\xe1\xb1\xe1\xe1\xb4\xe1') ]
|
518
|
-
|
532
|
+
|
533
|
+
|
519
534
|
def _test_against_known_canonical_retriangulations():
|
520
535
|
from snappy import Manifold
|
521
536
|
for name, bytes_ in _known_canonical_retriangulations:
|
522
|
-
M = Manifold(name)
|
523
|
-
|
524
|
-
|
537
|
+
M = Manifold(name)
|
538
|
+
K = verified_canonical_retriangulation(M)
|
539
|
+
L = Manifold('empty')
|
540
|
+
L._from_bytes(bytes_)
|
541
|
+
if not K.isomorphisms_to(L):
|
525
542
|
raise Exception('%s failed' % name)
|
@@ -5,9 +5,10 @@ from .closed import *
|
|
5
5
|
|
6
6
|
__all__ = ['verified_complex_volume_torsion']
|
7
7
|
|
8
|
+
|
8
9
|
@sage_method
|
9
|
-
def verified_complex_volume_torsion(manifold, bits_prec
|
10
|
-
|
10
|
+
def verified_complex_volume_torsion(manifold, bits_prec=None):
|
11
|
+
|
11
12
|
completeness = [
|
12
13
|
cusp_info['complete?'] for cusp_info in manifold.cusp_info() ]
|
13
14
|
|