snappy 3.0.3__cp38-cp38-macosx_11_0_arm64.whl → 3.2__cp38-cp38-macosx_11_0_arm64.whl
Sign up to get free protection for your applications and to get access to all the features.
- snappy/CyOpenGL.cpython-38-darwin.so +0 -0
- snappy/SnapPy.cpython-38-darwin.so +0 -0
- snappy/SnapPyHP.cpython-38-darwin.so +0 -0
- snappy/__init__.py +373 -426
- snappy/app.py +240 -75
- snappy/app_menus.py +93 -78
- snappy/browser.py +87 -63
- snappy/cache.py +5 -8
- snappy/canonical.py +249 -0
- snappy/{verify/cusp_shapes.py → cusps/__init__.py} +11 -19
- snappy/cusps/cusp_area_matrix.py +101 -0
- snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +39 -54
- 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 +40 -31
- snappy/db_utilities.py +13 -14
- snappy/decorated_isosig.py +377 -133
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +42 -9
- snappy/dev/extended_ptolemy/extended.py +32 -25
- snappy/dev/extended_ptolemy/giac_rur.py +23 -8
- snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
- snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +2 -1
- snappy/dev/vericlosed/gimbalLoopFinder.py +5 -5
- snappy/dev/vericlosed/hyperbolicStructure.py +3 -3
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +2 -2
- snappy/dev/vericlosed/truncatedComplex.py +3 -2
- snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +4 -3
- snappy/doc/_images/geodesics.jpg +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/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 +1 -0
- snappy/doc/_sources/credits.rst.txt +6 -1
- snappy/doc/_sources/development.rst.txt +69 -50
- snappy/doc/_sources/index.rst.txt +101 -66
- snappy/doc/_sources/installing.rst.txt +148 -165
- snappy/doc/_sources/news.rst.txt +136 -32
- snappy/doc/_sources/ptolemy.rst.txt +1 -1
- snappy/doc/_sources/ptolemy_examples1.rst.txt +9 -8
- snappy/doc/_sources/ptolemy_examples2.rst.txt +3 -3
- snappy/doc/_sources/ptolemy_examples3.rst.txt +14 -14
- snappy/doc/_sources/ptolemy_prelim.rst.txt +1 -1
- snappy/doc/_sources/snap.rst.txt +2 -2
- snappy/doc/_sources/snappy.rst.txt +1 -1
- snappy/doc/_sources/triangulation.rst.txt +3 -2
- snappy/doc/_sources/verify.rst.txt +89 -29
- snappy/doc/_sources/verify_internals.rst.txt +5 -16
- 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 +47 -27
- 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 +107 -274
- snappy/doc/_static/documentation_options.js +6 -5
- 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 -2
- 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 +3 -101
- snappy/doc/_static/pygments.css +1 -0
- snappy/doc/_static/searchtools.js +489 -398
- 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 +688 -263
- snappy/doc/bugs.html +107 -94
- snappy/doc/censuses.html +155 -127
- snappy/doc/credits.html +115 -104
- snappy/doc/development.html +184 -146
- snappy/doc/genindex.html +287 -204
- snappy/doc/index.html +189 -150
- snappy/doc/installing.html +259 -266
- snappy/doc/manifold.html +1626 -592
- snappy/doc/manifoldhp.html +119 -105
- snappy/doc/news.html +198 -104
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +117 -105
- snappy/doc/platonic_census.html +161 -114
- snappy/doc/plink.html +113 -105
- snappy/doc/ptolemy.html +131 -108
- snappy/doc/ptolemy_classes.html +242 -223
- snappy/doc/ptolemy_examples1.html +144 -130
- snappy/doc/ptolemy_examples2.html +141 -129
- snappy/doc/ptolemy_examples3.html +148 -132
- snappy/doc/ptolemy_examples4.html +131 -111
- snappy/doc/ptolemy_prelim.html +162 -138
- snappy/doc/py-modindex.html +104 -69
- snappy/doc/screenshots.html +117 -108
- snappy/doc/search.html +115 -84
- snappy/doc/searchindex.js +1 -1
- snappy/doc/snap.html +109 -96
- snappy/doc/snappy.html +134 -97
- snappy/doc/spherogram.html +259 -187
- snappy/doc/todo.html +107 -94
- snappy/doc/triangulation.html +1380 -111
- snappy/doc/tutorial.html +107 -94
- snappy/doc/verify.html +194 -125
- snappy/doc/verify_internals.html +248 -686
- 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 +126 -0
- snappy/drilling/tracing.py +351 -0
- snappy/exceptions.py +23 -3
- snappy/export_stl.py +20 -14
- 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 +197 -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 +123 -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/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/geometric_structure/geodesic/fixed_points.py +93 -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 +101 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +36 -36
- snappy/horoviewer.py +50 -48
- snappy/hyperboloid/__init__.py +212 -0
- 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/{infodialog.py → infowindow.py} +32 -33
- 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/manifolds/__init__.py +1 -1
- snappy/math_basics.py +176 -0
- snappy/matrix.py +525 -0
- snappy/number.py +97 -21
- snappy/numeric_output_checker.py +37 -27
- snappy/pari.py +30 -69
- snappy/phone_home.py +25 -20
- snappy/polyviewer.py +39 -37
- snappy/ptolemy/__init__.py +4 -6
- snappy/ptolemy/component.py +14 -12
- snappy/ptolemy/coordinates.py +312 -295
- snappy/ptolemy/fieldExtensions.py +14 -12
- snappy/ptolemy/findLoops.py +43 -31
- snappy/ptolemy/geometricRep.py +24 -26
- snappy/ptolemy/homology.py +12 -7
- snappy/ptolemy/manifoldMethods.py +69 -70
- snappy/ptolemy/matrix.py +65 -26
- snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +18 -14
- snappy/ptolemy/polynomial.py +125 -119
- snappy/ptolemy/processComponents.py +36 -30
- snappy/ptolemy/processFileBase.py +79 -18
- snappy/ptolemy/processFileDispatch.py +13 -14
- snappy/ptolemy/processMagmaFile.py +44 -39
- snappy/ptolemy/processRurFile.py +18 -11
- snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +20 -17
- snappy/ptolemy/ptolemyObstructionClass.py +13 -17
- snappy/ptolemy/ptolemyVariety.py +190 -121
- snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +20 -19
- snappy/ptolemy/reginaWrapper.py +25 -29
- snappy/ptolemy/rur.py +6 -14
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +27 -22
- snappy/ptolemy/test.py +247 -188
- snappy/ptolemy/utilities.py +41 -43
- 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 +10 -6
- snappy/raytracing/eyeball.py +123 -0
- snappy/raytracing/finite_raytracing_data.py +48 -38
- snappy/raytracing/finite_viewer.py +218 -210
- 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 +152 -40
- snappy/raytracing/hyperboloid_navigation.py +102 -52
- snappy/raytracing/hyperboloid_utilities.py +114 -261
- snappy/raytracing/ideal_raytracing_data.py +256 -179
- snappy/raytracing/inside_viewer.py +522 -253
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +46 -34
- snappy/raytracing/raytracing_view.py +190 -109
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +60 -4
- snappy/raytracing/shaders/fragment.glsl +575 -148
- 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 +32 -29
- snappy/raytracing/zoom_slider/test.py +2 -0
- snappy/sage_helper.py +69 -123
- snappy/{preferences.py → settings.py} +167 -145
- snappy/shell.py +4 -0
- snappy/snap/__init__.py +12 -8
- snappy/snap/character_varieties.py +24 -18
- snappy/snap/find_field.py +35 -34
- snappy/snap/fundamental_polyhedron.py +99 -85
- snappy/snap/generators.py +6 -8
- snappy/snap/interval_reps.py +18 -6
- snappy/snap/kernel_structures.py +8 -3
- snappy/snap/mcomplex_base.py +1 -2
- snappy/snap/nsagetools.py +107 -53
- snappy/snap/peripheral/__init__.py +1 -1
- snappy/snap/peripheral/dual_cellulation.py +15 -7
- snappy/snap/peripheral/link.py +20 -16
- snappy/snap/peripheral/peripheral.py +22 -14
- snappy/snap/peripheral/surface.py +47 -50
- snappy/snap/peripheral/test.py +8 -8
- snappy/snap/polished_reps.py +65 -40
- snappy/snap/shapes.py +41 -22
- snappy/snap/slice_obs_HKL.py +64 -25
- snappy/snap/t3mlite/arrow.py +88 -51
- snappy/snap/t3mlite/corner.py +5 -6
- snappy/snap/t3mlite/edge.py +32 -21
- snappy/snap/t3mlite/face.py +7 -9
- snappy/snap/t3mlite/files.py +31 -23
- snappy/snap/t3mlite/homology.py +14 -10
- snappy/snap/t3mlite/linalg.py +158 -56
- snappy/snap/t3mlite/mcomplex.py +739 -291
- snappy/snap/t3mlite/perm4.py +236 -84
- snappy/snap/t3mlite/setup.py +9 -10
- snappy/snap/t3mlite/simplex.py +65 -48
- snappy/snap/t3mlite/spun.py +42 -30
- snappy/snap/t3mlite/surface.py +45 -45
- snappy/snap/t3mlite/test.py +3 -0
- snappy/snap/t3mlite/test_vs_regina.py +17 -13
- snappy/snap/t3mlite/tetrahedron.py +25 -24
- snappy/snap/t3mlite/vertex.py +8 -13
- snappy/snap/test.py +45 -52
- snappy/snap/utilities.py +66 -65
- snappy/test.py +155 -158
- 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 +313 -203
- snappy/twister/main.py +1 -8
- snappy/twister/twister_core.cpython-38-darwin.so +0 -0
- snappy/upper_halfspace/__init__.py +146 -0
- snappy/upper_halfspace/ideal_point.py +26 -0
- snappy/verify/__init__.py +4 -8
- snappy/verify/{verifyCanonical.py → canonical.py} +114 -97
- snappy/verify/complex_volume/__init__.py +3 -2
- snappy/verify/complex_volume/adjust_torsion.py +13 -11
- snappy/verify/complex_volume/closed.py +29 -24
- snappy/verify/complex_volume/compute_ptolemys.py +8 -6
- snappy/verify/complex_volume/cusped.py +10 -9
- snappy/verify/complex_volume/extended_bloch.py +14 -12
- snappy/verify/{cuspTranslations.py → cusp_translations.py} +15 -14
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +23 -56
- snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +19 -15
- snappy/verify/interval_newton_shapes_engine.py +51 -211
- snappy/verify/interval_tree.py +27 -25
- snappy/verify/krawczyk_shapes_engine.py +47 -50
- snappy/verify/maximal_cusp_area_matrix/__init__.py +17 -86
- snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +58 -48
- snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +53 -57
- snappy/verify/{realAlgebra.py → real_algebra.py} +26 -20
- snappy/verify/shapes.py +10 -7
- snappy/verify/short_slopes.py +41 -42
- snappy/verify/{squareExtensions.py → square_extensions.py} +96 -92
- snappy/verify/test.py +59 -57
- snappy/verify/upper_halfspace/extended_matrix.py +5 -5
- snappy/verify/upper_halfspace/finite_point.py +44 -31
- snappy/verify/upper_halfspace/ideal_point.py +69 -57
- snappy/verify/volume.py +15 -12
- snappy/version.py +2 -3
- {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/METADATA +14 -12
- snappy-3.2.dist-info/RECORD +503 -0
- {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
- {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -1
- {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/top_level.txt +10 -1
- snappy/doc/_sources/verify_canon.rst.txt +0 -90
- snappy/doc/_static/classic.css +0 -266
- snappy/doc/_static/jquery-3.5.1.js +0 -10872
- snappy/doc/_static/sidebar.js +0 -159
- snappy/doc/_static/underscore-1.13.1.js +0 -2042
- snappy/doc/_static/underscore.js +0 -6
- snappy/doc/verify_canon.html +0 -283
- snappy/ppm_to_png.py +0 -243
- 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/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/verify/cuspCrossSection.py +0 -1413
- snappy/verify/mathHelpers.py +0 -64
- snappy-3.0.3.dist-info/RECORD +0 -360
@@ -1,5 +1,5 @@
|
|
1
1
|
"""
|
2
|
-
The
|
2
|
+
The square_extensions module provides
|
3
3
|
two special classes to give exact representations of the values
|
4
4
|
involved when computing a cusp cross section.
|
5
5
|
|
@@ -18,6 +18,7 @@ implementation of the == operator.
|
|
18
18
|
|
19
19
|
import operator
|
20
20
|
from functools import reduce
|
21
|
+
from ..math_basics import prod
|
21
22
|
from ..sage_helper import _within_sage, sage_method, SageNotAvailable
|
22
23
|
|
23
24
|
__all__ = ['find_shapes_as_complex_sqrt_lin_combinations',
|
@@ -38,7 +39,8 @@ if _within_sage:
|
|
38
39
|
|
39
40
|
from ..snap import find_field
|
40
41
|
|
41
|
-
from .
|
42
|
+
from .real_algebra import field_containing_real_and_imaginary_part_of_number_field
|
43
|
+
|
42
44
|
|
43
45
|
def eval_number_field_elt(elt, root):
|
44
46
|
# SageMath 7.6 can no longer evaluate a rational polynomial on an
|
@@ -72,12 +74,13 @@ def eval_number_field_elt(elt, root):
|
|
72
74
|
# This is implemented in
|
73
75
|
# _field_containing_real_and_imaginary_part_of_algebraic_number_LLL.
|
74
76
|
# This was still very slow and failed on t11669 and 9 manifolds with 9 tetrahedra.
|
75
|
-
#
|
76
|
-
# The fastest implementation so far is in
|
77
|
+
#
|
78
|
+
# The fastest implementation so far is in real_algebra. The implementation there
|
77
79
|
# turns the one complex equation p(z) = 0 defining the number field into two
|
78
80
|
# real equations for the real and imaginary part of the complex equation and
|
79
81
|
# then uses the resultant to find exact solutions.
|
80
82
|
|
83
|
+
|
81
84
|
@sage_method
|
82
85
|
def find_shapes_as_complex_sqrt_lin_combinations(M, prec, degree):
|
83
86
|
"""
|
@@ -108,7 +111,7 @@ def find_shapes_as_complex_sqrt_lin_combinations(M, prec, degree):
|
|
108
111
|
# exact_complex_shapes are elements in a Sage NumberField
|
109
112
|
complex_number_field, complex_root, exact_complex_shapes = complex_data
|
110
113
|
|
111
|
-
# We now have a generator (complex_root) for the NumberField
|
114
|
+
# We now have a generator (complex_root) for the NumberField
|
112
115
|
# containing the shapes.
|
113
116
|
# Next, we need to find the NumberField containing the real and imaginary
|
114
117
|
# part of this generator.
|
@@ -121,7 +124,7 @@ def find_shapes_as_complex_sqrt_lin_combinations(M, prec, degree):
|
|
121
124
|
|
122
125
|
real_number_field, real_part, imag_part = real_result
|
123
126
|
|
124
|
-
# Caches the values of
|
127
|
+
# Caches the values of
|
125
128
|
# nf.gen_embedding()
|
126
129
|
# and RealIntervalField(prec)(nf.gen_embedding())
|
127
130
|
# for different precision prec where nf is the NumberField real_number_field
|
@@ -130,17 +133,18 @@ def find_shapes_as_complex_sqrt_lin_combinations(M, prec, degree):
|
|
130
133
|
# This is for speed only. See _get_interval_embedding_from_cache for
|
131
134
|
# details.
|
132
135
|
embed_cache = {}
|
133
|
-
|
136
|
+
|
134
137
|
# The generator of the shape field as the desired return type
|
135
138
|
exact_complex_root = ComplexSqrtLinCombination(real_part, imag_part,
|
136
|
-
embed_cache
|
139
|
+
embed_cache=embed_cache)
|
137
140
|
|
138
141
|
# All shapes are given as polynomials in the generator,
|
139
142
|
# so translate them to be of the desired return type
|
140
143
|
return [ eval_number_field_elt(exact_complex_shape, exact_complex_root)
|
141
144
|
for exact_complex_shape in exact_complex_shapes ]
|
142
145
|
|
143
|
-
|
146
|
+
|
147
|
+
class SqrtLinCombination():
|
144
148
|
"""
|
145
149
|
A class representing a linear combination
|
146
150
|
|
@@ -179,7 +183,7 @@ class SqrtLinCombination(object):
|
|
179
183
|
cancel the two sqrt's and apply the common r_{i,j} to the c_i of the result
|
180
184
|
instead. Thus, the following procedure for determining whether D == 0 will
|
181
185
|
eventually terminate:
|
182
|
-
|
186
|
+
|
183
187
|
- if the number of terms n is 0, return True
|
184
188
|
- if the number of terms n is 1, return c_1 == 0
|
185
189
|
- if there is a r_{i,j} common to each summand, factor it out
|
@@ -240,17 +244,16 @@ class SqrtLinCombination(object):
|
|
240
244
|
|
241
245
|
"""
|
242
246
|
|
243
|
-
def __init__(self, value
|
247
|
+
def __init__(self, value=None, d={}, embed_cache=None):
|
244
248
|
# Initialize from either a value or a dictionary
|
245
|
-
|
249
|
+
|
246
250
|
# c_1 * sqrt(r_1) + c_2 * sqrt(r_2) + ... + c_n * sqrt(r_n)
|
247
251
|
#
|
248
252
|
# is encoded as dictionary
|
249
253
|
#
|
250
254
|
# { r_1 : c_1, r_2 : c_2, ..., r_n : c_n }
|
251
255
|
|
252
|
-
|
253
|
-
if not value is None:
|
256
|
+
if value is not None:
|
254
257
|
if d:
|
255
258
|
raise TypeError("SqrtLinCombination has both value and "
|
256
259
|
"dictionary.")
|
@@ -265,15 +268,18 @@ class SqrtLinCombination(object):
|
|
265
268
|
else:
|
266
269
|
# Filter out zero elements
|
267
270
|
self._dict = _filter_zero(d)
|
268
|
-
|
271
|
+
|
269
272
|
# Set embed cache, see _get_interval_embedding_from_cache for details
|
270
273
|
self._embed_cache = embed_cache
|
271
274
|
|
275
|
+
def parent(self):
|
276
|
+
return SqrtLinCombination
|
277
|
+
|
272
278
|
def __add__(self, other):
|
273
279
|
# Try to convert other term to SqrtLinCombination if necessary
|
274
280
|
if not isinstance(other, SqrtLinCombination):
|
275
281
|
return self + SqrtLinCombination(
|
276
|
-
other, embed_cache
|
282
|
+
other, embed_cache=_get_embed_cache(self, other))
|
277
283
|
|
278
284
|
# Add
|
279
285
|
d = {}
|
@@ -282,14 +288,14 @@ class SqrtLinCombination(object):
|
|
282
288
|
for k, v in other._dict.items():
|
283
289
|
d[k] = d.get(k, 0) + v
|
284
290
|
return SqrtLinCombination(
|
285
|
-
d
|
286
|
-
embed_cache
|
291
|
+
d=d,
|
292
|
+
embed_cache=_get_embed_cache(self, other))
|
287
293
|
|
288
294
|
def __neg__(self):
|
289
295
|
# Negate
|
290
296
|
return SqrtLinCombination(
|
291
|
-
d
|
292
|
-
embed_cache
|
297
|
+
d={ k: -v for k, v in self._dict.items() },
|
298
|
+
embed_cache=self._embed_cache)
|
293
299
|
|
294
300
|
def __sub__(self, other):
|
295
301
|
# Subtract
|
@@ -300,7 +306,7 @@ class SqrtLinCombination(object):
|
|
300
306
|
if not isinstance(other, SqrtLinCombination):
|
301
307
|
return self * SqrtLinCombination(
|
302
308
|
other,
|
303
|
-
embed_cache
|
309
|
+
embed_cache=_get_embed_cache(self, other))
|
304
310
|
|
305
311
|
# Result
|
306
312
|
d = {}
|
@@ -324,13 +330,13 @@ class SqrtLinCombination(object):
|
|
324
330
|
m = k1 * k2
|
325
331
|
d[m] = d.get(m, 0) + p
|
326
332
|
return SqrtLinCombination(
|
327
|
-
d
|
333
|
+
d=d, embed_cache=_get_embed_cache(self, other))
|
328
334
|
|
329
335
|
def inverse(self):
|
330
336
|
# The inverse element of c_1 * sqrt(r_1)
|
331
337
|
# is (1 / (c_1 * r_1)) * sqrt(r_1)
|
332
338
|
l = len(self._dict)
|
333
|
-
if
|
339
|
+
if l != 1:
|
334
340
|
# Do not implement other elements.
|
335
341
|
if l == 0:
|
336
342
|
# In particular, do not invert 0
|
@@ -340,15 +346,15 @@ class SqrtLinCombination(object):
|
|
340
346
|
|
341
347
|
# Iteration over the only term
|
342
348
|
for k, v in self._dict.items():
|
343
|
-
return SqrtLinCombination(
|
344
|
-
d
|
345
|
-
embed_cache
|
349
|
+
return SqrtLinCombination(
|
350
|
+
d={ k : 1 / (v * k) },
|
351
|
+
embed_cache=self._embed_cache)
|
346
352
|
|
347
353
|
def __div__(self, other):
|
348
354
|
# Try to convert other term to SqrtLinCombination if necessary
|
349
355
|
if not isinstance(other, SqrtLinCombination):
|
350
356
|
return self / SqrtLinCombination(
|
351
|
-
other, embed_cache
|
357
|
+
other, embed_cache=_get_embed_cache(self, other))
|
352
358
|
return self * other.inverse()
|
353
359
|
|
354
360
|
def __truediv__(self, other):
|
@@ -375,17 +381,17 @@ class SqrtLinCombination(object):
|
|
375
381
|
if l == 0:
|
376
382
|
# sqrt of 0
|
377
383
|
return SqrtLinCombination(
|
378
|
-
embed_cache
|
384
|
+
embed_cache=self._embed_cache)
|
379
385
|
if l == 1:
|
380
386
|
# Iterate through only term
|
381
387
|
for k, v in self._dict.items():
|
382
388
|
# Make sure expression in sqrt is 1
|
383
|
-
if
|
389
|
+
if k != 1:
|
384
390
|
raise TypeError('SqrtLinCombination sqrt not fully '
|
385
391
|
'implemented')
|
386
392
|
return SqrtLinCombination(
|
387
|
-
d
|
388
|
-
embed_cache
|
393
|
+
d={ v: _One},
|
394
|
+
embed_cache=self._embed_cache)
|
389
395
|
raise TypeError('SqrtLinCombination sqrt not fully implemented')
|
390
396
|
|
391
397
|
def __repr__(self):
|
@@ -416,7 +422,6 @@ class SqrtLinCombination(object):
|
|
416
422
|
|
417
423
|
def __ge__(self, other):
|
418
424
|
raise Exception('Not implemented')
|
419
|
-
|
420
425
|
|
421
426
|
def _real_mpfi_(self, RIF):
|
422
427
|
"""
|
@@ -473,7 +478,7 @@ class SqrtLinCombination(object):
|
|
473
478
|
# be slow so we try numerically first.
|
474
479
|
prec = 106
|
475
480
|
numerical_sign, interval_val = self._sign_numerical(prec)
|
476
|
-
if
|
481
|
+
if numerical_sign is not None:
|
477
482
|
# We could determine the sign using interval arithmetics
|
478
483
|
# Return the result.
|
479
484
|
return numerical_sign, interval_val
|
@@ -488,7 +493,7 @@ class SqrtLinCombination(object):
|
|
488
493
|
while True:
|
489
494
|
prec *= 2
|
490
495
|
numerical_sign, interval_val = self._sign_numerical(prec)
|
491
|
-
if
|
496
|
+
if numerical_sign is not None:
|
492
497
|
return numerical_sign, interval_val
|
493
498
|
|
494
499
|
def sign(self):
|
@@ -500,27 +505,27 @@ class SqrtLinCombination(object):
|
|
500
505
|
return self.sign_with_interval()[0]
|
501
506
|
|
502
507
|
|
503
|
-
class ComplexSqrtLinCombination(
|
508
|
+
class ComplexSqrtLinCombination():
|
504
509
|
"""
|
505
510
|
A pair (real, imag) of SqrtLinCombinations representing the complex number
|
506
511
|
real + imag * I. Supports ``real()``, ``imag()``, ``+``, ``-``, ``*``, ``/``,
|
507
512
|
``abs``, ``conjugate()`` and ``==``.
|
508
513
|
"""
|
509
514
|
|
510
|
-
def __init__(self, real, imag
|
515
|
+
def __init__(self, real, imag=0, embed_cache=None):
|
511
516
|
if isinstance(real, SqrtLinCombination):
|
512
517
|
self._real = real
|
513
518
|
else:
|
514
519
|
self._real = SqrtLinCombination(
|
515
520
|
real,
|
516
|
-
embed_cache
|
521
|
+
embed_cache=embed_cache)
|
517
522
|
|
518
523
|
if isinstance(imag, SqrtLinCombination):
|
519
524
|
self._imag = imag
|
520
525
|
else:
|
521
526
|
self._imag = SqrtLinCombination(
|
522
527
|
imag,
|
523
|
-
embed_cache
|
528
|
+
embed_cache=embed_cache)
|
524
529
|
|
525
530
|
def __repr__(self):
|
526
531
|
return "ComplexSqrtLinCombination(%r, %r)" % (self._real, self._imag)
|
@@ -547,7 +552,7 @@ class ComplexSqrtLinCombination(object):
|
|
547
552
|
def __add__(self, other):
|
548
553
|
if not isinstance(other, ComplexSqrtLinCombination):
|
549
554
|
return self + ComplexSqrtLinCombination(other)
|
550
|
-
|
555
|
+
|
551
556
|
return ComplexSqrtLinCombination(self._real + other._real,
|
552
557
|
self._imag + other._imag)
|
553
558
|
|
@@ -604,7 +609,7 @@ class ComplexSqrtLinCombination(object):
|
|
604
609
|
|
605
610
|
def __ne__(self, other):
|
606
611
|
return not (self == other)
|
607
|
-
|
612
|
+
|
608
613
|
def __lt__(self, other):
|
609
614
|
raise TypeError('No order on complex numbers.')
|
610
615
|
|
@@ -627,11 +632,13 @@ class ComplexSqrtLinCombination(object):
|
|
627
632
|
# And just pair
|
628
633
|
return CIF(RIF(self._real), RIF(self._imag))
|
629
634
|
|
635
|
+
|
630
636
|
class _SqrtException(Exception):
|
631
637
|
pass
|
632
638
|
|
633
|
-
|
634
|
-
|
639
|
+
|
640
|
+
class _FactorizedSqrtLinCombination():
|
641
|
+
def __init__(self, d={}, embed_cache=None):
|
635
642
|
# c_1 * sqrt(r_{1,1}) * sqrt(r_{1,2}) * ... * sqrt(r_{1,k_1})
|
636
643
|
# + c_2 * sqrt(r_{2,1}) * sqrt(r_{2,2}) * ... * sqrt(r_{2,k_2})
|
637
644
|
# + ...
|
@@ -652,23 +659,21 @@ class _FactorizedSqrtLinCombination(object):
|
|
652
659
|
def _real_mpfi_(self, RIF):
|
653
660
|
|
654
661
|
def eval_term(k, v):
|
655
|
-
# Evaluate one term
|
662
|
+
# Evaluate one term
|
656
663
|
# c_i * sqrt(r_{i,1}) * sqrt(r_{i,2}) * ... * sqrt(r_{i,k_2})
|
657
664
|
# where c_i is stored in v
|
658
665
|
# and k is the set of r_{i,j}
|
659
|
-
|
666
|
+
|
660
667
|
# Take the product of all r_{i,j} after converting to intervals
|
661
|
-
|
662
|
-
|
663
|
-
[_to_RIF(t, RIF, self._embed_cache) for t in k],
|
664
|
-
RIF(1))
|
668
|
+
pr = prod([_to_RIF(t, RIF, self._embed_cache) for t in k],
|
669
|
+
RIF(1))
|
665
670
|
|
666
671
|
# Raise exception if interval isn't positive
|
667
|
-
if not
|
672
|
+
if not pr > 0:
|
668
673
|
raise _SqrtException()
|
669
674
|
|
670
675
|
# Return interval for term
|
671
|
-
return
|
676
|
+
return pr.sqrt() * _to_RIF(v, RIF, self._embed_cache)
|
672
677
|
|
673
678
|
# Sum over all terms
|
674
679
|
return sum([eval_term(k, v) for k, v in self._dict.items()], RIF(0))
|
@@ -699,9 +704,9 @@ class _FactorizedSqrtLinCombination(object):
|
|
699
704
|
else:
|
700
705
|
return frozenset([k])
|
701
706
|
|
702
|
-
return _FactorizedSqrtLinCombination(
|
703
|
-
|
704
|
-
embed_cache
|
707
|
+
return _FactorizedSqrtLinCombination({
|
708
|
+
to_set(k): v for k, v in l._dict.items()},
|
709
|
+
embed_cache=l._embed_cache)
|
705
710
|
|
706
711
|
def __add__(self, other):
|
707
712
|
# Add
|
@@ -712,12 +717,12 @@ class _FactorizedSqrtLinCombination(object):
|
|
712
717
|
d[k] = d.get(k, 0) + v
|
713
718
|
return _FactorizedSqrtLinCombination(
|
714
719
|
d,
|
715
|
-
embed_cache
|
720
|
+
embed_cache=_get_embed_cache(self, other))
|
716
721
|
|
717
722
|
def __neg__(self):
|
718
723
|
return _FactorizedSqrtLinCombination(
|
719
|
-
|
720
|
-
embed_cache
|
724
|
+
{k: -v for k, v in self._dict.items()},
|
725
|
+
embed_cache=self._embed_cache)
|
721
726
|
|
722
727
|
def __sub__(self, other):
|
723
728
|
return self + (-other)
|
@@ -734,22 +739,22 @@ class _FactorizedSqrtLinCombination(object):
|
|
734
739
|
#
|
735
740
|
# If sqrt(r) appears in both terms, it becomes
|
736
741
|
# sqrt(r) * sqrt(r) = r and is multiplied into the coefficient
|
737
|
-
# (this is done by
|
742
|
+
# (this is done by prod(k1 & k2), _One).
|
738
743
|
# A sqrt(r) appearing only appearing in one term survives
|
739
744
|
# (k1^k2)
|
740
745
|
|
741
746
|
k = k1 ^ k2
|
742
|
-
v = v1 * v2 *
|
747
|
+
v = v1 * v2 * prod(k1 & k2, _One)
|
743
748
|
d[k] = d.get(k, 0) + v
|
744
749
|
return _FactorizedSqrtLinCombination(
|
745
|
-
d, embed_cache
|
750
|
+
d, embed_cache=_get_embed_cache(self, other))
|
746
751
|
|
747
752
|
def is_zero(self):
|
748
753
|
"""
|
749
754
|
Returns True if it is zero, False otherwise.
|
750
755
|
"""
|
751
756
|
|
752
|
-
# Implements the algorithm for operator == described in
|
757
|
+
# Implements the algorithm for operator == described in
|
753
758
|
# SqrtLinCombination
|
754
759
|
|
755
760
|
# The case of no terms n = 0
|
@@ -765,18 +770,18 @@ class _FactorizedSqrtLinCombination(object):
|
|
765
770
|
operator.and_, self._dict.keys())
|
766
771
|
|
767
772
|
# Factor them out
|
768
|
-
d =
|
773
|
+
d = {k - common_terms: v for k, v in self._dict.items()}
|
769
774
|
|
770
775
|
# Pick one r_{i,j}
|
771
776
|
term = _firstfirst(d.keys())
|
772
|
-
|
777
|
+
|
773
778
|
# Split the summands into "left" and "right"
|
774
779
|
left = _FactorizedSqrtLinCombination(
|
775
|
-
|
776
|
-
embed_cache
|
780
|
+
{ k: v for k, v in d.items() if term in k },
|
781
|
+
embed_cache=self._embed_cache)
|
777
782
|
right = _FactorizedSqrtLinCombination(
|
778
|
-
|
779
|
-
embed_cache
|
783
|
+
{ k: v for k, v in d.items() if term not in k},
|
784
|
+
embed_cache=self._embed_cache)
|
780
785
|
|
781
786
|
# Check left^2 - right^2 == 0
|
782
787
|
if not (left * left - right * right).is_zero():
|
@@ -792,10 +797,10 @@ class _FactorizedSqrtLinCombination(object):
|
|
792
797
|
while True:
|
793
798
|
# Determine signs, None indicates the signs couldn't be certified
|
794
799
|
opposite_signs = _opposite_signs(left, right, prec)
|
795
|
-
if
|
800
|
+
if opposite_signs is not None:
|
796
801
|
# Done
|
797
802
|
return opposite_signs
|
798
|
-
|
803
|
+
|
799
804
|
# Otherwise, increase precision
|
800
805
|
prec *= 2
|
801
806
|
|
@@ -820,25 +825,26 @@ def _opposite_signs(left, right, prec):
|
|
820
825
|
# It just means we need to use higher precision.
|
821
826
|
# So just return "None" to indicate failed certification.
|
822
827
|
return None
|
823
|
-
|
828
|
+
|
824
829
|
# Try to determine sign of left expression.
|
825
|
-
left_negative
|
826
|
-
left_positive
|
827
|
-
left_determined
|
828
|
-
|
830
|
+
left_negative = bool(left_interval < 0)
|
831
|
+
left_positive = bool(left_interval > 0)
|
832
|
+
left_determined = left_negative or left_positive
|
833
|
+
|
829
834
|
# Try to determine sign of right expression
|
830
|
-
right_negative
|
831
|
-
right_positive
|
835
|
+
right_negative = bool(right_interval < 0)
|
836
|
+
right_positive = bool(right_interval > 0)
|
832
837
|
right_determined = right_negative or right_positive
|
833
|
-
|
838
|
+
|
834
839
|
# If both signs could be determined
|
835
840
|
if left_determined and right_determined:
|
836
841
|
# Return true if and only if signs are opposite
|
837
842
|
return left_positive ^ right_positive
|
838
|
-
|
843
|
+
|
839
844
|
# At least one sign couldn't be determined.
|
840
845
|
return None
|
841
846
|
|
847
|
+
|
842
848
|
def _first(iterable):
|
843
849
|
"""
|
844
850
|
Return first element of iterable.
|
@@ -846,6 +852,7 @@ def _first(iterable):
|
|
846
852
|
for i in iterable:
|
847
853
|
return i
|
848
854
|
|
855
|
+
|
849
856
|
def _firstfirst(iterable):
|
850
857
|
"""
|
851
858
|
Given a nested iterable, i.e., list of lists, return the first element
|
@@ -855,20 +862,14 @@ def _firstfirst(iterable):
|
|
855
862
|
for j in i:
|
856
863
|
return j
|
857
864
|
|
858
|
-
def _prod(s):
|
859
|
-
"""
|
860
|
-
The product of the elements in s. Returns Sage Integer(1)
|
861
|
-
when s is empty.
|
862
|
-
"""
|
863
|
-
return reduce(operator.mul, s, _One)
|
864
865
|
|
865
866
|
def _filter_zero(d):
|
866
867
|
"""
|
867
868
|
Given a dict, filter out all items where the value is 0.
|
868
869
|
"""
|
870
|
+
return {k: v for k, v in d.items() if v != 0}
|
871
|
+
|
869
872
|
|
870
|
-
return dict( (k, v) for k, v in d.items() if not v == 0)
|
871
|
-
|
872
873
|
def _convert_to_allowed_type(number):
|
873
874
|
"""
|
874
875
|
When given a Python int, convert to Sage Integer (so that
|
@@ -887,6 +888,7 @@ def _convert_to_allowed_type(number):
|
|
887
888
|
|
888
889
|
raise Exception("Not an allowed type")
|
889
890
|
|
891
|
+
|
890
892
|
def _get_embed_cache(l1, l2):
|
891
893
|
"""
|
892
894
|
Given objects of type SqrtLinCombination or _FactorizedSqrtLinCombination
|
@@ -900,7 +902,7 @@ def _get_embed_cache(l1, l2):
|
|
900
902
|
for l in [l1, l2]:
|
901
903
|
if ((isinstance(l, SqrtLinCombination) or
|
902
904
|
isinstance(l, _FactorizedSqrtLinCombination)) and
|
903
|
-
|
905
|
+
l._embed_cache is not None):
|
904
906
|
return l._embed_cache
|
905
907
|
|
906
908
|
return None
|
@@ -932,33 +934,34 @@ def _get_interval_embedding_from_cache(nf, RIF, cache):
|
|
932
934
|
# print("Warning: No cache used")
|
933
935
|
|
934
936
|
# The key 'gen_embedding' holds the value of nf.gen_embedding()
|
935
|
-
if
|
937
|
+
if cache is not None and 'gen_embedding' in cache:
|
936
938
|
# We can read it from cache
|
937
939
|
gen_embedding = cache['gen_embedding']
|
938
940
|
else:
|
939
941
|
# We need to evaluate it
|
940
942
|
gen_embedding = nf.gen_embedding()
|
941
|
-
if
|
943
|
+
if cache is not None:
|
942
944
|
# Save in cache for future use
|
943
945
|
cache['gen_embedding'] = gen_embedding
|
944
946
|
|
945
947
|
# Get the desired precision of the RealIntervalField
|
946
948
|
prec = RIF.prec()
|
947
949
|
# The precision (which is an int) is the key into the cache
|
948
|
-
if
|
950
|
+
if cache is not None and prec in cache:
|
949
951
|
# RIF(nf.gen_embedding()) is in the cache
|
950
952
|
# We can just return the result
|
951
953
|
return cache[prec]
|
952
|
-
|
954
|
+
|
953
955
|
# We need to actually compute it.
|
954
956
|
interval = RIF(gen_embedding)
|
955
|
-
if
|
957
|
+
if cache is not None:
|
956
958
|
# Save in cache for future use.
|
957
959
|
cache[prec] = interval
|
958
960
|
|
959
961
|
return interval
|
960
962
|
|
961
|
-
|
963
|
+
|
964
|
+
def _to_RIF(x, RIF, embed_cache=None):
|
962
965
|
"""
|
963
966
|
Given a Sage Integer, Rational or an element x in a
|
964
967
|
Sage NumberField with a real embedding and an instance
|
@@ -996,6 +999,7 @@ def _to_RIF(x, RIF, embed_cache = None):
|
|
996
999
|
# at the root
|
997
1000
|
return x.lift()(root)
|
998
1001
|
|
1002
|
+
|
999
1003
|
if __name__ == '__main__':
|
1000
1004
|
import doctest
|
1001
1005
|
doctest.testmod()
|
snappy/verify/test.py
CHANGED
@@ -1,32 +1,19 @@
|
|
1
|
-
from snappy import
|
2
|
-
|
3
|
-
from snappy.sage_helper import _within_sage, doctest_modules
|
4
|
-
import sys, getopt
|
1
|
+
from snappy import testing
|
2
|
+
import snappy
|
5
3
|
|
6
|
-
|
7
|
-
for n in ['m009', 'm015', 't02333', 't02333(1,2)',
|
8
|
-
'm129(2,3)', 'm129(2,3)(3,4)']:
|
9
|
-
M = Manifold(n)
|
10
|
-
high_prec = M.tetrahedra_shapes('rect', bits_prec = 1000)
|
11
|
-
|
12
|
-
intervals = M.tetrahedra_shapes('rect', bits_prec = 100,
|
13
|
-
intervals = True)
|
14
|
-
|
15
|
-
for z, interval in zip(high_prec, intervals):
|
16
|
-
if not abs(interval.center() - z) < 1e-10:
|
17
|
-
raise Exception
|
18
|
-
|
19
|
-
if not z in interval:
|
20
|
-
raise Exception
|
4
|
+
from snappy import verify
|
21
5
|
|
22
6
|
def generate_test_with_shapes_engine(module, engine):
|
23
|
-
def result(verbose):
|
24
|
-
globs = {'Manifold':Manifold}
|
7
|
+
def result(verbose, print_info=True):
|
8
|
+
globs = {'Manifold' : snappy.Manifold}
|
25
9
|
|
26
10
|
original = verify.CertifiedShapesEngine
|
27
11
|
verify.CertifiedShapesEngine = engine
|
28
12
|
|
29
|
-
r = doctest_modules([module],
|
13
|
+
r = testing.doctest_modules([ module ],
|
14
|
+
verbose=verbose,
|
15
|
+
print_info=print_info,
|
16
|
+
extraglobs=globs)
|
30
17
|
|
31
18
|
verify.CertifiedShapesEngine = original
|
32
19
|
|
@@ -36,41 +23,56 @@ def generate_test_with_shapes_engine(module, engine):
|
|
36
23
|
|
37
24
|
return result
|
38
25
|
|
26
|
+
modules = [
|
27
|
+
generate_test_with_shapes_engine(
|
28
|
+
verify.krawczyk_shapes_engine,
|
29
|
+
verify.KrawczykShapesEngine),
|
30
|
+
generate_test_with_shapes_engine(
|
31
|
+
verify.interval_newton_shapes_engine,
|
32
|
+
verify.IntervalNewtonShapesEngine),
|
33
|
+
generate_test_with_shapes_engine(
|
34
|
+
verify.hyperbolicity,
|
35
|
+
verify.KrawczykShapesEngine),
|
36
|
+
generate_test_with_shapes_engine(
|
37
|
+
verify.hyperbolicity,
|
38
|
+
verify.IntervalNewtonShapesEngine),
|
39
|
+
verify.canonical,
|
40
|
+
verify.interval_tree,
|
41
|
+
verify.volume,
|
42
|
+
verify.upper_halfspace.ideal_point,
|
43
|
+
verify.upper_halfspace.finite_point,
|
44
|
+
verify.upper_halfspace.extended_matrix,
|
45
|
+
verify.maximal_cusp_area_matrix,
|
46
|
+
verify.maximal_cusp_area_matrix.cusp_tiling_engine,
|
47
|
+
verify.maximal_cusp_area_matrix.cusp_translate_engine,
|
48
|
+
verify.square_extensions,
|
49
|
+
verify.real_algebra
|
50
|
+
]
|
51
|
+
|
39
52
|
def run_doctests(verbose=False, print_info=True):
|
40
|
-
globs = {'Manifold':Manifold}
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
upper_halfspace.finite_point,
|
64
|
-
upper_halfspace.extended_matrix,
|
65
|
-
verify.maximal_cusp_area_matrix,
|
66
|
-
verify.maximal_cusp_area_matrix.cusp_tiling_engine,
|
67
|
-
verify.maximal_cusp_area_matrix.cusp_translate_engine,
|
68
|
-
verify.squareExtensions,
|
69
|
-
verify.realAlgebra ],
|
70
|
-
extraglobs=globs,
|
71
|
-
verbose=verbose, print_info=print_info)
|
53
|
+
globs = {'Manifold' : snappy.Manifold}
|
54
|
+
return testing.doctest_modules(modules,
|
55
|
+
verbose=verbose,
|
56
|
+
print_info=print_info,
|
57
|
+
extraglobs=globs)
|
58
|
+
|
59
|
+
run_doctests.__name__ = verify.__name__
|
60
|
+
|
61
|
+
def check_certified_intervals():
|
62
|
+
for n in ['m009', 'm015', 't02333', 't02333(1,2)',
|
63
|
+
'm129(2,3)', 'm129(2,3)(3,4)']:
|
64
|
+
M = Manifold(n)
|
65
|
+
high_prec = M.tetrahedra_shapes('rect', bits_prec=1000)
|
66
|
+
|
67
|
+
intervals = M.tetrahedra_shapes('rect', bits_prec=100,
|
68
|
+
intervals=True)
|
69
|
+
|
70
|
+
for z, interval in zip(high_prec, intervals):
|
71
|
+
if not abs(interval.center() - z) < 1e-10:
|
72
|
+
raise Exception
|
73
|
+
|
74
|
+
if z not in interval:
|
75
|
+
raise Exception
|
72
76
|
|
73
77
|
if __name__ == '__main__':
|
74
|
-
|
75
|
-
verbose = len(optlist) > 0
|
76
|
-
run_doctests(verbose)
|
78
|
+
testing.run_doctests_as_main(run_doctests)
|