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
@@ -0,0 +1,170 @@
|
|
1
|
+
from ..SnapPy import Info
|
2
|
+
from ..math_basics import is_ComplexIntervalFieldElement
|
3
|
+
|
4
|
+
from typing import Tuple, Optional
|
5
|
+
|
6
|
+
class LengthSpectrumGeodesicInfo(Info):
|
7
|
+
"""
|
8
|
+
Information about a geodesic in the length spectrum as returned by
|
9
|
+
Manifold.length_spectrum_alt_gen.
|
10
|
+
"""
|
11
|
+
|
12
|
+
def _body(self) -> str:
|
13
|
+
return _format % (
|
14
|
+
_format_length(self.length),
|
15
|
+
_format_core_curve(self.core_curve),
|
16
|
+
self.word)
|
17
|
+
|
18
|
+
def __repr__(self) -> str:
|
19
|
+
if self._is_first:
|
20
|
+
return _header + '\n' + self._body()
|
21
|
+
else:
|
22
|
+
return self._body()
|
23
|
+
|
24
|
+
_core_curve_label = 'Core curve'
|
25
|
+
_verified_num_digits = 19
|
26
|
+
|
27
|
+
_format = (
|
28
|
+
'%%-%ds ' # Length
|
29
|
+
'%%-%ds ' # Core curve
|
30
|
+
'%%s' # Word
|
31
|
+
) % (_verified_num_digits + len(' + ') + _verified_num_digits + len('*I'),
|
32
|
+
len(_core_curve_label))
|
33
|
+
|
34
|
+
_header = _format % ( 'Length',
|
35
|
+
_core_curve_label,
|
36
|
+
'Word')
|
37
|
+
|
38
|
+
_total_length = len("Out [100:] " + _header)
|
39
|
+
|
40
|
+
if _total_length > 80:
|
41
|
+
raise AssertionError(
|
42
|
+
"Total length spectrum string too long: %d" % (
|
43
|
+
_total_length))
|
44
|
+
|
45
|
+
def _format_length(length) -> str:
|
46
|
+
if is_ComplexIntervalFieldElement(length):
|
47
|
+
return _format_verified_length(length)
|
48
|
+
else:
|
49
|
+
return _format_unverified_length(length)
|
50
|
+
|
51
|
+
def _format_verified_length(length) -> str:
|
52
|
+
return (
|
53
|
+
_format_verified_real_length(length.real()) +
|
54
|
+
' ' +
|
55
|
+
_format_verified_imag_length(length.imag()) +
|
56
|
+
'*I')
|
57
|
+
|
58
|
+
def _format_verified_real_length(length) -> str:
|
59
|
+
result = repr(length)
|
60
|
+
return _make_fixed_length(result, _verified_num_digits)
|
61
|
+
|
62
|
+
def _format_verified_imag_length(length) -> str:
|
63
|
+
result = repr(length)
|
64
|
+
|
65
|
+
# Consume "-" to consistently format " + " and " - " later.
|
66
|
+
has_minus = result[0] == '-'
|
67
|
+
if has_minus:
|
68
|
+
result = result[1:]
|
69
|
+
|
70
|
+
# If this appears to be zero
|
71
|
+
# (that is small enough that it is of the form 1.0?e-10
|
72
|
+
# and cannot be verified to be non-zero), then
|
73
|
+
# we write "0.00000?" or "0.00000....".
|
74
|
+
if 'e' in result and not length != 0:
|
75
|
+
num_zeros = (-abs(length).log10()).lower().floor()
|
76
|
+
if num_zeros > 2:
|
77
|
+
result = '0.' + num_zeros * '0' + '?'
|
78
|
+
|
79
|
+
result = _make_fixed_length(result, _verified_num_digits)
|
80
|
+
|
81
|
+
if has_minus:
|
82
|
+
result = '- ' + result
|
83
|
+
else:
|
84
|
+
result = '+ ' + result
|
85
|
+
return result
|
86
|
+
|
87
|
+
def _format_unverified_length(length) -> str:
|
88
|
+
formatStr = "%16.14f"
|
89
|
+
|
90
|
+
lenStr = formatStr % length.real()
|
91
|
+
absImag = abs(length.imag())
|
92
|
+
# Unverified: just drop imaginary part if it is close to zero.
|
93
|
+
if absImag > 1e-9:
|
94
|
+
if length.imag() > 0:
|
95
|
+
lenStr += " + "
|
96
|
+
else:
|
97
|
+
lenStr += " - "
|
98
|
+
lenStr += (formatStr % absImag) + "*I"
|
99
|
+
return lenStr
|
100
|
+
|
101
|
+
def _format_word(word : str, max_length : int) -> str:
|
102
|
+
"""
|
103
|
+
>>> _format_word('abcdefghi', 9)
|
104
|
+
'abcdefghi'
|
105
|
+
>>> _format_word('abcdefghi', 8)
|
106
|
+
'abcde...'
|
107
|
+
>>> _format_word('X1x2x123x12', 11)
|
108
|
+
'X1x2x123x12'
|
109
|
+
>>> _format_word('X1x2x123x12', 10)
|
110
|
+
'X1x2...'
|
111
|
+
"""
|
112
|
+
|
113
|
+
if len(word) <= max_length:
|
114
|
+
return word
|
115
|
+
|
116
|
+
# If word is too long, write it as "abc..." so that total
|
117
|
+
# length is _max_word_length.
|
118
|
+
ellipsis = '...'
|
119
|
+
|
120
|
+
for i in range(max_length - len(ellipsis), -1, -1):
|
121
|
+
# Be careful not to break at, say 2, in x123 since
|
122
|
+
# x12... would be misleading.
|
123
|
+
if not word[i].isdigit():
|
124
|
+
break
|
125
|
+
return word[:i] + ellipsis
|
126
|
+
|
127
|
+
def _format_core_curve(core_curve : Optional[int]) -> str:
|
128
|
+
if core_curve is None:
|
129
|
+
return '-'
|
130
|
+
else:
|
131
|
+
return 'Cusp %d' % core_curve
|
132
|
+
|
133
|
+
def _split_scientific_notation(s : str) -> Tuple[str, str]:
|
134
|
+
"""
|
135
|
+
>>> _split_scientific_notation('0.45')
|
136
|
+
('0.45', '')
|
137
|
+
>>> _split_scientific_notation('4.5?e-5')
|
138
|
+
('4.5?', 'e-5')
|
139
|
+
"""
|
140
|
+
|
141
|
+
parts = s.split('e', 2)
|
142
|
+
if len(parts) == 2:
|
143
|
+
return parts[0], 'e' + parts[1]
|
144
|
+
else:
|
145
|
+
return parts[0], ''
|
146
|
+
|
147
|
+
def _make_fixed_length(result : str, length : int) -> str:
|
148
|
+
"""
|
149
|
+
>>> _make_fixed_length('0.1234567', 9)
|
150
|
+
'0.1234567'
|
151
|
+
>>> _make_fixed_length('0.1234567', 8)
|
152
|
+
'0.123...'
|
153
|
+
>>> _make_fixed_length('1.2345678e-4', 9)
|
154
|
+
'1.2...e-4'
|
155
|
+
"""
|
156
|
+
|
157
|
+
n = len(result)
|
158
|
+
|
159
|
+
# How many characters to we need to erase.
|
160
|
+
k = n - length
|
161
|
+
|
162
|
+
if k <= 0:
|
163
|
+
# We actually need to fill with white space.
|
164
|
+
return result + (-k) * ' '
|
165
|
+
|
166
|
+
# Preserve trailing, e.g., 'e-4'
|
167
|
+
m, e = _split_scientific_notation(result)
|
168
|
+
ellipsis = '...'
|
169
|
+
k += len(ellipsis)
|
170
|
+
return m[:-k] + ellipsis + e
|
snappy/len_spec/spine.py
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
from ..snap.t3mlite import Mcomplex, simplex, Tetrahedron
|
2
|
+
from ..hyperboloid.distances import distance_r13_points
|
3
|
+
from ..hyperboloid import compute_inradius_and_incenter_from_planes
|
4
|
+
from ..hyperboloid import time_r13_normalise, r13_dot
|
5
|
+
from ..math_basics import correct_max
|
6
|
+
|
7
|
+
def add_spine(mcomplex : Mcomplex):
|
8
|
+
"""
|
9
|
+
Adds a spine to the mcomplex with some geometric structures.
|
10
|
+
|
11
|
+
The key property of the spine is that every geodesic that is not a core
|
12
|
+
curve is intersecting the spine.
|
13
|
+
|
14
|
+
Topologically, the spine is the dual 2-skeleton of the triangulation.
|
15
|
+
Restricted to a tetrahedron, it consists of 12 triangles. The vertices
|
16
|
+
of each triangle are on an edge, on a face and inside the tetrahedron.
|
17
|
+
|
18
|
+
We can give the spine a geometry by picking a point on each edge, on
|
19
|
+
each face and in each tetrahedron. Since we are only interested in the
|
20
|
+
radius of the spine when restricted to a tetrahedron, we actually do
|
21
|
+
not explicitly compute a point for each face.
|
22
|
+
|
23
|
+
We store the following information about the spine:
|
24
|
+
- use the tetrahedron's incenter as its spine center tet.spine_center.
|
25
|
+
- compute tet.out_radius, the radius (about the spine center) of a
|
26
|
+
tetrahedron truncated by the smaller horotriangles given by the scale
|
27
|
+
factor.
|
28
|
+
- a point on each edge of the triangulation, stored in tet.spine_points
|
29
|
+
- the maximum distance of the tet.spine_points to tet.spine_center in
|
30
|
+
tet.spine_radius.
|
31
|
+
Lemma: There is a spine of the manifold such that for each tetrahedron
|
32
|
+
a ball of this radius about the tetrahedron's spine center will contain
|
33
|
+
the restriction of the spine to the tetrahedron.
|
34
|
+
Proof: For each face, pick as point on that face the point picked for
|
35
|
+
one of the edges of that face. Consider one of the 12 triangles.
|
36
|
+
The point furthest from the spine center will be one of its vertices.
|
37
|
+
We can ignore the vertex that is the spine center itself. Any other
|
38
|
+
vertex of the triangle was considered when computing the maximum
|
39
|
+
distance.
|
40
|
+
- tet.inv_spine_cosh = 1 / cosh(r) where r is the tet.spine_radius
|
41
|
+
- for the entire fundamental domain, we have store the spine center
|
42
|
+
of the base tetrahedron in mcomplex.spine_center and the distance of
|
43
|
+
the spine point of any edge in the fundamental domain in
|
44
|
+
mcomplex.spine_radius.
|
45
|
+
"""
|
46
|
+
|
47
|
+
_add_spine_points(mcomplex)
|
48
|
+
|
49
|
+
for tet in mcomplex.Tetrahedra:
|
50
|
+
_, tet.spine_center = compute_inradius_and_incenter_from_planes(
|
51
|
+
[ tet.R13_planes[f]
|
52
|
+
for f in simplex.TwoSubsimplices ])
|
53
|
+
|
54
|
+
tet.spine_radius = correct_max(
|
55
|
+
[ distance_r13_points(tet.spine_center,
|
56
|
+
tet.spine_points[e])
|
57
|
+
for e in simplex.OneSubsimplices] )
|
58
|
+
|
59
|
+
tet.inv_spine_cosh = 1 / tet.spine_radius.cosh()
|
60
|
+
|
61
|
+
if False:
|
62
|
+
for v in simplex.ZeroSubsimplices:
|
63
|
+
d = r13_dot(tet.spine_center, tet.R13_vertices[v])
|
64
|
+
if not d < - (1 - mcomplex.RF(1e-8)):
|
65
|
+
print(tet.spine_points)
|
66
|
+
print(tet.R13_vertices)
|
67
|
+
raise Exception("Conjecture is wrong.")
|
68
|
+
|
69
|
+
tet.out_points = {
|
70
|
+
(v0, v1): _out_point(tet, v0, v1)
|
71
|
+
for v0 in simplex.ZeroSubsimplices
|
72
|
+
for v1 in simplex.ZeroSubsimplices
|
73
|
+
if v0 != v1 }
|
74
|
+
|
75
|
+
tet.out_radius = correct_max(
|
76
|
+
[ distance_r13_points(tet.spine_center,
|
77
|
+
tet.out_points[(v0, v1)])
|
78
|
+
for v0 in simplex.ZeroSubsimplices
|
79
|
+
for v1 in simplex.ZeroSubsimplices
|
80
|
+
if v0 != v1 ])
|
81
|
+
|
82
|
+
if False:
|
83
|
+
print("out, spine =", tet.out_radius, tet.spine_radius)
|
84
|
+
|
85
|
+
mcomplex.spine_center = mcomplex.baseTet.spine_center
|
86
|
+
mcomplex.spine_radius = correct_max(
|
87
|
+
[ distance_r13_points(mcomplex.spine_center,
|
88
|
+
tet.spine_points[e])
|
89
|
+
for tet in mcomplex.Tetrahedra
|
90
|
+
for e in simplex.OneSubsimplices ])
|
91
|
+
|
92
|
+
def _add_spine_points(mcomplex : Mcomplex):
|
93
|
+
"""
|
94
|
+
Adds tet.spine_points.
|
95
|
+
|
96
|
+
We need to pick the points such that they are inside the tetrahedra
|
97
|
+
truncated by the chosen cusp neighborhood or tube about the core curve (if
|
98
|
+
cusp is filled). We also need to pick them consistently across tetrahedra.
|
99
|
+
|
100
|
+
That is if two edges of two (not necessarily distinct) tetrahedra get
|
101
|
+
identified in the triangulation, then the two points we pick for those two
|
102
|
+
edges need to be the same point in the manifold.
|
103
|
+
"""
|
104
|
+
|
105
|
+
for tet in mcomplex.Tetrahedra:
|
106
|
+
tet.spine_points = {}
|
107
|
+
|
108
|
+
for edge in mcomplex.Edges:
|
109
|
+
# An edge connects two (possibly not distinct) cusps.
|
110
|
+
#
|
111
|
+
# If both cusps are complete, this is easy:
|
112
|
+
# We simply take as point the midpoint on the edge between the two
|
113
|
+
# cusp neighborhoods. Given the vectors defining the
|
114
|
+
# corresponding horoballs stored in tet.R13_vertices, we can simply
|
115
|
+
# average the two corresponding vectors and normalise.
|
116
|
+
#
|
117
|
+
# However, if the cusp is incomplete, the horotriangles for one cusp
|
118
|
+
# about the edge touch the edge about different points in the
|
119
|
+
# manifold (recall the Giant's Causeway picture in
|
120
|
+
# scale_triangles_to_avoid_standard_tube).
|
121
|
+
#
|
122
|
+
# So when we walk about the edge, we need to keep track of the scaling
|
123
|
+
# factor that needs to be applied to tet.R13_vertices so that the
|
124
|
+
# horotriangle it defines lines up with the first horotriangle about
|
125
|
+
# the edge.
|
126
|
+
#
|
127
|
+
# When we go from one triangle to the next, the scaling factor needs to
|
128
|
+
# be adjusted by the ratio of the lengths of the edges of the triangle
|
129
|
+
# that we want to glue together.
|
130
|
+
#
|
131
|
+
# We start by simply picking the midpoint as in the complete case
|
132
|
+
# for the first edge embedding. Since the two horotriangles we use
|
133
|
+
# are both outside the chosen cusp neighborhood or core curve tube,
|
134
|
+
# the point computed this way will be outside those neighborhoods.
|
135
|
+
|
136
|
+
# Relevant edge length of triangle for cusps
|
137
|
+
length0 = None
|
138
|
+
length1 = None
|
139
|
+
|
140
|
+
# Scale factor to align horotriangles for both cusps
|
141
|
+
scale0 = mcomplex.RF(1)
|
142
|
+
scale1 = mcomplex.RF(1)
|
143
|
+
|
144
|
+
# Walk about the edge
|
145
|
+
for i, (tet, perm) in enumerate(edge.embeddings()):
|
146
|
+
# Vertices of tetrahedron corresponding to the cusps
|
147
|
+
v0 = simplex.ZeroSubsimplices[perm[0]]
|
148
|
+
v1 = simplex.ZeroSubsimplices[perm[1]]
|
149
|
+
|
150
|
+
# Face we need to cross to get to next embedding
|
151
|
+
face2 = simplex.TwoSubsimplices[perm[2]]
|
152
|
+
# Face we need to cross to get to previous embedding
|
153
|
+
face3 = simplex.TwoSubsimplices[perm[3]]
|
154
|
+
|
155
|
+
if i == 0:
|
156
|
+
# Record whether cusp is complete
|
157
|
+
is_complete0 = tet.Class[v0].is_complete
|
158
|
+
is_complete1 = tet.Class[v1].is_complete
|
159
|
+
|
160
|
+
if not is_complete0:
|
161
|
+
lengths0 = tet.horotriangles[v0].get_real_lengths()
|
162
|
+
if length0 is not None:
|
163
|
+
# We are beyond the very first triangle and need to
|
164
|
+
# update the scaling factor.
|
165
|
+
#
|
166
|
+
# We use the ratio of the following edge lengths:
|
167
|
+
# - the edge of the current triangle. It is the edge that
|
168
|
+
# we need to cross to get to the previous embedding.
|
169
|
+
# - the edge of the previous triangle. It is the edge that
|
170
|
+
# we needed to cross to get to this embedding.
|
171
|
+
scale0 = scale0 * lengths0[face3] / length0
|
172
|
+
# Store length for next iteration
|
173
|
+
length0 = lengths0[face2]
|
174
|
+
|
175
|
+
if not is_complete1:
|
176
|
+
# Similar
|
177
|
+
lengths1 = tet.horotriangles[v1].get_real_lengths()
|
178
|
+
if length1 is not None:
|
179
|
+
scale1 = scale1 * lengths1[face3] / length1
|
180
|
+
length1 = lengths1[face2]
|
181
|
+
|
182
|
+
tet.spine_points[v0 | v1] = time_r13_normalise(
|
183
|
+
scale0 * tet.R13_vertices[v0] + scale1 * tet.R13_vertices[v1])
|
184
|
+
|
185
|
+
def _out_point(tet : Tetrahedron, v0 : int, v1 : int):
|
186
|
+
"""
|
187
|
+
Compute one vertex of the truncated tetrahedron. Here it is the "large"
|
188
|
+
tetrahedron truncated by the "small" horotriangle.
|
189
|
+
|
190
|
+
Note that for a complete cusps, we only have one horotriangle per tetrahedron
|
191
|
+
and vertex of that tetrahedron. But for a filled cusp, we have a pair of
|
192
|
+
horotriangles, a "big" one which is outside the chosen core curve tube and
|
193
|
+
a "small" one inside the chosen core curve tube.
|
194
|
+
"""
|
195
|
+
|
196
|
+
# Inverse scaling factor to get from the default "big" horotriangle to the
|
197
|
+
# "small" one.
|
198
|
+
s = tet.horotriangles[v0].inverse_scale_to_be_inside_tube
|
199
|
+
return _point_on_horosphere(s * tet.R13_vertices[v0], tet.R13_vertices[v1])
|
200
|
+
|
201
|
+
def _point_on_horosphere(horo_vec, pt):
|
202
|
+
"""
|
203
|
+
The point that is the intersection of the horosphere defined by horo_vec
|
204
|
+
and the line from horo_vec to pt.
|
205
|
+
"""
|
206
|
+
return time_r13_normalise( horo_vec - (2 / r13_dot(horo_vec, pt)) * pt)
|
snappy/len_spec/test.py
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
from snappy import testing
|
2
|
+
import snappy
|
3
|
+
|
4
|
+
from snappy import len_spec
|
5
|
+
import snappy.len_spec.test_cases
|
6
|
+
|
7
|
+
modules = [
|
8
|
+
len_spec,
|
9
|
+
len_spec.word,
|
10
|
+
len_spec.length_spectrum_geodesic_info,
|
11
|
+
len_spec.test_cases
|
12
|
+
]
|
13
|
+
|
14
|
+
def run_doctests(verbose=False, print_info=True):
|
15
|
+
globs = {'Manifold': snappy.Manifold}
|
16
|
+
return testing.doctest_modules(modules,
|
17
|
+
verbose=verbose,
|
18
|
+
print_info=print_info,
|
19
|
+
extraglobs=globs)
|
20
|
+
|
21
|
+
run_doctests.__name__ = len_spec.__name__
|
22
|
+
|
23
|
+
if __name__ == '__main__':
|
24
|
+
testing.run_doctests_as_main(run_doctests)
|
@@ -0,0 +1,69 @@
|
|
1
|
+
"""
|
2
|
+
IMPORTANT: Python only recognises this as a doc string if there is
|
3
|
+
nothing before it. In particular, add any includes after the doc string.
|
4
|
+
|
5
|
+
>>> M = Manifold("m125(3,4)(0,0)")
|
6
|
+
>>> spec = M.length_spectrum_alt_gen()
|
7
|
+
>>> next(spec) # doctest: +NUMERIC9
|
8
|
+
Length Core curve Word
|
9
|
+
0.24208261435543 - 1.73621300277325*I Cusp 0 aBDcDcb
|
10
|
+
>>> next(spec).length # doctest: +NUMERIC9
|
11
|
+
0.90986906036840 + 3.03574280072295*I
|
12
|
+
>>> next(spec).length # doctest: +NUMERIC9
|
13
|
+
0.98258854739348 - 2.33353878259198*I
|
14
|
+
>>> next(spec).length # doctest: +NUMERIC9
|
15
|
+
1.00610499287709 - 3.02617893116978*I
|
16
|
+
>>> next(spec).length # doctest: +NUMERIC9
|
17
|
+
1.13551437663552 - 2.12918861416187*I
|
18
|
+
>>> next(spec).length # doctest: +NUMERIC9
|
19
|
+
1.63203771292969 + 2.30009520293758*I
|
20
|
+
|
21
|
+
Examples with +SKIP from length_spectrum_alt
|
22
|
+
|
23
|
+
>>> M = Manifold("m202(3,4)(3,4)")
|
24
|
+
>>> spec = M.length_spectrum_alt(count = 3)
|
25
|
+
>>> len(spec)
|
26
|
+
4
|
27
|
+
>>> spec[0].length # doctest: +NUMERIC9
|
28
|
+
0.14820741547094 - 1.76955170166922*I
|
29
|
+
>>> spec[1].length # doctest: +NUMERIC9
|
30
|
+
0.14820741547097 - 1.76955170166923*I
|
31
|
+
>>> spec[2].length # doctest: +NUMERIC9
|
32
|
+
0.79356651781096 + 2.65902431489655*I
|
33
|
+
>>> spec[3].length # doctest: +NUMERIC9
|
34
|
+
0.79356651781096 + 2.65902431489655*I
|
35
|
+
|
36
|
+
Verified:
|
37
|
+
|
38
|
+
sage: spec = M.length_spectrum_alt(count = 3, verified = True, bits_prec = 110)
|
39
|
+
sage: len(spec)
|
40
|
+
4
|
41
|
+
sage: spec[0].length # doctest: +NUMERIC9
|
42
|
+
0.14820741547094772? - 1.76955170166923543?*I
|
43
|
+
sage: spec[1].length # doctest: +NUMERIC9
|
44
|
+
0.14820741547094772? - 1.76955170166923543?*I
|
45
|
+
sage: spec[2].length # doctest: +NUMERIC9
|
46
|
+
0.79356651781095741? + 2.65902431489655135?*I
|
47
|
+
sage: spec[3].length # doctest: +NUMERIC9
|
48
|
+
0.79356651781095741? + 2.65902431489655135?*I
|
49
|
+
|
50
|
+
>>> M = Manifold("m202(3,4)(0,0)")
|
51
|
+
>>> M.length_spectrum_alt(max_len = 1.1) # doctest: +NUMERIC9
|
52
|
+
[Length Core curve Word
|
53
|
+
0.14742465268512 - 1.78287093565202*I Cusp 0 aabcDabcB,
|
54
|
+
0.81161414965958 + 2.72911699294426*I - b,
|
55
|
+
0.84163270359334 + 2.61245944742151*I - aB,
|
56
|
+
0.93461379591349 + 2.70060614107722*I - a]
|
57
|
+
|
58
|
+
sage: M.length_spectrum_alt(max_len = 1.1, verified=True, bits_prec=130) # doctest: +NORMALIZE_WHITESPACE
|
59
|
+
[Length Core curve Word
|
60
|
+
0.14742465268515... - 1.78287093565201...*I Cusp 0 aabcDabcB,
|
61
|
+
0.81161414965958... + 2.72911699294425...*I - b,
|
62
|
+
0.84163270359334... + 2.61245944742151...*I - aB,
|
63
|
+
0.93461379591349... + 2.70060614107721...*I - a]
|
64
|
+
|
65
|
+
|
66
|
+
"""
|
67
|
+
|
68
|
+
if not __doc__:
|
69
|
+
raise Exception("doc string with tests was not recognized.")
|