snappy 3.1.1__cp38-cp38-win_amd64.whl → 3.2__cp38-cp38-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- snappy/CyOpenGL.cp38-win_amd64.pyd +0 -0
- snappy/SnapPy.cp38-win_amd64.pyd +0 -0
- snappy/SnapPyHP.cp38-win_amd64.pyd +0 -0
- snappy/__init__.py +299 -402
- snappy/app.py +70 -20
- snappy/browser.py +18 -17
- snappy/canonical.py +249 -0
- snappy/{verify/cusp_shapes.py → cusps/__init__.py} +8 -18
- snappy/cusps/cusp_area_matrix.py +101 -0
- snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +23 -39
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/test.py +21 -0
- snappy/cusps/trig_cusp_area_matrix.py +63 -0
- snappy/database.py +10 -9
- snappy/decorated_isosig.py +337 -114
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +40 -7
- snappy/dev/extended_ptolemy/extended.py +3 -3
- snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +1 -1
- snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
- snappy/doc/_images/m125_paper_plane.jpg +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
- snappy/doc/_sources/additional_classes.rst.txt +40 -40
- snappy/doc/_sources/bugs.rst.txt +14 -14
- snappy/doc/_sources/censuses.rst.txt +51 -51
- snappy/doc/_sources/credits.rst.txt +75 -75
- snappy/doc/_sources/development.rst.txt +259 -239
- snappy/doc/_sources/index.rst.txt +182 -115
- snappy/doc/_sources/installing.rst.txt +247 -264
- snappy/doc/_sources/manifold.rst.txt +6 -6
- snappy/doc/_sources/manifoldhp.rst.txt +46 -46
- snappy/doc/_sources/news.rst.txt +355 -283
- snappy/doc/_sources/other.rst.txt +25 -25
- snappy/doc/_sources/platonic_census.rst.txt +20 -20
- snappy/doc/_sources/plink.rst.txt +102 -102
- snappy/doc/_sources/ptolemy.rst.txt +66 -66
- snappy/doc/_sources/ptolemy_classes.rst.txt +42 -42
- snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -297
- snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -363
- snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -301
- snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -61
- snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -105
- snappy/doc/_sources/screenshots.rst.txt +21 -21
- snappy/doc/_sources/snap.rst.txt +87 -87
- snappy/doc/_sources/snappy.rst.txt +28 -28
- snappy/doc/_sources/spherogram.rst.txt +103 -103
- snappy/doc/_sources/todo.rst.txt +47 -47
- snappy/doc/_sources/triangulation.rst.txt +11 -11
- snappy/doc/_sources/tutorial.rst.txt +49 -49
- snappy/doc/_sources/verify.rst.txt +210 -150
- snappy/doc/_sources/verify_internals.rst.txt +79 -90
- snappy/doc/_static/basic.css +924 -902
- snappy/doc/_static/css/badge_only.css +1 -1
- snappy/doc/_static/css/theme.css +1 -1
- snappy/doc/_static/doctools.js +1 -1
- snappy/doc/_static/documentation_options.js +12 -13
- snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
- snappy/doc/_static/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +199 -199
- snappy/doc/_static/pygments.css +74 -73
- snappy/doc/_static/searchtools.js +125 -71
- snappy/doc/_static/snappy_furo.css +33 -33
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
- snappy/doc/_static/sphinx_highlight.js +13 -3
- snappy/doc/additional_classes.html +1499 -1330
- snappy/doc/bugs.html +131 -134
- snappy/doc/censuses.html +426 -445
- snappy/doc/credits.html +180 -183
- snappy/doc/development.html +383 -363
- snappy/doc/genindex.html +1330 -1409
- snappy/doc/index.html +261 -206
- snappy/doc/installing.html +345 -363
- snappy/doc/manifold.html +3451 -2839
- snappy/doc/manifoldhp.html +179 -182
- snappy/doc/news.html +387 -329
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +160 -162
- snappy/doc/platonic_census.html +374 -377
- snappy/doc/plink.html +209 -212
- snappy/doc/ptolemy.html +253 -255
- snappy/doc/ptolemy_classes.html +1143 -1146
- snappy/doc/ptolemy_examples1.html +408 -410
- snappy/doc/ptolemy_examples2.html +470 -473
- snappy/doc/ptolemy_examples3.html +413 -416
- snappy/doc/ptolemy_examples4.html +194 -197
- snappy/doc/ptolemy_prelim.html +247 -250
- snappy/doc/py-modindex.html +164 -167
- snappy/doc/screenshots.html +140 -142
- snappy/doc/search.html +134 -137
- snappy/doc/searchindex.js +1 -1
- snappy/doc/snap.html +201 -204
- snappy/doc/snappy.html +180 -182
- snappy/doc/spherogram.html +1210 -1213
- snappy/doc/todo.html +165 -168
- snappy/doc/triangulation.html +1583 -1474
- snappy/doc/tutorial.html +158 -161
- snappy/doc/verify.html +329 -275
- snappy/doc/verify_internals.html +1234 -1691
- snappy/drilling/__init__.py +153 -235
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +0 -2
- snappy/drilling/crush.py +56 -130
- snappy/drilling/cusps.py +12 -6
- snappy/drilling/debug.py +2 -1
- snappy/drilling/exceptions.py +7 -40
- snappy/drilling/moves.py +302 -243
- snappy/drilling/perturb.py +63 -37
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +0 -5
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +126 -0
- snappy/drilling/tracing.py +9 -37
- snappy/exceptions.py +18 -5
- snappy/exterior_to_link/barycentric_geometry.py +2 -4
- snappy/exterior_to_link/main.py +8 -7
- snappy/exterior_to_link/mcomplex_with_link.py +2 -2
- snappy/exterior_to_link/rational_linear_algebra.py +1 -1
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
- snappy/exterior_to_link/test.py +21 -33
- snappy/geometric_structure/__init__.py +212 -0
- snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
- snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
- snappy/geometric_structure/geodesic/__init__.py +0 -0
- snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
- snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
- snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
- snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
- snappy/geometric_structure/geodesic/constants.py +6 -0
- snappy/geometric_structure/geodesic/exceptions.py +22 -0
- snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
- snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
- snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
- snappy/geometric_structure/geodesic/line.py +30 -0
- snappy/geometric_structure/geodesic/multiplicity.py +127 -0
- snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +23 -13
- snappy/horoviewer.py +7 -7
- snappy/hyperboloid/__init__.py +96 -31
- snappy/hyperboloid/distances.py +245 -0
- snappy/hyperboloid/horoball.py +19 -0
- snappy/hyperboloid/line.py +35 -0
- snappy/hyperboloid/point.py +9 -0
- snappy/hyperboloid/triangle.py +29 -0
- snappy/isometry_signature.py +382 -0
- snappy/len_spec/__init__.py +596 -0
- snappy/len_spec/geodesic_info.py +110 -0
- snappy/len_spec/geodesic_key_info_dict.py +117 -0
- snappy/len_spec/geodesic_piece.py +143 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +80 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
- snappy/len_spec/spine.py +206 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +275 -0
- snappy/len_spec/word.py +86 -0
- snappy/math_basics.py +39 -13
- snappy/matrix.py +52 -9
- snappy/number.py +12 -6
- snappy/numeric_output_checker.py +2 -3
- snappy/pari.py +8 -4
- snappy/phone_home.py +2 -1
- snappy/polyviewer.py +8 -8
- snappy/ptolemy/__init__.py +1 -1
- snappy/ptolemy/component.py +2 -2
- snappy/ptolemy/coordinates.py +25 -25
- snappy/ptolemy/findLoops.py +9 -9
- snappy/ptolemy/manifoldMethods.py +27 -29
- snappy/ptolemy/polynomial.py +50 -57
- snappy/ptolemy/processFileBase.py +60 -0
- snappy/ptolemy/ptolemyVariety.py +109 -41
- snappy/ptolemy/reginaWrapper.py +4 -4
- snappy/ptolemy/rur.py +1 -1
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
- snappy/ptolemy/test.py +99 -54
- snappy/ptolemy/utilities.py +1 -1
- snappy/raytracing/__init__.py +64 -0
- snappy/raytracing/additional_horospheres.py +64 -0
- snappy/raytracing/additional_len_spec_choices.py +63 -0
- snappy/raytracing/cohomology_fractal.py +0 -3
- snappy/raytracing/eyeball.py +123 -0
- snappy/raytracing/finite_raytracing_data.py +17 -17
- snappy/raytracing/finite_viewer.py +15 -15
- snappy/raytracing/geodesic_tube_info.py +93 -63
- snappy/raytracing/geodesics.py +94 -64
- snappy/raytracing/geodesics_window.py +56 -34
- snappy/raytracing/gui_utilities.py +21 -6
- snappy/raytracing/hyperboloid_navigation.py +29 -4
- snappy/raytracing/hyperboloid_utilities.py +73 -73
- snappy/raytracing/ideal_raytracing_data.py +121 -91
- snappy/raytracing/inside_viewer.py +199 -66
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +37 -25
- snappy/raytracing/raytracing_view.py +70 -65
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +39 -3
- snappy/raytracing/shaders/fragment.glsl +451 -133
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +42 -9
- snappy/sage_helper.py +67 -134
- snappy/settings.py +90 -77
- snappy/shell.py +2 -0
- snappy/snap/character_varieties.py +2 -2
- snappy/snap/find_field.py +4 -3
- snappy/snap/fundamental_polyhedron.py +2 -2
- snappy/snap/kernel_structures.py +5 -1
- snappy/snap/nsagetools.py +9 -8
- snappy/snap/peripheral/dual_cellulation.py +4 -3
- snappy/snap/peripheral/peripheral.py +2 -2
- snappy/snap/peripheral/surface.py +5 -5
- snappy/snap/peripheral/test.py +1 -1
- snappy/snap/polished_reps.py +8 -8
- snappy/snap/slice_obs_HKL.py +16 -14
- snappy/snap/t3mlite/arrow.py +3 -3
- snappy/snap/t3mlite/edge.py +3 -3
- snappy/snap/t3mlite/homology.py +2 -2
- snappy/snap/t3mlite/mcomplex.py +3 -3
- snappy/snap/t3mlite/simplex.py +12 -0
- snappy/snap/t3mlite/spun.py +18 -17
- snappy/snap/t3mlite/test_vs_regina.py +4 -4
- snappy/snap/test.py +37 -53
- snappy/snap/utilities.py +4 -5
- snappy/test.py +121 -138
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -0
- snappy/tiling/canonical_key_dict.py +59 -0
- snappy/tiling/dict_based_set.py +79 -0
- snappy/tiling/floor.py +49 -0
- snappy/tiling/hyperboloid_dict.py +54 -0
- snappy/tiling/iter_utils.py +78 -0
- snappy/tiling/lifted_tetrahedron.py +22 -0
- snappy/tiling/lifted_tetrahedron_set.py +54 -0
- snappy/tiling/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +215 -0
- snappy/tiling/triangle.py +33 -0
- snappy/tkterminal.py +113 -84
- snappy/twister/main.py +1 -7
- snappy/twister/twister_core.cp38-win_amd64.pyd +0 -0
- snappy/upper_halfspace/__init__.py +78 -17
- snappy/verify/__init__.py +3 -7
- snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
- snappy/verify/complex_volume/adjust_torsion.py +1 -2
- snappy/verify/complex_volume/closed.py +13 -13
- snappy/verify/complex_volume/cusped.py +6 -6
- snappy/verify/complex_volume/extended_bloch.py +5 -8
- snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +0 -55
- snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
- snappy/verify/interval_newton_shapes_engine.py +7 -5
- snappy/verify/interval_tree.py +5 -5
- snappy/verify/krawczyk_shapes_engine.py +17 -18
- snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
- snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
- snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
- snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
- snappy/verify/shapes.py +5 -3
- snappy/verify/short_slopes.py +39 -41
- snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
- snappy/verify/test.py +57 -60
- snappy/verify/upper_halfspace/extended_matrix.py +1 -1
- snappy/verify/upper_halfspace/finite_point.py +3 -4
- snappy/verify/upper_halfspace/ideal_point.py +9 -9
- snappy/verify/volume.py +2 -2
- snappy/version.py +2 -2
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +14 -10
- snappy-3.2.dist-info/RECORD +503 -0
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
- snappy/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/__pycache__/browser.cpython-38.pyc +0 -0
- snappy/__pycache__/cache.cpython-38.pyc +0 -0
- snappy/__pycache__/database.cpython-38.pyc +0 -0
- snappy/__pycache__/db_utilities.cpython-38.pyc +0 -0
- snappy/__pycache__/decorated_isosig.cpython-38.pyc +0 -0
- snappy/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/__pycache__/export_stl.cpython-38.pyc +0 -0
- snappy/__pycache__/filedialog.cpython-38.pyc +0 -0
- snappy/__pycache__/gui.cpython-38.pyc +0 -0
- snappy/__pycache__/horoviewer.cpython-38.pyc +0 -0
- snappy/__pycache__/math_basics.cpython-38.pyc +0 -0
- snappy/__pycache__/matrix.cpython-38.pyc +0 -0
- snappy/__pycache__/number.cpython-38.pyc +0 -0
- snappy/__pycache__/numeric_output_checker.cpython-38.pyc +0 -0
- snappy/__pycache__/pari.cpython-38.pyc +0 -0
- snappy/__pycache__/polyviewer.cpython-38.pyc +0 -0
- snappy/__pycache__/sage_helper.cpython-38.pyc +0 -0
- snappy/__pycache__/version.cpython-38.pyc +0 -0
- snappy/doc/_sources/verify_canon.rst.txt +0 -90
- snappy/doc/_static/jquery-3.6.0.js +0 -10881
- snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
- snappy/doc/_static/js/html5shiv.min.js +0 -4
- snappy/doc/_static/underscore-1.13.1.js +0 -2042
- snappy/doc/_static/underscore.js +0 -6
- snappy/doc/verify_canon.html +0 -304
- snappy/drilling/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/constants.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/crush.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/cusps.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/debug.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/epsilons.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/fixed_points.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_info.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_tube.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geometric_structure.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/line.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/moves.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/peripheral_curves.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/perturb.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/quotient_space.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/spatial_dict.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/subdivide.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/tracing.cpython-38.pyc +0 -0
- snappy/drilling/geodesic_tube.py +0 -441
- snappy/drilling/geometric_structure.py +0 -366
- snappy/drilling/line.py +0 -122
- snappy/drilling/quotient_space.py +0 -94
- snappy/drilling/spatial_dict.py +0 -128
- snappy/exterior_to_link/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/hyp_utils.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/link_projection.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/main.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/pl_utils.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/put_in_S3.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/stored_moves.cpython-38.pyc +0 -0
- snappy/hyperboloid/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/manifolds/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/component.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/coordinates.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/fieldExtensions.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/findLoops.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/homology.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/manifoldMethods.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/matrix.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/polynomial.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processComponents.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileBase.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileDispatch.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processMagmaFile.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processRurFile.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVariety.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/rur.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/utilities.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/character_varieties.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/fundamental_polyhedron.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/interval_reps.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/kernel_structures.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/mcomplex_base.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/nsagetools.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/polished_reps.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/shapes.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/slice_obs_HKL.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/utilities.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/link.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/peripheral.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/surface.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/arrow.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/corner.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/edge.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/face.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/files.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/homology.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/linalg.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/mcomplex.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/perm4.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/simplex.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/spun.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/surface.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/vertex.cpython-38.pyc +0 -0
- snappy/togl/__init__.py +0 -3
- snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
- snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
- snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
- snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
- snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
- snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
- snappy/twister/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/twister/__pycache__/main.cpython-38.pyc +0 -0
- snappy/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cuspCrossSection.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cuspTranslations.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cusp_areas.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cusp_shapes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/interval_tree.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/realAlgebra.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/shapes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/short_slopes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/squareExtensions.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/verifyCanonical.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/verifyHyperbolicity.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/volume.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/closed.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/cusped.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-38.pyc +0 -0
- snappy/verify/cuspCrossSection.py +0 -1422
- snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-38.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
- snappy-3.1.1.dist-info/RECORD +0 -575
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
snappy/__init__.py
CHANGED
@@ -3,14 +3,18 @@
|
|
3
3
|
# logging.basicConfig(filename='example.log',level=logging.DEBUG)
|
4
4
|
# logging.debug('This message should go to the log file')
|
5
5
|
import sys
|
6
|
-
from .SnapPy import (AbelianGroup,
|
7
|
-
|
8
|
-
|
6
|
+
from .SnapPy import (AbelianGroup,
|
7
|
+
FundamentalGroup,
|
8
|
+
SymmetryGroup,
|
9
|
+
Isometry,
|
10
|
+
AlternatingKnotExteriors,
|
11
|
+
NonalternatingKnotExteriors,
|
9
12
|
pari)
|
10
|
-
from .exceptions import SnapPeaFatalError, InsufficientPrecisionError
|
11
13
|
from .SnapPy import DirichletDomain
|
12
14
|
from .SnapPyHP import DirichletDomain as DirichletDomainHP
|
15
|
+
from .SnapPy import CuspNeighborhood
|
13
16
|
from .SnapPyHP import CuspNeighborhood as CuspNeighborhoodHP
|
17
|
+
from .SnapPy import HolonomyGroup
|
14
18
|
from .SnapPyHP import HolonomyGroup as HolonomyGroupHP
|
15
19
|
|
16
20
|
from .SnapPy import Triangulation as _TriangulationLP
|
@@ -23,18 +27,56 @@ import time
|
|
23
27
|
from .SnapPy import set_rand_seed
|
24
28
|
set_rand_seed(int(time.time()))
|
25
29
|
|
30
|
+
from .exceptions import (SnapPeaFatalError,
|
31
|
+
InsufficientPrecisionError,
|
32
|
+
NonorientableManifoldError)
|
26
33
|
|
34
|
+
from typing import Union, Tuple, List, Optional
|
35
|
+
|
36
|
+
# Subclass to be able to monkey-patch
|
27
37
|
class Triangulation(_TriangulationLP):
|
28
38
|
__doc__ = _TriangulationLP.__doc__
|
29
39
|
|
30
|
-
|
40
|
+
# Subclass to be able to monkey-patch
|
31
41
|
class TriangulationHP(_TriangulationHP):
|
32
42
|
__doc__ = _TriangulationHP.__doc__
|
33
43
|
|
34
|
-
|
35
|
-
|
44
|
+
# We want Manifold to be a subclass of Triangulation.
|
45
|
+
# Unfortunately, that introduces a diamond pattern here.
|
46
|
+
# Luckily, the python resolves methods and bases classes
|
47
|
+
# in the presence of a diamond pattern seem to work just
|
48
|
+
# fine. In particular, we do not double allocate the underlying
|
49
|
+
# C structures.
|
50
|
+
class Manifold(_ManifoldLP, Triangulation):
|
36
51
|
__doc__ = _ManifoldLP.__doc__
|
37
52
|
|
53
|
+
def identify(self, extends_to_link=False):
|
54
|
+
"""
|
55
|
+
Looks for the manifold in all of the SnapPy databases.
|
56
|
+
For hyperbolic manifolds this is done by searching for isometries:
|
57
|
+
|
58
|
+
>>> M = Manifold('m125')
|
59
|
+
>>> M.identify()
|
60
|
+
[m125(0,0)(0,0), L13n5885(0,0)(0,0), ooct01_00000(0,0)(0,0)]
|
61
|
+
|
62
|
+
By default, there is no restriction on the isometries. One can
|
63
|
+
require that the isometry take meridians to meridians. This
|
64
|
+
might return fewer results:
|
65
|
+
|
66
|
+
>>> M.identify(extends_to_link=True)
|
67
|
+
[m125(0,0)(0,0), ooct01_00000(0,0)(0,0)]
|
68
|
+
|
69
|
+
For closed manifolds, extends_to_link doesn't make sense
|
70
|
+
because of how the kernel code works:
|
71
|
+
|
72
|
+
>>> C = Manifold("m015(1,2)")
|
73
|
+
>>> C.identify()
|
74
|
+
[m006(-5,2)]
|
75
|
+
>>> C.identify(True)
|
76
|
+
[]
|
77
|
+
"""
|
78
|
+
return self._identify(extends_to_link)
|
79
|
+
|
38
80
|
def high_precision(self):
|
39
81
|
"""
|
40
82
|
Return a high precision version of this manifold.
|
@@ -59,15 +101,9 @@ class Manifold(_ManifoldLP):
|
|
59
101
|
def low_precision(self):
|
60
102
|
return self.copy()
|
61
103
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
return _ManifoldHP.is_isometric_to(self.high_precision(), other,
|
66
|
-
return_isometries)
|
67
|
-
return _ManifoldLP.is_isometric_to(self, other, return_isometries)
|
68
|
-
|
69
|
-
|
70
|
-
class ManifoldHP(_ManifoldHP):
|
104
|
+
# We want ManifoldHP to be a subclass of TriangulationHP.
|
105
|
+
# See comment about Manifold and the diamond pattern.
|
106
|
+
class ManifoldHP(_ManifoldHP, TriangulationHP):
|
71
107
|
__doc__ = _ManifoldHP.__doc__
|
72
108
|
|
73
109
|
def low_precision(self):
|
@@ -95,13 +131,6 @@ class ManifoldHP(_ManifoldHP):
|
|
95
131
|
def high_precision(self):
|
96
132
|
return self.copy()
|
97
133
|
|
98
|
-
def is_isometric_to(self, other, return_isometries=False):
|
99
|
-
__doc__ = _ManifoldHP.is_isometric_to.__doc__
|
100
|
-
if other.__class__ is Manifold:
|
101
|
-
return _ManifoldHP.is_isometric_to(self, other.high_precision(),
|
102
|
-
return_isometries)
|
103
|
-
return _ManifoldHP.is_isometric_to(self, other, return_isometries)
|
104
|
-
|
105
134
|
def identify(self, extends_to_link=False):
|
106
135
|
"""
|
107
136
|
Looks for the manifold in all of the SnapPy databases.
|
@@ -128,7 +157,7 @@ class ManifoldHP(_ManifoldHP):
|
|
128
157
|
[]
|
129
158
|
|
130
159
|
"""
|
131
|
-
return self.low_precision().
|
160
|
+
return self.low_precision()._identify(extends_to_link)
|
132
161
|
|
133
162
|
|
134
163
|
SnapPy._manifold_class = Manifold
|
@@ -144,7 +173,75 @@ __all__ = ['Triangulation', 'Manifold', 'ManifoldHP', 'AbelianGroup',
|
|
144
173
|
'InsufficientPrecisionError',
|
145
174
|
'pari', 'twister', ]
|
146
175
|
|
147
|
-
|
176
|
+
def _symmetrize_high_precision_manifold(
|
177
|
+
mfd1 : Union[Manifold, ManifoldHP],
|
178
|
+
mfd2 : Union[Manifold, ManifoldHP]
|
179
|
+
) -> Union[Tuple[Manifold, Manifold],
|
180
|
+
Tuple[ManifoldHP, ManifoldHP]]:
|
181
|
+
"""
|
182
|
+
Given a (potential) mix of two Manifold and ManifoldHP,
|
183
|
+
promote one to high precision if necessary and return
|
184
|
+
the result as pair.
|
185
|
+
"""
|
186
|
+
resolved_mfd1 = mfd1
|
187
|
+
resolved_mfd2 = mfd2
|
188
|
+
high1 = isinstance(mfd1, ManifoldHP)
|
189
|
+
high2 = isinstance(mfd2, ManifoldHP)
|
190
|
+
if high1 and not high2:
|
191
|
+
resolved_mfd2 = ManifoldHP(mfd2)
|
192
|
+
if high2 and not high1:
|
193
|
+
resolved_mfd1 = ManifoldHP(mfd1)
|
194
|
+
return (resolved_mfd1, resolved_mfd2)
|
195
|
+
|
196
|
+
def _symmetrize_low_precision_triangulation(
|
197
|
+
tri1 : Union[Triangulation, TriangulationHP],
|
198
|
+
tri2 : Union[Triangulation, TriangulationHP]
|
199
|
+
) -> Union[Tuple[Triangulation, Triangulation],
|
200
|
+
Tuple[TriangulationHP, TriangulationHP]]:
|
201
|
+
"""
|
202
|
+
Given a (potential) mix of two Triangulation and TriangulationHP,
|
203
|
+
demote one to low precision if necessary and return
|
204
|
+
the result as pair.
|
205
|
+
"""
|
206
|
+
resolved_tri1 = tri1
|
207
|
+
resolved_tri2 = tri2
|
208
|
+
low1 = isinstance(tri1, Triangulation)
|
209
|
+
low2 = isinstance(tri2, Triangulation)
|
210
|
+
if low1 and not low2:
|
211
|
+
resolved_tri2 = Triangulation(tri2, remove_finite_vertices=False)
|
212
|
+
if low2 and not low1:
|
213
|
+
resolved_tri1 = Triangulation(tri1, remove_finite_vertices=False)
|
214
|
+
return (resolved_tri1, resolved_tri2)
|
215
|
+
|
216
|
+
def is_isometric_to(self,
|
217
|
+
other : Union[Manifold, ManifoldHP],
|
218
|
+
return_isometries : bool = False
|
219
|
+
) -> Union[bool, List[Isometry]]:
|
220
|
+
resolved_self, resolved_other = (
|
221
|
+
_symmetrize_high_precision_manifold(
|
222
|
+
self, other))
|
223
|
+
|
224
|
+
return resolved_self._is_isometric_to(
|
225
|
+
resolved_other,
|
226
|
+
return_isometries=return_isometries)
|
227
|
+
|
228
|
+
is_isometric_to.__doc__ = _ManifoldLP._is_isometric_to.__doc__
|
229
|
+
Manifold.is_isometric_to = is_isometric_to
|
230
|
+
ManifoldHP.is_isometric_to = is_isometric_to
|
231
|
+
|
232
|
+
def isomorphisms_to(self,
|
233
|
+
other : Union[Triangulation, TriangulationHP]
|
234
|
+
) -> List[Isometry]:
|
235
|
+
resolved_self, resolved_other = (
|
236
|
+
_symmetrize_low_precision_triangulation(
|
237
|
+
self, other))
|
238
|
+
|
239
|
+
return resolved_self._isomorphisms_to(
|
240
|
+
resolved_other)
|
241
|
+
|
242
|
+
isomorphisms_to.__doc__ = _TriangulationLP._isomorphisms_to.__doc__
|
243
|
+
Triangulation.isomorphisms_to = isomorphisms_to
|
244
|
+
TriangulationHP.isomorphisms_to = isomorphisms_to
|
148
245
|
|
149
246
|
from . import snap
|
150
247
|
snap.add_methods(Manifold)
|
@@ -162,283 +259,108 @@ from . import verify
|
|
162
259
|
Manifold.verify_hyperbolicity = verify.verify_hyperbolicity
|
163
260
|
ManifoldHP.verify_hyperbolicity = verify.verify_hyperbolicity
|
164
261
|
|
262
|
+
from . import len_spec
|
263
|
+
Manifold.length_spectrum_alt_gen = len_spec.length_spectrum_alt_gen
|
264
|
+
ManifoldHP.length_spectrum_alt_gen = len_spec.length_spectrum_alt_gen
|
265
|
+
Manifold.length_spectrum_alt = len_spec.length_spectrum_alt
|
266
|
+
ManifoldHP.length_spectrum_alt = len_spec.length_spectrum_alt
|
165
267
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
exact_bits_prec_and_degrees=verify.default_exact_bits_prec_and_degrees,
|
170
|
-
verbose=False):
|
171
|
-
"""
|
172
|
-
The canonical retriangulation which is closely related to the canonical
|
173
|
-
cell decomposition and described in more detail `here
|
174
|
-
<verify.html#the-canonical-retriangulation-and-the-isometry-signature>`_::
|
175
|
-
|
176
|
-
>>> M = Manifold("m412")
|
177
|
-
>>> K = M.canonical_retriangulation()
|
178
|
-
>>> len(K.isomorphisms_to(K)) # Unverified size of the isometry group.
|
179
|
-
8
|
180
|
-
|
181
|
-
When used inside `Sage <http://sagemath.org/>`_ and ``verified = True`` is
|
182
|
-
passed as argument, the verify module will certify the result to be
|
183
|
-
correct::
|
184
|
-
|
185
|
-
sage: M = Manifold("m412")
|
186
|
-
sage: K = M.canonical_retriangulation(verified = True)
|
187
|
-
sage: len(K.isomorphisms_to(K)) # Verified size of the isometry group.
|
188
|
-
8
|
189
|
-
|
190
|
-
See :py:meth:`verify.verified_canonical_retriangulation` for the
|
191
|
-
additional options.
|
192
|
-
"""
|
193
|
-
if False in manifold.cusp_info('complete?'):
|
194
|
-
raise ValueError('Canonical retriangulation needs all cusps to be complete')
|
195
|
-
|
196
|
-
if verified:
|
197
|
-
return verify.verified_canonical_retriangulation(
|
198
|
-
manifold,
|
199
|
-
interval_bits_precs=interval_bits_precs,
|
200
|
-
exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
|
201
|
-
verbose=verbose)
|
202
|
-
else:
|
203
|
-
return manifold._canonical_retriangulation()
|
204
|
-
|
205
|
-
|
206
|
-
Manifold.canonical_retriangulation = canonical_retriangulation
|
207
|
-
ManifoldHP.canonical_retriangulation = canonical_retriangulation
|
208
|
-
|
268
|
+
from . import canonical
|
269
|
+
Manifold.canonical_retriangulation = canonical.canonical_retriangulation
|
270
|
+
ManifoldHP.canonical_retriangulation = canonical.canonical_retriangulation_hp
|
209
271
|
|
210
|
-
|
211
|
-
manifold, of_link=False, verified=False,
|
212
|
-
interval_bits_precs=verify.default_interval_bits_precs,
|
213
|
-
exact_bits_prec_and_degrees=verify.default_exact_bits_prec_and_degrees,
|
214
|
-
verbose=False):
|
215
|
-
"""
|
216
|
-
The isomorphism signature of the canonical retriangulation. This is a
|
217
|
-
complete invariant of the isometry type of a hyperbolic 3-manifold and
|
218
|
-
described in more detail `here
|
219
|
-
<verify.html#the-canonical-retriangulation-and-the-isometry-signature>`_::
|
220
|
-
|
221
|
-
>>> M = Manifold("m125")
|
222
|
-
>>> M.isometry_signature() # Unverified isometry signature
|
223
|
-
'gLLPQccdefffqffqqof'
|
224
|
-
|
225
|
-
When used inside `Sage <http://sagemath.org/>`_ and ``verified = True`` is
|
226
|
-
passed as argument, the verify module will certify the result to be
|
227
|
-
correct::
|
228
|
-
|
229
|
-
sage: M = Manifold("m125")
|
230
|
-
sage: M.isometry_signature(verified = True) # Verified isometry signature
|
231
|
-
'gLLPQccdefffqffqqof'
|
232
|
-
|
233
|
-
When ``of_link = True`` is specified, the peripheral curves are included in
|
234
|
-
such a way that the result is a complete invariant of a link. In particular,
|
235
|
-
``isometry_signature(of_link=True)`` is invariant under changing the
|
236
|
-
ordering or orientations of the components or flipping all crossings of a
|
237
|
-
link simultaneously (it passes ``ignore_cusp_order = True,
|
238
|
-
ignore_curve_orientations = True`` to
|
239
|
-
:py:meth:`Manifold.triangulation_isosig`)::
|
240
|
-
|
241
|
-
>>> Manifold("5^2_1").isometry_signature(of_link = True)
|
242
|
-
'eLPkbdcddhgggb_baCbbaCb'
|
243
|
-
>>> Manifold("7^2_8").isometry_signature(of_link = True)
|
244
|
-
'eLPkbdcddhgggb_bBcBbaCb'
|
245
|
-
|
246
|
-
See :py:meth:`verify.verified_canonical_retriangulation` for the
|
247
|
-
additional options.
|
248
|
-
|
249
|
-
Note that interval methods cannot verify a canonical retriangulation
|
250
|
-
with non-tetrahedral cells such as in the cas of ``m412``, so the following
|
251
|
-
call returns ``None``::
|
252
|
-
|
253
|
-
sage: M = Manifold("m412")
|
254
|
-
sage: M.isometry_signature(verified = True, exact_bits_prec_and_degrees = None)
|
255
|
-
|
256
|
-
"""
|
257
|
-
if False in manifold.cusp_info('complete?'):
|
258
|
-
raise ValueError('isometry_signature needs all cusps to be complete')
|
259
|
-
|
260
|
-
retrig = manifold.canonical_retriangulation(
|
261
|
-
verified=verified,
|
262
|
-
interval_bits_precs=interval_bits_precs,
|
263
|
-
exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
|
264
|
-
verbose=verbose)
|
265
|
-
|
266
|
-
if not retrig:
|
267
|
-
return None
|
268
|
-
|
269
|
-
return retrig.triangulation_isosig(decorated=of_link,
|
270
|
-
ignore_cusp_ordering=True,
|
271
|
-
ignore_curve_orientations=True)
|
272
|
+
from . import isometry_signature
|
272
273
|
|
274
|
+
Manifold.isometry_signature = isometry_signature.isometry_signature
|
275
|
+
ManifoldHP.isometry_signature = isometry_signature.isometry_signature
|
273
276
|
|
274
|
-
|
275
|
-
ManifoldHP.isometry_signature = isometry_signature
|
277
|
+
from .cusps import cusp_area_matrix
|
276
278
|
|
279
|
+
Manifold.cusp_area_matrix = cusp_area_matrix.cusp_area_matrix
|
280
|
+
ManifoldHP.cusp_area_matrix = cusp_area_matrix.cusp_area_matrix
|
277
281
|
|
278
|
-
|
279
|
-
verified=False, bits_prec=None):
|
280
|
-
r"""
|
281
|
-
This function returns a matrix that can be used to check whether
|
282
|
-
cusp neighborhoods of areas a\ :sub:`0`\ , ..., a\ :sub:`m-1` are
|
283
|
-
disjoint: the cusp neighborhoods about cusp i and j are
|
284
|
-
disjoint (respectively, the cusp neighborhood embeds if i and j
|
285
|
-
are equal) if a\ :sub:`i` * a\ :sub:`j` is less than or equal to
|
286
|
-
the entry (i,j) of the cusp area matrix. Note that the "if"
|
287
|
-
becomes "if and only if" if we pick the "maximal cusp area
|
288
|
-
matrix".
|
289
|
-
|
290
|
-
This function can operate in different ways (determined by
|
291
|
-
``method``). By default (``method='trigDependentTryCanonize'``),
|
292
|
-
it returns a result which can be suboptimal and non-deterministic
|
293
|
-
but is quicker to compute and sufficies for many applications::
|
294
|
-
|
295
|
-
>>> M = Manifold("s776")
|
296
|
-
>>> M.cusp_area_matrix() # doctest: +NUMERIC12
|
297
|
-
[28.0000000000000 7.00000000000000 6.99999999999999]
|
298
|
-
[7.00000000000000 21.4375000000000 7.00000000000000]
|
299
|
-
[6.99999999999999 7.00000000000000 21.4375000000000]
|
300
|
-
|
301
|
-
If ``method='maximal'`` is specified, the result is the "maximal
|
302
|
-
cusp area matrix", thus it is optimal and an invariant of the
|
303
|
-
manifold with labeled cusps. Note that the "maximal cusp area
|
304
|
-
matrix" is only available as verified computation and thus
|
305
|
-
requires passing ``verified = True``::
|
306
|
-
|
307
|
-
sage: M.cusp_area_matrix(method = 'maximal', verified=True) # doctest: +NUMERIC6
|
308
|
-
[28.0000000000? 7.0000000000? 7.0000000000?]
|
309
|
-
[ 7.0000000000? 28.000000000? 7.00000000000?]
|
310
|
-
[ 7.0000000000? 7.00000000000? 28.00000000?]
|
311
|
-
|
312
|
-
If ``verified = True`` is specified and ``method`` is not
|
313
|
-
``maximal``, the entries are all guaranteed to be less than the
|
314
|
-
corresponding ones in the maximal cusp area matrix (more
|
315
|
-
precisely, the lower end point of the interval is guaranteed to be
|
316
|
-
less than the true value of the corresponding maximal cusp area
|
317
|
-
matrix entry)::
|
318
|
-
|
319
|
-
sage: M.cusp_area_matrix(verified=True, bits_prec=70) # doctest: +NUMERIC15
|
320
|
-
[ 28.000000000000000? 7.0000000000000000? 7.0000000000000000?]
|
321
|
-
[ 7.0000000000000000? 21.4375000000000000? 7.0000000000000000?]
|
322
|
-
[ 7.0000000000000000? 7.0000000000000000? 21.4375000000000000?]
|
323
|
-
|
324
|
-
For expert users:
|
325
|
-
|
326
|
-
Besides the two values above, ``method`` can be ``trigDependent``:
|
327
|
-
this result is also fast to compute by making the assumption that
|
328
|
-
cusp neighborhoods are not only disjoint but also in "standard
|
329
|
-
form" with respect to the triangulation (i.e., when lifting of a
|
330
|
-
cusp neighborhood to a horoball in the universal cover, it
|
331
|
-
intersects a geodesic tetrahedron in three but not four
|
332
|
-
faces). ``trigDependentTryCanonize`` is similar to
|
333
|
-
``trigDependent`` but tries to "proto-canonize" (a copy of) the
|
334
|
-
triangulation first since this often produces a matrix that is
|
335
|
-
closer to the maximal cusp area matrix, for example::
|
336
|
-
|
337
|
-
>>> M = Manifold("o9_35953")
|
338
|
-
>>> M.cusp_area_matrix(method = 'trigDependent') # doctest: +NUMERIC9
|
339
|
-
[72.9848715318467 12.7560424258060]
|
340
|
-
[12.7560424258060 6.65567118002656]
|
341
|
-
>>> M.cusp_area_matrix(method = 'trigDependentTryCanonize') # doctest: +NUMERIC9
|
342
|
-
[72.9848715318466 12.7560424258060]
|
343
|
-
[12.7560424258060 62.1043047674605]
|
344
|
-
|
345
|
-
Compare to maximal area matrix::
|
346
|
-
|
347
|
-
sage: M.cusp_area_matrix(method = 'maximal', verified = True, bits_prec = 100) # doctest: +NUMERIC15
|
348
|
-
[ 72.984871531846664? 12.7560424258059765562778?]
|
349
|
-
[12.7560424258059765562778? 62.104304767460978078?]
|
282
|
+
from .cusps import cusp_areas_from_matrix
|
350
283
|
|
284
|
+
def cusp_areas(manifold,
|
285
|
+
policy : str = 'unbiased',
|
286
|
+
method : str = 'maximal',
|
287
|
+
verified : bool = False,
|
288
|
+
bits_prec : Optional[int] = None,
|
289
|
+
first_cusps : List[int] = []):
|
351
290
|
"""
|
291
|
+
Returns a list of areas, one for each cusp. The cusp neighborhoods
|
292
|
+
defined by these areas are embedded and disjoint. Furthermore, these
|
293
|
+
neighborhoods are maximal in that they fail to be embedded or
|
294
|
+
disjoint if any cusp neighborhood is enlarged (unless :attr:`method`
|
295
|
+
is set to a value different from the default).
|
352
296
|
|
353
|
-
|
354
|
-
if not verified:
|
355
|
-
raise NotImplementedError("Maximal cusp area matrix only "
|
356
|
-
"available as verified computation. "
|
357
|
-
"Pass verified = True.")
|
358
|
-
return verify.verified_maximal_cusp_area_matrix(
|
359
|
-
manifold, bits_prec=bits_prec)
|
360
|
-
if method in ['trigDependent', 'trigDependentTryCanonize']:
|
361
|
-
if method == 'trigDependentTryCanonize':
|
362
|
-
manifold = manifold.copy()
|
363
|
-
manifold.canonize()
|
364
|
-
|
365
|
-
return verify.triangulation_dependent_cusp_area_matrix(
|
366
|
-
manifold, verified=verified, bits_prec=bits_prec)
|
367
|
-
|
368
|
-
raise ValueError("method passed to cusp_area_matrix must be "
|
369
|
-
"'trigDependent', 'trigDependentTryCanonize', "
|
370
|
-
"or 'maximal'.")
|
297
|
+
There are different policies how these cusp neighborhoods are found.
|
371
298
|
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
from .verify import cusp_areas as verify_cusp_areas
|
377
|
-
|
378
|
-
|
379
|
-
def cusp_areas(manifold, policy='unbiased',
|
380
|
-
method='trigDependentTryCanonize',
|
381
|
-
verified=False, bits_prec=None, first_cusps=[]):
|
382
|
-
"""
|
383
|
-
Picks areas for the cusps such that the corresponding cusp
|
384
|
-
neighborhoods are disjoint. By default, the ``policy`` is
|
385
|
-
``unbiased`` which means that the cusp neighborhoods are blown up
|
386
|
-
simultaneously with a cusp neighborhood stopping to grow when it
|
387
|
-
touches another cusp neighborhood or itself::
|
299
|
+
The default :attr:`policy` is ``unbiased``. This means that the
|
300
|
+
cusp neighborhoods are blown up simultaneously and a cusp neighborhood
|
301
|
+
stops growing when it touches any cusp neighborhood including itself::
|
388
302
|
|
389
303
|
>>> M = Manifold("s776")
|
390
304
|
>>> M.cusp_areas() # doctest: +NUMERIC9
|
391
305
|
[2.64575131106459, 2.64575131106459, 2.64575131106459]
|
392
306
|
|
393
|
-
Alternatively,
|
394
|
-
neighborhood is blown up until it touches itself,
|
395
|
-
cusp neighborhood is blown up until it touches itself
|
396
|
-
cusp neighborhood,
|
307
|
+
Alternatively, :attr:`policy='greedy'` can be specified. This means
|
308
|
+
that the first cusp neighborhood is blown up until it touches itself,
|
309
|
+
then the second cusp neighborhood is blown up until it touches itself
|
310
|
+
or the first cusp neighborhood, and so on::
|
397
311
|
|
398
312
|
>>> M.cusp_areas(policy='greedy') # doctest: +NUMERIC9
|
399
313
|
[5.29150262212918, 1.32287565553230, 1.32287565553229]
|
400
314
|
|
401
|
-
|
402
|
-
|
315
|
+
Use :attr:`first_cusps` to specify the order in which the cusp
|
316
|
+
neighborhoods are blown up::
|
403
317
|
|
404
|
-
>>> M
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
>>> M.cusp_areas(policy='greedy', first_cusps=[
|
412
|
-
[
|
413
|
-
>>> M.cusp_areas(policy='greedy', first_cusps=[0,1,2]) # doctest: +NUMERIC9
|
414
|
-
[7.053940530873898, 3.2712450270, 2.7091590087]
|
415
|
-
>>> M.cusp_areas(policy='greedy', first_cusps=[0,2,1]) # doctest: +NUMERIC9
|
416
|
-
[7.053940530873898, 2.3513135103, 3.7690945490]
|
417
|
-
>>> M.cusp_areas(policy='greedy', first_cusps=[1,]) # doctest: +NUMERIC9
|
418
|
-
[4.0302253322, 5.725527974287718, 1.5478612583]
|
419
|
-
|
420
|
-
``cusp_areas`` is implemented using
|
421
|
-
:py:meth:`Manifold.cusp_area_matrix` and the same arguments
|
422
|
-
(``method``, ``verified``, ``bits_prec``) are accepted. For
|
423
|
-
example, verified computations are supported::
|
424
|
-
|
425
|
-
sage: M=Manifold("v2854")
|
426
|
-
sage: M.cusp_areas(verified=True) # doctest: +NUMERIC9
|
427
|
-
[3.6005032476?, 3.6005032476?]
|
318
|
+
>>> M.cusp_areas(policy='greedy', first_cusps=[1,0,2]) # doctest: +NUMERIC9
|
319
|
+
[1.32287565553230, 5.29150262212918, 1.32287565553229]
|
320
|
+
|
321
|
+
An incomplete list can be given to :attr:`first_cusps`. In this case,
|
322
|
+
the list is automatically completed by appending the remaining cusps in
|
323
|
+
order. Thus, the above call is equivalent to::
|
324
|
+
|
325
|
+
>>> M.cusp_areas(policy='greedy', first_cusps=[1]) # doctest: +NUMERIC9
|
326
|
+
[1.32287565553230, 5.29150262212918, 1.32287565553229]
|
428
327
|
|
429
|
-
|
430
|
-
|
431
|
-
labeled cusps and the corresponding cusp neighborhoods are maximal
|
432
|
-
in that every cusp neighborhood is touching some (not necessarily
|
433
|
-
distinct) cusp neighborhood.
|
328
|
+
Under the hood, this method is using
|
329
|
+
:meth:`~snappy.Manifold.cusp_area_matrix`.
|
434
330
|
|
435
|
-
|
436
|
-
manifold::
|
331
|
+
**Verified computation**
|
437
332
|
|
438
|
-
|
439
|
-
|
440
|
-
|
333
|
+
If :attr:`verified = False`, floating-point issues can arise resulting in
|
334
|
+
incorrect values. The method can be made
|
335
|
+
:ref:`verified <verify-primer>` by passing :attr:`verified = True`::
|
441
336
|
|
337
|
+
sage: M=Manifold("s776")
|
338
|
+
sage: M.cusp_areas(verified=True) # doctest: +NUMERIC9
|
339
|
+
[2.64575131107?, 2.64575131107?, 2.64575131107?]
|
340
|
+
|
341
|
+
:param verified:
|
342
|
+
Use :ref:`verified computation <verify-primer>`.
|
343
|
+
:param bits_prec:
|
344
|
+
Precision used for computation. Increase if computation
|
345
|
+
did not succeed or a more precise result is desired.
|
346
|
+
:param method:
|
347
|
+
Passed to :meth:`~snappy.Manifold.cusp_area_matrix`. If set
|
348
|
+
to a value different from the default ``maximal``, the cusp
|
349
|
+
neighborhoods stop growing when the corresponding value
|
350
|
+
in the computed cusp area matrix is exceeded. At this point,
|
351
|
+
the cusp neighborhood might not necessarily touch any other
|
352
|
+
cusp neighborhood since we do not use the maximal cusp area
|
353
|
+
matrix.
|
354
|
+
:param policy:
|
355
|
+
Specifies process of choosing cusp neighborhoods.
|
356
|
+
Either ``unbiased`` or ``greedy``, see above.
|
357
|
+
:param first_cusps:
|
358
|
+
Preference order of cusps.
|
359
|
+
Only relevant if :attr:`policy='greedy'`, see above.
|
360
|
+
:return:
|
361
|
+
Areas of maximal embedded and disjoint cusp neighborhoods
|
362
|
+
(default). Or areas of some embedded and disjoint cusp
|
363
|
+
neighborhoods (if :attr:`method` switches to older algorithm).
|
442
364
|
"""
|
443
365
|
if policy not in ['unbiased', 'greedy']:
|
444
366
|
raise ValueError("policy passed to cusp_areas must be 'unbiased' "
|
@@ -448,10 +370,9 @@ def cusp_areas(manifold, policy='unbiased',
|
|
448
370
|
method=method, verified=verified, bits_prec=bits_prec)
|
449
371
|
|
450
372
|
if policy == 'unbiased':
|
451
|
-
return
|
373
|
+
return cusp_areas_from_matrix.unbiased_cusp_areas_from_cusp_area_matrix(m)
|
452
374
|
else:
|
453
|
-
return
|
454
|
-
|
375
|
+
return cusp_areas_from_matrix.greedy_cusp_areas_from_cusp_area_matrix(m, first_cusps=first_cusps)
|
455
376
|
|
456
377
|
Manifold.cusp_areas = cusp_areas
|
457
378
|
ManifoldHP.cusp_areas = cusp_areas
|
@@ -461,26 +382,29 @@ from .verify import short_slopes as verify_short_slopes
|
|
461
382
|
|
462
383
|
def short_slopes(manifold,
|
463
384
|
length=6,
|
464
|
-
policy='unbiased',
|
465
|
-
|
385
|
+
policy : str = 'unbiased',
|
386
|
+
method : str = 'maximal',
|
387
|
+
verified : bool = False,
|
388
|
+
bits_prec : Optional[int] = None,
|
389
|
+
first_cusps : List[int] = []):
|
466
390
|
"""
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
391
|
+
Returns a list of short slopes (for Dehn-fillings) for each cusp.
|
392
|
+
|
393
|
+
That is, the method uses :meth:`~snappy.Manifold.cusp_areas` to find
|
394
|
+
(maximal) embedded and disjoint cusp neighborhoods. It uses the boundaries
|
395
|
+
of these cusp neighborhoods to measure the length of a peripheral curve.
|
396
|
+
For each cusp, it determines all simple peripheral curves shorter than
|
397
|
+
the given :attr:`length` (which defaults to 6). The result is a list
|
398
|
+
of the corresponding slopes for each cusp::
|
472
399
|
|
473
400
|
>>> M = Manifold("otet20_00022")
|
474
401
|
>>> M.short_slopes()
|
475
402
|
[[(1, 0), (-1, 1), (0, 1)], [(1, 0)]]
|
476
403
|
|
477
|
-
|
478
|
-
to contain all slopes of length less or equal to given ``length``
|
479
|
-
(and could contain additional slopes if precision is not high
|
480
|
-
enough)::
|
404
|
+
It takes the same arguments as :meth:`~snappy.Manifold.cusp_areas`::
|
481
405
|
|
482
|
-
|
483
|
-
[[(1, 0)
|
406
|
+
>>> M.short_slopes(policy = 'greedy')
|
407
|
+
[[(1, 0)], [(1, 0)]]
|
484
408
|
|
485
409
|
The ten exceptional slopes of the figure-eight knot::
|
486
410
|
|
@@ -488,12 +412,28 @@ def short_slopes(manifold,
|
|
488
412
|
>>> M.short_slopes()
|
489
413
|
[[(1, 0), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]
|
490
414
|
|
491
|
-
Two more slopes appear when increasing length to 2
|
415
|
+
Two more slopes appear when increasing length to :math:`2\\pi`::
|
492
416
|
|
493
417
|
>>> M.short_slopes(length = 6.283185307179586)
|
494
418
|
[[(1, 0), (-5, 1), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]]
|
495
419
|
|
496
|
-
|
420
|
+
**Verified computation**
|
421
|
+
|
422
|
+
If :attr:`verified = False`, floating-point issues can arise resulting in
|
423
|
+
incorrect values. The method can be made
|
424
|
+
:ref:`verified <verify-primer>` by passing :attr:`verified = True`::
|
425
|
+
|
426
|
+
sage: M = Manifold("4_1")
|
427
|
+
sage: M.short_slopes(verified = True)
|
428
|
+
[[(1, 0), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]
|
429
|
+
|
430
|
+
If :attr:`verified = True`, the result is guaranteed to contain all short
|
431
|
+
slopes and might contain additional slopes (with lengths slightly longer
|
432
|
+
than the given :attr:`length` but this could not be proven using the
|
433
|
+
interval estimates).
|
434
|
+
|
435
|
+
The given :attr:`length` is cast to a SageMath ``RealIntervalField`` of the
|
436
|
+
given precision if :attr:`verified = True`::
|
497
437
|
|
498
438
|
sage: from sage.all import pi
|
499
439
|
sage: M.short_slopes(length = 2 * pi, verified = True, bits_prec = 100)
|
@@ -516,42 +456,43 @@ Manifold.short_slopes = short_slopes
|
|
516
456
|
ManifoldHP.short_slopes = short_slopes
|
517
457
|
|
518
458
|
|
519
|
-
def cusp_translations(manifold,
|
520
|
-
|
521
|
-
|
459
|
+
def cusp_translations(manifold,
|
460
|
+
policy : str = 'unbiased',
|
461
|
+
method : str = 'maximal',
|
462
|
+
verified : bool = False,
|
463
|
+
bits_prec : Optional[int] = None,
|
464
|
+
first_cusps : List[int] = []):
|
522
465
|
"""
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
:
|
527
|
-
|
528
|
-
|
466
|
+
Returns a list of the (complex) Euclidean translations corresponding to the
|
467
|
+
meridian and longitude of each cusp.
|
468
|
+
|
469
|
+
That is, the method uses :meth:`~snappy.Manifold.cusp_areas` to find
|
470
|
+
(maximal) embedded and disjoint cusp neighborhoods. It then uses the
|
471
|
+
boundaries of these cusp neighborhoods to measure the meridian and
|
472
|
+
longitude of each cusp. The result is a pair for each cusp. The first
|
473
|
+
entry of the pair corresponds to the meridian and is complex. The
|
474
|
+
second entry corresponds to the longitude and is always real::
|
529
475
|
|
530
476
|
>>> M = Manifold("s776")
|
531
477
|
>>> M.cusp_translations() # doctest: +NUMERIC9
|
532
478
|
[(0.500000000000000 + 1.32287565553230*I, 2.00000000000000), (0.500000000000000 + 1.32287565553230*I, 2.00000000000000), (0.499999999999999 + 1.32287565553230*I, 2.00000000000000)]
|
533
479
|
|
534
|
-
|
535
|
-
for :py:meth:`Manifold.cusp_areas`::
|
480
|
+
It takes the same arguments as :meth:`~snappy.Manifold.cusp_areas`::
|
536
481
|
|
537
|
-
>>> M.cusp_translations(policy = 'greedy'
|
482
|
+
>>> M.cusp_translations(policy = 'greedy') # doctest: +NUMERIC9
|
538
483
|
[(0.70710678118654752440084436210 + 1.8708286933869706927918743662*I, 2.8284271247461900976033774484), (0.35355339059327376220042218105 + 0.93541434669348534639593718308*I, 1.4142135623730950488016887242), (0.35355339059327376220042218105 + 0.93541434669348534639593718308*I, 1.4142135623730950488016887242)]
|
539
484
|
|
540
|
-
|
541
|
-
|
542
|
-
sage: M.cusp_translations(method = 'maximal', verified = True) # doctest: +NUMERIC9
|
543
|
-
[(0.50000000000? + 1.32287565553?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?)]
|
544
|
-
|
545
|
-
that are guaranteed to contain the true translations of cusp neighborhoods
|
546
|
-
verified to be disjoint (the element corresponding to a longitude
|
547
|
-
is always in a ``RealIntervalField``).
|
485
|
+
**Verified computations**
|
548
486
|
|
549
|
-
|
550
|
-
|
487
|
+
If :attr:`verified = False`, floating-point issues can arise resulting in
|
488
|
+
incorrect values. The method can be made
|
489
|
+
:ref:`verified <verify-primer>` by passing :attr:`verified = True`::
|
551
490
|
|
552
|
-
|
491
|
+
sage: M.cusp_translations(verified = True) # doctest: +NUMERIC9
|
492
|
+
[(0.50000000000? + 1.32287565553?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?)]
|
553
493
|
|
554
|
-
|
494
|
+
Note that the first element of each pair is a SageMath ``ComplexIntervalField`` and
|
495
|
+
the second element a ``RealIntervalField``.
|
555
496
|
"""
|
556
497
|
|
557
498
|
return [
|
@@ -572,31 +513,44 @@ ManifoldHP.cusp_translations = cusp_translations
|
|
572
513
|
def complex_volume(manifold, verified_modulo_2_torsion=False,
|
573
514
|
bits_prec=None):
|
574
515
|
"""
|
575
|
-
Returns the complex volume
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
516
|
+
Returns the complex volume modulo :math:`i \\pi^2` which is given by
|
517
|
+
|
518
|
+
.. math::
|
519
|
+
\\text{vol} + i \\text{CS}
|
520
|
+
|
521
|
+
where :math:`\\text{CS}` is the (unnormalized) Chern-Simons invariant.
|
522
|
+
|
523
|
+
>>> M = Manifold('5_2')
|
524
|
+
>>> M.complex_volume() # doctest: +NUMERIC6
|
525
|
+
2.82812209 - 3.02412838*I
|
526
|
+
|
527
|
+
Note that :meth:`chern_simons <snappy.Manifold.chern_simons>`
|
528
|
+
normalizes the Chern-Simons invariant by dividing it by
|
529
|
+
:math:`2 \\pi^2 = 19.7392...` ::
|
530
|
+
|
531
|
+
>>> M.chern_simons() # doctest: +NUMERIC6
|
532
|
+
-0.153204133297152
|
533
|
+
|
534
|
+
More examples::
|
535
|
+
|
536
|
+
>>> M.dehn_fill((1,2))
|
537
|
+
>>> M.complex_volume() # doctest: +NUMERIC6
|
538
|
+
2.22671790 + 1.52619361*I
|
539
|
+
>>> M = Manifold("3_1") # A non-hyperbolic example.
|
540
|
+
>>> cvol = M.complex_volume()
|
541
|
+
>>> cvol.real() # doctest: +NUMERIC6
|
542
|
+
0
|
543
|
+
>>> cvol.imag() # doctest: +NUMERIC6
|
544
|
+
-1.64493407
|
591
545
|
|
592
546
|
If no cusp is filled or there is only one cusped (filled or
|
593
547
|
unfilled), the complex volume can be verified up to multiples
|
594
|
-
of i pi^2 /
|
595
|
-
when inside SageMath
|
596
|
-
with
|
548
|
+
of :math:`i \\pi^2 /2` by passing ``verified_modulo_2_torsion = True``
|
549
|
+
when inside SageMath. Higher precision can be requested
|
550
|
+
with ``bits_prec``::
|
597
551
|
|
598
552
|
sage: M = Manifold("m015")
|
599
|
-
sage: M.complex_volume(verified_modulo_2_torsion=True, bits_prec =
|
553
|
+
sage: M.complex_volume(verified_modulo_2_torsion=True, bits_prec = 93) # doctest: +NUMERIC21
|
600
554
|
2.828122088330783162764? + 1.910673824035377649698?*I
|
601
555
|
sage: M = Manifold("m015(3,4)")
|
602
556
|
sage: M.complex_volume(verified_modulo_2_torsion=True) # doctest: +NUMERIC6
|
@@ -614,7 +568,6 @@ def complex_volume(manifold, verified_modulo_2_torsion=False,
|
|
614
568
|
|
615
569
|
return manifold._complex_volume()
|
616
570
|
|
617
|
-
|
618
571
|
Manifold.complex_volume = complex_volume
|
619
572
|
ManifoldHP.complex_volume = complex_volume
|
620
573
|
|
@@ -622,67 +575,10 @@ from . import drilling
|
|
622
575
|
drilling._add_methods(Manifold)
|
623
576
|
drilling._add_methods(ManifoldHP, high_precision=True)
|
624
577
|
|
625
|
-
|
626
|
-
from .gui import ViewerWindow
|
627
|
-
from .raytracing.inside_viewer import InsideViewer
|
628
|
-
from .raytracing.inside_viewer import NonorientableUnsupportedError
|
629
|
-
from .raytracing import cohomology_fractal
|
630
|
-
except ImportError as e:
|
631
|
-
InsideViewer = None
|
632
|
-
_importErrorRaytracing = str(e)
|
633
|
-
|
634
|
-
|
635
|
-
def manifold_inside_view(self, cohomology_class=None, geodesics=[]):
|
636
|
-
"""
|
637
|
-
Show raytraced inside view of hyperbolic manifold. See
|
638
|
-
`images <https://im.icerm.brown.edu/portfolio/snappy-views/>`_
|
639
|
-
and `demo video <https://youtu.be/CAERhmUCkRs>`_.
|
640
|
-
|
641
|
-
>>> M = Manifold("m004")
|
642
|
-
>>> M.inside_view() #doctest: +CYMODERNOPENGL
|
643
|
-
|
644
|
-
Or show the cohomology fractal:
|
645
|
-
|
646
|
-
>>> M = Manifold("m004")
|
647
|
-
>>> M.inside_view(cohomology_class = 0) #doctest: +CYMODERNOPENGL
|
648
|
-
|
649
|
-
The cohomology class in H^2(M, bd M; R) producing the cohomology
|
650
|
-
fractal can be specified as a cocycle or using an automatically computed
|
651
|
-
basis (of, say, length ``n``). Thus, ``cohomology_class`` can be one of
|
652
|
-
the following.
|
653
|
-
|
654
|
-
- An integer ``i`` between 0 and ``n`` - 1 to pick the ``i``-th basis
|
655
|
-
vector.
|
656
|
-
- An array of length ``n`` specifying the cohomology class as linear
|
657
|
-
combination of basis vectors.
|
658
|
-
- A weight for each face of each tetrahedron.
|
659
|
-
|
660
|
-
"""
|
661
|
-
|
662
|
-
if InsideViewer is None:
|
663
|
-
raise RuntimeError("Raytraced inside view not imported; "
|
664
|
-
"Tk or CyOpenGL is probably missing "
|
665
|
-
"(original error : %s)" % _importErrorRaytracing)
|
666
|
-
|
667
|
-
if not self.is_orientable():
|
668
|
-
raise NonorientableUnsupportedError(self)
|
669
|
-
|
670
|
-
weights, cohomology_basis, cohomology_class = (
|
671
|
-
cohomology_fractal.compute_weights_basis_class(
|
672
|
-
self, cohomology_class))
|
673
|
-
|
674
|
-
return ViewerWindow(
|
675
|
-
InsideViewer,
|
676
|
-
self,
|
677
|
-
title="Inside view of %s" % self.name(),
|
678
|
-
weights=weights,
|
679
|
-
cohomology_basis=cohomology_basis,
|
680
|
-
cohomology_class=cohomology_class,
|
681
|
-
geodesics=geodesics)
|
682
|
-
|
578
|
+
from . import raytracing
|
683
579
|
|
684
|
-
Manifold.inside_view =
|
685
|
-
ManifoldHP.inside_view =
|
580
|
+
Manifold.inside_view = raytracing.inside_view
|
581
|
+
ManifoldHP.inside_view = raytracing.inside_view
|
686
582
|
|
687
583
|
|
688
584
|
def all_translations(self, verified=False, bits_prec=None):
|
@@ -742,7 +638,7 @@ def all_translations(self, verified=False, bits_prec=None):
|
|
742
638
|
"""
|
743
639
|
|
744
640
|
if verified or bits_prec:
|
745
|
-
# Use the implementation in verify.
|
641
|
+
# Use the implementation in verify.cusp_translations that uses
|
746
642
|
# tetrahedra_shapes and ComplexCuspNeighborhood
|
747
643
|
return verify.cusp_translations_for_neighborhood(
|
748
644
|
self, verified=verified, bits_prec=bits_prec)
|
@@ -761,6 +657,7 @@ from . import twister
|
|
761
657
|
|
762
658
|
from . import database
|
763
659
|
database.Manifold = Manifold
|
660
|
+
database.Triangulation = Triangulation
|
764
661
|
snappy_module = sys.modules[__name__]
|
765
662
|
database_objects = []
|
766
663
|
known_manifold_packages = [('snappy_manifolds', True),
|