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/moves.py
CHANGED
@@ -1,21 +1,30 @@
|
|
1
1
|
from .cusps import CuspPostDrillInfo
|
2
|
-
from .geometric_structure import compute_r13_planes_for_tet
|
3
2
|
from .tracing import compute_plane_intersection_param, Endpoint, GeodesicPiece
|
4
3
|
from .epsilons import compute_epsilon
|
5
4
|
from . import constants
|
6
5
|
from . import exceptions
|
7
6
|
|
8
|
-
from ..
|
9
|
-
from ..
|
7
|
+
from ..geometric_structure import add_r13_planes_to_tetrahedron
|
8
|
+
from ..snap.t3mlite import simplex, Perm4, Tetrahedron, Corner # type: ignore
|
9
|
+
from ..matrix import make_identity_matrix # type: ignore
|
10
10
|
from ..exceptions import InsufficientPrecisionError # type: ignore
|
11
11
|
|
12
|
-
from typing import Sequence, Optional,
|
12
|
+
from typing import Sequence, Optional, List
|
13
13
|
|
14
14
|
__all__ = ['one_four_move', 'two_three_move']
|
15
15
|
|
16
|
-
|
17
16
|
def one_four_move(given_pieces : Sequence[GeodesicPiece],
|
18
17
|
verified : bool) -> Sequence[GeodesicPiece]:
|
18
|
+
"""
|
19
|
+
Performs a 1-4 move.
|
20
|
+
|
21
|
+
Given pieces are supposed to be either two pieces
|
22
|
+
F-T-F (see subdivide.py for notation) or just one piece F-F.
|
23
|
+
|
24
|
+
For F-T-F, the new point for the 1-4 move will be the one given
|
25
|
+
for T. For F-F, the 1-4 move will pick a point on the line segment
|
26
|
+
(not picking exactly the middle to avoid coincidences).
|
27
|
+
"""
|
19
28
|
|
20
29
|
tet : Tetrahedron = given_pieces[0].tet
|
21
30
|
RF = tet.O13_matrices[simplex.F0].base_ring()
|
@@ -50,15 +59,20 @@ def one_four_move(given_pieces : Sequence[GeodesicPiece],
|
|
50
59
|
else:
|
51
60
|
raise Exception("Bad 1-4 move")
|
52
61
|
|
62
|
+
# The new tetrahedra.
|
63
|
+
# new_tets[f] shares face f with the old tetrahedron.
|
64
|
+
# That is vertex v of the new tetrahedron corresponds to
|
65
|
+
# vertex v of the old tetrahedron if v is on the face f.
|
66
|
+
# Otherwise, the vertex v of the new tetrahedron corresponds
|
67
|
+
# to the new vertex in the center.
|
68
|
+
|
53
69
|
new_tets : dict[int, Tetrahedron] = {
|
54
70
|
f : Tetrahedron() for f in simplex.TwoSubsimplices }
|
55
71
|
|
56
|
-
neighbors : dict[int, Tetrahedron] =
|
57
|
-
|
58
|
-
gluings : dict[int, Perm4] = {
|
59
|
-
f: p for f, p in tet.Gluing.items() }
|
72
|
+
neighbors : dict[int, Tetrahedron] = dict(tet.Neighbor.items())
|
73
|
+
gluings : dict[int, Perm4] = dict(tet.Gluing.items())
|
60
74
|
|
61
|
-
id_matrix =
|
75
|
+
id_matrix = make_identity_matrix(ring=RF, n=4)
|
62
76
|
|
63
77
|
for f0, new_tet0 in new_tets.items():
|
64
78
|
new_tet0.geodesic_pieces = []
|
@@ -91,7 +105,7 @@ def one_four_move(given_pieces : Sequence[GeodesicPiece],
|
|
91
105
|
|
92
106
|
new_tet0.O13_matrices[f0] = tet.O13_matrices[f0]
|
93
107
|
|
94
|
-
|
108
|
+
add_r13_planes_to_tetrahedron(new_tet0)
|
95
109
|
|
96
110
|
for ml in range(2):
|
97
111
|
for sheet in range(2):
|
@@ -109,6 +123,8 @@ def one_four_move(given_pieces : Sequence[GeodesicPiece],
|
|
109
123
|
new_tets[f2].PeripheralCurves[ml][sheet][v][f1] = (
|
110
124
|
-tet.PeripheralCurves[ml][sheet][v][f2])
|
111
125
|
|
126
|
+
# Transfer or re-trace the other pieces of the geodesic going through
|
127
|
+
# the old tetrahedron in the new tetrahedra.
|
112
128
|
for old_piece in tet.geodesic_pieces:
|
113
129
|
if old_piece in given_pieces:
|
114
130
|
continue
|
@@ -116,11 +132,14 @@ def one_four_move(given_pieces : Sequence[GeodesicPiece],
|
|
116
132
|
start_subsimplex : int = old_piece.endpoints[0].subsimplex
|
117
133
|
end_subsimplex : int = old_piece.endpoints[1].subsimplex
|
118
134
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
135
|
+
dimension_start_subsimplex = simplex.dimension(start_subsimplex)
|
136
|
+
dimension_end_subsimplex = simplex.dimension(end_subsimplex)
|
137
|
+
|
138
|
+
if dimension_start_subsimplex == 0 and dimension_end_subsimplex == 0:
|
139
|
+
# Both endpoints are vertices, no re-tracing necessary.
|
140
|
+
total_subsimplex = start_subsimplex | end_subsimplex
|
141
|
+
for new_face, new_tet in new_tets.items():
|
142
|
+
if simplex.is_subset(total_subsimplex, new_face):
|
124
143
|
GeodesicPiece.replace_by(
|
125
144
|
old_piece, old_piece,
|
126
145
|
[ GeodesicPiece.create_and_attach(
|
@@ -130,49 +149,24 @@ def one_four_move(given_pieces : Sequence[GeodesicPiece],
|
|
130
149
|
break
|
131
150
|
else:
|
132
151
|
raise Exception("Unhandled edge case")
|
133
|
-
continue
|
134
|
-
|
135
|
-
r13_endpoints = [ e.r13_point for e in old_piece.endpoints ]
|
136
|
-
retrace_direction : int = +1
|
137
|
-
end_cell_dimension : int = 2
|
138
|
-
if end_subsimplex in simplex.ZeroSubsimplices:
|
139
|
-
end_cell_dimension = 0
|
140
|
-
allowed_end_corners : Sequence[Tuple[Tetrahedron, int]] = [
|
141
|
-
(new_tets[f], end_subsimplex)
|
142
|
-
for f in simplex.TwoSubsimplices
|
143
|
-
if simplex.is_subset(end_subsimplex, f) ]
|
144
|
-
elif end_subsimplex == simplex.T:
|
145
|
-
end_cell_dimension = 3
|
146
|
-
allowed_end_corners = [
|
147
|
-
(new_tet, end_subsimplex)
|
148
|
-
for new_tet in new_tets.values() ]
|
149
|
-
elif start_subsimplex == simplex.T:
|
150
|
-
end_cell_dimension = 3
|
151
|
-
retrace_direction = -1
|
152
|
-
start_subsimplex, end_subsimplex = end_subsimplex, start_subsimplex
|
153
|
-
r13_endpoints = r13_endpoints[::-1]
|
154
|
-
allowed_end_corners = [
|
155
|
-
(new_tet, end_subsimplex)
|
156
|
-
for new_tet in new_tets.values() ]
|
157
|
-
elif (start_subsimplex in simplex.TwoSubsimplices and
|
158
|
-
end_subsimplex in simplex.TwoSubsimplices):
|
159
|
-
allowed_end_corners = [ (new_tets[end_subsimplex], end_subsimplex) ]
|
160
152
|
else:
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
153
|
+
# Re-trace.
|
154
|
+
r13_endpoints = [ e.r13_point for e in old_piece.endpoints ]
|
155
|
+
|
156
|
+
GeodesicPiece.replace_by(
|
157
|
+
old_piece, old_piece,
|
158
|
+
_retrace_geodesic_piece(
|
159
|
+
index=old_piece.index,
|
160
|
+
r13_points=r13_endpoints,
|
161
|
+
start_corners=[ Corner(new_tets[f], start_subsimplex)
|
162
|
+
for f in simplex.TwoSubsimplices
|
163
|
+
if simplex.is_subset(start_subsimplex, f) ],
|
164
|
+
end_corners=[ Corner(new_tets[f], end_subsimplex)
|
165
|
+
for f in simplex.TwoSubsimplices
|
166
|
+
if simplex.is_subset(end_subsimplex, f) ],
|
167
|
+
verified=verified))
|
168
|
+
|
169
|
+
# Turn given pieces into F-V-F
|
176
170
|
start_point : Endpoint = given_pieces[0].endpoints[0]
|
177
171
|
end_point : Endpoint = given_pieces[-1].endpoints[1]
|
178
172
|
new_pieces : Sequence[GeodesicPiece] = [
|
@@ -192,24 +186,33 @@ def one_four_move(given_pieces : Sequence[GeodesicPiece],
|
|
192
186
|
|
193
187
|
return new_pieces
|
194
188
|
|
195
|
-
|
196
189
|
def two_three_move(given_pieces : Sequence[GeodesicPiece],
|
197
190
|
verified : bool) -> Sequence[GeodesicPiece]:
|
198
191
|
"""
|
199
|
-
|
200
|
-
|
201
|
-
|
192
|
+
Expects two given pieces V-F-V which form one straight line
|
193
|
+
segment from V to V.
|
194
|
+
|
195
|
+
The 2-3 move is performed on the two tetrahedra adjacent to
|
196
|
+
that face.
|
202
197
|
"""
|
203
198
|
|
199
|
+
# We imagine the two old tetrahedra such that the shared face
|
200
|
+
# is horizontal. We list them in the order where the top one
|
201
|
+
# is first and has index 0.
|
202
|
+
|
204
203
|
old_tets = [ old_piece.tet for old_piece in given_pieces ]
|
205
204
|
old_tips = [ given_pieces[i].endpoints[i].subsimplex
|
206
205
|
for i in range(2) ]
|
206
|
+
# For each old tetrahedron, its face that it shared with the other
|
207
|
+
# tetrahedron.
|
207
208
|
old_shared_faces = [ simplex.comp(old_tip)
|
208
209
|
for old_tip in old_tips ]
|
209
210
|
|
210
211
|
RF = old_tets[0].O13_matrices[simplex.F0].base_ring()
|
211
|
-
id_matrix =
|
212
|
+
id_matrix = make_identity_matrix(ring=RF, n=4)
|
212
213
|
|
214
|
+
# Embeddings to map both tetrahedra into the same coordinate
|
215
|
+
# system
|
213
216
|
O13_embeddings = [ old_tets[0].O13_matrices[old_shared_faces[0]],
|
214
217
|
id_matrix ]
|
215
218
|
O13_inverse_embeddings = [ old_tets[1].O13_matrices[old_shared_faces[1]],
|
@@ -219,13 +222,8 @@ def two_three_move(given_pieces : Sequence[GeodesicPiece],
|
|
219
222
|
O13_embeddings[i] * old_tets[i].R13_vertices[old_tips[i]]
|
220
223
|
for i in range(2) ]
|
221
224
|
|
222
|
-
#
|
223
|
-
#
|
224
|
-
# us call this tetrahedron standard tetrahedron (std tet).
|
225
|
-
#
|
226
|
-
# std_to_tet is the permutation taking the vertices of the standard
|
227
|
-
# tetrahedron to the top tetrahedron.
|
228
|
-
#
|
225
|
+
# Find permutation such that we can label the top vertex of
|
226
|
+
# the top tetrahedron by 0.
|
229
227
|
for perm in Perm4.A4():
|
230
228
|
if perm.image(simplex.V0) == old_tips[0]:
|
231
229
|
break
|
@@ -236,6 +234,17 @@ def two_three_move(given_pieces : Sequence[GeodesicPiece],
|
|
236
234
|
perm * Perm4((0,2,3,1)),
|
237
235
|
perm * Perm4((0,3,1,2)) ] ]
|
238
236
|
|
237
|
+
# The new tetrahedra have vertices as follows:
|
238
|
+
# Vertex 0 always corresponds to the top vertex of the
|
239
|
+
# top tetrahedron.
|
240
|
+
# Vertex 1 always corresponds to the top vertex of the
|
241
|
+
# bottom tetrahedron
|
242
|
+
# Vertex 3 is glued to vertex 2 of the next tetrahedron.
|
243
|
+
#
|
244
|
+
# Note that face 0 of a new tetrahedron is shared with
|
245
|
+
# some face of the old top tetrahedron (index=1).
|
246
|
+
# Similarly for face 1 and the bottom tetrahedron (index=0).
|
247
|
+
#
|
239
248
|
new_tets = [ Tetrahedron() for i in range(3) ]
|
240
249
|
|
241
250
|
for i, new_tet in enumerate(new_tets):
|
@@ -297,28 +306,65 @@ def two_three_move(given_pieces : Sequence[GeodesicPiece],
|
|
297
306
|
simplex.V3 : old_tets[1].post_drill_infos[new_to_old_tets[i][1].image(simplex.V3)],
|
298
307
|
}
|
299
308
|
|
300
|
-
|
309
|
+
add_r13_planes_to_tetrahedron(new_tet)
|
301
310
|
|
302
311
|
old_to_new_tets = [ [ ~new_to_old_tets[j][i] for j in range(3) ]
|
303
312
|
for i in range(2) ]
|
304
313
|
|
314
|
+
# Transfer or re-trace the other pieces of the geodesic going through
|
315
|
+
# the old tetrahedron in the new tetrahedra.
|
316
|
+
# Consider one old tetrahedron at a time.
|
305
317
|
for j, old_tet in enumerate(old_tets):
|
306
318
|
for old_piece in old_tet.geodesic_pieces:
|
307
319
|
|
308
320
|
if old_piece in given_pieces:
|
309
321
|
continue
|
310
322
|
|
311
|
-
|
312
|
-
|
323
|
+
start_point = old_piece.endpoints[0]
|
324
|
+
start_subsimplex = start_point.subsimplex
|
325
|
+
# Index of old tet where piece is starting
|
326
|
+
start_j = j
|
313
327
|
|
314
|
-
|
328
|
+
# A geodesic piece crossing the face shared between the bottom and
|
329
|
+
# top tetrahedron was originally two pieces. Of these two pieces,
|
330
|
+
# discard the one after crossing the shared face.
|
331
|
+
if start_subsimplex == old_shared_faces[j]:
|
332
|
+
continue
|
333
|
+
|
334
|
+
end_point = old_piece.endpoints[1]
|
335
|
+
end_subsimplex = end_point.subsimplex
|
336
|
+
# Index of old tet where piece is ending
|
337
|
+
end_j = j
|
338
|
+
|
339
|
+
old_pieces = [ old_piece ]
|
340
|
+
# If a geodesic piece ends at the shared face, merge it
|
341
|
+
# with the next piece.
|
342
|
+
if end_subsimplex == old_shared_faces[j]:
|
343
|
+
old_pieces.append(old_piece.next_)
|
344
|
+
end_point = old_piece.next_.endpoints[1]
|
345
|
+
end_subsimplex = end_point.subsimplex
|
346
|
+
end_j = 1 - j
|
347
|
+
|
348
|
+
dimension_start_subsimplex = simplex.dimension(start_subsimplex)
|
349
|
+
dimension_end_subsimplex = simplex.dimension(end_subsimplex)
|
350
|
+
|
351
|
+
# Face of new tetrahedron that is shared with old tetrahedron.
|
352
|
+
new_start_face = simplex.TwoSubsimplices[1 - start_j]
|
353
|
+
new_end_face = simplex.TwoSubsimplices[1 - end_j]
|
354
|
+
|
355
|
+
if dimension_start_subsimplex == 0 and dimension_end_subsimplex == 0:
|
356
|
+
# Vertex to vertex piece. We can just transfer.
|
315
357
|
for i, new_tet in enumerate(new_tets):
|
358
|
+
# We need to find the right new tetrahedron such that the
|
359
|
+
# geodesic piece is an edge of the face shared with the old
|
360
|
+
# tetrahedron.
|
316
361
|
new_start_subsimplex = old_to_new_tets[j][i].image(start_subsimplex)
|
317
362
|
new_end_subsimplex = old_to_new_tets[j][i].image(end_subsimplex)
|
363
|
+
new_subsimplex = new_start_subsimplex | new_end_subsimplex
|
318
364
|
|
319
|
-
if (
|
365
|
+
if simplex.is_subset(new_subsimplex, new_start_face):
|
320
366
|
GeodesicPiece.replace_by(
|
321
|
-
|
367
|
+
old_pieces[0], old_pieces[-1],
|
322
368
|
[
|
323
369
|
GeodesicPiece.create_and_attach(
|
324
370
|
old_piece.index,
|
@@ -328,68 +374,38 @@ def two_three_move(given_pieces : Sequence[GeodesicPiece],
|
|
328
374
|
break
|
329
375
|
else:
|
330
376
|
raise Exception("Unhandled edge case.")
|
331
|
-
continue
|
332
|
-
|
333
|
-
# A geodesic piece crossing the face shared between the bottom and
|
334
|
-
# top tetrahedron was originally two pieces. Discard the piece after
|
335
|
-
# the ray cross the shared face.
|
336
|
-
if start_subsimplex == old_shared_faces[j]:
|
337
|
-
continue
|
338
|
-
|
339
|
-
old_pieces = [ old_piece ]
|
340
|
-
if end_subsimplex == old_shared_faces[j]:
|
341
|
-
old_pieces.append(old_piece.next_)
|
342
|
-
end_j = 1 - j
|
343
|
-
end_subsimplex = old_pieces[-1].endpoints[1].subsimplex
|
344
377
|
else:
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
O13_embeddings[end_j] * old_pieces[-1].endpoints[1].r13_point
|
378
|
+
# We need to re-trace.
|
379
|
+
r13_endpoints = [
|
380
|
+
O13_embeddings[start_j] * start_point.r13_point,
|
381
|
+
O13_embeddings[end_j] * end_point.r13_point
|
350
382
|
]
|
351
383
|
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
GeodesicPiece.replace_by(
|
378
|
-
old_pieces[0], old_pieces[-1],
|
379
|
-
_retrace_geodesic_piece(
|
380
|
-
old_piece.index,
|
381
|
-
new_tets,
|
382
|
-
new_tet,
|
383
|
-
new_face,
|
384
|
-
end_cell_dimension,
|
385
|
-
r13_endpoints,
|
386
|
-
retrace_direction,
|
387
|
-
verified,
|
388
|
-
allowed_end_corners=None))
|
389
|
-
break
|
390
|
-
else:
|
391
|
-
raise Exception("No match")
|
392
|
-
|
384
|
+
new_start_subsimplices = [
|
385
|
+
old_to_new_tets[start_j][i].image(start_subsimplex)
|
386
|
+
for i in range(3) ]
|
387
|
+
start_corners = [
|
388
|
+
Corner(new_tets[i], new_start_subsimplices[i])
|
389
|
+
for i in range(3)
|
390
|
+
if simplex.is_subset(new_start_subsimplices[i], new_start_face) ]
|
391
|
+
new_end_subsimplices = [
|
392
|
+
old_to_new_tets[end_j][i].image(end_subsimplex)
|
393
|
+
for i in range(3) ]
|
394
|
+
end_corners = [
|
395
|
+
Corner(new_tets[i], new_end_subsimplices[i])
|
396
|
+
for i in range(3)
|
397
|
+
if simplex.is_subset(new_end_subsimplices[i], new_end_face) ]
|
398
|
+
|
399
|
+
GeodesicPiece.replace_by(
|
400
|
+
old_pieces[0], old_pieces[-1],
|
401
|
+
_retrace_geodesic_piece(
|
402
|
+
index=old_piece.index,
|
403
|
+
r13_points=r13_endpoints,
|
404
|
+
start_corners=start_corners,
|
405
|
+
end_corners=end_corners,
|
406
|
+
verified=verified))
|
407
|
+
|
408
|
+
# Given pieces are converted to one V-V piece.
|
393
409
|
new_piece = GeodesicPiece.create_and_attach(
|
394
410
|
given_pieces[0].index,
|
395
411
|
new_tets[0],
|
@@ -401,31 +417,74 @@ def two_three_move(given_pieces : Sequence[GeodesicPiece],
|
|
401
417
|
|
402
418
|
return new_piece
|
403
419
|
|
404
|
-
|
405
420
|
def _swap_perm(i, j):
|
406
421
|
result = [0, 1, 2, 3]
|
407
422
|
result[i] = j
|
408
423
|
result[j] = i
|
409
424
|
return result
|
410
425
|
|
411
|
-
|
412
426
|
_swap_perms = { (f0, f1) : _swap_perm(i, j)
|
413
427
|
for i, f0 in enumerate(simplex.TwoSubsimplices)
|
414
428
|
for j, f1 in enumerate(simplex.TwoSubsimplices) }
|
415
429
|
|
416
|
-
|
430
|
+
# Re-trace a line segment between two points in R^{1,3} in the new
|
431
|
+
# tetrahedra (which are assumed to be all in the same coordinate system).
|
432
|
+
#
|
433
|
+
# We are given the combinatorial information about the start and end points
|
434
|
+
# of the line segment through Corner's which are pairs of a tetrahedron and
|
435
|
+
# subsimplex.
|
436
|
+
#
|
437
|
+
# If such a start or end point is on a face, we give retrace exactly one
|
438
|
+
# corner encoding the face of the respective tetrahedron.
|
439
|
+
#
|
440
|
+
# If such a point is inside one of the new tetrahedra (we do not know yet
|
441
|
+
# which), we given an empty list of Corner's.
|
442
|
+
#
|
443
|
+
# If such a point is a vertex, we give all pairs of a new tetrahedron
|
444
|
+
# and one of its vertices that correspond to this vertex.
|
445
|
+
#
|
446
|
+
# index identifies to which of the geodesics we want to drill the retraced
|
447
|
+
# pieces belong. It is the index of the cusp that the geodesic will become
|
448
|
+
# in the drilled manifold.
|
449
|
+
#
|
417
450
|
def _retrace_geodesic_piece(
|
418
451
|
index : int,
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
452
|
+
r13_points,
|
453
|
+
start_corners : Sequence[Corner],
|
454
|
+
end_corners : Sequence[Corner],
|
455
|
+
verified : bool) -> Sequence[GeodesicPiece]:
|
456
|
+
|
457
|
+
if len(start_corners) == 1:
|
458
|
+
# If we have a unique start corner (which is supposed
|
459
|
+
# to be a face of a tetrahedron), we can just start
|
460
|
+
# tracing from that face.
|
461
|
+
trace_direction = +1
|
462
|
+
else:
|
463
|
+
# Otherwise, we need to trace the other way.
|
464
|
+
# The end corner was supposed to be a face of a tetrahedron
|
465
|
+
# in this case.
|
466
|
+
trace_direction = -1
|
467
|
+
start_corners, end_corners = end_corners, start_corners
|
468
|
+
r13_points = r13_points[::-1]
|
427
469
|
|
428
|
-
|
470
|
+
if len(start_corners) != 1:
|
471
|
+
raise Exception("No unique start corner")
|
472
|
+
|
473
|
+
# Tet and face to start re-tracing
|
474
|
+
tet = start_corners[0].Tetrahedron
|
475
|
+
face = start_corners[0].Subsimplex
|
476
|
+
|
477
|
+
if face not in simplex.TwoSubsimplices:
|
478
|
+
raise Exception("Tracing not starting on a face")
|
479
|
+
|
480
|
+
# Get dimension of subsimplex where line segment
|
481
|
+
# we are re-tracing ends.
|
482
|
+
dimension_end_subsimplex = 3
|
483
|
+
if len(end_corners) > 0:
|
484
|
+
dimension_end_subsimplex = simplex.dimension(
|
485
|
+
end_corners[0].Subsimplex)
|
486
|
+
|
487
|
+
start_point, end_point = r13_points
|
429
488
|
|
430
489
|
RF = start_point[0].parent()
|
431
490
|
if verified:
|
@@ -433,125 +492,125 @@ def _retrace_geodesic_piece(
|
|
433
492
|
else:
|
434
493
|
epsilon = compute_epsilon(RF)
|
435
494
|
|
436
|
-
direction = end_point - start_point
|
437
|
-
|
438
495
|
# Result
|
439
496
|
pieces : List[GeodesicPiece] = []
|
440
497
|
|
441
498
|
# Parametrizes ray. That is, we are start_point + param * direction.
|
442
499
|
param = RF(0)
|
500
|
+
direction = end_point - start_point
|
443
501
|
|
502
|
+
# 1-4 and 2-3 move never breaks up one line segment into more
|
503
|
+
# than 4 pieces.
|
444
504
|
for i in range(4):
|
505
|
+
hit_end : bool = False
|
445
506
|
# Record the face and param through which the ray is leaving
|
446
507
|
# the tet - that is which face the ray is hitting next.
|
447
|
-
|
508
|
+
hit_subsimplex : Optional[int] = None
|
448
509
|
hit_param = None
|
449
|
-
for candidate_face, plane in tet.R13_unnormalised_planes.items():
|
450
|
-
# Skip the face through which the ray just entered the tet
|
451
|
-
if candidate_face == face:
|
452
|
-
continue
|
453
|
-
# Compute the param at which the ray intersects this face
|
454
|
-
candidate_param = compute_plane_intersection_param(
|
455
|
-
plane, start_point, direction, verified)
|
456
510
|
|
457
|
-
|
458
|
-
#
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
#
|
476
|
-
|
511
|
+
if dimension_end_subsimplex == 0:
|
512
|
+
# Check if we just entered a tetrahedron adjacent to the
|
513
|
+
# vertex where the line segments stops.
|
514
|
+
for end_corner in end_corners:
|
515
|
+
if tet == end_corner.Tetrahedron:
|
516
|
+
# If that is true, we have finished re-tracing
|
517
|
+
# and just need to emit the final F-V piece below.
|
518
|
+
# Do some sanity checks first though.
|
519
|
+
hit_subsimplex = simplex.comp(face)
|
520
|
+
if hit_subsimplex != end_corner.Subsimplex:
|
521
|
+
raise Exception("Implementation error: "
|
522
|
+
"ray entered tetrahedron through "
|
523
|
+
"unexpected face.")
|
524
|
+
hit_end = True
|
525
|
+
|
526
|
+
if not hit_end:
|
527
|
+
# Above condition not met, do actual ray-tracing.
|
528
|
+
if dimension_end_subsimplex == 3:
|
529
|
+
# The line-segment to be re-traced ends in the interior
|
530
|
+
# of a simplex. We set hit_param to 1 so that any face
|
531
|
+
# the ray hits after reaching the end of the line
|
532
|
+
# segment are ignored.
|
533
|
+
hit_subsimplex = simplex.T
|
534
|
+
hit_param = RF(1)
|
535
|
+
|
536
|
+
# Now intersect the ray with each face we did not enter through.
|
537
|
+
for candidate_face, plane in tet.R13_unnormalised_planes.items():
|
538
|
+
# Skip the face through which the ray just entered the tet
|
539
|
+
if candidate_face == face:
|
540
|
+
continue
|
541
|
+
# Compute the param at which the ray intersects this face
|
542
|
+
candidate_param = compute_plane_intersection_param(
|
543
|
+
plane, start_point, direction, verified)
|
544
|
+
|
545
|
+
# If the ray crossed this face before it crossed the
|
546
|
+
# entry face, ignore. Can happen when a dihedral angle is obtuse.
|
547
|
+
if candidate_param < param - epsilon:
|
548
|
+
continue
|
549
|
+
if not candidate_param > param + epsilon:
|
550
|
+
raise InsufficientPrecisionError(
|
551
|
+
"When re-tracing the geodesic, the intersection with the "
|
552
|
+
"next tetrahedron face was too close to the previous "
|
553
|
+
"to tell them apart. Increasing the precision will "
|
554
|
+
"probably avoid this problem.")
|
555
|
+
|
556
|
+
# This face is the (potential) exit face if the ray crossed
|
557
|
+
# it before it crossed the other faces (encountered so far).
|
558
|
+
if hit_param is None:
|
559
|
+
# No other face encountered so far
|
477
560
|
hit_param = candidate_param
|
478
|
-
|
479
|
-
|
480
|
-
#
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
if dimension_end_cell == 3:
|
493
|
-
if hit_param < RF(1) - epsilon:
|
494
|
-
hit_end : bool = False
|
495
|
-
elif hit_param > RF(1) + epsilon:
|
496
|
-
hit_end = True
|
497
|
-
else:
|
561
|
+
hit_subsimplex = candidate_face
|
562
|
+
else:
|
563
|
+
# Check this face crossed before other faces
|
564
|
+
if candidate_param + epsilon < hit_param:
|
565
|
+
hit_param = candidate_param
|
566
|
+
hit_subsimplex = candidate_face
|
567
|
+
elif not candidate_param > hit_param + epsilon:
|
568
|
+
# If there is any ambiguity whether this face was
|
569
|
+
# crossed before the other face, fail!
|
570
|
+
# Most likely, this is because the ray is close to
|
571
|
+
# or crossing an edge of the triangulation.
|
572
|
+
raise exceptions.RetracingRayHittingOneSkeletonError()
|
573
|
+
|
574
|
+
if hit_param is None or hit_subsimplex is None:
|
498
575
|
raise InsufficientPrecisionError(
|
499
|
-
"Could not
|
500
|
-
"
|
501
|
-
"Increasing the precision will most likely fix the "
|
576
|
+
"Could not find the next intersection of the geodesic with a "
|
577
|
+
"tetrahedron face. Increasing the precision should solve this "
|
502
578
|
"problem.")
|
503
|
-
else:
|
504
|
-
if len(tets) == 3:
|
505
|
-
hit_end = hit_face in [ simplex.F0, simplex.F1]
|
506
|
-
else:
|
507
|
-
hit_end = tet is tets[hit_face]
|
508
579
|
|
509
|
-
|
510
|
-
|
511
|
-
|
580
|
+
if dimension_end_subsimplex == 3:
|
581
|
+
# If we hit not face before the line segment ended, we are done
|
582
|
+
# Emit final F-T segment below.
|
583
|
+
if hit_subsimplex == simplex.T:
|
584
|
+
hit_end = True
|
512
585
|
else:
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
"implementation bug.")
|
586
|
+
if hit_subsimplex == simplex.T:
|
587
|
+
raise Exception("Implementation error. Got interior of "
|
588
|
+
"simplex when expected face.")
|
589
|
+
# Did we hit the face where the line segment is ending at?
|
590
|
+
hit_end = (
|
591
|
+
tet == end_corners[0].Tetrahedron and
|
592
|
+
hit_subsimplex == end_corners[0].Subsimplex)
|
521
593
|
|
522
|
-
|
523
|
-
|
594
|
+
if hit_end:
|
595
|
+
# Use end point of line segment if we hit the end.
|
596
|
+
point = end_point
|
597
|
+
else:
|
598
|
+
# Advance ray.
|
599
|
+
point = start_point + hit_param * direction
|
524
600
|
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
break
|
601
|
+
endpoints = [ Endpoint(start_point + param * direction, face),
|
602
|
+
Endpoint(point, hit_subsimplex) ][::trace_direction]
|
529
603
|
|
530
604
|
pieces.append(
|
531
|
-
GeodesicPiece.create_and_attach(
|
532
|
-
index,
|
533
|
-
tet,
|
534
|
-
[ Endpoint(start_point + param * direction, face),
|
535
|
-
Endpoint(start_point + hit_param * direction, hit_face) ][::trace_direction]))
|
536
|
-
|
537
|
-
face = tet.Gluing[hit_face].image(hit_face)
|
538
|
-
tet = tet.Neighbor[hit_face]
|
539
|
-
param = hit_param
|
605
|
+
GeodesicPiece.create_and_attach(index, tet, endpoints))
|
540
606
|
|
541
|
-
if
|
542
|
-
if allowed_end_corners:
|
543
|
-
if not (tet, simplex.comp(face)) in allowed_end_corners:
|
544
|
-
raise Exception(
|
545
|
-
"Re-tracing geodesic piece ended at wrong cell. "
|
546
|
-
"This is either due to a lack of precision or an "
|
547
|
-
"implementation bug.")
|
548
|
-
|
549
|
-
pieces.append(
|
550
|
-
GeodesicPiece.create_face_to_vertex_and_attach(
|
551
|
-
index,
|
552
|
-
tet, Endpoint(start_point + hit_param * direction, face), trace_direction))
|
607
|
+
if hit_end:
|
553
608
|
break
|
554
609
|
|
610
|
+
# Teleport to the next tetrahedron.
|
611
|
+
face = tet.Gluing[hit_subsimplex].image(hit_subsimplex)
|
612
|
+
tet = tet.Neighbor[hit_subsimplex]
|
613
|
+
param = hit_param
|
555
614
|
else:
|
556
615
|
raise Exception(
|
557
616
|
"Too many steps when re-tracing a geodesic piece. "
|