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,8 +1,8 @@
|
|
1
|
-
from __future__ import print_function
|
2
1
|
from .polynomial import Polynomial
|
3
2
|
from .component import NonZeroDimensionalComponent
|
4
3
|
from ..pari import pari
|
5
4
|
|
5
|
+
|
6
6
|
def numerical_solutions_with_one(polys):
|
7
7
|
|
8
8
|
solutions = numerical_solutions(polys)
|
@@ -13,8 +13,9 @@ def numerical_solutions_with_one(polys):
|
|
13
13
|
|
14
14
|
return solutions
|
15
15
|
|
16
|
+
|
16
17
|
class PariPolynomialAndVariables:
|
17
|
-
def __init__(self, polynomial, variables
|
18
|
+
def __init__(self, polynomial, variables=None):
|
18
19
|
|
19
20
|
if isinstance(polynomial, Polynomial):
|
20
21
|
|
@@ -32,21 +33,21 @@ class PariPolynomialAndVariables:
|
|
32
33
|
def substitute(self, var, value):
|
33
34
|
|
34
35
|
return PariPolynomialAndVariables(
|
35
|
-
polynomial
|
36
|
-
variables
|
37
|
-
|
36
|
+
polynomial=self.pari_polynomial.substpol(var, value),
|
37
|
+
variables=[ v for v in self.variables if not v == var ])
|
38
38
|
|
39
39
|
def get_roots(self):
|
40
40
|
return self.pari_polynomial.polroots(
|
41
|
-
precision
|
41
|
+
precision=3.4 * pari.get_real_precision())
|
42
|
+
|
42
43
|
|
43
44
|
def numerical_solutions(polys):
|
44
45
|
|
45
46
|
# Divide out lowest power variables
|
46
|
-
polysReduced = [ poly.factor_out_variables() for poly in polys ]
|
47
|
+
polysReduced = [ poly.factor_out_variables() for poly in polys ]
|
47
48
|
|
48
49
|
# Filter out 0
|
49
|
-
polysFiltered = [ poly
|
50
|
+
polysFiltered = [ poly
|
50
51
|
for poly in polysReduced
|
51
52
|
if (not poly.is_constant()) or poly.get_constant() == 0 ]
|
52
53
|
|
@@ -58,26 +59,29 @@ def numerical_solutions(polys):
|
|
58
59
|
|
59
60
|
polysAndVars = [
|
60
61
|
PariPolynomialAndVariables(poly) for poly in polysFiltered ]
|
61
|
-
|
62
|
+
|
62
63
|
solutions = _numerical_solutions_recursion(polysAndVars, { })
|
63
64
|
|
64
65
|
number_variables = (
|
65
66
|
len(
|
66
67
|
set(sum(
|
67
68
|
[poly.variables() for poly in polys],[ ]))))
|
68
|
-
|
69
|
+
|
69
70
|
return [
|
70
|
-
solution if len(solution) == number_variables
|
71
|
+
solution if len(solution) == number_variables
|
71
72
|
else NonZeroDimensionalComponent()
|
72
73
|
for solution in solutions]
|
73
74
|
|
75
|
+
|
74
76
|
def _get_first(l):
|
75
77
|
if l:
|
76
78
|
return l[0]
|
77
79
|
return None
|
78
80
|
|
81
|
+
|
79
82
|
def _remove(l, element):
|
80
|
-
return [x for x in l if
|
83
|
+
return [x for x in l if x is not element]
|
84
|
+
|
81
85
|
|
82
86
|
def _numerical_solutions_recursion(polysAndVars, solutionDict):
|
83
87
|
|
@@ -88,10 +92,10 @@ def _numerical_solutions_recursion(polysAndVars, solutionDict):
|
|
88
92
|
for poly in polysAndVars
|
89
93
|
if poly.get_variable_if_univariate() ])
|
90
94
|
|
91
|
-
if
|
95
|
+
if univariatePoly is not None:
|
92
96
|
variable = univariatePoly.get_variable_if_univariate()
|
93
97
|
variableDicts = [ ]
|
94
|
-
|
98
|
+
|
95
99
|
for solution in univariatePoly.get_roots():
|
96
100
|
|
97
101
|
newSolutionDict = solutionDict.copy()
|
snappy/ptolemy/polynomial.py
CHANGED
@@ -1,28 +1,23 @@
|
|
1
|
-
from __future__ import print_function
|
2
|
-
|
3
1
|
import re
|
4
2
|
import operator
|
5
3
|
from fractions import Fraction
|
6
|
-
import sys
|
7
|
-
if sys.version > '3':
|
8
|
-
long = int
|
9
|
-
unicode = str
|
10
4
|
|
11
5
|
#######################################################
|
12
|
-
|
6
|
+
# Public Definitions of Monomial and Polynomial class
|
13
7
|
|
14
|
-
# The coefficients of a polynomial can be any type, the
|
15
|
-
# policy for mixed coefficients is defined in
|
8
|
+
# The coefficients of a polynomial can be any type, the
|
9
|
+
# policy for mixed coefficients is defined in
|
16
10
|
# _storage_type_policy and _operator_type_policy.
|
17
11
|
|
18
|
-
|
12
|
+
# Definition of Monomial Class
|
13
|
+
|
19
14
|
|
20
|
-
class Monomial(
|
15
|
+
class Monomial():
|
21
16
|
|
22
17
|
@classmethod
|
23
18
|
def from_variable_name(cls, var):
|
24
19
|
"""Construct a monomial with a single variable given as a string."""
|
25
|
-
assert isinstance(var, str)
|
20
|
+
assert isinstance(var, str)
|
26
21
|
return Monomial(1, ((var, 1),))
|
27
22
|
|
28
23
|
# Constructs a constant monomial
|
@@ -48,7 +43,7 @@ class Monomial(object):
|
|
48
43
|
else:
|
49
44
|
assert isinstance(vars, tuple)
|
50
45
|
for var, expo in vars:
|
51
|
-
assert isinstance(var, str)
|
46
|
+
assert isinstance(var, str)
|
52
47
|
assert isinstance(expo, int)
|
53
48
|
assert expo > 0
|
54
49
|
self._vars = vars
|
@@ -71,15 +66,17 @@ class Monomial(object):
|
|
71
66
|
e.g., "+ 3 * x".
|
72
67
|
"""
|
73
68
|
|
74
|
-
v = [
|
75
|
-
else "%s^%s" % (var, expo)
|
69
|
+
v = [var if expo == 1
|
70
|
+
else "%s^%s" % (var, expo)
|
76
71
|
for var, expo in self._vars]
|
77
72
|
|
78
73
|
coefficient_sign, coefficient_str = (
|
79
74
|
print_coefficient_method(self._coefficient))
|
80
75
|
|
81
|
-
if coefficient_str:
|
82
|
-
|
76
|
+
if coefficient_str:
|
77
|
+
v = [coefficient_str] + v
|
78
|
+
if not v:
|
79
|
+
v = ["1"]
|
83
80
|
|
84
81
|
sign_less_str = " * ".join(v)
|
85
82
|
|
@@ -87,9 +84,9 @@ class Monomial(object):
|
|
87
84
|
return coefficient_sign + " " + sign_less_str
|
88
85
|
|
89
86
|
return sign_less_str
|
90
|
-
|
87
|
+
|
91
88
|
def get_coefficient(self):
|
92
|
-
"""Return the coefficient."""
|
89
|
+
"""Return the coefficient."""
|
93
90
|
return self._coefficient
|
94
91
|
|
95
92
|
def coefficient_type(self):
|
@@ -106,7 +103,7 @@ class Monomial(object):
|
|
106
103
|
"""Return a list containing the variable names."""
|
107
104
|
return [var[0] for var in self._vars if var[1] > 0]
|
108
105
|
|
109
|
-
def degree(self, var
|
106
|
+
def degree(self, var=None):
|
110
107
|
"""Return the total degree of this monomial."""
|
111
108
|
return sum([this_degree
|
112
109
|
for this_var, this_degree in self._vars
|
@@ -123,24 +120,24 @@ class Monomial(object):
|
|
123
120
|
|
124
121
|
# Compute the variables
|
125
122
|
var_dict = _combine_dicts(
|
126
|
-
[dict(self._vars),dict(other._vars)],
|
123
|
+
[dict(self._vars), dict(other._vars)],
|
127
124
|
operator.add)
|
128
125
|
|
129
126
|
return Monomial(coefficient, var_dict)
|
130
127
|
|
131
128
|
def __pow__(self, other):
|
132
|
-
|
129
|
+
|
133
130
|
assert isinstance(other, int)
|
134
131
|
assert other >= 0
|
135
|
-
|
132
|
+
|
136
133
|
if other == 0:
|
137
134
|
return Monomial.constant_monomial(1)
|
138
135
|
if other == 1:
|
139
136
|
return self
|
140
|
-
if other % 2
|
141
|
-
return self * (self ** (other-1))
|
142
|
-
return (self * self) ** (other//2)
|
143
|
-
|
137
|
+
if other % 2:
|
138
|
+
return self * (self ** (other - 1))
|
139
|
+
return (self * self) ** (other // 2)
|
140
|
+
|
144
141
|
def __neg__(self):
|
145
142
|
"""Negate this monomial."""
|
146
143
|
return Monomial(-self._coefficient, self._vars)
|
@@ -165,7 +162,7 @@ class Monomial(object):
|
|
165
162
|
|
166
163
|
def split_variable(self, variable):
|
167
164
|
"""Split the specified variable from the others."""
|
168
|
-
remaining_terms = {
|
165
|
+
remaining_terms = {}
|
169
166
|
exponent = 0
|
170
167
|
for var, expo in self._vars:
|
171
168
|
if var == variable:
|
@@ -180,13 +177,13 @@ class Monomial(object):
|
|
180
177
|
|
181
178
|
vars = [(var, expo - d[var]) for var, expo in self._vars]
|
182
179
|
vars = tuple([(var, expo) for var, expo in vars if expo > 0])
|
183
|
-
|
180
|
+
|
184
181
|
return Monomial(self.get_coefficient(), vars)
|
185
182
|
|
186
183
|
|
187
|
-
|
184
|
+
# Definition of Polynomial class
|
188
185
|
|
189
|
-
class Polynomial(
|
186
|
+
class Polynomial():
|
190
187
|
|
191
188
|
"""
|
192
189
|
>>> m1 = Monomial(1, (('t', 1), ('x', 1), ('y', 1)))
|
@@ -257,16 +254,16 @@ class Polynomial(object):
|
|
257
254
|
@classmethod
|
258
255
|
def constant_polynomial(cls, constant):
|
259
256
|
"""Construct a constant polynomial."""
|
260
|
-
return Polynomial(
|
257
|
+
return Polynomial((Monomial.constant_monomial(constant),))
|
261
258
|
|
262
259
|
@classmethod
|
263
260
|
def from_variable_name(cls, var):
|
264
261
|
"""Construct a polynomial consisting of a single variable."""
|
265
|
-
return Polynomial(
|
262
|
+
return Polynomial((Monomial.from_variable_name(var),))
|
266
263
|
|
267
|
-
|
264
|
+
# constructor takes a tuple of polynomials which are combined
|
268
265
|
|
269
|
-
def __init__(self, monomials
|
266
|
+
def __init__(self, monomials=()):
|
270
267
|
|
271
268
|
# combine monomials with the same variables and exponents
|
272
269
|
# and bring them into canonical order
|
@@ -278,7 +275,7 @@ class Polynomial(object):
|
|
278
275
|
# and value being the coefficient
|
279
276
|
|
280
277
|
list_of_vars_coeff_dicts = [
|
281
|
-
{
|
278
|
+
{monomial.get_vars(): monomial.get_coefficient()}
|
282
279
|
for monomial in monomials]
|
283
280
|
|
284
281
|
# combine the dictionaries using sum
|
@@ -319,28 +316,28 @@ class Polynomial(object):
|
|
319
316
|
if isinstance(other, Polynomial):
|
320
317
|
assert other.is_constant()
|
321
318
|
other = other.get_constant()
|
322
|
-
|
319
|
+
|
323
320
|
assert isinstance(other, int)
|
324
321
|
assert other >= 0
|
325
322
|
if other == 0:
|
326
323
|
return Polynomial((Monomial.constant_monomial(1),))
|
327
324
|
if other == 1:
|
328
325
|
return self
|
329
|
-
if other % 2
|
330
|
-
return self * (self ** (other-1))
|
331
|
-
return (self * self) ** (other//2)
|
326
|
+
if other % 2:
|
327
|
+
return self * (self ** (other - 1))
|
328
|
+
return (self * self) ** (other // 2)
|
332
329
|
|
333
330
|
def __mul__(self, other):
|
334
331
|
monomials = []
|
335
|
-
|
332
|
+
|
336
333
|
for m in self._monomials:
|
337
334
|
for n in other._monomials:
|
338
335
|
monomials.append(m * n)
|
339
|
-
|
336
|
+
|
340
337
|
return Polynomial(tuple(monomials))
|
341
338
|
|
342
339
|
def __mod__(self, other):
|
343
|
-
|
340
|
+
|
344
341
|
assert isinstance(other, Polynomial)
|
345
342
|
assert self.is_univariate()
|
346
343
|
assert other.is_univariate()
|
@@ -351,10 +348,10 @@ class Polynomial(object):
|
|
351
348
|
|
352
349
|
other = other.convert_coefficients(Fraction)
|
353
350
|
other = other * Polynomial.constant_polynomial(
|
354
|
-
Fraction(1,1) / other.leading_coefficient())
|
351
|
+
Fraction(1, 1) / other.leading_coefficient())
|
355
352
|
|
356
353
|
variable = other.variables()[0]
|
357
|
-
assert ((not other.variables())
|
354
|
+
assert ((not other.variables())
|
358
355
|
or other.variables()[0] == variable)
|
359
356
|
|
360
357
|
rest = self
|
@@ -381,7 +378,7 @@ class Polynomial(object):
|
|
381
378
|
|
382
379
|
def to_string(self, print_coefficient_method):
|
383
380
|
s = " ".join([monomial.to_string(print_coefficient_method,
|
384
|
-
force_print_sign
|
381
|
+
force_print_sign=True)
|
385
382
|
for monomial in self._monomials])
|
386
383
|
if s and s[0] == '+':
|
387
384
|
return s[1:].lstrip()
|
@@ -391,15 +388,14 @@ class Polynomial(object):
|
|
391
388
|
"""Convert all coefficients using conversion_function."""
|
392
389
|
|
393
390
|
return Polynomial(tuple(
|
394
|
-
|
395
|
-
|
396
|
-
|
391
|
+
[monomial.convert_coefficient(conversion_function)
|
392
|
+
for monomial in self._monomials]))
|
393
|
+
|
397
394
|
def substitute(self, d):
|
398
|
-
"""
|
395
|
+
"""
|
399
396
|
Take a dictionary mapping variable name -> polynomial and
|
400
397
|
replace each variable by the corresponding polynomial.
|
401
398
|
"""
|
402
|
-
|
403
399
|
variables = self.variables()
|
404
400
|
|
405
401
|
skip_computation = True
|
@@ -410,18 +406,18 @@ class Polynomial(object):
|
|
410
406
|
|
411
407
|
if skip_computation:
|
412
408
|
return self
|
413
|
-
|
409
|
+
|
414
410
|
def substitute_monomial(monomial):
|
415
411
|
vars = monomial.get_vars()
|
416
412
|
new_vars = []
|
417
413
|
|
418
414
|
for var, expo in vars:
|
419
415
|
if var not in d:
|
420
|
-
new_vars.append((var,expo))
|
416
|
+
new_vars.append((var, expo))
|
421
417
|
|
422
418
|
poly = Polynomial((
|
423
|
-
|
424
|
-
|
419
|
+
Monomial(monomial.get_coefficient(),
|
420
|
+
tuple(new_vars)),))
|
425
421
|
|
426
422
|
for var, expo in vars:
|
427
423
|
if var in d:
|
@@ -430,8 +426,8 @@ class Polynomial(object):
|
|
430
426
|
return poly
|
431
427
|
|
432
428
|
return sum([substitute_monomial(monomial)
|
433
|
-
|
434
|
-
|
429
|
+
for monomial in self._monomials], Polynomial(()))
|
430
|
+
|
435
431
|
def variables(self):
|
436
432
|
"""Return a list of all variables in the polynomial."""
|
437
433
|
all_variables = [monomial.variables() for monomial in self._monomials]
|
@@ -478,11 +474,11 @@ class Polynomial(object):
|
|
478
474
|
"""Assert univariance; return True iff this polynomial is monic."""
|
479
475
|
return self.leading_coefficient() == 1
|
480
476
|
|
481
|
-
def get_coefficients(self, conversion_function
|
477
|
+
def get_coefficients(self, conversion_function=lambda x: x):
|
482
478
|
"""Assert univariance; return the coefficients in degree order."""
|
483
479
|
assert self.is_univariate()
|
484
480
|
degree = self.degree()
|
485
|
-
list_of_coefficients = (degree + 1) * [
|
481
|
+
list_of_coefficients = (degree + 1) * [conversion_function(0)]
|
486
482
|
for monomial in self._monomials:
|
487
483
|
list_of_coefficients[degree - monomial.degree()] = (
|
488
484
|
conversion_function(monomial.get_coefficient()))
|
@@ -532,8 +528,8 @@ class Polynomial(object):
|
|
532
528
|
return self._monomials
|
533
529
|
|
534
530
|
def factor_out_variables(self):
|
535
|
-
|
536
|
-
if self._monomials
|
531
|
+
|
532
|
+
if not self._monomials:
|
537
533
|
return self
|
538
534
|
|
539
535
|
def intersect(lists):
|
@@ -543,45 +539,47 @@ class Polynomial(object):
|
|
543
539
|
return s
|
544
540
|
|
545
541
|
non_trivial_variables = intersect(
|
546
|
-
[
|
542
|
+
[monomial.variables() for monomial in self._monomials])
|
547
543
|
|
548
|
-
lowest_powers =
|
544
|
+
lowest_powers = {var: 1000000 for var in non_trivial_variables}
|
549
545
|
|
550
|
-
def safe_dict(d,var):
|
546
|
+
def safe_dict(d, var):
|
551
547
|
if var in d:
|
552
548
|
return d[var]
|
553
|
-
|
554
|
-
return 0
|
549
|
+
return 0
|
555
550
|
|
556
551
|
for monomial in self._monomials:
|
557
552
|
for var, expo in monomial.get_vars():
|
558
|
-
lowest_powers[var] = min(safe_dict(lowest_powers,var), expo)
|
553
|
+
lowest_powers[var] = min(safe_dict(lowest_powers, var), expo)
|
559
554
|
|
560
|
-
return Polynomial(tuple([
|
561
|
-
|
555
|
+
return Polynomial(tuple([monomial.reduce_exponents(lowest_powers)
|
556
|
+
for monomial in self._monomials]))
|
562
557
|
|
563
558
|
###############################################################
|
564
|
-
|
559
|
+
# Default functions for parsing and printing the coefficients
|
560
|
+
|
561
|
+
# The user will rewrite these for other types and supply to
|
562
|
+
# the respective methods of Monomial and Polynomial.
|
565
563
|
|
566
|
-
### The user will rewrite these for other types and supply to
|
567
|
-
### the respective methods of Monomial and Polynomial.
|
568
564
|
|
569
565
|
def parse_int_coefficient(s):
|
570
|
-
coeff, rest = re.match('([0-9]*)(.*)',s).groups()
|
566
|
+
coeff, rest = re.match('([0-9]*)(.*)', s).groups()
|
571
567
|
if coeff:
|
572
568
|
coeff = int(coeff)
|
573
569
|
else:
|
574
570
|
coeff = None
|
575
571
|
return coeff, rest
|
576
572
|
|
573
|
+
|
577
574
|
def parse_int_or_fraction(s):
|
578
|
-
m = re.match('([0-9]+/[0-9]+)(.*)',s)
|
575
|
+
m = re.match('([0-9]+/[0-9]+)(.*)', s)
|
579
576
|
if m:
|
580
577
|
frac, rest = m.groups()
|
581
578
|
return Fraction(frac), rest
|
582
|
-
|
579
|
+
|
583
580
|
return parse_int_coefficient(s)
|
584
581
|
|
582
|
+
|
585
583
|
def parenthesis_coefficient_method(i):
|
586
584
|
if isinstance(i, int) or isinstance(i, Fraction):
|
587
585
|
return default_print_coefficient_method(i)
|
@@ -589,6 +587,7 @@ def parenthesis_coefficient_method(i):
|
|
589
587
|
else:
|
590
588
|
return '+', '(%s)' % repr(i)
|
591
589
|
|
590
|
+
|
592
591
|
def default_print_coefficient_method(i):
|
593
592
|
try:
|
594
593
|
sign = '+' if i >= 0 else '-'
|
@@ -597,9 +596,10 @@ def default_print_coefficient_method(i):
|
|
597
596
|
else:
|
598
597
|
print_str = str(abs(i))
|
599
598
|
return sign, print_str
|
600
|
-
except:
|
599
|
+
except (TypeError, ValueError):
|
601
600
|
return uncomparable_print_coefficient_method(i)
|
602
601
|
|
602
|
+
|
603
603
|
def uncomparable_print_coefficient_method(i):
|
604
604
|
print_str = str(i)
|
605
605
|
if '+' in print_str or '-' in print_str:
|
@@ -607,19 +607,20 @@ def uncomparable_print_coefficient_method(i):
|
|
607
607
|
else:
|
608
608
|
return '+', print_str
|
609
609
|
|
610
|
+
|
610
611
|
##############################################################################
|
611
|
-
|
612
|
+
# Private Definitions
|
612
613
|
|
613
|
-
|
614
|
-
|
614
|
+
# Methods defining what coefficient types can be mixed a polynomial
|
615
|
+
# Type Mixing Policy: only int can be mixed with another type
|
615
616
|
|
616
617
|
def _storage_type_policy(type_a, type_b):
|
617
618
|
assert isinstance(type_a, type)
|
618
619
|
assert isinstance(type_b, type)
|
619
|
-
|
620
|
-
if type_a in [int
|
620
|
+
|
621
|
+
if type_a in [int]:
|
621
622
|
return type_b
|
622
|
-
if type_b in [int
|
623
|
+
if type_b in [int]:
|
623
624
|
return type_a
|
624
625
|
|
625
626
|
if not type_a == type_b:
|
@@ -629,63 +630,67 @@ def _storage_type_policy(type_a, type_b):
|
|
629
630
|
|
630
631
|
return type_a
|
631
632
|
|
632
|
-
|
633
|
+
|
634
|
+
def _operator_type_policy(obj_a, obj_b, op=operator.add):
|
633
635
|
|
634
636
|
try:
|
635
637
|
|
636
638
|
if type(obj_a) == type(obj_b):
|
637
639
|
return op(obj_a, obj_b)
|
638
|
-
if type(obj_a) in [int
|
640
|
+
if type(obj_a) in [int]:
|
639
641
|
return op(type(obj_b)(obj_a), obj_b)
|
640
|
-
if type(obj_b) in [int
|
642
|
+
if type(obj_b) in [int]:
|
641
643
|
return op(type(obj_a)(obj_b), obj_a)
|
642
644
|
|
643
645
|
raise Exception
|
644
646
|
|
645
|
-
except:
|
647
|
+
except (TypeError, ValueError):
|
646
648
|
|
647
649
|
print(obj_a, obj_b)
|
648
650
|
print(type(obj_a), type(obj_b))
|
649
|
-
|
650
|
-
raise Exception("In _operatore_type_policy, cannot apply operator")
|
651
651
|
|
652
|
-
|
652
|
+
raise Exception("In _operator_type_policy, cannot apply operator")
|
653
|
+
|
654
|
+
# Definitions of parsable operators and their precedence
|
655
|
+
|
653
656
|
|
654
657
|
_operators = {
|
655
|
-
'+'
|
656
|
-
'-'
|
657
|
-
'*'
|
658
|
-
'^'
|
659
|
-
}
|
658
|
+
'+': operator.add,
|
659
|
+
'-': operator.sub,
|
660
|
+
'*': operator.mul,
|
661
|
+
'^': operator.pow}
|
660
662
|
|
661
663
|
_operator_precedence = {
|
662
|
-
None
|
663
|
-
'+'
|
664
|
-
'-'
|
665
|
-
'*'
|
666
|
-
'^'
|
667
|
-
|
664
|
+
None: 0,
|
665
|
+
'+': 1,
|
666
|
+
'-': 1,
|
667
|
+
'*': 2,
|
668
|
+
'^': 3}
|
669
|
+
|
668
670
|
|
669
671
|
def _apply_operator(op, l, r):
|
670
|
-
return _operators[op](l,r)
|
672
|
+
return _operators[op](l, r)
|
673
|
+
|
674
|
+
# Helper functions for parsing
|
671
675
|
|
672
|
-
### Helper functions for parsing
|
673
676
|
|
674
677
|
def _coefficient_is_non_trivial(c):
|
675
678
|
|
676
679
|
if isinstance(c, Polynomial):
|
677
680
|
return c._monomials
|
678
|
-
|
681
|
+
|
679
682
|
return not c == 0
|
680
683
|
|
684
|
+
|
681
685
|
def _parse_variable(s):
|
682
|
-
r = re.match(r'([_A-Za-z][_A-Za-z0-9]*)(.*)$',s)
|
686
|
+
r = re.match(r'([_A-Za-z][_A-Za-z0-9]*)(.*)$', s)
|
683
687
|
if r:
|
684
688
|
return r.groups()
|
685
689
|
else:
|
686
690
|
return None, s
|
687
691
|
|
688
|
-
|
692
|
+
# Parsing function for Polynomial
|
693
|
+
|
689
694
|
|
690
695
|
def _parse_polynomial_from_string(s, parse_coefficient_function):
|
691
696
|
|
@@ -697,7 +702,7 @@ def _parse_polynomial_from_string(s, parse_coefficient_function):
|
|
697
702
|
|
698
703
|
# Has there been an operand since the opening parenthesis
|
699
704
|
# e.g. parse things like "(+ x)"
|
700
|
-
no_operand_since_opening_parenthesis = [
|
705
|
+
no_operand_since_opening_parenthesis = [True]
|
701
706
|
|
702
707
|
def debug_print(s):
|
703
708
|
print("=" * 75)
|
@@ -708,19 +713,19 @@ def _parse_polynomial_from_string(s, parse_coefficient_function):
|
|
708
713
|
# pop the top operator from the stack and apply it to the
|
709
714
|
# two top operands from the stack, repeat as long as there are preceding
|
710
715
|
# operators left on the stack.
|
711
|
-
def eval_preceding_operators_on_stack(operator
|
716
|
+
def eval_preceding_operators_on_stack(operator=None):
|
712
717
|
while operator_stack:
|
713
718
|
top_operator = operator_stack[-1]
|
714
|
-
|
719
|
+
|
715
720
|
# stop if the top operator is "("
|
716
721
|
if top_operator == '(':
|
717
722
|
return
|
718
|
-
|
723
|
+
|
719
724
|
# or if the top operator is not preceding
|
720
725
|
if (_operator_precedence[top_operator] <
|
721
|
-
|
726
|
+
_operator_precedence[operator]):
|
722
727
|
return
|
723
|
-
|
728
|
+
|
724
729
|
top_operator = operator_stack.pop()
|
725
730
|
r = operand_stack.pop()
|
726
731
|
l = operand_stack.pop()
|
@@ -735,7 +740,7 @@ def _parse_polynomial_from_string(s, parse_coefficient_function):
|
|
735
740
|
|
736
741
|
# parse constants or variables and push them onto the operand stack
|
737
742
|
constant, rest = parse_coefficient_function(s)
|
738
|
-
if
|
743
|
+
if constant is not None:
|
739
744
|
operand_stack.append(Polynomial.constant_polynomial(constant))
|
740
745
|
no_operand_since_opening_parenthesis[0] = False
|
741
746
|
return rest
|
@@ -753,8 +758,8 @@ def _parse_polynomial_from_string(s, parse_coefficient_function):
|
|
753
758
|
# onto the operand stack as to emulate parsing "(0 + 3)"
|
754
759
|
|
755
760
|
next_char, rest = s[0], s[1:]
|
756
|
-
|
757
|
-
if next_char in
|
761
|
+
|
762
|
+
if next_char in _operators:
|
758
763
|
operator = next_char
|
759
764
|
eval_preceding_operators_on_stack(operator)
|
760
765
|
operator_stack.append(operator)
|
@@ -791,7 +796,7 @@ def _parse_polynomial_from_string(s, parse_coefficient_function):
|
|
791
796
|
s = process_next_token(s)
|
792
797
|
|
793
798
|
# finish any remaining operators on the stack
|
794
|
-
# debug_print(s)
|
799
|
+
# debug_print(s)
|
795
800
|
eval_preceding_operators_on_stack(None)
|
796
801
|
# debug_print(s)
|
797
802
|
|
@@ -807,11 +812,12 @@ def _parse_polynomial_from_string(s, parse_coefficient_function):
|
|
807
812
|
assert (len(operand_stack) == 1
|
808
813
|
or (
|
809
814
|
len(operand_stack) == 2 and
|
810
|
-
operand_stack[0] == Polynomial()))
|
815
|
+
operand_stack[0] == Polynomial()))
|
811
816
|
|
812
817
|
return operand_stack[-1]
|
813
818
|
|
814
|
-
|
819
|
+
|
820
|
+
# ## Other help functions to deal with the internal representation
|
815
821
|
|
816
822
|
# take a dictionary and turn it into a tuple of pairs sorted by keys
|
817
823
|
|
@@ -821,11 +827,11 @@ def _dict_to_ordered_tuple_of_pairs(d):
|
|
821
827
|
... { 'key3':'value3', 'key1':'value1', 'key2':'value2' })
|
822
828
|
(('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3'))
|
823
829
|
"""
|
824
|
-
|
825
830
|
l = list(d.items())
|
826
|
-
l.sort(key
|
831
|
+
l.sort(key=lambda x: x[0])
|
827
832
|
return tuple(l)
|
828
833
|
|
834
|
+
|
829
835
|
# given a list of dictionaries, combine values of the different
|
830
836
|
# dictionaries having the same key using combine_function.
|
831
837
|
|