snappy 3.1.1__cp38-cp38-win_amd64.whl → 3.2__cp38-cp38-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- snappy/CyOpenGL.cp38-win_amd64.pyd +0 -0
- snappy/SnapPy.cp38-win_amd64.pyd +0 -0
- snappy/SnapPyHP.cp38-win_amd64.pyd +0 -0
- snappy/__init__.py +299 -402
- snappy/app.py +70 -20
- snappy/browser.py +18 -17
- snappy/canonical.py +249 -0
- snappy/{verify/cusp_shapes.py → cusps/__init__.py} +8 -18
- snappy/cusps/cusp_area_matrix.py +101 -0
- snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +23 -39
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/test.py +21 -0
- snappy/cusps/trig_cusp_area_matrix.py +63 -0
- snappy/database.py +10 -9
- snappy/decorated_isosig.py +337 -114
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +40 -7
- snappy/dev/extended_ptolemy/extended.py +3 -3
- snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +1 -1
- snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
- snappy/doc/_images/m125_paper_plane.jpg +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
- snappy/doc/_sources/additional_classes.rst.txt +40 -40
- snappy/doc/_sources/bugs.rst.txt +14 -14
- snappy/doc/_sources/censuses.rst.txt +51 -51
- snappy/doc/_sources/credits.rst.txt +75 -75
- snappy/doc/_sources/development.rst.txt +259 -239
- snappy/doc/_sources/index.rst.txt +182 -115
- snappy/doc/_sources/installing.rst.txt +247 -264
- snappy/doc/_sources/manifold.rst.txt +6 -6
- snappy/doc/_sources/manifoldhp.rst.txt +46 -46
- snappy/doc/_sources/news.rst.txt +355 -283
- snappy/doc/_sources/other.rst.txt +25 -25
- snappy/doc/_sources/platonic_census.rst.txt +20 -20
- snappy/doc/_sources/plink.rst.txt +102 -102
- snappy/doc/_sources/ptolemy.rst.txt +66 -66
- snappy/doc/_sources/ptolemy_classes.rst.txt +42 -42
- snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -297
- snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -363
- snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -301
- snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -61
- snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -105
- snappy/doc/_sources/screenshots.rst.txt +21 -21
- snappy/doc/_sources/snap.rst.txt +87 -87
- snappy/doc/_sources/snappy.rst.txt +28 -28
- snappy/doc/_sources/spherogram.rst.txt +103 -103
- snappy/doc/_sources/todo.rst.txt +47 -47
- snappy/doc/_sources/triangulation.rst.txt +11 -11
- snappy/doc/_sources/tutorial.rst.txt +49 -49
- snappy/doc/_sources/verify.rst.txt +210 -150
- snappy/doc/_sources/verify_internals.rst.txt +79 -90
- snappy/doc/_static/basic.css +924 -902
- snappy/doc/_static/css/badge_only.css +1 -1
- snappy/doc/_static/css/theme.css +1 -1
- snappy/doc/_static/doctools.js +1 -1
- snappy/doc/_static/documentation_options.js +12 -13
- snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
- snappy/doc/_static/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +199 -199
- snappy/doc/_static/pygments.css +74 -73
- snappy/doc/_static/searchtools.js +125 -71
- snappy/doc/_static/snappy_furo.css +33 -33
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
- snappy/doc/_static/sphinx_highlight.js +13 -3
- snappy/doc/additional_classes.html +1499 -1330
- snappy/doc/bugs.html +131 -134
- snappy/doc/censuses.html +426 -445
- snappy/doc/credits.html +180 -183
- snappy/doc/development.html +383 -363
- snappy/doc/genindex.html +1330 -1409
- snappy/doc/index.html +261 -206
- snappy/doc/installing.html +345 -363
- snappy/doc/manifold.html +3451 -2839
- snappy/doc/manifoldhp.html +179 -182
- snappy/doc/news.html +387 -329
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +160 -162
- snappy/doc/platonic_census.html +374 -377
- snappy/doc/plink.html +209 -212
- snappy/doc/ptolemy.html +253 -255
- snappy/doc/ptolemy_classes.html +1143 -1146
- snappy/doc/ptolemy_examples1.html +408 -410
- snappy/doc/ptolemy_examples2.html +470 -473
- snappy/doc/ptolemy_examples3.html +413 -416
- snappy/doc/ptolemy_examples4.html +194 -197
- snappy/doc/ptolemy_prelim.html +247 -250
- snappy/doc/py-modindex.html +164 -167
- snappy/doc/screenshots.html +140 -142
- snappy/doc/search.html +134 -137
- snappy/doc/searchindex.js +1 -1
- snappy/doc/snap.html +201 -204
- snappy/doc/snappy.html +180 -182
- snappy/doc/spherogram.html +1210 -1213
- snappy/doc/todo.html +165 -168
- snappy/doc/triangulation.html +1583 -1474
- snappy/doc/tutorial.html +158 -161
- snappy/doc/verify.html +329 -275
- snappy/doc/verify_internals.html +1234 -1691
- snappy/drilling/__init__.py +153 -235
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +0 -2
- snappy/drilling/crush.py +56 -130
- snappy/drilling/cusps.py +12 -6
- snappy/drilling/debug.py +2 -1
- snappy/drilling/exceptions.py +7 -40
- snappy/drilling/moves.py +302 -243
- snappy/drilling/perturb.py +63 -37
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +0 -5
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +126 -0
- snappy/drilling/tracing.py +9 -37
- snappy/exceptions.py +18 -5
- snappy/exterior_to_link/barycentric_geometry.py +2 -4
- snappy/exterior_to_link/main.py +8 -7
- snappy/exterior_to_link/mcomplex_with_link.py +2 -2
- snappy/exterior_to_link/rational_linear_algebra.py +1 -1
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
- snappy/exterior_to_link/test.py +21 -33
- snappy/geometric_structure/__init__.py +212 -0
- snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
- snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
- snappy/geometric_structure/geodesic/__init__.py +0 -0
- snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
- snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
- snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
- snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
- snappy/geometric_structure/geodesic/constants.py +6 -0
- snappy/geometric_structure/geodesic/exceptions.py +22 -0
- snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
- snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
- snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
- snappy/geometric_structure/geodesic/line.py +30 -0
- snappy/geometric_structure/geodesic/multiplicity.py +127 -0
- snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +23 -13
- snappy/horoviewer.py +7 -7
- snappy/hyperboloid/__init__.py +96 -31
- snappy/hyperboloid/distances.py +245 -0
- snappy/hyperboloid/horoball.py +19 -0
- snappy/hyperboloid/line.py +35 -0
- snappy/hyperboloid/point.py +9 -0
- snappy/hyperboloid/triangle.py +29 -0
- snappy/isometry_signature.py +382 -0
- snappy/len_spec/__init__.py +596 -0
- snappy/len_spec/geodesic_info.py +110 -0
- snappy/len_spec/geodesic_key_info_dict.py +117 -0
- snappy/len_spec/geodesic_piece.py +143 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +80 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
- snappy/len_spec/spine.py +206 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +275 -0
- snappy/len_spec/word.py +86 -0
- snappy/math_basics.py +39 -13
- snappy/matrix.py +52 -9
- snappy/number.py +12 -6
- snappy/numeric_output_checker.py +2 -3
- snappy/pari.py +8 -4
- snappy/phone_home.py +2 -1
- snappy/polyviewer.py +8 -8
- snappy/ptolemy/__init__.py +1 -1
- snappy/ptolemy/component.py +2 -2
- snappy/ptolemy/coordinates.py +25 -25
- snappy/ptolemy/findLoops.py +9 -9
- snappy/ptolemy/manifoldMethods.py +27 -29
- snappy/ptolemy/polynomial.py +50 -57
- snappy/ptolemy/processFileBase.py +60 -0
- snappy/ptolemy/ptolemyVariety.py +109 -41
- snappy/ptolemy/reginaWrapper.py +4 -4
- snappy/ptolemy/rur.py +1 -1
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
- snappy/ptolemy/test.py +99 -54
- snappy/ptolemy/utilities.py +1 -1
- snappy/raytracing/__init__.py +64 -0
- snappy/raytracing/additional_horospheres.py +64 -0
- snappy/raytracing/additional_len_spec_choices.py +63 -0
- snappy/raytracing/cohomology_fractal.py +0 -3
- snappy/raytracing/eyeball.py +123 -0
- snappy/raytracing/finite_raytracing_data.py +17 -17
- snappy/raytracing/finite_viewer.py +15 -15
- snappy/raytracing/geodesic_tube_info.py +93 -63
- snappy/raytracing/geodesics.py +94 -64
- snappy/raytracing/geodesics_window.py +56 -34
- snappy/raytracing/gui_utilities.py +21 -6
- snappy/raytracing/hyperboloid_navigation.py +29 -4
- snappy/raytracing/hyperboloid_utilities.py +73 -73
- snappy/raytracing/ideal_raytracing_data.py +121 -91
- snappy/raytracing/inside_viewer.py +199 -66
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +37 -25
- snappy/raytracing/raytracing_view.py +70 -65
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +39 -3
- snappy/raytracing/shaders/fragment.glsl +451 -133
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +42 -9
- snappy/sage_helper.py +67 -134
- snappy/settings.py +90 -77
- snappy/shell.py +2 -0
- snappy/snap/character_varieties.py +2 -2
- snappy/snap/find_field.py +4 -3
- snappy/snap/fundamental_polyhedron.py +2 -2
- snappy/snap/kernel_structures.py +5 -1
- snappy/snap/nsagetools.py +9 -8
- snappy/snap/peripheral/dual_cellulation.py +4 -3
- snappy/snap/peripheral/peripheral.py +2 -2
- snappy/snap/peripheral/surface.py +5 -5
- snappy/snap/peripheral/test.py +1 -1
- snappy/snap/polished_reps.py +8 -8
- snappy/snap/slice_obs_HKL.py +16 -14
- snappy/snap/t3mlite/arrow.py +3 -3
- snappy/snap/t3mlite/edge.py +3 -3
- snappy/snap/t3mlite/homology.py +2 -2
- snappy/snap/t3mlite/mcomplex.py +3 -3
- snappy/snap/t3mlite/simplex.py +12 -0
- snappy/snap/t3mlite/spun.py +18 -17
- snappy/snap/t3mlite/test_vs_regina.py +4 -4
- snappy/snap/test.py +37 -53
- snappy/snap/utilities.py +4 -5
- snappy/test.py +121 -138
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -0
- snappy/tiling/canonical_key_dict.py +59 -0
- snappy/tiling/dict_based_set.py +79 -0
- snappy/tiling/floor.py +49 -0
- snappy/tiling/hyperboloid_dict.py +54 -0
- snappy/tiling/iter_utils.py +78 -0
- snappy/tiling/lifted_tetrahedron.py +22 -0
- snappy/tiling/lifted_tetrahedron_set.py +54 -0
- snappy/tiling/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +215 -0
- snappy/tiling/triangle.py +33 -0
- snappy/tkterminal.py +113 -84
- snappy/twister/main.py +1 -7
- snappy/twister/twister_core.cp38-win_amd64.pyd +0 -0
- snappy/upper_halfspace/__init__.py +78 -17
- snappy/verify/__init__.py +3 -7
- snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
- snappy/verify/complex_volume/adjust_torsion.py +1 -2
- snappy/verify/complex_volume/closed.py +13 -13
- snappy/verify/complex_volume/cusped.py +6 -6
- snappy/verify/complex_volume/extended_bloch.py +5 -8
- snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +0 -55
- snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
- snappy/verify/interval_newton_shapes_engine.py +7 -5
- snappy/verify/interval_tree.py +5 -5
- snappy/verify/krawczyk_shapes_engine.py +17 -18
- snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
- snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
- snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
- snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
- snappy/verify/shapes.py +5 -3
- snappy/verify/short_slopes.py +39 -41
- snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
- snappy/verify/test.py +57 -60
- snappy/verify/upper_halfspace/extended_matrix.py +1 -1
- snappy/verify/upper_halfspace/finite_point.py +3 -4
- snappy/verify/upper_halfspace/ideal_point.py +9 -9
- snappy/verify/volume.py +2 -2
- snappy/version.py +2 -2
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +14 -10
- snappy-3.2.dist-info/RECORD +503 -0
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
- snappy/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/__pycache__/browser.cpython-38.pyc +0 -0
- snappy/__pycache__/cache.cpython-38.pyc +0 -0
- snappy/__pycache__/database.cpython-38.pyc +0 -0
- snappy/__pycache__/db_utilities.cpython-38.pyc +0 -0
- snappy/__pycache__/decorated_isosig.cpython-38.pyc +0 -0
- snappy/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/__pycache__/export_stl.cpython-38.pyc +0 -0
- snappy/__pycache__/filedialog.cpython-38.pyc +0 -0
- snappy/__pycache__/gui.cpython-38.pyc +0 -0
- snappy/__pycache__/horoviewer.cpython-38.pyc +0 -0
- snappy/__pycache__/math_basics.cpython-38.pyc +0 -0
- snappy/__pycache__/matrix.cpython-38.pyc +0 -0
- snappy/__pycache__/number.cpython-38.pyc +0 -0
- snappy/__pycache__/numeric_output_checker.cpython-38.pyc +0 -0
- snappy/__pycache__/pari.cpython-38.pyc +0 -0
- snappy/__pycache__/polyviewer.cpython-38.pyc +0 -0
- snappy/__pycache__/sage_helper.cpython-38.pyc +0 -0
- snappy/__pycache__/version.cpython-38.pyc +0 -0
- snappy/doc/_sources/verify_canon.rst.txt +0 -90
- snappy/doc/_static/jquery-3.6.0.js +0 -10881
- snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
- snappy/doc/_static/js/html5shiv.min.js +0 -4
- snappy/doc/_static/underscore-1.13.1.js +0 -2042
- snappy/doc/_static/underscore.js +0 -6
- snappy/doc/verify_canon.html +0 -304
- snappy/drilling/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/constants.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/crush.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/cusps.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/debug.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/epsilons.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/fixed_points.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_info.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_tube.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geometric_structure.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/line.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/moves.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/peripheral_curves.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/perturb.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/quotient_space.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/spatial_dict.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/subdivide.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/tracing.cpython-38.pyc +0 -0
- snappy/drilling/geodesic_tube.py +0 -441
- snappy/drilling/geometric_structure.py +0 -366
- snappy/drilling/line.py +0 -122
- snappy/drilling/quotient_space.py +0 -94
- snappy/drilling/spatial_dict.py +0 -128
- snappy/exterior_to_link/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/hyp_utils.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/link_projection.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/main.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/pl_utils.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/put_in_S3.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/stored_moves.cpython-38.pyc +0 -0
- snappy/hyperboloid/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/manifolds/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/component.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/coordinates.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/fieldExtensions.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/findLoops.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/homology.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/manifoldMethods.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/matrix.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/polynomial.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processComponents.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileBase.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileDispatch.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processMagmaFile.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processRurFile.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVariety.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/rur.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/utilities.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/character_varieties.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/fundamental_polyhedron.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/interval_reps.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/kernel_structures.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/mcomplex_base.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/nsagetools.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/polished_reps.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/shapes.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/slice_obs_HKL.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/utilities.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/link.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/peripheral.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/surface.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/arrow.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/corner.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/edge.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/face.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/files.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/homology.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/linalg.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/mcomplex.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/perm4.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/simplex.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/spun.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/surface.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/vertex.cpython-38.pyc +0 -0
- snappy/togl/__init__.py +0 -3
- snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
- snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
- snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
- snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
- snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
- snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
- snappy/twister/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/twister/__pycache__/main.cpython-38.pyc +0 -0
- snappy/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cuspCrossSection.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cuspTranslations.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cusp_areas.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cusp_shapes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/interval_tree.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/realAlgebra.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/shapes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/short_slopes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/squareExtensions.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/verifyCanonical.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/verifyHyperbolicity.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/volume.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/closed.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/cusped.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-38.pyc +0 -0
- snappy/verify/cuspCrossSection.py +0 -1422
- snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-38.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
- snappy-3.1.1.dist-info/RECORD +0 -575
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,101 @@
|
|
1
|
+
from .canonical_keys import canonical_keys_function_for_line
|
2
|
+
from .geodesic_start_point_info import GeodesicStartPointInfo
|
3
|
+
from .avoid_core_curves import replace_piece_in_core_curve_tube
|
4
|
+
|
5
|
+
from ...tiling.tile import Tile, compute_tiles
|
6
|
+
from ...tiling.lifted_tetrahedron_set import (LiftedTetrahedronSet,
|
7
|
+
get_lifted_tetrahedron_set)
|
8
|
+
|
9
|
+
from ...snap.t3mlite import Mcomplex # type: ignore
|
10
|
+
|
11
|
+
from typing import Sequence
|
12
|
+
|
13
|
+
def compute_tiles_for_geodesic(mcomplex : Mcomplex,
|
14
|
+
geodesic : GeodesicStartPointInfo,
|
15
|
+
avoid_core_curves : bool = False,
|
16
|
+
for_raytracing : bool = False
|
17
|
+
) -> Sequence[Tile]:
|
18
|
+
"""
|
19
|
+
Computes all GeodesicPiece's needed to cover a tube about the
|
20
|
+
given closed geodesic in the given manifold. The geodesic cannot be
|
21
|
+
a core curve of a filled cusp.
|
22
|
+
|
23
|
+
A GeodesicTube is constructed from a triangulation with a suitable
|
24
|
+
geometric structure and a suitable GeodesicStartPointInfo object.
|
25
|
+
|
26
|
+
To add the necessary geometric structure to a triangulation, call
|
27
|
+
add_r13_geometry and add_r13_planes_to_tetrahedra.
|
28
|
+
|
29
|
+
The GeodesicStartPointInfo object needs to be constructed with a line and
|
30
|
+
GeodesicStartPointInfo.find_tet_or_core_curve be called on it.
|
31
|
+
|
32
|
+
Calling GeodesicStartPointInfo.add_pieces_for_radius will then add the
|
33
|
+
necessary pieces to GeodesicStartPointInfo.pieces to cover the tube of the
|
34
|
+
given radius.
|
35
|
+
"""
|
36
|
+
|
37
|
+
if geodesic.core_curve_cusp is not None:
|
38
|
+
raise ValueError(
|
39
|
+
"Cannot tile a tube about a geodesic that is a core curve.")
|
40
|
+
|
41
|
+
if geodesic.line is None:
|
42
|
+
raise ValueError(
|
43
|
+
"Tiling a tube about a geodesic expected GeodesicStartPointInfo with valid "
|
44
|
+
"line.")
|
45
|
+
|
46
|
+
if not geodesic.lifted_tetrahedra:
|
47
|
+
raise ValueError(
|
48
|
+
"Tiling a tube about a geodesic expected GeodesicStartPointInfo with valid "
|
49
|
+
"lifted_tetrahedra.")
|
50
|
+
|
51
|
+
min_neg_prod_distinct = (mcomplex.baseTetInRadius/2).cosh()
|
52
|
+
|
53
|
+
if mcomplex.verified:
|
54
|
+
max_neg_prod_equal = min_neg_prod_distinct
|
55
|
+
else:
|
56
|
+
max_neg_prod_equal = min(
|
57
|
+
min_neg_prod_distinct, 1 + _compute_prod_epsilon(mcomplex.RF))
|
58
|
+
if for_raytracing:
|
59
|
+
min_neg_prod_distinct = max_neg_prod_equal
|
60
|
+
|
61
|
+
lifted_tetrahedron_set : LiftedTetrahedronSet = (
|
62
|
+
get_lifted_tetrahedron_set(
|
63
|
+
base_point=mcomplex.R13_baseTetInCenter,
|
64
|
+
canonical_keys_function=(
|
65
|
+
canonical_keys_function_for_line(geodesic.line)),
|
66
|
+
act_on_base_point_by_inverse=False,
|
67
|
+
max_neg_prod_equal=max_neg_prod_equal,
|
68
|
+
min_neg_prod_distinct=min_neg_prod_distinct,
|
69
|
+
verified=mcomplex.verified))
|
70
|
+
|
71
|
+
if avoid_core_curves:
|
72
|
+
replace_lifted_tetrahedron_function = replace_piece_in_core_curve_tube
|
73
|
+
else:
|
74
|
+
replace_lifted_tetrahedron_function = None
|
75
|
+
|
76
|
+
return compute_tiles(
|
77
|
+
geometric_object=geodesic.line.r13_line,
|
78
|
+
visited_lifted_tetrahedra=lifted_tetrahedron_set,
|
79
|
+
initial_lifted_tetrahedra=geodesic.lifted_tetrahedra,
|
80
|
+
replace_lifted_tetrahedron_function=replace_lifted_tetrahedron_function,
|
81
|
+
verified=mcomplex.verified)
|
82
|
+
|
83
|
+
def _compute_prod_epsilon(RF):
|
84
|
+
p = RF.precision()
|
85
|
+
|
86
|
+
# We try to be a factor of at least several magnitudes smaller than
|
87
|
+
# 1/_compute_epsilon_inverse(RF) in hyperboloid_dict.py.
|
88
|
+
#
|
89
|
+
# This factor will even grow larger as the precision increases.
|
90
|
+
#
|
91
|
+
# That way, we will hopefully fail in _equality_predicate
|
92
|
+
# in hyperboloid_dict rather than failing by not hashing together
|
93
|
+
# lifted tetrahedra that should be the same but are not recognised
|
94
|
+
# as such because of numerical error.
|
95
|
+
|
96
|
+
result = RF(1e-6)
|
97
|
+
if p > 53:
|
98
|
+
result *= RF(0.5) ** ((p - 53) / 2)
|
99
|
+
|
100
|
+
return result
|
101
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
from snappy import testing
|
2
|
+
import snappy
|
3
|
+
|
4
|
+
from snappy import geometric_structure
|
5
|
+
|
6
|
+
modules = [
|
7
|
+
geometric_structure.cusp_neighborhood.cusp_cross_section_base,
|
8
|
+
geometric_structure.cusp_neighborhood.real_cusp_cross_section,
|
9
|
+
geometric_structure.cusp_neighborhood.complex_cusp_cross_section
|
10
|
+
]
|
11
|
+
|
12
|
+
def run_doctests(verbose=False, print_info=True):
|
13
|
+
globs = {'Manifold': snappy.Manifold}
|
14
|
+
return testing.doctest_modules(modules,
|
15
|
+
verbose=verbose,
|
16
|
+
print_info=print_info,
|
17
|
+
extraglobs=globs)
|
18
|
+
|
19
|
+
run_doctests.__name__ = geometric_structure.__name__
|
20
|
+
|
21
|
+
if __name__ == '__main__':
|
22
|
+
testing.run_doctests_as_main(run_doctests)
|
snappy/gui.py
CHANGED
@@ -4,21 +4,20 @@ import sys
|
|
4
4
|
import time
|
5
5
|
import tempfile
|
6
6
|
import tkinter as Tk_
|
7
|
-
from tkinter import ttk
|
7
|
+
from tkinter import ttk
|
8
|
+
from tkinter.ttk import Spinbox
|
8
9
|
from tkinter.font import Font, families as font_families
|
9
10
|
from tkinter.simpledialog import Dialog, SimpleDialog
|
10
11
|
from plink.ipython_tools import IPythonTkRoot
|
11
12
|
from . import filedialog
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
else:
|
21
|
-
Spinbox = ttk.Spinbox
|
14
|
+
|
15
|
+
def nominal_font_dict(tk_font):
|
16
|
+
"""
|
17
|
+
Like Font.actual() but not messed up by GNOME scaling factors on
|
18
|
+
Linux.
|
19
|
+
"""
|
20
|
+
return {key:tk_font.cget(key) for key in tk_font.actual()}
|
22
21
|
|
23
22
|
|
24
23
|
class SnapPyStyle:
|
@@ -41,10 +40,21 @@ class SnapPyStyle:
|
|
41
40
|
else:
|
42
41
|
self.windowBG = ttk_style.lookup('TLabelframe', 'background')
|
43
42
|
self.groupBG = self.subgroupBG = self.windowBG
|
44
|
-
self.font = ttk_style.lookup('TLabel', 'font')
|
45
|
-
self.font_info = fi = Font(font=self.font).actual()
|
46
|
-
fi['size'] = abs(fi['size']) # Why would the size be negative???
|
47
43
|
|
44
|
+
self.font = ttk_style.lookup('TLabel', 'font')
|
45
|
+
if self.font == '':
|
46
|
+
self.font = 'TkDefaultFont'
|
47
|
+
# TLabel.font and TLabelframe.Label.font differ in Tk 9.0 (at
|
48
|
+
# least on macOS). We restore the Tk 8.6 behavior.
|
49
|
+
self.ttk_style.configure('TLabelframe.Label',
|
50
|
+
font=self.font)
|
51
|
+
self.font_info = fi = nominal_font_dict(Font(font=self.font))
|
52
|
+
fi['size'] = int(str(fi['size']))
|
53
|
+
# On linux the treeview rows are too small, at least with hi-dpi displays.
|
54
|
+
if sys.platform == 'linux':
|
55
|
+
default_font = Font(name='TkDefaultFont', exists=True)
|
56
|
+
line_height = default_font.metrics()['linespace']
|
57
|
+
self.ttk_style.configure('Treeview', rowheight=line_height)
|
48
58
|
|
49
59
|
class ViewerWindow(Tk_.Toplevel):
|
50
60
|
def __init__(self, view_class, *args, **kwargs):
|
snappy/horoviewer.py
CHANGED
@@ -146,7 +146,7 @@ Use the View Options to select which components of the scene are drawn.
|
|
146
146
|
self.scene = HoroballScene(nbhd, pgram_var, Ford_var, tri_var,
|
147
147
|
horo_var, label_var, flipped=self.flip_var.get(), cutoff=self.cutoff,
|
148
148
|
which_cusp=self.which_cusp,togl_widget=self.widget)
|
149
|
-
self.widget.
|
149
|
+
self.widget.draw_projection_impl = self.scene.draw
|
150
150
|
if isinstance(parent, Tk_.Toplevel):
|
151
151
|
parent.config(menu=self.menubar)
|
152
152
|
# hacks needed on Sierra
|
@@ -174,7 +174,7 @@ Use the View Options to select which components of the scene are drawn.
|
|
174
174
|
self.widget.set_background(0.3, 0.3, 0.4)
|
175
175
|
else:
|
176
176
|
self.widget.set_background(1.0, 1.0, 1.0)
|
177
|
-
self.widget.
|
177
|
+
self.widget.redraw()
|
178
178
|
|
179
179
|
def build_sliders(self):
|
180
180
|
nbhd = self.nbhd
|
@@ -264,7 +264,7 @@ Use the View Options to select which components of the scene are drawn.
|
|
264
264
|
flipped=self.flip_var.get(), cutoff=self.cutoff,
|
265
265
|
which_cusp=self.which_cusp, togl_widget=self.widget)
|
266
266
|
assert(self.scene is not None)
|
267
|
-
self.widget.
|
267
|
+
self.widget.draw_projection_impl = self.scene.draw
|
268
268
|
self.configure_sliders()
|
269
269
|
self.rebuild()
|
270
270
|
|
@@ -278,7 +278,7 @@ Use the View Options to select which components of the scene are drawn.
|
|
278
278
|
flipped = self.flip_var.get()
|
279
279
|
self.scene.flip(flipped)
|
280
280
|
self.widget.flipped = flipped
|
281
|
-
self.widget.
|
281
|
+
self.widget.redraw()
|
282
282
|
|
283
283
|
def configure_sliders(self):
|
284
284
|
nbhd = self.nbhd
|
@@ -331,7 +331,7 @@ Use the View Options to select which components of the scene are drawn.
|
|
331
331
|
self.destroy()
|
332
332
|
|
333
333
|
def redraw(self):
|
334
|
-
self.widget.
|
334
|
+
self.widget.redraw()
|
335
335
|
|
336
336
|
def set_zoom(self, x):
|
337
337
|
fovy = 1.0 + (100.0-float(x))/15.0
|
@@ -342,14 +342,14 @@ Use the View Options to select which components of the scene are drawn.
|
|
342
342
|
else:
|
343
343
|
self.update_idletasks()
|
344
344
|
self.after(50, self.set_zoom, x)
|
345
|
-
self.widget.
|
345
|
+
self.widget.redraw()
|
346
346
|
|
347
347
|
def rebuild(self, full_list=True):
|
348
348
|
self.set_ties()
|
349
349
|
self.configure_sliders()
|
350
350
|
self.widget.make_current()
|
351
351
|
self.scene.build_scene(which_cusp=self.which_cusp, full_list=full_list)
|
352
|
-
self.widget.
|
352
|
+
self.widget.redraw()
|
353
353
|
|
354
354
|
def start_radius(self, event):
|
355
355
|
self.cusp_moving = True
|
snappy/hyperboloid/__init__.py
CHANGED
@@ -1,9 +1,6 @@
|
|
1
|
-
from ..matrix import
|
2
|
-
from ..math_basics import is_RealIntervalFieldElement
|
3
|
-
from ..sage_helper import _within_sage
|
1
|
+
from ..matrix import make_vector, make_matrix, mat_solve
|
4
2
|
|
5
|
-
|
6
|
-
import sage.all
|
3
|
+
from ..sage_helper import _within_sage
|
7
4
|
|
8
5
|
"""
|
9
6
|
hyperboloid contains methods relating to the hyperboloid model
|
@@ -40,27 +37,6 @@ def r13_dot(u, v):
|
|
40
37
|
return -u[0]*v[0] + u[1]*v[1] + u[2]*v[2] + u[3]*v[3]
|
41
38
|
|
42
39
|
|
43
|
-
def distance_unit_time_r13_points(u, v):
|
44
|
-
"""
|
45
|
-
Computes the hyperbolic distance between two points (represented
|
46
|
-
by unit time vectors) in the hyperboloid model.
|
47
|
-
"""
|
48
|
-
|
49
|
-
d = -r13_dot(u, v)
|
50
|
-
|
51
|
-
# Due to rounding errors, the resulting number or interval can be
|
52
|
-
# slightly less than 1 or contain numbers slightly less than 1,
|
53
|
-
# respectively - resulting in NaN's. Avoid this here.
|
54
|
-
if is_RealIntervalFieldElement(d):
|
55
|
-
RIF = d.parent()
|
56
|
-
d = d.intersection(RIF(1, sage.all.Infinity))
|
57
|
-
else:
|
58
|
-
if d < 1:
|
59
|
-
RF = d.parent()
|
60
|
-
d = RF(1)
|
61
|
-
return d.arccosh()
|
62
|
-
|
63
|
-
|
64
40
|
def time_r13_normalise(u):
|
65
41
|
"""
|
66
42
|
Given a time-like vector in Minkowski space, returns the normalised
|
@@ -94,6 +70,51 @@ def o13_inverse(m):
|
|
94
70
|
|
95
71
|
return result
|
96
72
|
|
73
|
+
def so13_to_pgl2c(B):
|
74
|
+
"""
|
75
|
+
Given an SO13 matrix, returns corresponding complex 2x2-matrix.
|
76
|
+
The determinant of the result is not 1 in general.
|
77
|
+
|
78
|
+
Python implementation of O31_to_Moebius (without normalization).
|
79
|
+
"""
|
80
|
+
|
81
|
+
AM0A_00 = B[0,0] + B[1,0]
|
82
|
+
AM1A_00 = B[0,1] + B[1,1]
|
83
|
+
aa = AM0A_00 + AM1A_00
|
84
|
+
bb = AM0A_00 - AM1A_00
|
85
|
+
|
86
|
+
if aa > bb:
|
87
|
+
return _to_complex_matrix(
|
88
|
+
aa, 0 ,
|
89
|
+
B[0,2] + B[1,2], B[0,3] + B[1,3] ,
|
90
|
+
|
91
|
+
B[2,0] + B[2,1], -(B[3,0] + B[3,1]),
|
92
|
+
B[2,2] + B[3,3], B[2,3] - B[3,2] )
|
93
|
+
else:
|
94
|
+
return _to_complex_matrix(
|
95
|
+
B[0,2] + B[1,2], -(B[0,3] + B[1,3]),
|
96
|
+
bb , 0 ,
|
97
|
+
B[2,2] - B[3,3], -(B[2,3] + B[3,2]),
|
98
|
+
B[2,0] - B[2,1], B[3,1] - B[3,0] )
|
99
|
+
|
100
|
+
def so13_to_psl2c(m):
|
101
|
+
"""
|
102
|
+
Given an SO13 matrix, returns corresponding complex 2x2-matrix
|
103
|
+
with determinant 1.
|
104
|
+
|
105
|
+
Python implementation of O31_to_Moebius (with normalization).
|
106
|
+
"""
|
107
|
+
|
108
|
+
A = so13_to_pgl2c(m)
|
109
|
+
return A / A.det().sqrt()
|
110
|
+
|
111
|
+
def r13_to_klein(v):
|
112
|
+
"""
|
113
|
+
Given a time-like or light-like vector, gives the respective point
|
114
|
+
in the Klein model or its boundary, respectively.
|
115
|
+
"""
|
116
|
+
|
117
|
+
return make_vector([v[1] / v[0], v[2] / v[0], v[3] / v[0]])
|
97
118
|
|
98
119
|
def unit_time_vector_to_o13_hyperbolic_translation(v):
|
99
120
|
"""
|
@@ -112,7 +133,7 @@ def unit_time_vector_to_o13_hyperbolic_translation(v):
|
|
112
133
|
m[2][2] += 1
|
113
134
|
m[3][3] += 1
|
114
135
|
|
115
|
-
return
|
136
|
+
return make_matrix(m)
|
116
137
|
|
117
138
|
|
118
139
|
def unnormalised_plane_eqn_from_r13_points(pts):
|
@@ -123,10 +144,10 @@ def unnormalised_plane_eqn_from_r13_points(pts):
|
|
123
144
|
three given points.
|
124
145
|
"""
|
125
146
|
|
126
|
-
return
|
127
|
-
|
128
|
-
|
129
|
-
|
147
|
+
return make_vector([ _det_shifted_matrix3(pts, 0),
|
148
|
+
_det_shifted_matrix3(pts, 1),
|
149
|
+
- _det_shifted_matrix3(pts, 2),
|
150
|
+
_det_shifted_matrix3(pts, 3)])
|
130
151
|
|
131
152
|
|
132
153
|
def _det_shifted_matrix3(m, i):
|
@@ -145,3 +166,47 @@ def _det_shifted_matrix3(m, i):
|
|
145
166
|
- m[0][i2] * m[1][i1] * m[2][i0]
|
146
167
|
- m[0][i0] * m[1][i2] * m[2][i1]
|
147
168
|
- m[0][i1] * m[1][i0] * m[2][i2])
|
169
|
+
|
170
|
+
def compute_inradius_and_incenter_from_planes(planes):
|
171
|
+
"""
|
172
|
+
Given outside-facing normals for the four faces of a
|
173
|
+
tetrahedron, compute the hyperbolic inradius and the
|
174
|
+
incenter (as unit time vector) of the tetrahedron (in the
|
175
|
+
hyperboloid model).
|
176
|
+
"""
|
177
|
+
|
178
|
+
# We need to c and r such that
|
179
|
+
# * r13_dot(c, c) = -1 and
|
180
|
+
# * r13_dot(plane, c) = -sinh(r) for every plane
|
181
|
+
#
|
182
|
+
# We instead solve for the following system of linear equations:
|
183
|
+
# * r13_dot(plane, pt) = -1 for every plane
|
184
|
+
|
185
|
+
RF = planes[0][0].parent()
|
186
|
+
m = make_matrix([[-plane[0], plane[1], plane[2], plane[3]]
|
187
|
+
for plane in planes])
|
188
|
+
v = make_vector([RF(-1), RF(-1), RF(-1), RF(-1)])
|
189
|
+
|
190
|
+
pt = mat_solve(m, v)
|
191
|
+
|
192
|
+
# And then use the inverse length of pt to scale pt to be
|
193
|
+
# a unit time vector and to compute the r.
|
194
|
+
scale = 1 / (-r13_dot(pt, pt)).sqrt()
|
195
|
+
|
196
|
+
return scale.arcsinh(), scale * pt
|
197
|
+
|
198
|
+
def _to_complex_matrix(
|
199
|
+
a, b, c, d,
|
200
|
+
e, f, g, h):
|
201
|
+
RF = a.parent()
|
202
|
+
if _within_sage:
|
203
|
+
CF = RF.complex_field()
|
204
|
+
return make_matrix(
|
205
|
+
[ [ CF(a,b), CF(c, d) ],
|
206
|
+
[ CF(e,f), CF(g, h) ] ],
|
207
|
+
ring=CF)
|
208
|
+
else:
|
209
|
+
I = RF('I')
|
210
|
+
return make_matrix(
|
211
|
+
[ [ a + b * I, c + d * I ],
|
212
|
+
[ e + f * I, g + h * I ] ])
|
@@ -0,0 +1,245 @@
|
|
1
|
+
from .triangle import R13IdealTriangle
|
2
|
+
from .line import R13Line
|
3
|
+
from .point import R13Point
|
4
|
+
from .horoball import R13Horoball
|
5
|
+
from . import r13_dot
|
6
|
+
|
7
|
+
from ..math_basics import is_RealIntervalFieldElement # type: ignore
|
8
|
+
from ..sage_helper import _within_sage # type: ignore
|
9
|
+
|
10
|
+
if _within_sage:
|
11
|
+
from ..sage_helper import Infinity
|
12
|
+
|
13
|
+
__all__ = ['distance_r13_lines',
|
14
|
+
'lower_bound_distance_r13_line_triangle']
|
15
|
+
|
16
|
+
def distance_r13_lines(line0 : R13Line, line1 : R13Line):
|
17
|
+
"""
|
18
|
+
Computes distance between two hyperbolic lines.
|
19
|
+
"""
|
20
|
+
|
21
|
+
p00 = r13_dot(line0.points[0], line1.points[0])
|
22
|
+
p01 = r13_dot(line0.points[0], line1.points[1])
|
23
|
+
p10 = r13_dot(line0.points[1], line1.points[0])
|
24
|
+
p11 = r13_dot(line0.points[1], line1.points[1])
|
25
|
+
|
26
|
+
pp = line0.inner_product * line1.inner_product
|
27
|
+
|
28
|
+
t0 = _safe_sqrt((p00 * p11) / pp)
|
29
|
+
t1 = _safe_sqrt((p01 * p10) / pp)
|
30
|
+
|
31
|
+
p = (t0 + t1 - 1) / 2
|
32
|
+
|
33
|
+
return 2 * _safe_sqrt(p).arcsinh()
|
34
|
+
|
35
|
+
def distance_r13_horoballs(horoball_defining_vec0,
|
36
|
+
horoball_defining_vec1):
|
37
|
+
p = -r13_dot(horoball_defining_vec0, horoball_defining_vec1) / 2
|
38
|
+
return _safe_log(p)
|
39
|
+
|
40
|
+
def distance_r13_horoball_line(horoball_defining_vec, # Light-like
|
41
|
+
line : R13Line):
|
42
|
+
|
43
|
+
p = (r13_dot(line.points[0], horoball_defining_vec) *
|
44
|
+
r13_dot(line.points[1], horoball_defining_vec))
|
45
|
+
s = -2 * p / line.inner_product
|
46
|
+
|
47
|
+
return _safe_log(s)/2
|
48
|
+
|
49
|
+
def distance_r13_horoball_plane(horoball_defining_vec, # Light-like
|
50
|
+
plane_defining_vec): # Unit space-like
|
51
|
+
p = r13_dot(horoball_defining_vec, plane_defining_vec)
|
52
|
+
return _safe_log_of_abs(p)
|
53
|
+
|
54
|
+
def distance_r13_horoball_point(horoball_defining_vec, # Light-like
|
55
|
+
pt): # Unit-time-like
|
56
|
+
p = r13_dot(horoball_defining_vec, pt)
|
57
|
+
return (-p).log()
|
58
|
+
|
59
|
+
def distance_r13_point_line(pt, # Unit time-like
|
60
|
+
line : R13Line):
|
61
|
+
"""
|
62
|
+
This also works if line is degenerate and starts and ends at some point.
|
63
|
+
"""
|
64
|
+
|
65
|
+
p = (r13_dot(line.points[0], pt) *
|
66
|
+
r13_dot(line.points[1], pt))
|
67
|
+
s = _safe_div(2 * p, -line.inner_product)
|
68
|
+
return _safe_arccosh(_safe_sqrt(s))
|
69
|
+
|
70
|
+
def distance_r13_point_plane(pt, # Unit time-like
|
71
|
+
plane_defining_vec): # Unit space-like
|
72
|
+
p = r13_dot(pt, plane_defining_vec)
|
73
|
+
return p.arcsinh().abs()
|
74
|
+
|
75
|
+
def distance_r13_points(pt0, # Unit time-like
|
76
|
+
pt1): # Unit time-like
|
77
|
+
"""
|
78
|
+
Computes the hyperbolic distance between two points (represented
|
79
|
+
by unit time vectors) in the hyperboloid model.
|
80
|
+
"""
|
81
|
+
p = r13_dot(pt0, pt1)
|
82
|
+
|
83
|
+
# Due to rounding errors, the resulting number or interval can be
|
84
|
+
# slightly less than 1 or contain numbers slightly less than 1,
|
85
|
+
# respectively - resulting in NaN's. Avoid this here.
|
86
|
+
return _safe_arccosh(-p)
|
87
|
+
|
88
|
+
def lower_bound_distance_to_r13_triangle(
|
89
|
+
geometric_object, triangle : R13IdealTriangle, verified : bool):
|
90
|
+
if isinstance(geometric_object, R13Horoball):
|
91
|
+
return lower_bound_distance_r13_horoball_triangle(
|
92
|
+
geometric_object.defining_vec, triangle, verified)
|
93
|
+
if isinstance(geometric_object, R13Line):
|
94
|
+
return lower_bound_distance_r13_line_triangle(
|
95
|
+
geometric_object, triangle, verified)
|
96
|
+
if isinstance(geometric_object, R13Point):
|
97
|
+
return lower_bound_distance_r13_point_triangle(
|
98
|
+
geometric_object.point, triangle, verified)
|
99
|
+
raise ValueError(
|
100
|
+
"Distance between %r and triangle not supported" % geometric_object)
|
101
|
+
|
102
|
+
def lower_bound_distance_r13_horoball_triangle(
|
103
|
+
horoball_defining_vec,
|
104
|
+
triangle : R13IdealTriangle, verified : bool):
|
105
|
+
|
106
|
+
if verified:
|
107
|
+
epsilon = 0
|
108
|
+
else:
|
109
|
+
RF = horoball_defining_vec[0].parent()
|
110
|
+
epsilon = _compute_epsilon(RF)
|
111
|
+
|
112
|
+
for bounding_plane, edge in zip(triangle.bounding_planes,
|
113
|
+
triangle.edges):
|
114
|
+
if r13_dot(horoball_defining_vec, bounding_plane) > epsilon:
|
115
|
+
return distance_r13_horoball_line(horoball_defining_vec, edge)
|
116
|
+
|
117
|
+
return distance_r13_horoball_plane(
|
118
|
+
horoball_defining_vec, triangle.plane)
|
119
|
+
|
120
|
+
def lower_bound_distance_r13_line_triangle(
|
121
|
+
line : R13Line, triangle : R13IdealTriangle, verified : bool):
|
122
|
+
|
123
|
+
if verified:
|
124
|
+
epsilon = 0
|
125
|
+
else:
|
126
|
+
RF = line.points[0][0].parent()
|
127
|
+
epsilon = _compute_epsilon(RF)
|
128
|
+
|
129
|
+
a0 = r13_dot(triangle.plane, line.points[0])
|
130
|
+
a1 = r13_dot(triangle.plane, line.points[1])
|
131
|
+
|
132
|
+
abs0 = abs(a0)
|
133
|
+
abs1 = abs(a1)
|
134
|
+
|
135
|
+
pt = abs1 * line.points[0] + abs0 * line.points[1]
|
136
|
+
|
137
|
+
for bounding_plane, edge in zip(triangle.bounding_planes,
|
138
|
+
triangle.edges):
|
139
|
+
if r13_dot(pt, bounding_plane) > epsilon:
|
140
|
+
return distance_r13_lines(line, edge)
|
141
|
+
|
142
|
+
p = a0 * a1
|
143
|
+
|
144
|
+
if p > 0:
|
145
|
+
return (-2 * p / line.inner_product).sqrt().arcsinh()
|
146
|
+
|
147
|
+
RF = line.points[0][0].parent()
|
148
|
+
return RF(0)
|
149
|
+
|
150
|
+
def lower_bound_distance_r13_point_triangle(
|
151
|
+
point,
|
152
|
+
triangle : R13IdealTriangle, verified : bool):
|
153
|
+
|
154
|
+
if verified:
|
155
|
+
epsilon = 0
|
156
|
+
else:
|
157
|
+
RF = point[0].parent()
|
158
|
+
epsilon = _compute_epsilon(RF)
|
159
|
+
|
160
|
+
for bounding_plane, edge in zip(triangle.bounding_planes,
|
161
|
+
triangle.edges):
|
162
|
+
if r13_dot(point, bounding_plane) > epsilon:
|
163
|
+
return distance_r13_point_line(point, edge)
|
164
|
+
|
165
|
+
return distance_r13_point_plane(point, triangle.plane)
|
166
|
+
|
167
|
+
def _compute_epsilon(RF):
|
168
|
+
return RF(0.5) ** (RF.prec() // 2)
|
169
|
+
|
170
|
+
def _safe_sqrt(p):
|
171
|
+
"""
|
172
|
+
Compute the sqrt of a number that is known to be non-negative
|
173
|
+
though might not be non-negative because of floating point
|
174
|
+
issues. When using interval arithmetic, this means that
|
175
|
+
while the upper bound will be non-negative, the lower bound
|
176
|
+
we computed might be negative because it is too conservative.
|
177
|
+
|
178
|
+
Example of a quantity that can be given to this function:
|
179
|
+
negative inner product of two vectors in the positive
|
180
|
+
light cone. This is because we know that the inner product
|
181
|
+
of two such vectors is always non-positive.
|
182
|
+
"""
|
183
|
+
|
184
|
+
if is_RealIntervalFieldElement(p):
|
185
|
+
RIF = p.parent()
|
186
|
+
p = p.intersection(RIF(0, Infinity))
|
187
|
+
else:
|
188
|
+
if p < 0:
|
189
|
+
RF = p.parent()
|
190
|
+
return RF(0)
|
191
|
+
return p.sqrt()
|
192
|
+
|
193
|
+
def _safe_log(p):
|
194
|
+
if is_RealIntervalFieldElement(p):
|
195
|
+
RIF = p.parent()
|
196
|
+
p = p.intersection(RIF(0, Infinity))
|
197
|
+
else:
|
198
|
+
if p <= 0:
|
199
|
+
RF = p.parent()
|
200
|
+
return RF(-1e20)
|
201
|
+
return p.log()
|
202
|
+
|
203
|
+
def _safe_log_of_abs(p):
|
204
|
+
return _safe_log_non_neg(p.abs())
|
205
|
+
|
206
|
+
def _safe_log_non_neg(p):
|
207
|
+
if p == 0:
|
208
|
+
if is_RealIntervalFieldElement(p):
|
209
|
+
RIF = p.parent()
|
210
|
+
return RIF(-Infinity)
|
211
|
+
else:
|
212
|
+
RF = p.parent()
|
213
|
+
return RF(-1e20)
|
214
|
+
else:
|
215
|
+
return p.log()
|
216
|
+
|
217
|
+
def _safe_arccosh(p):
|
218
|
+
if is_RealIntervalFieldElement(p):
|
219
|
+
RIF = p.parent()
|
220
|
+
p = p.intersection(RIF(1, Infinity))
|
221
|
+
else:
|
222
|
+
if p < 1:
|
223
|
+
RF = p.parent()
|
224
|
+
return RF(0)
|
225
|
+
return p.arccosh()
|
226
|
+
|
227
|
+
def _safe_div(a, b):
|
228
|
+
"""
|
229
|
+
Compute a / b where be is known to be non-negative and we should
|
230
|
+
return infinity if b is zero.
|
231
|
+
"""
|
232
|
+
|
233
|
+
if is_RealIntervalFieldElement(b):
|
234
|
+
RIF = b.parent()
|
235
|
+
if b == 0:
|
236
|
+
return RIF(Infinity)
|
237
|
+
else:
|
238
|
+
return a / b.intersection(RIF(0, Infinity))
|
239
|
+
else:
|
240
|
+
if b <= 0:
|
241
|
+
RIF = b.parent()
|
242
|
+
return RIF(1e20)
|
243
|
+
else:
|
244
|
+
return a / b
|
245
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
__all__ = ['R13Horoball']
|
2
|
+
|
3
|
+
class R13Horoball:
|
4
|
+
"""
|
5
|
+
Horoball defined by { x : r13_dot(x, l) > -1 } where l is a
|
6
|
+
light-like vector.
|
7
|
+
"""
|
8
|
+
|
9
|
+
def __init__(self,
|
10
|
+
defining_vec): # Light-like vector
|
11
|
+
self.defining_vec = defining_vec
|
12
|
+
|
13
|
+
def transformed(self,
|
14
|
+
m): # O13-matrix
|
15
|
+
"""
|
16
|
+
Returns image of the horoball under given O13-matrix m.
|
17
|
+
"""
|
18
|
+
|
19
|
+
return R13Horoball(m * self.defining_vec)
|