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
@@ -18,12 +18,12 @@ from ..pari import pari
|
|
18
18
|
|
19
19
|
# This is broken down in three steps.
|
20
20
|
|
21
|
-
# Step 1: Split into extensions and
|
21
|
+
# Step 1: Split into extensions and assignments
|
22
22
|
# extensions, assignments = extensions_and_assignments(polys)
|
23
23
|
|
24
24
|
# Split the list of polynomials into two lists, the first list
|
25
25
|
# contains triples (poly, var, degree) forming a tower of
|
26
|
-
# field
|
26
|
+
# field extensions and the second group is a dictionary assigning
|
27
27
|
# all remaining variables polynomials in the variables in the tower.
|
28
28
|
|
29
29
|
# Example:
|
@@ -151,12 +151,12 @@ def update_assignments_and_merge(assignments, d):
|
|
151
151
|
variables = sorted(set(
|
152
152
|
sum([poly.variables() for poly in assignments.values()], [])))
|
153
153
|
|
154
|
-
monomial_to_value = {
|
154
|
+
monomial_to_value = {(): pari(1)}
|
155
155
|
|
156
156
|
for var in variables:
|
157
157
|
max_degree = max([poly.degree(var) for poly in assignments.values()])
|
158
158
|
|
159
|
-
old_keys = list(monomial_to_value
|
159
|
+
old_keys = list(monomial_to_value)
|
160
160
|
|
161
161
|
v = d[var]
|
162
162
|
power_of_v = pari(1)
|
@@ -180,8 +180,8 @@ def update_assignments_and_merge(assignments, d):
|
|
180
180
|
[eval_monomial(m) for m in poly.get_monomials()],
|
181
181
|
pari(0))
|
182
182
|
|
183
|
-
new_assignments =
|
184
|
-
for key, poly in assignments.items()
|
183
|
+
new_assignments = {key: substitute(poly)
|
184
|
+
for key, poly in assignments.items()}
|
185
185
|
|
186
186
|
# Merge all the assignments of variables
|
187
187
|
new_assignments.update(d)
|
@@ -227,9 +227,9 @@ def _process_extensions(extensions):
|
|
227
227
|
# The new number field is again in x but the assignments
|
228
228
|
# are assigning polynomials in the old x.
|
229
229
|
# Need to update.
|
230
|
-
ext_assignments =
|
231
|
-
|
232
|
-
for key, poly in ext_assignments.items()
|
230
|
+
ext_assignments = {
|
231
|
+
key: poly.substitute({'x' : old_x_in_new_x})
|
232
|
+
for key, poly in ext_assignments.items()}
|
233
233
|
|
234
234
|
# And compute what the root of the last polynomial was
|
235
235
|
# to assign it.
|
snappy/ptolemy/test.py
CHANGED
@@ -13,20 +13,25 @@
|
|
13
13
|
# python test.py --compute
|
14
14
|
|
15
15
|
from snappy import Manifold, pari, ptolemy
|
16
|
+
from snappy import ptolemy
|
16
17
|
from snappy.ptolemy import solutions_from_magma, Flattenings, parse_solutions
|
17
18
|
from snappy.ptolemy.processFileBase import get_manifold
|
18
19
|
from snappy.ptolemy import __path__ as ptolemy_paths
|
19
20
|
from snappy.ptolemy.coordinates import PtolemyCannotBeCheckedError
|
20
|
-
from snappy.sage_helper import _within_sage
|
21
|
+
from snappy.sage_helper import _within_sage
|
22
|
+
from snappy.testing import doctest_modules
|
21
23
|
from snappy.pari import pari
|
22
24
|
import bz2
|
23
25
|
import os
|
24
26
|
import sys
|
27
|
+
import doctest
|
28
|
+
import traceback
|
25
29
|
|
26
30
|
if _within_sage:
|
27
31
|
from sage.misc.sage_eval import sage_eval
|
28
32
|
|
29
33
|
test_regina = '--regina' in sys.argv
|
34
|
+
compute_solutions = '--compute' in sys.argv
|
30
35
|
|
31
36
|
base_path = ptolemy_paths[0]
|
32
37
|
if test_regina:
|
@@ -208,7 +213,8 @@ def testSolutionsForManifold(M, N, solutions, baseline_cvolumes=None,
|
|
208
213
|
def testComputeSolutionsForManifold(manifold, N,
|
209
214
|
compute_solutions=False,
|
210
215
|
baseline_cvolumes=None,
|
211
|
-
expect_non_zero_dimensional=None
|
216
|
+
expect_non_zero_dimensional=None,
|
217
|
+
print_info=True):
|
212
218
|
|
213
219
|
varieties = manifold.ptolemy_variety(N, obstruction_class="all_original")
|
214
220
|
|
@@ -226,10 +232,10 @@ def testComputeSolutionsForManifold(manifold, N,
|
|
226
232
|
baseline_cvolumes, expect_non_zero_dimensional)
|
227
233
|
|
228
234
|
if manifold.name() == 't00000':
|
229
|
-
testMatrixMethods(manifold, solutions)
|
235
|
+
testMatrixMethods(manifold, solutions, print_info=print_info)
|
230
236
|
|
231
237
|
|
232
|
-
def testMatrixMethods(manifold, solutions):
|
238
|
+
def testMatrixMethods(manifold, solutions, print_info=True):
|
233
239
|
|
234
240
|
def matrix_is_diagonal(m):
|
235
241
|
return (
|
@@ -241,7 +247,8 @@ def testMatrixMethods(manifold, solutions):
|
|
241
247
|
return matrix_is_diagonal(m) and (
|
242
248
|
m[0][0] + 1 == 0 or m[0][0] - 1 == 0)
|
243
249
|
|
244
|
-
|
250
|
+
if print_info:
|
251
|
+
print("Testing matrix methods...")
|
245
252
|
|
246
253
|
G = manifold.fundamental_group(simplify_presentation=True)
|
247
254
|
Graw = manifold.fundamental_group(simplify_presentation=False)
|
@@ -302,9 +309,14 @@ def test_flattenings_from_tetrahedra_shapes_of_manifold():
|
|
302
309
|
|
303
310
|
from snappy import OrientableCuspedCensus
|
304
311
|
|
305
|
-
for
|
306
|
-
|
312
|
+
for M_database in (list(OrientableCuspedCensus()[0:10]) +
|
313
|
+
list(OrientableCuspedCensus()[10000:10010])):
|
307
314
|
|
315
|
+
# The manifold returned by OrientableCuspedCensus is
|
316
|
+
# a SnapPy.Manifold, not a snappy.Manifold (as is overridden
|
317
|
+
# in python/test.py).
|
318
|
+
M = Manifold(M_database)
|
319
|
+
|
308
320
|
flattening = Flattenings.from_tetrahedra_shapes_of_manifold(M)
|
309
321
|
flattening.check_against_manifold(M, epsilon=1e-80)
|
310
322
|
|
@@ -447,7 +459,7 @@ def testComputeSolutionsForManifoldGeneralizedObstructionClass(
|
|
447
459
|
manifold, N, baseline_volumes, baseline_dimensions)
|
448
460
|
|
449
461
|
|
450
|
-
def testGeneralizedObstructionClass(compute_solutions):
|
462
|
+
def testGeneralizedObstructionClass(compute_solutions, print_info = True):
|
451
463
|
|
452
464
|
vols = [
|
453
465
|
pari('0'),
|
@@ -484,7 +496,8 @@ def testGeneralizedObstructionClass(compute_solutions):
|
|
484
496
|
|
485
497
|
for manifold, N, vols, dims in test_cases:
|
486
498
|
|
487
|
-
|
499
|
+
if print_info:
|
500
|
+
print("Checking for", manifold.name(), "N = %d" % N)
|
488
501
|
|
489
502
|
testComputeSolutionsForManifoldGeneralizedObstructionClass(
|
490
503
|
manifold, N, compute_solutions, vols, dims)
|
@@ -647,7 +660,7 @@ def testNumericalSolutions():
|
|
647
660
|
check_volumes(allCVolumes, expected_cvolumes)
|
648
661
|
|
649
662
|
|
650
|
-
def testGeometricRep(compute_solutions):
|
663
|
+
def testGeometricRep(compute_solutions, print_info=False):
|
651
664
|
|
652
665
|
from snappy.ptolemy import geometricRep
|
653
666
|
|
@@ -657,13 +670,14 @@ def testGeometricRep(compute_solutions):
|
|
657
670
|
else:
|
658
671
|
from urllib.request import pathname2url
|
659
672
|
url = pathname2url(os.path.abspath(testing_files_directory))
|
660
|
-
sol = geometricRep.retrieve_geometric_solution(
|
673
|
+
sol = geometricRep.retrieve_geometric_solution(
|
674
|
+
M, data_url=url, verbose = print_info)
|
661
675
|
|
662
676
|
# Make sure this is of type Ptolemy
|
663
677
|
sol['c_0011_2']
|
664
678
|
|
665
679
|
assert any(
|
666
|
-
|
680
|
+
abs(vol - 2.9441064867) < 1e-9 for vol in sol.volume_numerical())
|
667
681
|
|
668
682
|
|
669
683
|
def testSageCommandLine():
|
@@ -809,79 +823,66 @@ def test_num_obstruction_class_match():
|
|
809
823
|
for i in range(2,6):
|
810
824
|
assert len(M.ptolemy_generalized_obstruction_classes(i)) == len(N.ptolemy_generalized_obstruction_classes(i))
|
811
825
|
|
826
|
+
def run_ptolemy_tests_raising_exceptions(print_info=True):
|
827
|
+
if print_info:
|
828
|
+
print("Testing in sage:", _within_sage)
|
812
829
|
|
813
|
-
|
814
|
-
ptolemy.matrix, ptolemy.polynomial, ptolemy.processMagmaFile,
|
815
|
-
ptolemy.ptolemyObstructionClass, ptolemy.ptolemyVariety,
|
816
|
-
ptolemy.ptolemyVariety, ptolemy.processFileBase, ptolemy.processRurFile,
|
817
|
-
ptolemy.rur, ptolemy.utilities]
|
818
|
-
if test_regina:
|
819
|
-
modules.append(ptolemy.reginaWrapper)
|
820
|
-
|
821
|
-
|
822
|
-
def run_doctests(verbose=False, print_info=True):
|
823
|
-
return doctest_modules(modules, verbose, print_info)
|
824
|
-
|
825
|
-
|
826
|
-
def main(verbose=False, doctest=True):
|
827
|
-
print("Testing in sage:", _within_sage)
|
828
|
-
|
829
|
-
print("Testing in regina:", test_regina)
|
830
|
-
|
831
|
-
if doctest:
|
832
|
-
print("Running doctests...")
|
833
|
-
run_doctests(verbose)
|
834
|
-
print()
|
830
|
+
print("Testing in regina:", test_regina)
|
835
831
|
|
836
832
|
if test_regina:
|
837
|
-
|
833
|
+
if print_info:
|
834
|
+
print("Testing that regina agrees with snappy obstruction classes")
|
838
835
|
test_num_obstruction_class_match()
|
839
836
|
|
840
837
|
if not test_regina:
|
841
|
-
|
838
|
+
if print_info:
|
839
|
+
print("Testing Flattenings.from_tetrahedra_shapes_of_manifold...")
|
842
840
|
|
843
841
|
test_flattenings_from_tetrahedra_shapes_of_manifold()
|
844
842
|
|
845
|
-
compute_solutions = False
|
846
|
-
|
847
|
-
if '--compute' in sys.argv:
|
848
|
-
compute_solutions = True
|
849
|
-
|
850
843
|
if test_regina and not compute_solutions:
|
851
844
|
print("regina testing requires --compute")
|
852
845
|
sys.exit(1)
|
853
846
|
|
854
847
|
old_precision = pari.set_real_precision(100)
|
855
848
|
|
856
|
-
|
849
|
+
if print_info:
|
850
|
+
print("Testing induced representation...")
|
857
851
|
|
858
852
|
test_induced_representation()
|
859
853
|
|
860
|
-
|
854
|
+
if print_info:
|
855
|
+
print("Testing induced SL(4,C) representation...")
|
861
856
|
|
862
857
|
test_induced_sl4_representation()
|
863
858
|
|
864
|
-
|
859
|
+
if print_info:
|
860
|
+
print("Running manifold tests for generalized obstruction class...")
|
865
861
|
|
866
|
-
testGeneralizedObstructionClass(compute_solutions)
|
862
|
+
testGeneralizedObstructionClass(compute_solutions, print_info=print_info)
|
867
863
|
|
868
864
|
if not test_regina:
|
869
|
-
|
865
|
+
if print_info:
|
866
|
+
print("Testing RUR for m052__sl3_c0.rur")
|
870
867
|
|
871
868
|
testMapleLikeRur()
|
872
869
|
|
873
|
-
|
870
|
+
if print_info:
|
871
|
+
print("Testing numerical solution retrieval method...")
|
874
872
|
|
875
873
|
testNumericalSolutions()
|
876
874
|
|
877
|
-
|
878
|
-
|
875
|
+
if print_info:
|
876
|
+
print("Testing geometricRep...")
|
877
|
+
testGeometricRep(compute_solutions, print_info=print_info)
|
879
878
|
|
880
879
|
if _within_sage:
|
881
|
-
|
880
|
+
if print_info:
|
881
|
+
print("Testing in sage command line...")
|
882
882
|
testSageCommandLine()
|
883
883
|
|
884
|
-
|
884
|
+
if print_info:
|
885
|
+
print("Running manifold tests...")
|
885
886
|
|
886
887
|
# Test for a non-hyperbolic manifold
|
887
888
|
|
@@ -1068,14 +1069,58 @@ def main(verbose=False, doctest=True):
|
|
1068
1069
|
|
1069
1070
|
for manifold, N, cvols, expect_non_zero_dim in test_cases:
|
1070
1071
|
|
1071
|
-
|
1072
|
+
if print_info:
|
1073
|
+
print("Checking for", manifold.name(), "N = %d" % N)
|
1072
1074
|
|
1073
1075
|
testComputeSolutionsForManifold(
|
1074
1076
|
manifold, N,
|
1075
1077
|
compute_solutions=compute_solutions,
|
1076
1078
|
baseline_cvolumes=cvols,
|
1077
|
-
expect_non_zero_dimensional=expect_non_zero_dim
|
1079
|
+
expect_non_zero_dimensional=expect_non_zero_dim,
|
1080
|
+
print_info=print_info)
|
1078
1081
|
|
1082
|
+
def run_ptolemy_tests(verbose=False, print_info=True):
|
1083
|
+
try:
|
1084
|
+
run_ptolemy_tests_raising_exceptions(
|
1085
|
+
print_info=print_info)
|
1086
|
+
return doctest.TestResults(failed=0, attempted=1)
|
1087
|
+
except Exception as e:
|
1088
|
+
print()
|
1089
|
+
print("FAILED TEST in Ptolemy. Exception is:")
|
1090
|
+
traceback.print_exc()
|
1091
|
+
print()
|
1092
|
+
return doctest.TestResults(failed=1, attempted=1)
|
1093
|
+
|
1094
|
+
run_ptolemy_tests.__name__ = ptolemy.__name__ + ' (non-doc tests)'
|
1095
|
+
|
1096
|
+
modules = [ptolemy.component,
|
1097
|
+
ptolemy.coordinates,
|
1098
|
+
ptolemy.manifoldMethods,
|
1099
|
+
ptolemy.matrix,
|
1100
|
+
ptolemy.polynomial,
|
1101
|
+
ptolemy.processFileBase,
|
1102
|
+
ptolemy.processMagmaFile,
|
1103
|
+
ptolemy.processRurFile,
|
1104
|
+
ptolemy.ptolemyObstructionClass,
|
1105
|
+
ptolemy.ptolemyVariety,
|
1106
|
+
ptolemy.rur,
|
1107
|
+
ptolemy.utilities]
|
1108
|
+
if test_regina:
|
1109
|
+
modules.append(ptolemy.reginaWrapper)
|
1110
|
+
|
1111
|
+
def run_doctests(verbose=False, print_info=True):
|
1112
|
+
return doctest_modules(
|
1113
|
+
modules,
|
1114
|
+
verbose=verbose, print_info=print_info)
|
1115
|
+
|
1116
|
+
run_doctests.__name__ = ptolemy.__name__
|
1079
1117
|
|
1080
1118
|
if __name__ == '__main__':
|
1081
|
-
|
1119
|
+
verbose = '-v' in sys.argv[1:] or '--verbose' in sys.argv[1:]
|
1120
|
+
|
1121
|
+
result = run_doctests(verbose=verbose, print_info=True)
|
1122
|
+
if result.failed:
|
1123
|
+
sys.exit(result.failed)
|
1124
|
+
|
1125
|
+
result = run_ptolemy_tests(verbose=verbose, print_info=True)
|
1126
|
+
sys.exit(result.failed)
|
snappy/ptolemy/utilities.py
CHANGED
@@ -212,7 +212,7 @@ class MethodMappingList(list):
|
|
212
212
|
"""
|
213
213
|
|
214
214
|
def __init__(self, l=[], p=None):
|
215
|
-
super(
|
215
|
+
super().__init__(l)
|
216
216
|
|
217
217
|
def __call__(self, *args, **kwargs):
|
218
218
|
return type(self)([elt(*args, **kwargs) for elt in self],
|
snappy/raytracing/__init__.py
CHANGED
@@ -0,0 +1,64 @@
|
|
1
|
+
from ..exceptions import NonorientableManifoldError
|
2
|
+
from . import cohomology_fractal
|
3
|
+
|
4
|
+
try:
|
5
|
+
from ..gui import ViewerWindow
|
6
|
+
from .inside_viewer import InsideViewer
|
7
|
+
except ImportError as e:
|
8
|
+
InsideViewer = None
|
9
|
+
_importErrorRaytracing = str(e)
|
10
|
+
|
11
|
+
from typing import Sequence
|
12
|
+
|
13
|
+
def inside_view(self, cohomology_class=None, geodesics : Sequence[str]=[]):
|
14
|
+
r"""
|
15
|
+
Show raytraced inside view of hyperbolic manifold. See
|
16
|
+
`images <https://im.icerm.brown.edu/portfolio/snappy-views/>`_
|
17
|
+
and `demo video <https://youtu.be/CAERhmUCkRs>`_.
|
18
|
+
|
19
|
+
>>> M = Manifold("m004")
|
20
|
+
>>> M.inside_view() #doctest: +CYMODERNOPENGL
|
21
|
+
|
22
|
+
Or show the cohomology fractal:
|
23
|
+
|
24
|
+
>>> M = Manifold("m004")
|
25
|
+
>>> M.inside_view(cohomology_class = 0) #doctest: +CYMODERNOPENGL
|
26
|
+
|
27
|
+
The cohomology class in :math:`H^2(M, \partial M; \mathbb{R})` producing the
|
28
|
+
cohomology fractal can be specified as a cocycle or using an automatically
|
29
|
+
computed basis (of, say, length ``n``). Thus, ``cohomology_class`` can be
|
30
|
+
one of the following.
|
31
|
+
|
32
|
+
- An integer ``i`` between 0 and ``n`` - 1 to pick the ``i``-th basis
|
33
|
+
vector.
|
34
|
+
- An array of length ``n`` specifying the cohomology class as linear
|
35
|
+
combination of basis vectors.
|
36
|
+
- A weight for each face of each tetrahedron.
|
37
|
+
|
38
|
+
Geodesics can be specified as words in the unsimplified fundamental group:
|
39
|
+
|
40
|
+
>>> M = Manifold("m004")
|
41
|
+
>>> M.inside_view(geodesics=['a', 'bC']) #doctest: +CYMODERNOPENGL
|
42
|
+
|
43
|
+
"""
|
44
|
+
|
45
|
+
if InsideViewer is None:
|
46
|
+
raise RuntimeError("Raytraced inside view not imported; "
|
47
|
+
"Tk or CyOpenGL is probably missing "
|
48
|
+
"(original error : %s)" % _importErrorRaytracing)
|
49
|
+
|
50
|
+
if not self.is_orientable():
|
51
|
+
raise NonorientableManifoldError("Manifold.inside_view", self)
|
52
|
+
|
53
|
+
weights, cohomology_basis, cohomology_class = (
|
54
|
+
cohomology_fractal.compute_weights_basis_class(
|
55
|
+
self, cohomology_class))
|
56
|
+
|
57
|
+
return ViewerWindow(
|
58
|
+
InsideViewer,
|
59
|
+
self,
|
60
|
+
title="Inside view of %s" % self.name(),
|
61
|
+
weights=weights,
|
62
|
+
cohomology_basis=cohomology_basis,
|
63
|
+
cohomology_class=cohomology_class,
|
64
|
+
geodesics=geodesics)
|
@@ -0,0 +1,64 @@
|
|
1
|
+
"""
|
2
|
+
from snappy import *; from snappy.raytracing.additional_horospheres import *
|
3
|
+
|
4
|
+
M=Manifold("t10879")
|
5
|
+
M=CubicalOrientableCuspedCensus[0]
|
6
|
+
v = M.inside_view()
|
7
|
+
a=AdditionalHorospheres(M)
|
8
|
+
v.view.widget.additional_structures['horospheres'] = a; v.view.widget._update_shader()
|
9
|
+
|
10
|
+
"""
|
11
|
+
|
12
|
+
from ..geometric_structure.cusp_neighborhood.tiles_for_cusp_neighborhood import mcomplex_for_tiling_cusp_neighborhoods
|
13
|
+
from .pack import pack_tet_data
|
14
|
+
from .upper_halfspace_utilities import add_coordinate_transform_to_mcomplex
|
15
|
+
|
16
|
+
class AdditionalHorospheres:
|
17
|
+
def __init__(self, manifold):
|
18
|
+
|
19
|
+
self.mcomplex = mcomplex_for_tiling_cusp_neighborhoods(
|
20
|
+
manifold, bits_prec = 53, verified = False)
|
21
|
+
add_coordinate_transform_to_mcomplex(self.mcomplex)
|
22
|
+
|
23
|
+
self.num_tetrahedra = manifold.num_tetrahedra()
|
24
|
+
self.RF = manifold.tetrahedra_shapes('rect')[0].real().parent()
|
25
|
+
self.cusp_areas = [ 1.0 for v in self.mcomplex.Vertices ]
|
26
|
+
|
27
|
+
self._num = 0
|
28
|
+
|
29
|
+
self.compute_bindings()
|
30
|
+
|
31
|
+
def get_compile_time_defs(self):
|
32
|
+
if self._num > 0:
|
33
|
+
num = max(100, self._num)
|
34
|
+
else:
|
35
|
+
num = 0
|
36
|
+
|
37
|
+
return { 'num_additional_horospheres' : num }
|
38
|
+
|
39
|
+
def get_uniform_bindings(self):
|
40
|
+
return self._uniform_bindings
|
41
|
+
|
42
|
+
def compute_bindings(self):
|
43
|
+
|
44
|
+
tets_to_data = [ [] for i in range(self.num_tetrahedra) ]
|
45
|
+
|
46
|
+
for cusp_index, v in enumerate(self.mcomplex.Vertices):
|
47
|
+
scale = (self.RF(self.cusp_areas[cusp_index]) / v.cusp_area).sqrt()
|
48
|
+
|
49
|
+
d = scale.log()
|
50
|
+
|
51
|
+
for tile in v.tiles():
|
52
|
+
if tile.lower_bound_distance > d:
|
53
|
+
break
|
54
|
+
|
55
|
+
tet = tile.lifted_tetrahedron.tet
|
56
|
+
|
57
|
+
s = (
|
58
|
+
tet.to_coordinates_in_symmetric_tet * tile.inverse_lifted_geometric_object.defining_vec) / scale
|
59
|
+
|
60
|
+
tets_to_data[tet.Index].append(
|
61
|
+
{ 'Vec' : ('vec4', s),
|
62
|
+
'CuspIndex' : ('int', cusp_index) })
|
63
|
+
|
64
|
+
self._uniform_bindings, self._num = pack_tet_data('additionalHorospheres.horosphere', tets_to_data)
|
@@ -0,0 +1,63 @@
|
|
1
|
+
"""
|
2
|
+
from snappy import *; from snappy.raytracing.additional_len_spec_choices import *
|
3
|
+
|
4
|
+
M=Manifold("t10879")
|
5
|
+
M=CubicalOrientableCuspedCensus[0]
|
6
|
+
v = M.inside_view()
|
7
|
+
a=AdditionalLenSpecChoices(M)
|
8
|
+
v.view.widget.additional_structures['lenSpec'] = a; v.view.widget._update_shader()
|
9
|
+
|
10
|
+
"""
|
11
|
+
|
12
|
+
from ..len_spec import mcomplex_for_len_spec
|
13
|
+
|
14
|
+
from .pack import pack_tet_data
|
15
|
+
from .upper_halfspace_utilities import add_coordinate_transform_to_mcomplex
|
16
|
+
from ..snap.t3mlite import simplex
|
17
|
+
|
18
|
+
class AdditionalLenSpecChoices:
|
19
|
+
def __init__(self, manifold):
|
20
|
+
|
21
|
+
self.mcomplex = mcomplex_for_len_spec(
|
22
|
+
manifold, bits_prec = 53, verified = False)
|
23
|
+
add_coordinate_transform_to_mcomplex(self.mcomplex)
|
24
|
+
|
25
|
+
self._num = 0
|
26
|
+
|
27
|
+
self.compute_bindings()
|
28
|
+
|
29
|
+
def get_compile_time_defs(self):
|
30
|
+
if self._num > 0:
|
31
|
+
num = max(100, self._num)
|
32
|
+
else:
|
33
|
+
num = 0
|
34
|
+
|
35
|
+
return { 'num_additional_horospheres' : num,
|
36
|
+
'has_edge_midpoints' : 1}
|
37
|
+
|
38
|
+
def get_uniform_bindings(self):
|
39
|
+
return self._uniform_bindings
|
40
|
+
|
41
|
+
def compute_bindings(self):
|
42
|
+
self._uniform_bindings, self._num = pack_tet_data(
|
43
|
+
'additionalHorospheres.horosphere',
|
44
|
+
self._get_data())
|
45
|
+
self._uniform_bindings['edgeMidpoints.edgeMidpointVec'] = (
|
46
|
+
'vec4[]', [ tet.to_coordinates_in_symmetric_tet * tet.spine_points[e]
|
47
|
+
for tet in self.mcomplex.Tetrahedra
|
48
|
+
for e in simplex.OneSubsimplices ])
|
49
|
+
self._uniform_bindings['edgeMidpointRadiusParam'] = (
|
50
|
+
'float', 1.002)
|
51
|
+
|
52
|
+
def _get_data(self):
|
53
|
+
return [ [ _data_for_vert(tet, v) for v in simplex.ZeroSubsimplices ]
|
54
|
+
for tet in self.mcomplex.Tetrahedra ]
|
55
|
+
|
56
|
+
def _data_for_vert(tet, v):
|
57
|
+
return {
|
58
|
+
'Vec' :(
|
59
|
+
'vec4',
|
60
|
+
tet.to_coordinates_in_symmetric_tet * tet.R13_vertices[v]),
|
61
|
+
'CuspIndex' : (
|
62
|
+
'int',
|
63
|
+
tet.Class[v].Index) }
|
@@ -55,7 +55,6 @@ def check_weights_valid(trig, weights):
|
|
55
55
|
Given a SnapPy triangulation and weights per face per tetrahedron,
|
56
56
|
check they are consistent across glued faces and form a 2-cocycle.
|
57
57
|
|
58
|
-
>>> from snappy import Manifold
|
59
58
|
>>> check_weights_valid(Manifold("m015"), [1, 0, 0, 0, -1, 0, 0, 1, -1, 0, 0, 0])
|
60
59
|
>>> check_weights_valid(Manifold("m004"), [0, 1, 0, 1, 0, 0, -1, -2])
|
61
60
|
Traceback (most recent call last):
|
@@ -111,7 +110,6 @@ def rational_cohomology_basis(trig):
|
|
111
110
|
per face per tetrahedron that generate the second rational cohomology
|
112
111
|
group.
|
113
112
|
|
114
|
-
>>> from snappy import Manifold
|
115
113
|
>>> rational_cohomology_basis(Manifold("m125"))
|
116
114
|
[[-1, -4, -2, 0, 1, 0, 0, 0, 0, 4, 1, 2, -1, 0, 0, 0], [0, 5, 2, 0, 0, 0, 0, 1, 0, -5, 0, -2, 0, 0, 0, -1]]
|
117
115
|
|
@@ -147,7 +145,6 @@ def compute_weights_basis_class(trig, cohomology_class):
|
|
147
145
|
Convenience method to quickly access cohomology classes for
|
148
146
|
M.inside_view().
|
149
147
|
|
150
|
-
>>> from snappy import Manifold
|
151
148
|
>>> compute_weights_basis_class(Manifold("m004"), None)
|
152
149
|
(None, None, None)
|
153
150
|
>>> compute_weights_basis_class(Manifold("m003"), [1, 0, 0, 1, -1, 0, 0, -1])
|
@@ -0,0 +1,123 @@
|
|
1
|
+
from ..hyperboloid import o13_inverse
|
2
|
+
from ..hyperboloid.point import R13Point
|
3
|
+
|
4
|
+
from ..tiling.tile import compute_tiles
|
5
|
+
from ..tiling.lifted_tetrahedron import LiftedTetrahedron
|
6
|
+
from ..tiling.lifted_tetrahedron_set import (LiftedTetrahedronSet,
|
7
|
+
get_lifted_tetrahedron_set)
|
8
|
+
from ..tiling.triangle import add_triangles_to_tetrahedra
|
9
|
+
|
10
|
+
from ..matrix import make_matrix, make_vector
|
11
|
+
|
12
|
+
from ..matrix import matrix
|
13
|
+
|
14
|
+
import math
|
15
|
+
|
16
|
+
eyeball_type_none = 0
|
17
|
+
eyeball_type_paper_plane = 1
|
18
|
+
eyeball_type_eyeball = 2
|
19
|
+
|
20
|
+
_max_num_eyeballs = 40
|
21
|
+
|
22
|
+
class Eyeball:
|
23
|
+
def __init__(self, raytracing_view):
|
24
|
+
self.raytracing_view = raytracing_view
|
25
|
+
|
26
|
+
self.mcomplex = self.raytracing_view.raytracing_data.mcomplex
|
27
|
+
self.num_tetrahedra = len(self.mcomplex.Tetrahedra)
|
28
|
+
|
29
|
+
self._added_triangles = False
|
30
|
+
|
31
|
+
self.view_state = None
|
32
|
+
|
33
|
+
def _enabled(self):
|
34
|
+
return (
|
35
|
+
self.raytracing_view.ui_parameter_dict['eyeballSize'][1] > 0 and
|
36
|
+
self.raytracing_view.ui_parameter_dict['eyeballType'][1] > eyeball_type_none)
|
37
|
+
|
38
|
+
def get_compile_time_defs(self):
|
39
|
+
if not self._enabled():
|
40
|
+
return {}
|
41
|
+
|
42
|
+
d = { 'num_eyeballs' : _max_num_eyeballs,
|
43
|
+
'eyeball_type' : self.raytracing_view.ui_parameter_dict['eyeballType'][1]}
|
44
|
+
|
45
|
+
return d
|
46
|
+
|
47
|
+
def get_uniform_bindings(self):
|
48
|
+
if not self._enabled():
|
49
|
+
return {}
|
50
|
+
|
51
|
+
if not self._added_triangles:
|
52
|
+
add_triangles_to_tetrahedra(self.mcomplex)
|
53
|
+
self._added_triangles = True
|
54
|
+
|
55
|
+
if self.view_state is None or (
|
56
|
+
not self.raytracing_view.ui_parameter_dict['freezeEyeball'][1]):
|
57
|
+
self.view_state = self.raytracing_view.view_state
|
58
|
+
|
59
|
+
boost, tet_num, current_weight = self.view_state
|
60
|
+
|
61
|
+
RF = self.raytracing_view.raytracing_data.RF
|
62
|
+
|
63
|
+
boost = make_matrix(boost, ring=RF)
|
64
|
+
|
65
|
+
base_point = make_vector([b[0] for b in boost])
|
66
|
+
|
67
|
+
eyeballRadius = self.raytracing_view.ui_parameter_dict['eyeballSize'][1]
|
68
|
+
if self.raytracing_view.ui_parameter_dict['eyeballType'][1] == eyeball_type_eyeball:
|
69
|
+
eyeballRadius = eyeballRadius / 2.0
|
70
|
+
tets_to_data = [ [] for i in range(self.num_tetrahedra) ]
|
71
|
+
|
72
|
+
initial_lifted_tetrahedron = LiftedTetrahedron(
|
73
|
+
self.mcomplex.Tetrahedra[tet_num], matrix.identity(RF, 4))
|
74
|
+
|
75
|
+
cut_off = RF(1.0 + 1e-5)
|
76
|
+
|
77
|
+
lifted_tetrahedron_set : LiftedTetrahedronSet = (
|
78
|
+
get_lifted_tetrahedron_set(
|
79
|
+
base_point=base_point,
|
80
|
+
act_on_base_point_by_inverse=True,
|
81
|
+
max_neg_prod_equal=cut_off,
|
82
|
+
min_neg_prod_distinct=cut_off,
|
83
|
+
canonical_keys_function=None,
|
84
|
+
verified=False))
|
85
|
+
|
86
|
+
for i, tile in enumerate(
|
87
|
+
compute_tiles(
|
88
|
+
geometric_object=R13Point(base_point),
|
89
|
+
visited_lifted_tetrahedra=lifted_tetrahedron_set,
|
90
|
+
initial_lifted_tetrahedra=[ initial_lifted_tetrahedron ],
|
91
|
+
verified=False)):
|
92
|
+
|
93
|
+
if i == _max_num_eyeballs:
|
94
|
+
break
|
95
|
+
if tile.lower_bound_distance > eyeballRadius:
|
96
|
+
break
|
97
|
+
|
98
|
+
m = o13_inverse(boost) * tile.lifted_tetrahedron.o13_matrix
|
99
|
+
|
100
|
+
tets_to_data[tile.lifted_tetrahedron.tet.Index].append((
|
101
|
+
tile.inverse_lifted_geometric_object.point,
|
102
|
+
m,
|
103
|
+
o13_inverse(m)))
|
104
|
+
|
105
|
+
eyeballPositions = []
|
106
|
+
eyeballInvEmbeddings = []
|
107
|
+
eyeballEmbeddings = []
|
108
|
+
eyeballOffsets = []
|
109
|
+
|
110
|
+
for data in tets_to_data:
|
111
|
+
eyeballOffsets.append(len(eyeballPositions))
|
112
|
+
for eyeballPosition, eyeballInvEmbedding, eyeballEmbedding in data:
|
113
|
+
eyeballPositions.append(eyeballPosition)
|
114
|
+
eyeballInvEmbeddings.append(eyeballInvEmbedding)
|
115
|
+
eyeballEmbeddings.append(eyeballEmbedding)
|
116
|
+
eyeballOffsets.append(len(eyeballPositions))
|
117
|
+
|
118
|
+
return {
|
119
|
+
'eyeballRadius' : ('float', eyeballRadius),
|
120
|
+
'eyeballs.eyeballPositions' : ('vec4[]', eyeballPositions),
|
121
|
+
'eyeballs.eyeballInvEmbeddings' : ('mat4[]', eyeballInvEmbeddings),
|
122
|
+
'eyeballs.eyeballEmbeddings' : ('mat4[]', eyeballEmbeddings),
|
123
|
+
'eyeballs.eyeballOffsets' : ('int[]', eyeballOffsets) }
|