snappy 3.3__cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.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.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.ico +0 -0
- snappy/SnapPy.png +0 -0
- snappy/SnapPyHP.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/__init__.py +534 -0
- snappy/app.py +604 -0
- snappy/app_menus.py +372 -0
- snappy/browser.py +998 -0
- snappy/cache.py +25 -0
- snappy/canonical.py +249 -0
- snappy/cusps/__init__.py +280 -0
- snappy/cusps/cusp_area_matrix.py +98 -0
- snappy/cusps/cusp_areas_from_matrix.py +96 -0
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/short_slopes_for_cusp.py +217 -0
- snappy/cusps/test.py +22 -0
- snappy/cusps/trig_cusp_area_matrix.py +63 -0
- snappy/database.py +454 -0
- snappy/db_utilities.py +79 -0
- snappy/decorated_isosig.py +717 -0
- snappy/dev/__init__.py +0 -0
- snappy/dev/extended_ptolemy/__init__.py +8 -0
- snappy/dev/extended_ptolemy/closed.py +106 -0
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
- snappy/dev/extended_ptolemy/direct.py +42 -0
- snappy/dev/extended_ptolemy/extended.py +406 -0
- snappy/dev/extended_ptolemy/giac_helper.py +43 -0
- snappy/dev/extended_ptolemy/giac_rur.py +129 -0
- snappy/dev/extended_ptolemy/gluing.py +46 -0
- snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
- snappy/dev/extended_ptolemy/printMatrices.py +70 -0
- snappy/dev/vericlosed/__init__.py +1 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
- snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
- snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
- snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
- snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
- snappy/dev/vericlosed/orb/__init__.py +1 -0
- snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
- snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
- snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
- snappy/dev/vericlosed/test.py +54 -0
- snappy/dev/vericlosed/truncatedComplex.py +176 -0
- snappy/dev/vericlosed/verificationError.py +58 -0
- snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
- snappy/doc/_images/SnapPy-196.png +0 -0
- snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
- snappy/doc/_images/m125_paper_plane.jpg +0 -0
- snappy/doc/_images/mac.png +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/_images/plink-action.png +0 -0
- snappy/doc/_images/ubuntu.png +0 -0
- snappy/doc/_images/win7.png +0 -0
- snappy/doc/_sources/additional_classes.rst.txt +40 -0
- snappy/doc/_sources/bugs.rst.txt +14 -0
- snappy/doc/_sources/censuses.rst.txt +52 -0
- snappy/doc/_sources/credits.rst.txt +81 -0
- snappy/doc/_sources/development.rst.txt +261 -0
- snappy/doc/_sources/index.rst.txt +215 -0
- snappy/doc/_sources/installing.rst.txt +249 -0
- snappy/doc/_sources/manifold.rst.txt +6 -0
- snappy/doc/_sources/manifoldhp.rst.txt +46 -0
- snappy/doc/_sources/news.rst.txt +425 -0
- snappy/doc/_sources/other.rst.txt +25 -0
- snappy/doc/_sources/platonic_census.rst.txt +20 -0
- snappy/doc/_sources/plink.rst.txt +102 -0
- snappy/doc/_sources/ptolemy.rst.txt +66 -0
- snappy/doc/_sources/ptolemy_classes.rst.txt +42 -0
- snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -0
- snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -0
- snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -0
- snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -0
- snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -0
- snappy/doc/_sources/screenshots.rst.txt +21 -0
- snappy/doc/_sources/snap.rst.txt +87 -0
- snappy/doc/_sources/snappy.rst.txt +28 -0
- snappy/doc/_sources/spherogram.rst.txt +103 -0
- snappy/doc/_sources/todo.rst.txt +47 -0
- snappy/doc/_sources/triangulation.rst.txt +11 -0
- snappy/doc/_sources/tutorial.rst.txt +49 -0
- snappy/doc/_sources/verify.rst.txt +210 -0
- snappy/doc/_sources/verify_internals.rst.txt +79 -0
- snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
- snappy/doc/_static/SnapPy.ico +0 -0
- snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
- snappy/doc/_static/basic.css +906 -0
- snappy/doc/_static/css/badge_only.css +1 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
- snappy/doc/_static/css/theme.css +4 -0
- snappy/doc/_static/doctools.js +149 -0
- snappy/doc/_static/documentation_options.js +13 -0
- snappy/doc/_static/file.png +0 -0
- 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/jquery.js +2 -0
- snappy/doc/_static/js/badge_only.js +1 -0
- snappy/doc/_static/js/theme.js +1 -0
- snappy/doc/_static/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +192 -0
- snappy/doc/_static/minus.png +0 -0
- snappy/doc/_static/plus.png +0 -0
- snappy/doc/_static/pygments.css +75 -0
- snappy/doc/_static/searchtools.js +635 -0
- snappy/doc/_static/snappy_furo.css +33 -0
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
- snappy/doc/_static/sphinx_highlight.js +154 -0
- snappy/doc/additional_classes.html +1500 -0
- snappy/doc/bugs.html +132 -0
- snappy/doc/censuses.html +453 -0
- snappy/doc/credits.html +184 -0
- snappy/doc/development.html +385 -0
- snappy/doc/doc-latest/additional_classes.html +1500 -0
- snappy/doc/doc-latest/bugs.html +132 -0
- snappy/doc/doc-latest/censuses.html +453 -0
- snappy/doc/doc-latest/credits.html +184 -0
- snappy/doc/doc-latest/development.html +385 -0
- snappy/doc/doc-latest/genindex.html +1349 -0
- snappy/doc/doc-latest/index.html +287 -0
- snappy/doc/doc-latest/installing.html +346 -0
- snappy/doc/doc-latest/manifold.html +3632 -0
- snappy/doc/doc-latest/manifoldhp.html +180 -0
- snappy/doc/doc-latest/news.html +438 -0
- snappy/doc/doc-latest/objects.inv +0 -0
- snappy/doc/doc-latest/other.html +160 -0
- snappy/doc/doc-latest/platonic_census.html +376 -0
- snappy/doc/doc-latest/plink.html +210 -0
- snappy/doc/doc-latest/ptolemy.html +253 -0
- snappy/doc/doc-latest/ptolemy_classes.html +1144 -0
- snappy/doc/doc-latest/ptolemy_examples1.html +409 -0
- snappy/doc/doc-latest/ptolemy_examples2.html +471 -0
- snappy/doc/doc-latest/ptolemy_examples3.html +414 -0
- snappy/doc/doc-latest/ptolemy_examples4.html +195 -0
- snappy/doc/doc-latest/ptolemy_prelim.html +248 -0
- snappy/doc/doc-latest/py-modindex.html +165 -0
- snappy/doc/doc-latest/screenshots.html +141 -0
- snappy/doc/doc-latest/search.html +135 -0
- snappy/doc/doc-latest/searchindex.js +1 -0
- snappy/doc/doc-latest/snap.html +202 -0
- snappy/doc/doc-latest/snappy.html +181 -0
- snappy/doc/doc-latest/spherogram.html +1346 -0
- snappy/doc/doc-latest/todo.html +166 -0
- snappy/doc/doc-latest/triangulation.html +1676 -0
- snappy/doc/doc-latest/tutorial.html +159 -0
- snappy/doc/doc-latest/verify.html +330 -0
- snappy/doc/doc-latest/verify_internals.html +1235 -0
- snappy/doc/genindex.html +1349 -0
- snappy/doc/index.html +287 -0
- snappy/doc/installing.html +346 -0
- snappy/doc/manifold.html +3632 -0
- snappy/doc/manifoldhp.html +180 -0
- snappy/doc/news.html +438 -0
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +160 -0
- snappy/doc/platonic_census.html +376 -0
- snappy/doc/plink.html +210 -0
- snappy/doc/ptolemy.html +253 -0
- snappy/doc/ptolemy_classes.html +1144 -0
- snappy/doc/ptolemy_examples1.html +409 -0
- snappy/doc/ptolemy_examples2.html +471 -0
- snappy/doc/ptolemy_examples3.html +414 -0
- snappy/doc/ptolemy_examples4.html +195 -0
- snappy/doc/ptolemy_prelim.html +248 -0
- snappy/doc/py-modindex.html +165 -0
- snappy/doc/screenshots.html +141 -0
- snappy/doc/search.html +135 -0
- snappy/doc/searchindex.js +1 -0
- snappy/doc/snap.html +202 -0
- snappy/doc/snappy.html +181 -0
- snappy/doc/spherogram.html +1346 -0
- snappy/doc/todo.html +166 -0
- snappy/doc/triangulation.html +1676 -0
- snappy/doc/tutorial.html +159 -0
- snappy/doc/verify.html +330 -0
- snappy/doc/verify_internals.html +1235 -0
- snappy/drilling/__init__.py +456 -0
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +5 -0
- snappy/drilling/crush.py +270 -0
- snappy/drilling/cusps.py +125 -0
- snappy/drilling/debug.py +242 -0
- snappy/drilling/epsilons.py +6 -0
- snappy/drilling/exceptions.py +55 -0
- snappy/drilling/moves.py +620 -0
- snappy/drilling/peripheral_curves.py +210 -0
- snappy/drilling/perturb.py +188 -0
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +274 -0
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +132 -0
- snappy/drilling/tracing.py +351 -0
- snappy/exceptions.py +26 -0
- snappy/export_stl.py +120 -0
- snappy/exterior_to_link/__init__.py +2 -0
- snappy/exterior_to_link/barycentric_geometry.py +463 -0
- snappy/exterior_to_link/exceptions.py +6 -0
- snappy/exterior_to_link/geodesic_map.json +14408 -0
- snappy/exterior_to_link/hyp_utils.py +112 -0
- snappy/exterior_to_link/link_projection.py +323 -0
- snappy/exterior_to_link/main.py +198 -0
- snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
- snappy/exterior_to_link/mcomplex_with_link.py +687 -0
- snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
- snappy/exterior_to_link/pl_utils.py +491 -0
- snappy/exterior_to_link/put_in_S3.py +156 -0
- snappy/exterior_to_link/rational_linear_algebra.py +130 -0
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
- snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
- snappy/exterior_to_link/stored_moves.py +475 -0
- snappy/exterior_to_link/test.py +31 -0
- snappy/filedialog.py +28 -0
- 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 +691 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +480 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +41 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +294 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +156 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +35 -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_representatives.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/geometric_structure/geodesic/fixed_points.py +106 -0
- snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
- 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 +128 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +121 -0
- snappy/horoviewer.py +443 -0
- snappy/hyperboloid/__init__.py +212 -0
- snappy/hyperboloid/distances.py +259 -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/info_icon.gif +0 -0
- snappy/infowindow.py +65 -0
- snappy/isometry_signature.py +389 -0
- snappy/len_spec/__init__.py +609 -0
- snappy/len_spec/geodesic_info.py +129 -0
- snappy/len_spec/geodesic_key_info_dict.py +116 -0
- snappy/len_spec/geodesic_piece.py +146 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +136 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +185 -0
- snappy/len_spec/spine.py +128 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +276 -0
- snappy/len_spec/word.py +86 -0
- snappy/manifolds/HTWKnots/alternating.gz +0 -0
- snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
- snappy/manifolds/__init__.py +3 -0
- snappy/margulis/__init__.py +332 -0
- snappy/margulis/cusp_neighborhood_neighborhood.py +66 -0
- snappy/margulis/geodesic_neighborhood.py +152 -0
- snappy/margulis/margulis_info.py +21 -0
- snappy/margulis/mu_from_neighborhood_pair.py +175 -0
- snappy/margulis/neighborhood.py +29 -0
- snappy/margulis/test.py +22 -0
- snappy/math_basics.py +187 -0
- snappy/matrix.py +525 -0
- snappy/number.py +657 -0
- snappy/numeric_output_checker.py +345 -0
- snappy/pari.py +41 -0
- snappy/phone_home.py +57 -0
- snappy/polyviewer.py +259 -0
- snappy/ptolemy/__init__.py +17 -0
- snappy/ptolemy/component.py +103 -0
- snappy/ptolemy/coordinates.py +2290 -0
- snappy/ptolemy/fieldExtensions.py +153 -0
- snappy/ptolemy/findLoops.py +473 -0
- snappy/ptolemy/geometricRep.py +59 -0
- snappy/ptolemy/homology.py +165 -0
- snappy/ptolemy/magma/default.magma_template +229 -0
- snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
- snappy/ptolemy/manifoldMethods.py +395 -0
- snappy/ptolemy/matrix.py +350 -0
- snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
- snappy/ptolemy/polynomial.py +856 -0
- snappy/ptolemy/processComponents.py +173 -0
- snappy/ptolemy/processFileBase.py +247 -0
- snappy/ptolemy/processFileDispatch.py +46 -0
- snappy/ptolemy/processMagmaFile.py +392 -0
- snappy/ptolemy/processRurFile.py +150 -0
- snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
- snappy/ptolemy/ptolemyObstructionClass.py +64 -0
- snappy/ptolemy/ptolemyVariety.py +995 -0
- snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
- snappy/ptolemy/reginaWrapper.py +698 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/rur.py +545 -0
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
- snappy/ptolemy/test.py +1126 -0
- snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
- snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
- snappy/ptolemy/utilities.py +236 -0
- 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 +197 -0
- snappy/raytracing/eyeball.py +124 -0
- snappy/raytracing/finite_raytracing_data.py +237 -0
- snappy/raytracing/finite_viewer.py +590 -0
- snappy/raytracing/geodesic_tube_info.py +174 -0
- snappy/raytracing/geodesics.py +246 -0
- snappy/raytracing/geodesics_window.py +258 -0
- snappy/raytracing/gui_utilities.py +293 -0
- snappy/raytracing/hyperboloid_navigation.py +556 -0
- snappy/raytracing/hyperboloid_utilities.py +234 -0
- snappy/raytracing/ideal_raytracing_data.py +592 -0
- snappy/raytracing/inside_viewer.py +974 -0
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +126 -0
- snappy/raytracing/raytracing_view.py +454 -0
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +101 -0
- snappy/raytracing/shaders/fragment.glsl +1744 -0
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +98 -0
- snappy/raytracing/view_scale_controller.py +98 -0
- snappy/raytracing/zoom_slider/__init__.py +263 -0
- snappy/raytracing/zoom_slider/inward.png +0 -0
- snappy/raytracing/zoom_slider/inward18.png +0 -0
- snappy/raytracing/zoom_slider/outward.png +0 -0
- snappy/raytracing/zoom_slider/outward18.png +0 -0
- snappy/raytracing/zoom_slider/test.py +20 -0
- snappy/sage_helper.py +119 -0
- snappy/settings.py +407 -0
- snappy/shell.py +53 -0
- snappy/snap/__init__.py +117 -0
- snappy/snap/character_varieties.py +375 -0
- snappy/snap/find_field.py +372 -0
- snappy/snap/fox_milnor.py +271 -0
- snappy/snap/fundamental_polyhedron.py +569 -0
- snappy/snap/generators.py +39 -0
- snappy/snap/interval_reps.py +81 -0
- snappy/snap/kernel_structures.py +128 -0
- snappy/snap/mcomplex_base.py +18 -0
- snappy/snap/nsagetools.py +716 -0
- snappy/snap/peripheral/__init__.py +1 -0
- snappy/snap/peripheral/dual_cellulation.py +219 -0
- snappy/snap/peripheral/link.py +127 -0
- snappy/snap/peripheral/peripheral.py +159 -0
- snappy/snap/peripheral/surface.py +522 -0
- snappy/snap/peripheral/test.py +35 -0
- snappy/snap/polished_reps.py +335 -0
- snappy/snap/shapes.py +152 -0
- snappy/snap/slice_obs_HKL/__init__.py +194 -0
- snappy/snap/slice_obs_HKL/basics.py +236 -0
- snappy/snap/slice_obs_HKL/direct.py +217 -0
- snappy/snap/slice_obs_HKL/poly_norm.py +212 -0
- snappy/snap/slice_obs_HKL/rep_theory.py +424 -0
- snappy/snap/t3mlite/__init__.py +2 -0
- snappy/snap/t3mlite/arrow.py +243 -0
- snappy/snap/t3mlite/corner.py +22 -0
- snappy/snap/t3mlite/edge.py +172 -0
- snappy/snap/t3mlite/face.py +37 -0
- snappy/snap/t3mlite/files.py +211 -0
- snappy/snap/t3mlite/homology.py +53 -0
- snappy/snap/t3mlite/linalg.py +419 -0
- snappy/snap/t3mlite/mcomplex.py +1499 -0
- snappy/snap/t3mlite/perm4.py +320 -0
- snappy/snap/t3mlite/setup.py +12 -0
- snappy/snap/t3mlite/simplex.py +199 -0
- snappy/snap/t3mlite/spun.py +297 -0
- snappy/snap/t3mlite/surface.py +519 -0
- snappy/snap/t3mlite/test.py +20 -0
- snappy/snap/t3mlite/test_vs_regina.py +86 -0
- snappy/snap/t3mlite/tetrahedron.py +109 -0
- snappy/snap/t3mlite/vertex.py +42 -0
- snappy/snap/test.py +139 -0
- snappy/snap/utilities.py +288 -0
- snappy/test.py +213 -0
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -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/quotient_dict.py +70 -0
- snappy/tiling/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +224 -0
- snappy/tiling/triangle.py +33 -0
- snappy/tkterminal.py +920 -0
- snappy/twister/__init__.py +20 -0
- snappy/twister/main.py +646 -0
- snappy/twister/surfaces/S_0_1 +3 -0
- snappy/twister/surfaces/S_0_2 +3 -0
- snappy/twister/surfaces/S_0_4 +7 -0
- snappy/twister/surfaces/S_0_4_Lantern +8 -0
- snappy/twister/surfaces/S_1 +3 -0
- snappy/twister/surfaces/S_1_1 +4 -0
- snappy/twister/surfaces/S_1_2 +5 -0
- snappy/twister/surfaces/S_1_2_5 +6 -0
- snappy/twister/surfaces/S_2 +6 -0
- snappy/twister/surfaces/S_2_1 +8 -0
- snappy/twister/surfaces/S_2_heeg +10 -0
- snappy/twister/surfaces/S_3 +8 -0
- snappy/twister/surfaces/S_3_1 +10 -0
- snappy/twister/surfaces/S_4_1 +12 -0
- snappy/twister/surfaces/S_5_1 +14 -0
- snappy/twister/surfaces/heeg_fig8 +9 -0
- snappy/twister/twister_core.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/upper_halfspace/__init__.py +146 -0
- snappy/upper_halfspace/ideal_point.py +29 -0
- snappy/verify/__init__.py +13 -0
- snappy/verify/canonical.py +542 -0
- snappy/verify/complex_volume/__init__.py +18 -0
- snappy/verify/complex_volume/adjust_torsion.py +86 -0
- snappy/verify/complex_volume/closed.py +168 -0
- snappy/verify/complex_volume/compute_ptolemys.py +90 -0
- snappy/verify/complex_volume/cusped.py +56 -0
- snappy/verify/complex_volume/extended_bloch.py +201 -0
- snappy/verify/cusp_translations.py +85 -0
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +254 -0
- snappy/verify/hyperbolicity.py +224 -0
- snappy/verify/interval_newton_shapes_engine.py +523 -0
- snappy/verify/interval_tree.py +400 -0
- snappy/verify/krawczyk_shapes_engine.py +518 -0
- snappy/verify/real_algebra.py +286 -0
- snappy/verify/shapes.py +25 -0
- snappy/verify/square_extensions.py +1005 -0
- snappy/verify/test.py +72 -0
- snappy/verify/volume.py +128 -0
- snappy/version.py +2 -0
- snappy-3.3.dist-info/METADATA +58 -0
- snappy-3.3.dist-info/RECORD +541 -0
- snappy-3.3.dist-info/WHEEL +6 -0
- snappy-3.3.dist-info/entry_points.txt +2 -0
- snappy-3.3.dist-info/top_level.txt +28 -0
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Defines the basic objects we work with in barycentric coordinates,
|
|
3
|
+
including the various tetrahedron embeddings used for the 2 <--> 3 and
|
|
4
|
+
4 --> 4 moves.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from ..snap.t3mlite.simplex import *
|
|
8
|
+
from .rational_linear_algebra import Matrix, Vector3, Vector4, rational_round
|
|
9
|
+
from . import pl_utils
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Point():
|
|
13
|
+
"""
|
|
14
|
+
A point in R^3. The optional ``boundary`` parameter is for
|
|
15
|
+
recording the label of the face of a convex polytope containing
|
|
16
|
+
the point.
|
|
17
|
+
"""
|
|
18
|
+
def __init__(self, c0, c1, c2, boundary=None):
|
|
19
|
+
self.vector = Vector3([c0, c1, c2])
|
|
20
|
+
self._boundary_face = boundary
|
|
21
|
+
|
|
22
|
+
def __hash__(self):
|
|
23
|
+
return hash(self.vector)
|
|
24
|
+
|
|
25
|
+
def on_boundary(self):
|
|
26
|
+
return self._boundary_face is not None
|
|
27
|
+
|
|
28
|
+
def boundary_face(self):
|
|
29
|
+
assert self._boundary_face is not None
|
|
30
|
+
return self._boundary_face
|
|
31
|
+
|
|
32
|
+
def __repr__(self):
|
|
33
|
+
return self.vector.__repr__()
|
|
34
|
+
|
|
35
|
+
def __eq__(self, other):
|
|
36
|
+
return self.vector == other.vector
|
|
37
|
+
|
|
38
|
+
def __ne__(self, other):
|
|
39
|
+
return self.vector != other.vector
|
|
40
|
+
|
|
41
|
+
def to_3d_point(self):
|
|
42
|
+
return self.vector
|
|
43
|
+
|
|
44
|
+
def transform_to_R4(self, matrix):
|
|
45
|
+
v = Vector4(list(self.vector) + [1])
|
|
46
|
+
w = matrix * v
|
|
47
|
+
return BarycentricPoint(*w)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class Arc():
|
|
51
|
+
"""
|
|
52
|
+
A line segment between two Points, often part of a linked list of
|
|
53
|
+
Arcs forming a PL path or loop.
|
|
54
|
+
"""
|
|
55
|
+
def __init__(self, start, end, past=None, next=None):
|
|
56
|
+
self.start = start
|
|
57
|
+
self.end = end
|
|
58
|
+
self.past = past
|
|
59
|
+
self.next = next
|
|
60
|
+
|
|
61
|
+
def __hash__(self):
|
|
62
|
+
return hash((self.start, self.end))
|
|
63
|
+
|
|
64
|
+
def __eq__(self, other):
|
|
65
|
+
return (self.start == other.start) and (self.end == other.end)
|
|
66
|
+
|
|
67
|
+
def __ne__(self, other):
|
|
68
|
+
return not self.__eq__(other)
|
|
69
|
+
|
|
70
|
+
def is_point(self):
|
|
71
|
+
return self.start == self.end
|
|
72
|
+
|
|
73
|
+
def height(self):
|
|
74
|
+
coeffs = self.start.vector.list() + self.end.vector.list()
|
|
75
|
+
return max(c.height() for c in coeffs)
|
|
76
|
+
|
|
77
|
+
def to_3d_points(self):
|
|
78
|
+
return (self.start.to_3d_point(), self.end.to_3d_point())
|
|
79
|
+
|
|
80
|
+
def transform_to_R4(self, matrix):
|
|
81
|
+
new_start = self.start.transform_to_R4(matrix)
|
|
82
|
+
new_end = self.end.transform_to_R4(matrix)
|
|
83
|
+
return BarycentricArc(new_start, new_end)
|
|
84
|
+
|
|
85
|
+
def glue_to(self, next_arc):
|
|
86
|
+
"""
|
|
87
|
+
Helper method used when concatenating two linked lists of Arcs.
|
|
88
|
+
|
|
89
|
+
Assumes self.end == next_arc.start and then makes them the
|
|
90
|
+
same object.
|
|
91
|
+
"""
|
|
92
|
+
self.next = next_arc
|
|
93
|
+
next_arc.past = self
|
|
94
|
+
next_arc.start = self.end
|
|
95
|
+
|
|
96
|
+
def max_denom(self):
|
|
97
|
+
rationals = list(self.start.vector) + list(self.end.vector)
|
|
98
|
+
return max([q.denominator() for q in rationals])
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class BarycentricPoint(Point):
|
|
102
|
+
"""
|
|
103
|
+
A quadruple of Sage rational numbers whose sum is 1.
|
|
104
|
+
"""
|
|
105
|
+
def __init__(self, c0, c1, c2, c3):
|
|
106
|
+
self.vector = Vector4([c0, c1, c2, c3])
|
|
107
|
+
self._zero_coordinates = [i for i in range(4) if self.vector[i] == 0]
|
|
108
|
+
|
|
109
|
+
if sum(self.vector) != 1:
|
|
110
|
+
raise Exception("Barycentric point doesn't sum to 1")
|
|
111
|
+
|
|
112
|
+
def __repr__(self):
|
|
113
|
+
return self.vector.__repr__()
|
|
114
|
+
|
|
115
|
+
def __eq__(self, other):
|
|
116
|
+
return self.vector == other.vector
|
|
117
|
+
|
|
118
|
+
def __ne__(self, other):
|
|
119
|
+
return self.vector != other.vector
|
|
120
|
+
|
|
121
|
+
def __hash__(self):
|
|
122
|
+
return hash(self.vector)
|
|
123
|
+
|
|
124
|
+
def has_negative_coordinate(self):
|
|
125
|
+
for l in self.vector:
|
|
126
|
+
if l < 0:
|
|
127
|
+
return True
|
|
128
|
+
return False
|
|
129
|
+
|
|
130
|
+
def negative_coordinates(self):
|
|
131
|
+
return [l for l in self.vector if l < 0]
|
|
132
|
+
|
|
133
|
+
def zero_coordinates(self):
|
|
134
|
+
return self._zero_coordinates
|
|
135
|
+
|
|
136
|
+
def on_boundary(self):
|
|
137
|
+
return len(self._zero_coordinates) > 0
|
|
138
|
+
|
|
139
|
+
def boundary_face(self):
|
|
140
|
+
zeros = self._zero_coordinates
|
|
141
|
+
if len(zeros) != 1:
|
|
142
|
+
raise GeneralPositionError('Not a generic point on a face')
|
|
143
|
+
return zeros[0]
|
|
144
|
+
|
|
145
|
+
def is_interior(self):
|
|
146
|
+
return len(self._zero_coordinates) == 0
|
|
147
|
+
|
|
148
|
+
def convex_combination(self, other, t):
|
|
149
|
+
c0,c1,c2,c3 = (1-t)*self.vector + t*other.vector
|
|
150
|
+
return BarycentricPoint(c0, c1, c2, c3)
|
|
151
|
+
|
|
152
|
+
def transform_to_R3(self, matrix, bdry_map=None):
|
|
153
|
+
v = self.vector
|
|
154
|
+
new_v = matrix*v
|
|
155
|
+
boundary_face = None
|
|
156
|
+
if bdry_map is not None and self.on_boundary():
|
|
157
|
+
face = self.zero_coordinates()[0]
|
|
158
|
+
boundary_face = bdry_map[face]
|
|
159
|
+
return Point(new_v[0], new_v[1], new_v[2], boundary_face)
|
|
160
|
+
|
|
161
|
+
def min_nonzero(self):
|
|
162
|
+
return min([c for c in self.vector if c > 0])
|
|
163
|
+
|
|
164
|
+
def to_3d_point(self):
|
|
165
|
+
return self.vector[0:3]
|
|
166
|
+
|
|
167
|
+
def permute(self, perm):
|
|
168
|
+
"""
|
|
169
|
+
Start with a permutation perm, which represents a map from the
|
|
170
|
+
vertices of a tetrahedron T in which a point lies, to the
|
|
171
|
+
vertices of another tetrahedron S which is glued to T. Then,
|
|
172
|
+
translate the barycentric coordinates of the point in T to the
|
|
173
|
+
corresponding barycentric coordinates of the point in S. On
|
|
174
|
+
the interior, this doesn't make much sense; it really should
|
|
175
|
+
be used for points on the common boundary triangle.
|
|
176
|
+
"""
|
|
177
|
+
v = self.vector
|
|
178
|
+
new_v = [0]*4
|
|
179
|
+
for i in range(4):
|
|
180
|
+
new_v[perm[i]] = v[i]
|
|
181
|
+
return BarycentricPoint(*new_v)
|
|
182
|
+
|
|
183
|
+
def round(self, max_denom=2**32, force=False):
|
|
184
|
+
if force or max(x.denominator() for x in self.vector) > max_denom:
|
|
185
|
+
v = []
|
|
186
|
+
for y in max_denom * self.vector:
|
|
187
|
+
if y != 0:
|
|
188
|
+
y = max(rational_round(y), 1)
|
|
189
|
+
v.append(y)
|
|
190
|
+
|
|
191
|
+
# Should be just Vector4(v)/sum(v)
|
|
192
|
+
self.vector = Vector4(Vector4(v)/sum(v))
|
|
193
|
+
self._zero_coordinates = [i for i in range(4) if self.vector[i] == 0]
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
class BarycentricArc(Arc):
|
|
197
|
+
"""
|
|
198
|
+
A line segment between two endpoints in barycentric coordinates.
|
|
199
|
+
"""
|
|
200
|
+
def __init__(self, start, end, past=None, next=None, tet=None):
|
|
201
|
+
self.start = start
|
|
202
|
+
self.end = end
|
|
203
|
+
self.past = past
|
|
204
|
+
self.next = next
|
|
205
|
+
self.tet = tet
|
|
206
|
+
|
|
207
|
+
def __hash__(self):
|
|
208
|
+
return hash((self.start, self.end, self.tet))
|
|
209
|
+
|
|
210
|
+
def __eq__(self, other):
|
|
211
|
+
return ((self.start == other.start)
|
|
212
|
+
and (self.end == other.end)
|
|
213
|
+
and (self.tet == other.tet))
|
|
214
|
+
|
|
215
|
+
def trim(self):
|
|
216
|
+
"""
|
|
217
|
+
Given an arc in R^4 lying in the slice x0 + x1 + x2 + x3 = 1,
|
|
218
|
+
return its intersection with the standard three-simplex.
|
|
219
|
+
"""
|
|
220
|
+
|
|
221
|
+
t0, t1 = 0, 1
|
|
222
|
+
u, v = self.start.vector, self.end.vector
|
|
223
|
+
for i in range(4):
|
|
224
|
+
if u[i] < 0 and v[i] < 0:
|
|
225
|
+
return None
|
|
226
|
+
elif u[i] >= 0 and v[i] >= 0:
|
|
227
|
+
continue
|
|
228
|
+
else:
|
|
229
|
+
t = u[i]/(u[i] - v[i])
|
|
230
|
+
assert (1 - t)*u[i] + t*v[i] == 0
|
|
231
|
+
if u[i] < 0:
|
|
232
|
+
t0 = max(t0, t)
|
|
233
|
+
else:
|
|
234
|
+
t1 = min(t1, t)
|
|
235
|
+
|
|
236
|
+
if t1 < t0:
|
|
237
|
+
return None
|
|
238
|
+
x = (1 - t0)*u + t0*v
|
|
239
|
+
y = (1 - t1)*u + t1*v
|
|
240
|
+
return BarycentricArc(BarycentricPoint(*x), BarycentricPoint(*y))
|
|
241
|
+
|
|
242
|
+
def __repr__(self):
|
|
243
|
+
return '[{},{}]'.format(self.start, self.end)
|
|
244
|
+
|
|
245
|
+
def transform_to_R3(self, matrix, bdry_map=None):
|
|
246
|
+
new_start = self.start.transform_to_R3(matrix, bdry_map)
|
|
247
|
+
new_end = self.end.transform_to_R3(matrix, bdry_map)
|
|
248
|
+
return BarycentricArc(new_start, new_end)
|
|
249
|
+
|
|
250
|
+
def is_nongeneric(self):
|
|
251
|
+
zeros_s = self.start.zero_coordinates()
|
|
252
|
+
zeros_e = self.end.zero_coordinates()
|
|
253
|
+
if len(zeros_s) > 1 or len(zeros_e) > 1:
|
|
254
|
+
return True
|
|
255
|
+
return bool(set(zeros_s) & set(zeros_e))
|
|
256
|
+
|
|
257
|
+
def max_denom(self):
|
|
258
|
+
rationals = list(self.start.vector) + list(self.end.vector)
|
|
259
|
+
return max(q.denominator() for q in rationals)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
class InfinitesimalArc(Arc):
|
|
263
|
+
"""
|
|
264
|
+
A length 0 arc corresponding to moving across a face from one
|
|
265
|
+
tetrahedron to the adjacent one.
|
|
266
|
+
"""
|
|
267
|
+
def __init__(self, start, end, start_tet, end_tet, past=None, next=None):
|
|
268
|
+
self.start, self.end = start, end
|
|
269
|
+
self.start_tet, self.end_tet = start_tet, end_tet
|
|
270
|
+
self.past, self.next = past, next
|
|
271
|
+
|
|
272
|
+
def __repr__(self):
|
|
273
|
+
v, i = self.start, self.start_tet
|
|
274
|
+
w, j = self.end, self.end_tet
|
|
275
|
+
return f'InfArc({i}:{v}; {j}:{w})'
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
# We consider a bipyramid with a triangular base, i.e. the union of
|
|
279
|
+
# two tetrahedra sharing a face, with vertices A, B, C around the
|
|
280
|
+
# equator and poles N and S. The orientation convention is that
|
|
281
|
+
# looking down at N the equator is A, B, C in anticlockwise order.
|
|
282
|
+
#
|
|
283
|
+
# Here are Malik's original choices:
|
|
284
|
+
|
|
285
|
+
# A = vector(QQ, [ 1, 0, 0])
|
|
286
|
+
# B = vector(QQ, [-1, 1, 0])
|
|
287
|
+
# C = vector(QQ, [-1, -1, 0])
|
|
288
|
+
# N = vector(QQ, [ 0, 0, 1])
|
|
289
|
+
# S = vector(QQ, [ 0, 0, -1])
|
|
290
|
+
|
|
291
|
+
# One subtly is given a second bipyramid (A', B', C', N', S') there
|
|
292
|
+
# are two simple PL homeos between it and (A, B, C, N, S): you can
|
|
293
|
+
# divide them into to two tetrahedra sharing a face, or three
|
|
294
|
+
# tetrahedra around the line joining N to S, and then use the unique
|
|
295
|
+
# affine map between each pair of tetrahedra. These two PL maps are
|
|
296
|
+
# typically different unless there is a global affine map taking one
|
|
297
|
+
# bipyramid to the other. It is thus convenient to us a standard
|
|
298
|
+
# bipyramid which is symmetric with respect to affine maps.
|
|
299
|
+
A = Vector3([ 3, 0, 0])
|
|
300
|
+
B = Vector3([ 0, 0, 3])
|
|
301
|
+
C = Vector3([ 0, 3, 0])
|
|
302
|
+
N = Vector3([ 0, 0, 0])
|
|
303
|
+
S = Vector3([ 2, 2, 2])
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
class TetrahedronEmbedding():
|
|
307
|
+
"""
|
|
308
|
+
A map from a tetrahedron with PL arcs in barycentric coordinates
|
|
309
|
+
into R^3. The map is described by choosing where the vertices of
|
|
310
|
+
the given arrow go, in the standard order::
|
|
311
|
+
|
|
312
|
+
(tail, head, opp_tail, opp_head)
|
|
313
|
+
|
|
314
|
+
The optional boundary information is for recording which faces
|
|
315
|
+
(if any) of the tetrahedron correspond particular faces of some
|
|
316
|
+
larger convex polytope.
|
|
317
|
+
"""
|
|
318
|
+
def __init__(self, arrow, vertex_images, bdry_map=None):
|
|
319
|
+
opp_arrow = arrow.copy().opposite()
|
|
320
|
+
to_arrow = {arrow.tail():0, arrow.head():1,
|
|
321
|
+
opp_arrow.tail():2, opp_arrow.head():3}
|
|
322
|
+
self.vertex_images = [vertex_images[to_arrow[V]] for V in ZeroSubsimplices]
|
|
323
|
+
if bdry_map is not None:
|
|
324
|
+
bdry_map = {i:bdry_map[to_arrow[V]] for i, V in enumerate(ZeroSubsimplices)}
|
|
325
|
+
self.bdry_map = bdry_map
|
|
326
|
+
assert [len(v) for v in vertex_images] == 4*[3]
|
|
327
|
+
R4_images = [list(v) + [1] for v in self.vertex_images]
|
|
328
|
+
self.matrix = Matrix(R4_images).transpose()
|
|
329
|
+
self.inverse_matrix = self.matrix.inverse()
|
|
330
|
+
# assert self.matrix.det() > 0 # disabled for speed
|
|
331
|
+
|
|
332
|
+
def transfer_arcs_to_R3(self, arcs):
|
|
333
|
+
return [arc.transform_to_R3(self.matrix, bdry_map=self.bdry_map) for arc in arcs]
|
|
334
|
+
|
|
335
|
+
def transfer_arcs_from_R3(self, arcs):
|
|
336
|
+
return [arc.transform_to_R4(self.inverse_matrix) for arc in arcs]
|
|
337
|
+
|
|
338
|
+
def info(self):
|
|
339
|
+
self.tetrahedron.info()
|
|
340
|
+
print(self.matrix)
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
class TetrahedronEmbeddingCache():
|
|
344
|
+
def __init__(self):
|
|
345
|
+
self.cache = {}
|
|
346
|
+
|
|
347
|
+
def __call__(self, arrow, vertex_images, bdry_map=None):
|
|
348
|
+
if bdry_map is None:
|
|
349
|
+
bdry_map_key = None
|
|
350
|
+
else:
|
|
351
|
+
bdry_map_key = tuple(bdry_map)
|
|
352
|
+
key = (arrow.Edge, arrow.Face, tuple(vertex_images), bdry_map_key)
|
|
353
|
+
if key not in self.cache:
|
|
354
|
+
self.cache[key] = TetrahedronEmbedding(arrow, vertex_images, bdry_map)
|
|
355
|
+
return self.cache[key]
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
tetrahedron_embedding = TetrahedronEmbeddingCache()
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
def barycentric_face_embedding(arrow, north_pole=None):
|
|
362
|
+
"""
|
|
363
|
+
The arrow here is a directed edge in a specified tetrahedron. It
|
|
364
|
+
also specifies a face (the face which is disjoint from the arrow,
|
|
365
|
+
except for the head). This helper function takes the arrow and
|
|
366
|
+
embeds the face of the arrow in the xy-plane, with the two
|
|
367
|
+
tetrahedra on either side of the face embedded in the upper and
|
|
368
|
+
lower half-spaces. The specific coordinates are labeled below; A,
|
|
369
|
+
B, and C are the vertices of the image of the face in the
|
|
370
|
+
xy-plane, and N and S are images of the vertices of the two
|
|
371
|
+
tetrahedron not in the face.
|
|
372
|
+
"""
|
|
373
|
+
if north_pole is None:
|
|
374
|
+
north_pole = N
|
|
375
|
+
next_arrow = arrow.glued()
|
|
376
|
+
top_bdry = [None, 't1', 't2', 't3']
|
|
377
|
+
bottom_brdy = ['b1', None, 'b2', 'b3']
|
|
378
|
+
|
|
379
|
+
emb_top = tetrahedron_embedding(arrow, [north_pole, A, C, B], top_bdry)
|
|
380
|
+
emb_bottom = tetrahedron_embedding(next_arrow, [A, S, C, B], bottom_brdy)
|
|
381
|
+
|
|
382
|
+
return [(arrow.Tetrahedron, emb_top),
|
|
383
|
+
(next_arrow.Tetrahedron, emb_bottom)]
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def barycentric_edge_embedding(arrow, north_pole=None):
|
|
387
|
+
"""
|
|
388
|
+
Take the arrow corresponding to an edge of valence 3. This
|
|
389
|
+
function then creates an embedding of the three tetrahedra glued
|
|
390
|
+
in pairs around the edge into R^3. The embedding is defined so
|
|
391
|
+
that the edge goes from N to S, as labeled below, The arrow goes
|
|
392
|
+
from A to B; A, B, and C form a triangle in the xy-plane.
|
|
393
|
+
|
|
394
|
+
Note that this arrangement has the same image in R^3 as the
|
|
395
|
+
barycentric_face_embedding above -- that's by design, so that we
|
|
396
|
+
can use these two maps to transfer the arcs in barycentric
|
|
397
|
+
coordinates under two-three and two-three moves.
|
|
398
|
+
"""
|
|
399
|
+
if north_pole is None:
|
|
400
|
+
north_pole = N
|
|
401
|
+
assert len(arrow.linking_cycle()) == 3
|
|
402
|
+
arrow = arrow.copy()
|
|
403
|
+
verts = [A, B, C, A]
|
|
404
|
+
ans = []
|
|
405
|
+
for i in range(3):
|
|
406
|
+
tet_verts = [verts[i], verts[i+1], S, north_pole]
|
|
407
|
+
bdry_map = [None, None, f't{i+1}', f'b{i+1}']
|
|
408
|
+
ans.append((arrow.Tetrahedron,
|
|
409
|
+
tetrahedron_embedding(arrow, tet_verts, bdry_map)))
|
|
410
|
+
arrow.next()
|
|
411
|
+
return ans
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
# arrow, tail, head, opp_tail, opp_head
|
|
415
|
+
def barycentric_quad_embedding0(arrow, north_pole=None):
|
|
416
|
+
"""
|
|
417
|
+
Take an arrow with 4 valent axis, then build embedding of the
|
|
418
|
+
surrounding four tetrahedra forming an octahedron in R^3 using the
|
|
419
|
+
arrows running around the valence 4 edge in xy plane.
|
|
420
|
+
"""
|
|
421
|
+
n = Vector3([ 0, 0, 1]) if north_pole is None else north_pole
|
|
422
|
+
e = Vector3([ 1, 0, 0])
|
|
423
|
+
s = Vector3([ 0, 0,-1])
|
|
424
|
+
w = Vector3([-1, 0, 0])
|
|
425
|
+
a = Vector3([ 0,-1, 0])
|
|
426
|
+
b = Vector3([ 0, 1, 0])
|
|
427
|
+
|
|
428
|
+
arrow = arrow.copy()
|
|
429
|
+
ans = []
|
|
430
|
+
verts = [e, b, w, a, e]
|
|
431
|
+
for i in range(4):
|
|
432
|
+
bdry_map = [None, None, f'x{i}', f'y{i}']
|
|
433
|
+
tet_verts = [verts[i], verts[i + 1], s, n]
|
|
434
|
+
ans.append((arrow.Tetrahedron,
|
|
435
|
+
tetrahedron_embedding(arrow, tet_verts, bdry_map)))
|
|
436
|
+
arrow.next()
|
|
437
|
+
|
|
438
|
+
return ans
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
# arrow, tail, head, opp_tail, opp_head
|
|
442
|
+
def barycentric_quad_embedding1(arrow, north_pole=None):
|
|
443
|
+
"""
|
|
444
|
+
Take an arrow with 4 valent axis, then build embedding of the
|
|
445
|
+
surrounding four tetrahedra forming an octahedron in R^3 using the
|
|
446
|
+
arrows running around the valence 4 edge in zy plane.
|
|
447
|
+
"""
|
|
448
|
+
n = Vector3([ 0, 0, 1]) if north_pole is None else north_pole
|
|
449
|
+
e = Vector3([ 1, 0, 0])
|
|
450
|
+
s = Vector3([ 0, 0,-1])
|
|
451
|
+
w = Vector3([-1, 0, 0])
|
|
452
|
+
a = Vector3([ 0,-1, 0])
|
|
453
|
+
b = Vector3([ 0, 1, 0])
|
|
454
|
+
|
|
455
|
+
arrow = arrow.copy()
|
|
456
|
+
ans = []
|
|
457
|
+
verts = [e, s, w, n, e]
|
|
458
|
+
for i in range(4):
|
|
459
|
+
ans.append((arrow.Tetrahedron,
|
|
460
|
+
tetrahedron_embedding(arrow, [verts[i], verts[i+1], a, b])))
|
|
461
|
+
arrow.next()
|
|
462
|
+
|
|
463
|
+
return ans
|