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/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py}
RENAMED
@@ -1,18 +1,27 @@
|
|
1
|
-
from .line import R13LineWithMatrix
|
2
|
-
from . import epsilons
|
3
1
|
from . import constants
|
4
2
|
from . import exceptions
|
5
3
|
|
6
|
-
from
|
7
|
-
from
|
8
|
-
from
|
9
|
-
from
|
10
|
-
|
4
|
+
from .line import R13LineWithMatrix
|
5
|
+
from .fixed_points import r13_fixed_line_of_psl2c_matrix
|
6
|
+
from .multiplicity import compute_and_verify_multiplicity
|
7
|
+
from .graph_trace_helper import find_lifted_tetrahedra_containing_point
|
8
|
+
|
9
|
+
from .. import word_to_psl2c_matrix
|
10
|
+
|
11
|
+
from ...tiling.lifted_tetrahedron import LiftedTetrahedron
|
12
|
+
from ...hyperboloid import r13_dot, o13_inverse # type: ignore
|
13
|
+
from ...hyperboloid.distances import distance_r13_points
|
14
|
+
from ...hyperboloid.line import R13Line
|
15
|
+
from ...snap.t3mlite import simplex # type: ignore
|
16
|
+
from ...snap.t3mlite import Tetrahedron, Vertex, Mcomplex # type: ignore
|
17
|
+
from ...exceptions import InsufficientPrecisionError # type: ignore
|
18
|
+
from ...matrix import make_identity_matrix # type: ignore
|
11
19
|
|
12
20
|
from typing import Tuple, Sequence, Optional, Any
|
13
21
|
|
22
|
+
__all__ = ['compute_geodsic_info', 'GeodesicStartPointInfo', 'sample_line']
|
14
23
|
|
15
|
-
def sample_line(
|
24
|
+
def sample_line(line : R13Line):
|
16
25
|
"""
|
17
26
|
Pick a point on a line in the hyperboloid model.
|
18
27
|
Returns an unnormalised time-like vector computed
|
@@ -24,9 +33,18 @@ def sample_line(line_with_matrix : R13LineWithMatrix):
|
|
24
33
|
triangulation (which happens for some geodesics in some
|
25
34
|
triangulated hyperbolic manifolds when picking equal weights for
|
26
35
|
the fixed points computed by r13_fixed_points_of_psl2c_matrix).
|
36
|
+
|
37
|
+
Note that we want to avoid picking a point that is far away from
|
38
|
+
the fundamental polyhedron. By the choices we made, this is not
|
39
|
+
the case: the fundamental polyhedron is contains the origin in the
|
40
|
+
hyperboloid model. r13_fixed_points_of_psl2c_matrix returns
|
41
|
+
light-like vectors of the form (1, ...) so the average corresponds
|
42
|
+
to taking the mid-point in the Klein model and is thus the point
|
43
|
+
on the line closest to the origin. Furthermore, the bias is close
|
44
|
+
enough to 1 (the log is ~0.22, so we move the point by ~0.11
|
45
|
+
units in hyperbolic space).
|
27
46
|
"""
|
28
47
|
|
29
|
-
line = line_with_matrix.r13_line
|
30
48
|
RF = line.points[0][0].parent()
|
31
49
|
bias = RF(constants.start_point_bias)
|
32
50
|
|
@@ -35,29 +53,7 @@ def sample_line(line_with_matrix : R13LineWithMatrix):
|
|
35
53
|
# @dataclass
|
36
54
|
|
37
55
|
|
38
|
-
class
|
39
|
-
"""
|
40
|
-
Represents the lift of a tetrahedron in a manifold to the hyperboloid
|
41
|
-
model.
|
42
|
-
|
43
|
-
That is, if a tetrahedron (as part of the fundamental domain) was assigned
|
44
|
-
vertices by calling add_r13_geometry, then the vertices of a
|
45
|
-
LiftedTetrahedron l will be given by l.o13_matrices * tet.R13_vertices[v]
|
46
|
-
where v in snappy.snap.t3mlite.simplex.ZeroSubsimplices.
|
47
|
-
"""
|
48
|
-
|
49
|
-
def __init__(self,
|
50
|
-
tet : Tetrahedron,
|
51
|
-
# An O(1,3)-matrix - since this might be a SageMath class or a
|
52
|
-
# SimpleMatrix, just using Any as type annotation.
|
53
|
-
o13_matrix):
|
54
|
-
self.tet = tet
|
55
|
-
self.o13_matrix = o13_matrix
|
56
|
-
|
57
|
-
# @dataclass
|
58
|
-
|
59
|
-
|
60
|
-
class GeodesicInfo:
|
56
|
+
class GeodesicStartPointInfo:
|
61
57
|
"""
|
62
58
|
Information needed to trace a closed geodesic through a triangulation
|
63
59
|
given as snappy.snap.t3mlite.Mcomplex with geometric structure added
|
@@ -74,7 +70,7 @@ class GeodesicInfo:
|
|
74
70
|
will either:
|
75
71
|
|
76
72
|
1. Detect that the closed geodesic is actually a core curve of a
|
77
|
-
filled cusp and set core_curve_cusp and
|
73
|
+
filled cusp and set core_curve_cusp and core_curve_multiplicity
|
78
74
|
accordingly. This means that instead tracing the geodesic
|
79
75
|
through the triangulation, the client has to unfill the
|
80
76
|
corresponding cusp instead.
|
@@ -104,6 +100,9 @@ class GeodesicInfo:
|
|
104
100
|
# The triangulation
|
105
101
|
mcomplex : Mcomplex,
|
106
102
|
|
103
|
+
# Word were are drilling
|
104
|
+
word : str,
|
105
|
+
|
107
106
|
# Trace of corresponding PSL(2,C)-matrix.
|
108
107
|
trace : Any,
|
109
108
|
|
@@ -143,13 +142,14 @@ class GeodesicInfo:
|
|
143
142
|
# Output of find_tet_or_core_corve: sign (+1/-1) indicating whether
|
144
143
|
# the given geodesic and the core curve run parallel or
|
145
144
|
# anti-parallel.
|
146
|
-
|
145
|
+
core_curve_multiplicity : Optional[int] = None,
|
147
146
|
|
148
147
|
# Field filled by client to indicate which index the cusp resulting
|
149
148
|
# from drilling this geodesic is supposed to have.
|
150
149
|
index : Optional[int] = None):
|
151
150
|
|
152
151
|
self.mcomplex = mcomplex
|
152
|
+
self.word = word
|
153
153
|
self.trace = trace
|
154
154
|
self.unnormalised_start_point = unnormalised_start_point
|
155
155
|
self.unnormalised_end_point = unnormalised_end_point
|
@@ -157,7 +157,7 @@ class GeodesicInfo:
|
|
157
157
|
self.tet = tet
|
158
158
|
self.lifted_tetrahedra = lifted_tetrahedra
|
159
159
|
self.core_curve_cusp = core_curve_cusp
|
160
|
-
self.
|
160
|
+
self.core_curve_multiplicity = core_curve_multiplicity
|
161
161
|
self.index = index
|
162
162
|
|
163
163
|
def find_tet_or_core_curve(self) -> None:
|
@@ -172,10 +172,13 @@ class GeodesicInfo:
|
|
172
172
|
not ensure that this distance is positive.
|
173
173
|
"""
|
174
174
|
|
175
|
+
self._graph_trace()
|
176
|
+
|
177
|
+
def _graph_trace(self):
|
175
178
|
self.tet = None
|
176
179
|
self.lifted_tetrahedra = ()
|
177
180
|
self.core_curve_cusp = None
|
178
|
-
self.
|
181
|
+
self.core_curve_multiplicity = None
|
179
182
|
|
180
183
|
# Walks from tetrahedron to tetrahedron (transforming the start point
|
181
184
|
# and other data) trying to get the start_point closer and closer to
|
@@ -184,111 +187,36 @@ class GeodesicInfo:
|
|
184
187
|
# face of a tetrahedron or when (the lift of) the geodesic was really
|
185
188
|
# close to (a lift of) a core curve.
|
186
189
|
|
187
|
-
# tet is the tetrahedron where the algorithm stopped.
|
188
|
-
# faces is the subset of simplex.TwoSubsimplices: a face is in the subset
|
189
|
-
# if it could not be verified that the start point is to the inside
|
190
|
-
# of the plane supporting that face.
|
191
|
-
# cusp_curve_vertex is None or an element of simplex.ZeroSubsimplices
|
192
|
-
# if we are close to the core curve at that vertex.
|
193
|
-
tet, faces, cusp_curve_vertex = self._graph_trace(self.mcomplex.baseTet)
|
194
|
-
|
195
|
-
# Do some verification work for the above information to fill
|
196
|
-
# self.tet, self.lifted_tetrahedra and self.core_curve_cusp.
|
197
|
-
|
198
|
-
if cusp_curve_vertex is not None:
|
199
|
-
# Verify that the the geodesic is really the core curve and
|
200
|
-
# determine whether the geodesic and core curve or parallel
|
201
|
-
# or anti-parallel.
|
202
|
-
self.core_curve_direction = self._verify_direction_of_core_curve(
|
203
|
-
tet, cusp_curve_vertex)
|
204
|
-
self.core_curve_cusp = tet.Class[cusp_curve_vertex]
|
205
|
-
return
|
206
|
-
|
207
|
-
id_matrix = matrix.identity(ring=self.mcomplex.RF, n=4)
|
208
|
-
|
209
|
-
if len(faces) == 0:
|
210
|
-
# The start point is really inside the given tetrahedron.
|
211
|
-
|
212
|
-
# Signal to the client that we can start tracing the geodesic
|
213
|
-
# throguh the triangulation from this tetrahedron:
|
214
|
-
self.tet = tet
|
215
|
-
|
216
|
-
# Signal to the client that we can start with this tetrahedron
|
217
|
-
# when developing a tube about the geodesic.
|
218
|
-
self.lifted_tetrahedra = [ LiftedTetrahedron(tet, id_matrix) ]
|
219
|
-
return
|
220
|
-
|
221
|
-
if len(faces) == 1:
|
222
|
-
# The start point is probably on the face of the tetrahedron,
|
223
|
-
# that is, we could verify it lies to the right side of the
|
224
|
-
# supporting planes for three faces but not one:
|
225
|
-
face, = faces
|
226
|
-
|
227
|
-
# Even though we cannot verify that the start point lies
|
228
|
-
# exactly on the face, we can verify that the start point
|
229
|
-
# lies in the interior of the union of two neighboring
|
230
|
-
# tetrahedra. That is, the union is a hexahedron and
|
231
|
-
# it suffices to check that the start point lies to the
|
232
|
-
# inside of the six faces of the tetrahedron.
|
233
|
-
#
|
234
|
-
# _graph_trace already checked the three faces of the given
|
235
|
-
# tetrahedron. But it is left to check this for the neighboring
|
236
|
-
# tetrahedron.
|
237
|
-
|
238
|
-
# Find the other tetrahedron of the neighboring tetrahedra.
|
239
|
-
other_tet = tet.Neighbor[face]
|
240
|
-
other_unnormalised_start_point = (
|
241
|
-
tet.O13_matrices[face] * self.unnormalised_start_point)
|
242
|
-
other_face = tet.Gluing[face].image(face)
|
243
|
-
|
244
|
-
for f in simplex.TwoSubsimplices:
|
245
|
-
if f != other_face:
|
246
|
-
if not r13_dot(other_unnormalised_start_point,
|
247
|
-
other_tet.R13_planes[f]) < 0:
|
248
|
-
raise InsufficientPrecisionError(
|
249
|
-
"Failed to find lift of geodesic and prove that "
|
250
|
-
"it intersects tetrahedra of the fundamental domain. "
|
251
|
-
"Increasing the precision will probably fix this "
|
252
|
-
"problem.")
|
253
|
-
|
254
|
-
# Returns the two (lifted) tetrahedra.
|
255
|
-
self.lifted_tetrahedra = [
|
256
|
-
LiftedTetrahedron(tet, id_matrix),
|
257
|
-
LiftedTetrahedron(other_tet,
|
258
|
-
other_tet.O13_matrices[other_face]) ]
|
259
|
-
return
|
260
|
-
|
261
|
-
raise InsufficientPrecisionError(
|
262
|
-
"Start point chosen on geodesic too close to 1-skeleton of "
|
263
|
-
"triangulation to verify it is not on the 1-skeleton. "
|
264
|
-
"Increasing the precision will probably fix this problem.")
|
265
|
-
|
266
|
-
def _graph_trace(
|
267
|
-
self,
|
268
|
-
tet : Tetrahedron) -> Tuple[Tetrahedron,
|
269
|
-
Sequence[int],
|
270
|
-
Optional[int]]:
|
271
|
-
"""
|
272
|
-
Walk from tetrahedron to tetrahedron (transforming start point and
|
273
|
-
the other data) to capture the start point in a tetrahedron.
|
274
|
-
"""
|
275
|
-
|
276
190
|
if self.mcomplex.verified:
|
277
191
|
epsilon = 0
|
278
|
-
key
|
192
|
+
def key(face_and_signed_distance):
|
193
|
+
return face_and_signed_distance[1].center()
|
279
194
|
else:
|
280
|
-
epsilon =
|
281
|
-
key
|
195
|
+
epsilon = _compute_epsilon(self.mcomplex.RF)
|
196
|
+
def key(face_and_signed_distance):
|
197
|
+
return face_and_signed_distance[1]
|
282
198
|
|
283
199
|
# Face through which tetrahedron was entered - to avoid we are
|
284
200
|
# going back through the face we just came from. Initialized to
|
285
201
|
# simplex.T for the first iteration.
|
202
|
+
tet = self.mcomplex.baseTet
|
286
203
|
entry_cell = simplex.T
|
287
204
|
|
288
205
|
for i in range(constants.graph_trace_max_steps):
|
289
206
|
# See whether the geodesic is close to a core curve.
|
207
|
+
# v is the vertex of the simplex for that core curve.
|
208
|
+
# Or None
|
290
209
|
v = self._find_cusp_if_core_curve(tet, entry_cell, epsilon)
|
291
210
|
|
211
|
+
if v is not None:
|
212
|
+
# Verify that the the geodesic is really the core curve and
|
213
|
+
# determine whether the geodesic and core curve or parallel
|
214
|
+
# or anti-parallel.
|
215
|
+
self.core_curve_multiplicity = self._multiplicity_of_core_curve(
|
216
|
+
tet, v)
|
217
|
+
self.core_curve_cusp = tet.Class[v]
|
218
|
+
return
|
219
|
+
|
292
220
|
# Compute the signed distance of the start point to the
|
293
221
|
# planes supporting a face for each face of the tetrahedron.
|
294
222
|
#
|
@@ -308,22 +236,29 @@ class GeodesicInfo:
|
|
308
236
|
# tetrahedron, stop.
|
309
237
|
#
|
310
238
|
# Note the subtle difference here between using
|
311
|
-
# signed_distance >
|
239
|
+
# signed_distance > epsilon to determine whether to stop
|
312
240
|
# signed_distance < -epsilon to determine whether the start point
|
313
241
|
# is inside.
|
314
242
|
#
|
315
|
-
if
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
243
|
+
if not any( signed_distance > epsilon
|
244
|
+
for face, signed_distance
|
245
|
+
in faces_and_signed_distances ):
|
246
|
+
|
247
|
+
self.lifted_tetrahedra = find_lifted_tetrahedra_containing_point(
|
248
|
+
LiftedTetrahedron(
|
249
|
+
tet, make_identity_matrix(ring=self.mcomplex.RF, n=4)),
|
250
|
+
faces_and_signed_distances,
|
251
|
+
self.unnormalised_start_point,
|
252
|
+
epsilon)
|
253
|
+
|
254
|
+
if len(self.lifted_tetrahedra) == 1:
|
255
|
+
# We verified that there is a unique tetrahedron containing
|
256
|
+
# the start point.
|
257
|
+
# Signal to the client that we can start tracing the geodesic
|
258
|
+
# throguh the triangulation from this tetrahedron:
|
259
|
+
self.tet = self.lifted_tetrahedra[0].tet
|
260
|
+
|
261
|
+
return
|
327
262
|
|
328
263
|
# Find face for which the signed distance is largest.
|
329
264
|
#
|
@@ -422,12 +357,12 @@ class GeodesicInfo:
|
|
422
357
|
|
423
358
|
return None
|
424
359
|
|
425
|
-
def
|
426
|
-
|
427
|
-
|
360
|
+
def _multiplicity_of_core_curve(self,
|
361
|
+
tet : Tetrahedron,
|
362
|
+
vertex : int) -> int:
|
428
363
|
"""
|
429
|
-
Verify that geodesic
|
430
|
-
|
364
|
+
Verify that geodesic is indeed a multiple of the core curve (including
|
365
|
+
sign).
|
431
366
|
"""
|
432
367
|
|
433
368
|
if self.line is None:
|
@@ -435,42 +370,66 @@ class GeodesicInfo:
|
|
435
370
|
"There is a bug in the code: it is trying to verify that "
|
436
371
|
"geodesic is a core curve without being given a line.")
|
437
372
|
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
# Decktransformation corresponding to core curve acting on basepoint
|
455
|
-
m = tet.core_curves[vertex].o13_matrix
|
456
|
-
b0 = m * self.mcomplex.R13_baseTetInCenter
|
457
|
-
if distance_unit_time_r13_points(a, b0) < self.mcomplex.baseTetInRadius:
|
458
|
-
return +1
|
459
|
-
|
460
|
-
# Decktransformation corresponding to core curve with opposite
|
461
|
-
# orientation acting on basepoint.
|
462
|
-
b1 = o13_inverse(m) * self.mcomplex.R13_baseTetInCenter
|
463
|
-
if distance_unit_time_r13_points(a, b1) < self.mcomplex.baseTetInRadius:
|
464
|
-
return -1
|
373
|
+
try:
|
374
|
+
return compute_and_verify_multiplicity(
|
375
|
+
tet.core_curves[vertex],
|
376
|
+
self.line,
|
377
|
+
self.mcomplex)
|
378
|
+
except InsufficientPrecisionError:
|
379
|
+
raise InsufficientPrecisionError(
|
380
|
+
"Geodesic is very close to a core curve but could not verify "
|
381
|
+
"it is the core curve. Increasing the precision will probably "
|
382
|
+
"fix this.")
|
383
|
+
|
384
|
+
def compute_geodesic_start_point_info(mcomplex : Mcomplex,
|
385
|
+
word) -> GeodesicStartPointInfo:
|
386
|
+
"""
|
387
|
+
Compute basic information about a geodesic given a word.
|
465
388
|
|
466
|
-
|
467
|
-
|
468
|
-
"the core curve. Increasing the precision will probably fix this.")
|
389
|
+
add_r13_geometry must have been called on the Mcomplex.
|
390
|
+
"""
|
469
391
|
|
392
|
+
m = word_to_psl2c_matrix(mcomplex, word)
|
393
|
+
_verify_not_parabolic(m, mcomplex, word)
|
394
|
+
# Line fixed by matrix
|
395
|
+
line : R13LineWithMatrix = r13_fixed_line_of_psl2c_matrix(m)
|
396
|
+
|
397
|
+
# Pick a point on the line
|
398
|
+
start_point = sample_line(line.r13_line)
|
399
|
+
|
400
|
+
g = GeodesicStartPointInfo(
|
401
|
+
mcomplex=mcomplex,
|
402
|
+
word=word,
|
403
|
+
trace=m.trace(),
|
404
|
+
unnormalised_start_point=start_point,
|
405
|
+
unnormalised_end_point=line.o13_matrix * start_point,
|
406
|
+
line=line)
|
407
|
+
|
408
|
+
# Determines whether geodesic corresponds to a core curve.
|
409
|
+
# Applies Decktransformations so that start point lies within
|
410
|
+
# the interior of one tetrahedron in the fundamental domain or
|
411
|
+
# within the union of two tetrahedra neighboring in the hyperboloid
|
412
|
+
# model.
|
413
|
+
#
|
414
|
+
# See GeodesicStartPointInfo for details.
|
415
|
+
g.find_tet_or_core_curve()
|
416
|
+
|
417
|
+
return g
|
418
|
+
|
419
|
+
def _verify_not_parabolic(m, mcomplex, word):
|
420
|
+
"""
|
421
|
+
Raise exception when user gives a word corresponding to a parabolic
|
422
|
+
matrix.
|
423
|
+
"""
|
470
424
|
|
471
|
-
|
472
|
-
|
425
|
+
if mcomplex.verified:
|
426
|
+
epsilon = 0
|
427
|
+
else:
|
428
|
+
epsilon = _compute_epsilon(mcomplex.RF)
|
473
429
|
|
430
|
+
tr = m.trace()
|
431
|
+
if not (abs(tr - 2) > epsilon and abs(tr + 2) > epsilon):
|
432
|
+
raise exceptions.WordAppearsToBeParabolic(word, tr)
|
474
433
|
|
475
|
-
def
|
476
|
-
return
|
434
|
+
def _compute_epsilon(RF):
|
435
|
+
return RF(0.5) ** (RF.prec() // 2)
|
@@ -0,0 +1,67 @@
|
|
1
|
+
from ...tiling.lifted_tetrahedron import LiftedTetrahedron
|
2
|
+
from ...snap.t3mlite import simplex # type: ignore
|
3
|
+
from ...hyperboloid import r13_dot
|
4
|
+
from ...exceptions import InsufficientPrecisionError # type: ignore
|
5
|
+
|
6
|
+
def find_lifted_tetrahedra_containing_point(
|
7
|
+
lifted_tetrahedron : LiftedTetrahedron,
|
8
|
+
faces_and_signed_distances,
|
9
|
+
lifted_pt,
|
10
|
+
epsilon):
|
11
|
+
|
12
|
+
# Report faces for which we cannot confirm that the start point
|
13
|
+
# is to the inside of the plane supporting that face.
|
14
|
+
faces = [ face
|
15
|
+
for face, signed_distance
|
16
|
+
in faces_and_signed_distances
|
17
|
+
if not signed_distance < -epsilon ]
|
18
|
+
|
19
|
+
if len(faces) == 0:
|
20
|
+
# Signal to the client that we can start with this tetrahedron
|
21
|
+
# when developing a tube about the geodesic.
|
22
|
+
return [ lifted_tetrahedron ]
|
23
|
+
|
24
|
+
if len(faces) == 1:
|
25
|
+
# The start point is probably on the face of the tetrahedron,
|
26
|
+
# that is, we could verify it lies to the right side of the
|
27
|
+
# supporting planes for three faces but not one:
|
28
|
+
face, = faces
|
29
|
+
|
30
|
+
# Even though we cannot verify that the start point lies
|
31
|
+
# exactly on the face, we can verify that the start point
|
32
|
+
# lies in the interior of the union of two neighboring
|
33
|
+
# tetrahedra. That is, the union is a hexahedron and
|
34
|
+
# it suffices to check that the start point lies to the
|
35
|
+
# inside of the six faces of the tetrahedron.
|
36
|
+
#
|
37
|
+
# _graph_trace already checked the three faces of the given
|
38
|
+
# tetrahedron. But it is left to check this for the neighboring
|
39
|
+
# tetrahedron.
|
40
|
+
|
41
|
+
tet = lifted_tetrahedron.tet
|
42
|
+
m = lifted_tetrahedron.o13_matrix
|
43
|
+
|
44
|
+
# Find the other tetrahedron of the neighboring tetrahedra.
|
45
|
+
other_tet = tet.Neighbor[face]
|
46
|
+
other_pt = tet.O13_matrices[face] * lifted_pt
|
47
|
+
other_face = tet.Gluing[face].image(face)
|
48
|
+
|
49
|
+
for f in simplex.TwoSubsimplices:
|
50
|
+
if f == other_face:
|
51
|
+
continue
|
52
|
+
if not r13_dot(other_pt, other_tet.R13_planes[f]) < epsilon:
|
53
|
+
raise InsufficientPrecisionError(
|
54
|
+
"Failed to find lift of geodesic and prove that "
|
55
|
+
"it intersects tetrahedra of the fundamental domain. "
|
56
|
+
"Increasing the precision will probably fix this "
|
57
|
+
"problem.")
|
58
|
+
|
59
|
+
return [ lifted_tetrahedron,
|
60
|
+
LiftedTetrahedron(
|
61
|
+
other_tet,
|
62
|
+
m * other_tet.O13_matrices[other_face]) ]
|
63
|
+
|
64
|
+
raise InsufficientPrecisionError(
|
65
|
+
"Start point chosen on geodesic too close to 1-skeleton of "
|
66
|
+
"triangulation to verify it is not on the 1-skeleton. "
|
67
|
+
"Increasing the precision will probably fix this problem.")
|
@@ -0,0 +1,30 @@
|
|
1
|
+
from ...hyperboloid import o13_inverse # type: ignore
|
2
|
+
from ...hyperboloid.line import R13Line
|
3
|
+
|
4
|
+
__all__ = [ 'R13LineWithMatrix' ]
|
5
|
+
|
6
|
+
class R13LineWithMatrix:
|
7
|
+
"""
|
8
|
+
A line in the hyperboloid model together with a O(1,3)-matrix moving
|
9
|
+
the line forward by the given complex length (with real positive part)
|
10
|
+
(the matrix is fixing the line set-wise).
|
11
|
+
"""
|
12
|
+
def __init__(self,
|
13
|
+
r13_line : R13Line,
|
14
|
+
o13_matrix,
|
15
|
+
complex_length):
|
16
|
+
self.r13_line = r13_line
|
17
|
+
self.o13_matrix = o13_matrix
|
18
|
+
self.complex_length = complex_length
|
19
|
+
|
20
|
+
def transformed(self, m):
|
21
|
+
"""
|
22
|
+
Returns image of line with matrix under given O13-matrix m.
|
23
|
+
|
24
|
+
That is, the matrix will be conjugated by m so that the new
|
25
|
+
matrix will fix the image of the line (set-wise).
|
26
|
+
"""
|
27
|
+
return R13LineWithMatrix(
|
28
|
+
self.r13_line.transformed(m),
|
29
|
+
m * self.o13_matrix * o13_inverse(m),
|
30
|
+
self.complex_length)
|
@@ -0,0 +1,127 @@
|
|
1
|
+
from .line import R13LineWithMatrix
|
2
|
+
from ...hyperboloid.distances import distance_r13_points
|
3
|
+
from ...hyperboloid import o13_inverse
|
4
|
+
from ...exceptions import InsufficientPrecisionError
|
5
|
+
|
6
|
+
def compute_and_verify_multiplicity(line : R13LineWithMatrix,
|
7
|
+
line_power : R13LineWithMatrix,
|
8
|
+
mcomplex):
|
9
|
+
"""
|
10
|
+
Assume that line and line_power are created from matrices from the geometric
|
11
|
+
representation.
|
12
|
+
|
13
|
+
Verify that the matrix of line_power is a signed multiple of the matrix
|
14
|
+
of line and return the multiple.
|
15
|
+
"""
|
16
|
+
|
17
|
+
# First use real length to compute multiple up to sign.
|
18
|
+
multiplicity = _compute_absolute_multiplicity(
|
19
|
+
line.complex_length.real(),
|
20
|
+
line_power.complex_length.real(),
|
21
|
+
mcomplex.verified)
|
22
|
+
|
23
|
+
sign = _determine_and_verify_sign(
|
24
|
+
multiplicity,
|
25
|
+
line.o13_matrix,
|
26
|
+
line_power.o13_matrix,
|
27
|
+
mcomplex)
|
28
|
+
|
29
|
+
return sign * multiplicity
|
30
|
+
|
31
|
+
_epsilon = 0.001
|
32
|
+
_max_multiple = 500
|
33
|
+
|
34
|
+
def _compute_absolute_multiplicity(
|
35
|
+
length,
|
36
|
+
length_multiple,
|
37
|
+
verified):
|
38
|
+
|
39
|
+
r = length_multiple / length
|
40
|
+
|
41
|
+
if verified:
|
42
|
+
is_int, r_int = r.is_int()
|
43
|
+
if not is_int:
|
44
|
+
raise InsufficientPrecisionError(
|
45
|
+
"When verifying that a geodesic is a multiple of another "
|
46
|
+
"geodesic, the interval for the multiplicity does not contain "
|
47
|
+
"a unique integer.")
|
48
|
+
else:
|
49
|
+
r_int = r.round()
|
50
|
+
if abs(r_int - r) > _epsilon:
|
51
|
+
raise InsufficientPrecisionError(
|
52
|
+
"When verifying that a geodesic is a multiple of another "
|
53
|
+
"geodesic, the floating point approximation for the "
|
54
|
+
"multiplicity is too far off an integer.")
|
55
|
+
r_int = int(r_int)
|
56
|
+
|
57
|
+
if not r_int > 0:
|
58
|
+
if verified:
|
59
|
+
raise RuntimeError(
|
60
|
+
"When verifying that a geodesic is a multiple of another "
|
61
|
+
"geodesic, we got zero for multiplicity. This is a bug.")
|
62
|
+
else:
|
63
|
+
raise InsufficientPrecisionError(
|
64
|
+
"When verifying that a geodesic is a multiple of another "
|
65
|
+
"geodesic, we got zero for multiplicity. Increasing the "
|
66
|
+
"precision might help.")
|
67
|
+
if not r_int < _max_multiple:
|
68
|
+
raise RuntimeError(
|
69
|
+
"When verifying that a geodesic is a multiple of another "
|
70
|
+
"geodesic, we got a multiple (%d) higher than what we support "
|
71
|
+
"(%d)" % (r_int, _max_multiple))
|
72
|
+
|
73
|
+
return r_int
|
74
|
+
|
75
|
+
def _determine_and_verify_sign(multiplicity, m, m_power, mcomplex):
|
76
|
+
"""
|
77
|
+
Given matrices m and m_power coming from the geometric representation,
|
78
|
+
verify that either m^multiplicity = m_power^sign for either sign = +1
|
79
|
+
or sign = -1. Return sign.
|
80
|
+
"""
|
81
|
+
|
82
|
+
base_pt = mcomplex.R13_baseTetInCenter
|
83
|
+
|
84
|
+
# Compute image of base point under m^multiplicity.
|
85
|
+
pt = base_pt
|
86
|
+
for i in range(multiplicity):
|
87
|
+
pt = m * pt
|
88
|
+
|
89
|
+
# Check whether it is equal to image under m_power
|
90
|
+
if _are_images_of_basepoints_equal(
|
91
|
+
pt, m_power * base_pt, mcomplex):
|
92
|
+
return +1
|
93
|
+
|
94
|
+
# Check whether it is equal to image under m_power^-1
|
95
|
+
if _are_images_of_basepoints_equal(
|
96
|
+
pt, o13_inverse(m_power) * base_pt, mcomplex):
|
97
|
+
return -1
|
98
|
+
|
99
|
+
raise RuntimeError(
|
100
|
+
"Given geodesic is not a multiple of other given geodesic.")
|
101
|
+
|
102
|
+
def _are_images_of_basepoints_equal(pt0, pt1, mcomplex):
|
103
|
+
"""
|
104
|
+
Given two images of the base point under Deck transformations,
|
105
|
+
check whether they are the same (and thus correspond to the same
|
106
|
+
Deck transformation).
|
107
|
+
"""
|
108
|
+
|
109
|
+
# We use that the the base point is the incenter of the base
|
110
|
+
# tetrahedron. Thus, we know that if the minimum distance for
|
111
|
+
# them to be distinct is the in-radius of the base tetrahedron.
|
112
|
+
#
|
113
|
+
# We add in a factor of 1/2 for safety.
|
114
|
+
|
115
|
+
d = distance_r13_points(pt0, pt1)
|
116
|
+
if d < mcomplex.baseTetInRadius / 2:
|
117
|
+
return True
|
118
|
+
if d > mcomplex.baseTetInRadius / 2:
|
119
|
+
return False
|
120
|
+
|
121
|
+
raise InsufficientPrecisionError(
|
122
|
+
"When determining whether a geodesic is a multiple of another "
|
123
|
+
"geodesic, we could not verify that the images of the base point "
|
124
|
+
"under the corresponding matrices are the same or not.\n"
|
125
|
+
"Distance between basepoints: %r\n"
|
126
|
+
"Cut-off: %r" % (d, mcomplex.baseTetInRadius / 2))
|
127
|
+
|