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,3 @@
|
|
1
|
-
from __future__ import print_function
|
2
|
-
|
3
1
|
from . import matrix
|
4
2
|
from . import homology
|
5
3
|
from .ptolemyObstructionClass import PtolemyObstructionClass
|
@@ -7,13 +5,14 @@ from .ptolemyGeneralizedObstructionClass import PtolemyGeneralizedObstructionCla
|
|
7
5
|
from .ptolemyVariety import PtolemyVariety
|
8
6
|
from .utilities import MethodMappingList
|
9
7
|
|
8
|
+
|
10
9
|
def _gcd(s, t):
|
11
10
|
if t == 0:
|
12
11
|
return s
|
13
12
|
return _gcd(t, s % t)
|
14
13
|
|
15
|
-
def get_ptolemy_obstruction_classes(manifold):
|
16
14
|
|
15
|
+
def get_ptolemy_obstruction_classes(manifold):
|
17
16
|
"""
|
18
17
|
Generates a list of obstruction cocycles representing each class in
|
19
18
|
H^2(M,bd M; Z/2) suitable as argument for get_ptolemy_variety.
|
@@ -22,39 +21,39 @@ def get_ptolemy_obstruction_classes(manifold):
|
|
22
21
|
See Definition 1.7 of
|
23
22
|
Garoufalidis, Thurston, Zickert
|
24
23
|
The Complex Volume of SL(n,C)-Representations of 3-Manifolds
|
25
|
-
|
24
|
+
https://arxiv.org/abs/1111.2828
|
26
25
|
|
27
26
|
s_f_t takes values +/-1 and is the value of evaluating the cocycle on
|
28
27
|
face f of tetrahedron t.
|
29
28
|
|
30
|
-
|
29
|
+
**Examples**
|
31
30
|
|
32
31
|
Get the obstruction classes for 4_1:
|
33
|
-
|
32
|
+
|
34
33
|
>>> from snappy import Manifold
|
35
34
|
>>> M = Manifold("4_1")
|
36
35
|
>>> c = get_ptolemy_obstruction_classes(M)
|
37
36
|
|
38
|
-
There are two such
|
39
|
-
|
37
|
+
There are two such classes for 4_1:
|
38
|
+
|
40
39
|
>>> len(c)
|
41
40
|
2
|
42
|
-
|
41
|
+
|
43
42
|
Print the non-trivial obstruction class:
|
44
43
|
|
45
44
|
>>> c[1]
|
46
45
|
PtolemyObstructionClass(s_0_0 + 1, s_1_0 - 1, s_2_0 - 1, s_3_0 + 1, s_0_0 - s_0_1, s_1_0 - s_3_1, s_2_0 - s_2_1, s_3_0 - s_1_1)
|
47
46
|
|
48
47
|
Construct Ptolemy variety for non-trivial obstruction class:
|
49
|
-
|
48
|
+
|
50
49
|
>>> p = get_ptolemy_variety(M, N = 2, obstruction_class = c[1])
|
51
50
|
|
52
51
|
Short cut for the above code:
|
53
|
-
|
52
|
+
|
54
53
|
>>> p = get_ptolemy_variety(M, N = 2, obstruction_class = 1)
|
55
54
|
|
56
55
|
Obstruction class only makes sense for even N:
|
57
|
-
|
56
|
+
|
58
57
|
>>> p = get_ptolemy_variety(M, N = 3, obstruction_class = c[1])
|
59
58
|
Traceback (most recent call last):
|
60
59
|
...
|
@@ -62,7 +61,7 @@ def get_ptolemy_obstruction_classes(manifold):
|
|
62
61
|
|
63
62
|
|
64
63
|
When specifying N = 3, it automatically uses generalized obstruction class.
|
65
|
-
|
64
|
+
|
66
65
|
>>> len(get_ptolemy_variety(M, N = 3, obstruction_class = 'all'))
|
67
66
|
2
|
68
67
|
"""
|
@@ -81,8 +80,8 @@ def get_ptolemy_obstruction_classes(manifold):
|
|
81
80
|
for index, H2_element
|
82
81
|
in enumerate(H2_elements)]
|
83
82
|
|
84
|
-
def get_generalized_ptolemy_obstruction_classes(manifold, N):
|
85
83
|
|
84
|
+
def get_generalized_ptolemy_obstruction_classes(manifold, N):
|
86
85
|
"""
|
87
86
|
See SnapPy.pyx for documentation
|
88
87
|
|
@@ -96,7 +95,7 @@ def get_generalized_ptolemy_obstruction_classes(manifold, N):
|
|
96
95
|
[PtolemyGeneralizedObstructionClass([0, 0, 0, 0]), PtolemyGeneralizedObstructionClass([3, 0, 0, 1]), PtolemyGeneralizedObstructionClass([2, 0, 0, 2])]
|
97
96
|
>>> get_generalized_ptolemy_obstruction_classes(M, 5)
|
98
97
|
[PtolemyGeneralizedObstructionClass([0, 0, 0, 0]), PtolemyGeneralizedObstructionClass([4, 0, 0, 1])]
|
99
|
-
|
98
|
+
|
100
99
|
>>> M = Manifold("m202")
|
101
100
|
>>> len(get_generalized_ptolemy_obstruction_classes(M, 2))
|
102
101
|
4
|
@@ -104,7 +103,7 @@ def get_generalized_ptolemy_obstruction_classes(manifold, N):
|
|
104
103
|
5
|
105
104
|
>>> len(get_generalized_ptolemy_obstruction_classes(M, 4))
|
106
105
|
10
|
107
|
-
|
106
|
+
|
108
107
|
>>> M = Manifold("m207")
|
109
108
|
>>> len(get_generalized_ptolemy_obstruction_classes(M, 2))
|
110
109
|
2
|
@@ -129,11 +128,11 @@ def get_generalized_ptolemy_obstruction_classes(manifold, N):
|
|
129
128
|
already_seen.add(
|
130
129
|
tuple([(x * u) % N for x in H2_element]))
|
131
130
|
|
132
|
-
return [PtolemyGeneralizedObstructionClass(H2_element, index
|
133
|
-
N
|
131
|
+
return [PtolemyGeneralizedObstructionClass(H2_element, index=index,
|
132
|
+
N=N, manifold=manifold)
|
134
133
|
for index, H2_element
|
135
134
|
in enumerate(filtered_H2_elements)]
|
136
|
-
|
135
|
+
|
137
136
|
|
138
137
|
def get_obstruction_classes(manifold, N):
|
139
138
|
|
@@ -150,77 +149,78 @@ def get_obstruction_classes(manifold, N):
|
|
150
149
|
return (homology.homology_representatives(cochain_d2, cochain_d1, N),
|
151
150
|
explain_columns)
|
152
151
|
|
152
|
+
|
153
153
|
class PtolemyVarietyList(list):
|
154
154
|
def retrieve_decomposition(self, *args, **kwargs):
|
155
155
|
return MethodMappingList(
|
156
156
|
[ p.retrieve_decomposition(*args, **kwargs)
|
157
157
|
for p in self ])
|
158
|
+
|
158
159
|
def compute_decomposition(self, *args, **kwargs):
|
159
160
|
return MethodMappingList(
|
160
161
|
[ p.compute_decomposition(*args, **kwargs)
|
161
162
|
for p in self ])
|
163
|
+
|
162
164
|
def retrieve_solutions(self, *args, **kwargs):
|
163
165
|
return MethodMappingList(
|
164
166
|
[ p.retrieve_solutions(*args, **kwargs)
|
165
167
|
for p in self ])
|
168
|
+
|
166
169
|
def compute_solutions(self, *args, **kwargs):
|
167
170
|
return MethodMappingList(
|
168
171
|
[ p.compute_solutions(*args, **kwargs)
|
169
172
|
for p in self ])
|
170
|
-
|
171
173
|
|
172
|
-
def get_ptolemy_variety(manifold, N, obstruction_class = None,
|
173
|
-
simplify = True, eliminate_fixed_ptolemys = False):
|
174
174
|
|
175
|
+
def get_ptolemy_variety(manifold, N, obstruction_class = None,
|
176
|
+
simplify : bool =True,
|
177
|
+
eliminate_fixed_ptolemys : bool =False):
|
175
178
|
"""
|
176
179
|
Generates Ptolemy variety as described in
|
177
180
|
(1) Garoufalidis, Thurston, Zickert
|
178
181
|
The Complex Volume of SL(n,C)-Representations of 3-Manifolds
|
179
|
-
|
180
|
-
|
182
|
+
https://arxiv.org/abs/1111.2828
|
183
|
+
|
181
184
|
(2) Garoufalidis, Goerner, Zickert:
|
182
|
-
Gluing Equations for PGL(n,C)-Representations of 3-Manifolds
|
183
|
-
|
185
|
+
Gluing Equations for PGL(n,C)-Representations of 3-Manifolds
|
186
|
+
https://arxiv.org/abs/1207.6711
|
184
187
|
|
185
188
|
The variety can be exported to magma or sage and solved there. The
|
186
189
|
solutions can be processed to compute invariants. See below.
|
187
190
|
|
188
|
-
|
191
|
+
:param N: which SL(N,C) we want the variety.
|
189
192
|
|
190
|
-
|
193
|
+
:param obstruction_class: class from Definition 1.7 of (1).
|
194
|
+
``None`` for trivial class,
|
195
|
+
a value returned from :meth:`get_ptolemy_obstruction_classes`,
|
196
|
+
an integer indexing the obstruction classes returned from
|
197
|
+
:meth:`get_ptolemy_obstruction_classes`,
|
198
|
+
or 'all' to return a list of Ptolemy varieties, one for each
|
199
|
+
obstruction class.
|
191
200
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
for each obstruction. For easier iteration, can set obstruction_class to
|
196
|
-
an integer.
|
201
|
+
:param simplify: indicate whether to simplify the equations which
|
202
|
+
significantly reduces the number of variables. Simplifying means that several identified Ptolemy coordinates :math:`x = y = z = ...`
|
203
|
+
are eliminated instead of adding relations :math:`x - y = 0, y - z = 0, ...`
|
197
204
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
Defaults to True.
|
205
|
+
:param eliminate_fixed_ptolemys: boolean to indicate whether to eliminate
|
206
|
+
the Ptolemy coordinates that are set to 1 for fixing the decoration.
|
207
|
+
Even though this simplifies the resulting representation, setting it to
|
208
|
+
``True`` can cause magma to run longer when finding a Groebner basis.
|
203
209
|
|
204
|
-
|
205
|
-
the Ptolemy coordinates that are set to 1 for fixing the decoration.
|
206
|
-
Even though this simplifies the resulting representation, setting it to
|
207
|
-
True can cause magma to run longer when finding a Groebner basis.
|
208
|
-
Defaults to False.
|
210
|
+
**Examples for 4_1**
|
209
211
|
|
210
|
-
=== Examples for 4_1 ===
|
211
|
-
|
212
212
|
>>> from snappy import Manifold
|
213
213
|
>>> M = Manifold("4_1")
|
214
214
|
|
215
215
|
Get the varieties for all obstruction classes at once (use
|
216
216
|
help(varieties[0]) for more information):
|
217
|
-
|
217
|
+
|
218
218
|
>>> varieties = get_ptolemy_variety(M, N = 2, obstruction_class = "all")
|
219
219
|
|
220
220
|
Print the variety as an ideal (sage object) for the non-trivial class:
|
221
221
|
|
222
222
|
>>> varieties[1].ideal #doctest: +SKIP
|
223
|
-
Ideal (-c_0011_0^2 + c_0011_0*c_0101_0 + c_0101_0^2, -c_0011_0^2 - c_0011_0*c_0101_0 + c_0101_0^2, c_0011_0 - 1) of Multivariate Polynomial Ring in c_0011_0, c_0101_0 over Rational Field
|
223
|
+
Ideal (-c_0011_0^2 + c_0011_0*c_0101_0 + c_0101_0^2, -c_0011_0^2 - c_0011_0*c_0101_0 + c_0101_0^2, c_0011_0 - 1) of Multivariate Polynomial Ring in c_0011_0, c_0101_0 over Rational Field
|
224
224
|
(skip doctest because example only works in sage and not plain python)
|
225
225
|
|
226
226
|
>>> for eqn in varieties[1].equations:
|
@@ -230,7 +230,7 @@ def get_ptolemy_variety(manifold, N, obstruction_class = None,
|
|
230
230
|
- 1 + c_0011_0
|
231
231
|
|
232
232
|
Generate a magma input to compute Groebner basis for N = 3:
|
233
|
-
|
233
|
+
|
234
234
|
>>> p = get_ptolemy_variety(M, N = 3)
|
235
235
|
>>> s = p.to_magma()
|
236
236
|
|
@@ -246,20 +246,20 @@ def get_ptolemy_variety(manifold, N, obstruction_class = None,
|
|
246
246
|
|
247
247
|
|
248
248
|
|
249
|
-
|
249
|
+
**If you have a magma installation**
|
250
250
|
|
251
251
|
Call p.compute_solutions() to automatically call magma on the above output
|
252
252
|
and produce exact solutions!!!
|
253
|
-
|
253
|
+
|
254
254
|
>>> try:
|
255
255
|
... sols = p.compute_solutions(verbose)
|
256
256
|
... except:
|
257
257
|
... sols = None # magma failed, use precomputed output instead
|
258
258
|
|
259
|
-
|
259
|
+
**If you do not have a magma installation**
|
260
260
|
|
261
261
|
Load a precomputed example from magma which is provided with the package:
|
262
|
-
|
262
|
+
|
263
263
|
>>> from snappy.ptolemy.processMagmaFile import _magma_output_for_4_1__sl3, solutions_from_magma, triangulation_from_magma
|
264
264
|
>>> print(_magma_output_for_4_1__sl3) #doctest: +ELLIPSIS
|
265
265
|
<BLANKLINE>
|
@@ -280,11 +280,11 @@ def get_ptolemy_variety(manifold, N, obstruction_class = None,
|
|
280
280
|
>>> if sols is None: # calling magma failed, so use precomputed example
|
281
281
|
... sols = solutions_from_magma(_magma_output_for_4_1__sl3)
|
282
282
|
|
283
|
-
|
283
|
+
**Continue here whether you have or do not have magma**
|
284
284
|
|
285
285
|
Pick the first solution of the three different solutions (up to Galois
|
286
286
|
conjugates):
|
287
|
-
|
287
|
+
|
288
288
|
>>> len(sols)
|
289
289
|
3
|
290
290
|
>>> solution = sols[0]
|
@@ -304,10 +304,10 @@ def get_ptolemy_variety(manifold, N, obstruction_class = None,
|
|
304
304
|
>>> len(simplified.equations), len(full.equations)
|
305
305
|
(24, 72)
|
306
306
|
|
307
|
-
|
307
|
+
**ONLY DOCTESTS, NOT PART OF DOCUMENTATION**
|
308
308
|
|
309
309
|
>>> varieties = get_ptolemy_variety(M, N = 2, obstruction_class = "all", eliminate_fixed_ptolemys = True)
|
310
|
-
|
310
|
+
|
311
311
|
>>> for eqn in varieties[1].equations:
|
312
312
|
... print(" ", eqn)
|
313
313
|
1 - c_0101_0 + c_0101_0^2
|
@@ -322,12 +322,12 @@ def get_ptolemy_variety(manifold, N, obstruction_class = None,
|
|
322
322
|
...
|
323
323
|
|
324
324
|
"""
|
325
|
-
|
325
|
+
|
326
326
|
if hasattr(manifold, 'cusp_info'):
|
327
327
|
if False in manifold.cusp_info('is_complete'):
|
328
328
|
raise Exception("Dehn fillings not supported by Ptolemy variety")
|
329
|
-
|
330
|
-
# Typing M.ptolemy_variety(N = 3, 1) into sage makes
|
329
|
+
|
330
|
+
# Typing M.ptolemy_variety(N = 3, 1) into sage makes
|
331
331
|
# N have type sage.rings.integer.Integer
|
332
332
|
N = int(N)
|
333
333
|
|
@@ -338,8 +338,8 @@ def get_ptolemy_variety(manifold, N, obstruction_class = None,
|
|
338
338
|
isinstance(obstruction_class, PtolemyGeneralizedObstructionClass)):
|
339
339
|
return PtolemyVariety(
|
340
340
|
manifold, N, obstruction_class,
|
341
|
-
simplify
|
342
|
-
eliminate_fixed_ptolemys
|
341
|
+
simplify=simplify,
|
342
|
+
eliminate_fixed_ptolemys=eliminate_fixed_ptolemys)
|
343
343
|
|
344
344
|
# Will we return a list of obstruction classes versus a list
|
345
345
|
list_obstruction_classes = False
|
@@ -360,7 +360,7 @@ def get_ptolemy_variety(manifold, N, obstruction_class = None,
|
|
360
360
|
manifold, N)
|
361
361
|
list_obstruction_classes = True
|
362
362
|
else:
|
363
|
-
# New mode:
|
363
|
+
# New mode:
|
364
364
|
if N == 2:
|
365
365
|
# N = 2 uses Z/2-obstruction class (so that we can compute
|
366
366
|
# complex volume)
|
@@ -374,23 +374,22 @@ def get_ptolemy_variety(manifold, N, obstruction_class = None,
|
|
374
374
|
# List all obstruction classes
|
375
375
|
if obstruction_class == 'all':
|
376
376
|
list_obstruction_classes = True
|
377
|
-
|
377
|
+
|
378
378
|
# Give a list of all obstruction classes
|
379
379
|
if list_obstruction_classes:
|
380
380
|
return PtolemyVarietyList([
|
381
381
|
PtolemyVariety(
|
382
382
|
manifold, N, obstruction_class,
|
383
|
-
simplify
|
384
|
-
eliminate_fixed_ptolemys
|
383
|
+
simplify=simplify,
|
384
|
+
eliminate_fixed_ptolemys=eliminate_fixed_ptolemys)
|
385
385
|
for obstruction_class in obstruction_classes])
|
386
|
-
|
386
|
+
|
387
387
|
# Otherwise try to interpret obstruction_class as an index
|
388
388
|
try:
|
389
389
|
obstruction_class = obstruction_classes[int(obstruction_class)]
|
390
|
-
except:
|
390
|
+
except (KeyError, IndexError):
|
391
391
|
raise Exception("Bad index for obstruction class")
|
392
392
|
|
393
393
|
return PtolemyVariety(manifold, N, obstruction_class,
|
394
|
-
simplify
|
395
|
-
eliminate_fixed_ptolemys
|
396
|
-
|
394
|
+
simplify=simplify,
|
395
|
+
eliminate_fixed_ptolemys=eliminate_fixed_ptolemys)
|
snappy/ptolemy/matrix.py
CHANGED
@@ -1,53 +1,64 @@
|
|
1
|
-
from __future__ import print_function
|
2
|
-
|
3
1
|
from ..pari import pari
|
4
2
|
import fractions
|
5
3
|
|
4
|
+
|
6
5
|
def num_rows(m):
|
7
6
|
return len(m)
|
8
7
|
|
8
|
+
|
9
9
|
def num_cols(m):
|
10
10
|
if len(m) == 0:
|
11
11
|
return 0
|
12
12
|
return len(m[0])
|
13
13
|
|
14
|
+
|
14
15
|
def col_is_zero(m, col):
|
15
16
|
if col < 0:
|
16
17
|
return True
|
17
18
|
for row in m:
|
18
|
-
if not row[col]==0:
|
19
|
+
if not row[col] == 0:
|
19
20
|
return False
|
20
21
|
return True
|
21
22
|
|
23
|
+
|
22
24
|
def max_abs_of_col(m, col):
|
23
25
|
return max([abs(row[col]) for row in m])
|
24
26
|
|
27
|
+
|
25
28
|
def row_is_zero(m, row):
|
26
29
|
if row < 0:
|
27
30
|
return True
|
28
31
|
return is_vector_zero(m[row])
|
29
32
|
|
33
|
+
|
30
34
|
def max_abs_of_row(m, row):
|
31
35
|
return max([abs(x) for x in m[row]])
|
32
36
|
|
37
|
+
|
33
38
|
def vector_add(v1, v2):
|
34
39
|
return [x1 + x2 for x1, x2 in zip(v1, v2)]
|
35
40
|
|
41
|
+
|
36
42
|
def matrix_diagonal(m):
|
37
43
|
return [r[i] for i, r in enumerate(m)]
|
38
44
|
|
45
|
+
|
39
46
|
def matrix_trace(m):
|
40
47
|
return sum(matrix_diagonal(m))
|
41
48
|
|
49
|
+
|
42
50
|
def matrix_mult_vector(m, v):
|
43
51
|
return [_inner_product(row, v) for row in m]
|
44
52
|
|
53
|
+
|
45
54
|
def matrix_add(m1, m2):
|
46
55
|
return [[c1 + c2 for c1, c2 in zip(r1, r2)] for r1, r2 in zip(m1, m2)]
|
47
56
|
|
57
|
+
|
48
58
|
def matrix_sub(m1, m2):
|
49
59
|
return [[c1 - c2 for c1, c2 in zip(r1, r2)] for r1, r2 in zip(m1, m2)]
|
50
60
|
|
61
|
+
|
51
62
|
def matrix_mult(m, n):
|
52
63
|
num_rows_m = num_rows(m)
|
53
64
|
num_cols_m = num_cols(m)
|
@@ -62,30 +73,35 @@ def matrix_mult(m, n):
|
|
62
73
|
return [ [ compute_entry(i,j) for j in range(num_cols_n) ]
|
63
74
|
for i in range(num_rows_m) ]
|
64
75
|
|
76
|
+
|
65
77
|
def vector_modulo(v, mod):
|
66
78
|
return [x % mod for x in v]
|
67
79
|
|
80
|
+
|
68
81
|
def matrix_modulo(m, mod):
|
69
82
|
return [vector_modulo(row, mod) for row in m]
|
70
83
|
|
84
|
+
|
71
85
|
def is_vector_zero(v):
|
72
86
|
for e in v:
|
73
87
|
if not e == 0:
|
74
88
|
return False
|
75
89
|
return True
|
76
90
|
|
91
|
+
|
77
92
|
def is_matrix_zero(m):
|
78
93
|
for row in m:
|
79
94
|
if not is_vector_zero(row):
|
80
95
|
return False
|
81
96
|
return True
|
82
97
|
|
98
|
+
|
83
99
|
def matrix_transpose(m):
|
84
100
|
if len(m) == 0:
|
85
101
|
return []
|
86
|
-
|
102
|
+
|
87
103
|
return [[m[r][c] for r in range(len(m))]
|
88
|
-
for c in range(len(m[0]))]
|
104
|
+
for c in range(len(m[0]))]
|
89
105
|
|
90
106
|
|
91
107
|
def simultaneous_smith_normal_form(in1, in2):
|
@@ -99,13 +115,13 @@ def simultaneous_smith_normal_form(in1, in2):
|
|
99
115
|
matrix_mult(
|
100
116
|
matrix_inverse(v1), in2)) == d2
|
101
117
|
|
102
|
-
|
103
118
|
# d1 d2 are m and n in new system
|
104
119
|
# next three are coordinate changes in groups
|
105
|
-
|
120
|
+
|
106
121
|
return (u1, matrix_mult(v1, u2), v2,
|
107
122
|
d1, d2)
|
108
123
|
|
124
|
+
|
109
125
|
def test_simultaneous_smith_normal_form(in1, in2, u0, u1, u2, d1, d2):
|
110
126
|
_assert_at_most_one_zero_entry_per_row_or_column(d1)
|
111
127
|
_assert_at_most_one_zero_entry_per_row_or_column(d2)
|
@@ -117,8 +133,10 @@ def test_simultaneous_smith_normal_form(in1, in2, u0, u1, u2, d1, d2):
|
|
117
133
|
assert is_matrix_zero(matrix_mult(in1, in2))
|
118
134
|
assert is_matrix_zero(matrix_mult(d1, d2))
|
119
135
|
|
136
|
+
|
120
137
|
def has_full_rank(matrix):
|
121
|
-
return len(_internal_to_pari(matrix).mattranspose().matker(flag
|
138
|
+
return len(_internal_to_pari(matrix).mattranspose().matker(flag=1)) == 0
|
139
|
+
|
122
140
|
|
123
141
|
def _debug_print_matrix(m):
|
124
142
|
for row in m:
|
@@ -131,12 +149,14 @@ def _debug_print_matrix(m):
|
|
131
149
|
|
132
150
|
# internal representation of a matrix is as a list of list:
|
133
151
|
# list of rows, each row is a list of columns.
|
152
|
+
|
153
|
+
|
134
154
|
def _pari_to_internal(m):
|
135
155
|
num_cols = len(m)
|
136
156
|
if num_cols == 0:
|
137
157
|
return []
|
138
158
|
num_rows = len(m[0])
|
139
|
-
|
159
|
+
|
140
160
|
def convert(p):
|
141
161
|
d = int(p.denominator())
|
142
162
|
n = int(p.numerator())
|
@@ -147,35 +167,42 @@ def _pari_to_internal(m):
|
|
147
167
|
return [[convert(m[(r,c)]) for c in range(num_cols)]
|
148
168
|
for r in range(num_rows)]
|
149
169
|
|
170
|
+
|
150
171
|
def _internal_to_pari(m):
|
151
172
|
num_rows = len(m)
|
152
173
|
if num_rows == 0:
|
153
174
|
return pari.matrix(0,0)
|
154
175
|
num_cols = len(m[0])
|
155
|
-
|
176
|
+
|
156
177
|
return pari.matrix(
|
157
178
|
num_rows,num_cols,
|
158
179
|
[i for row in m for i in row])
|
159
180
|
|
181
|
+
|
160
182
|
def _expand_square_matrix(m, num_cols_rows):
|
161
183
|
|
162
184
|
def upleft(row):
|
163
185
|
return m[row]
|
186
|
+
|
164
187
|
def upright(row):
|
165
188
|
return [0 for col in range(num_cols_rows)]
|
189
|
+
|
166
190
|
def downleft(row):
|
167
191
|
return [0 for col in range(len(m))]
|
192
|
+
|
168
193
|
def downright(row):
|
169
194
|
return [1 if row == col else 0 for col in range(num_cols_rows)]
|
170
195
|
|
171
|
-
up
|
196
|
+
up = [upleft(row) + upright(row) for row in range(len(m))]
|
172
197
|
down = [downleft(row) + downright(row) for row in range(num_cols_rows)]
|
173
198
|
|
174
199
|
return up + down
|
175
200
|
|
201
|
+
|
176
202
|
def _identity_matrix(s):
|
177
|
-
return _expand_square_matrix([],s)
|
178
|
-
|
203
|
+
return _expand_square_matrix([], s)
|
204
|
+
|
205
|
+
|
179
206
|
def _get_only_non_zero_entry_in_col(m, col):
|
180
207
|
entry = None
|
181
208
|
for row in m:
|
@@ -183,10 +210,11 @@ def _get_only_non_zero_entry_in_col(m, col):
|
|
183
210
|
assert (entry is None), (
|
184
211
|
"more than one non-zero entry in column %d" % col)
|
185
212
|
entry = row[col]
|
186
|
-
if
|
213
|
+
if entry is not None:
|
187
214
|
return entry
|
188
215
|
return 0
|
189
216
|
|
217
|
+
|
190
218
|
def _get_only_non_zero_entry_in_row(m, row):
|
191
219
|
entry = None
|
192
220
|
for i in m[row]:
|
@@ -194,58 +222,67 @@ def _get_only_non_zero_entry_in_row(m, row):
|
|
194
222
|
assert (entry is None), (
|
195
223
|
"more than one non-zero entry in row %d" % row)
|
196
224
|
entry = i
|
197
|
-
if
|
225
|
+
if entry is not None:
|
198
226
|
return entry
|
199
227
|
return 0
|
200
228
|
|
229
|
+
|
201
230
|
def _split_matrix_bottom_zero_rows(m):
|
202
231
|
for number_top_rows in range(len(m), -1, -1):
|
203
232
|
if not row_is_zero(m, number_top_rows - 1):
|
204
233
|
break
|
205
|
-
|
234
|
+
|
206
235
|
return m[:number_top_rows], m[number_top_rows:]
|
207
236
|
|
237
|
+
|
208
238
|
def matrix_inverse(m):
|
209
239
|
return _pari_to_internal(_internal_to_pari(m)**(-1))
|
210
240
|
|
241
|
+
|
211
242
|
def matrix_determinant(m):
|
212
243
|
return _internal_to_pari(m).matdet()
|
213
244
|
|
245
|
+
|
214
246
|
def _inner_product(v1, v2):
|
215
247
|
assert len(v1) == len(v2)
|
216
248
|
return sum([e1 * e2 for e1, e2 in zip(v1, v2)])
|
217
249
|
|
250
|
+
|
218
251
|
def smith_normal_form(m):
|
219
|
-
u, v, d = _internal_to_pari(m).matsnf(flag
|
252
|
+
u, v, d = _internal_to_pari(m).matsnf(flag=1)
|
220
253
|
return (_pari_to_internal(u),
|
221
254
|
_pari_to_internal(v),
|
222
255
|
_pari_to_internal(d))
|
223
256
|
|
257
|
+
|
224
258
|
def _smith_normal_form_with_inverse(m):
|
225
|
-
u, v, d = _internal_to_pari(m).matsnf(flag
|
259
|
+
u, v, d = _internal_to_pari(m).matsnf(flag=1)
|
226
260
|
return (_pari_to_internal(u**(-1)),
|
227
261
|
_pari_to_internal(v),
|
228
262
|
_pari_to_internal(d))
|
229
263
|
|
264
|
+
|
230
265
|
def _bottom_row_stable_smith_normal_form(m):
|
231
266
|
m_up, m_down = _split_matrix_bottom_zero_rows(m)
|
232
|
-
|
267
|
+
|
233
268
|
if len(m_up) == 0:
|
234
269
|
return (_identity_matrix(len(m)),
|
235
270
|
_identity_matrix(len(m[0])),
|
236
271
|
m)
|
237
|
-
|
272
|
+
|
238
273
|
u_upleft, v, d_up = _smith_normal_form_with_inverse(m_up)
|
239
274
|
|
240
275
|
return (_expand_square_matrix(u_upleft, len(m_down)),
|
241
|
-
v,
|
276
|
+
v,
|
242
277
|
d_up + m_down)
|
243
278
|
|
279
|
+
|
244
280
|
def _change_coordinates(u, v, m):
|
245
281
|
return matrix_mult(
|
246
282
|
matrix_mult(
|
247
283
|
matrix_inverse(u), m), v)
|
248
284
|
|
285
|
+
|
249
286
|
def _assert_at_most_one_zero_entry_per_row_or_column(m):
|
250
287
|
for i in range(len(m)):
|
251
288
|
num_non_zero_entries = 0
|
@@ -261,14 +298,15 @@ def _assert_at_most_one_zero_entry_per_row_or_column(m):
|
|
261
298
|
num_non_zero_entries += 1
|
262
299
|
assert num_non_zero_entries < 2
|
263
300
|
|
301
|
+
|
264
302
|
def get_independent_rows(rows, explain_rows,
|
265
|
-
desired_determinant
|
266
|
-
sort_rows_key
|
303
|
+
desired_determinant=None,
|
304
|
+
sort_rows_key=None):
|
267
305
|
|
268
306
|
row_explain_pairs = list(zip(rows, explain_rows))
|
269
307
|
if sort_rows_key:
|
270
308
|
row_explain_pairs.sort(
|
271
|
-
key
|
309
|
+
key=(
|
272
310
|
lambda row_explain_pair: sort_rows_key(
|
273
311
|
row_explain_pair[1])))
|
274
312
|
|
@@ -279,13 +317,14 @@ def get_independent_rows(rows, explain_rows,
|
|
279
317
|
raise Exception("Could not find enough independent rows")
|
280
318
|
|
281
319
|
return result
|
282
|
-
|
320
|
+
|
321
|
+
|
283
322
|
def _get_independent_rows_recursive(row_explain_pairs,
|
284
323
|
length,
|
285
324
|
desired_determinant,
|
286
325
|
selected_rows,
|
287
326
|
selected_explains):
|
288
|
-
|
327
|
+
|
289
328
|
if len(selected_rows) == length:
|
290
329
|
if desired_determinant is None:
|
291
330
|
return selected_explains
|