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,31 +1,34 @@
|
|
1
|
-
|
1
|
+
# $Id: tetrahedron.py,v 1.2 2002/09/20 03:52:16 culler Exp $
|
2
2
|
# t3m - software for studying triangulated 3-manifolds
|
3
3
|
# Copyright (C) 2002 Marc Culler, Nathan Dunfield and others
|
4
4
|
#
|
5
|
-
# This program is distributed under the terms of the
|
5
|
+
# This program is distributed under the terms of the
|
6
6
|
# GNU General Public License, version 2 or later, as published by
|
7
7
|
# the Free Software Foundation. See the file GPL.txt for details.
|
8
8
|
|
9
9
|
from .simplex import *
|
10
|
+
from .perm4 import Perm4, inv
|
11
|
+
|
10
12
|
import sys
|
11
13
|
|
14
|
+
|
12
15
|
class Tetrahedron:
|
13
|
-
def __init__(self, name
|
16
|
+
def __init__(self, name=''):
|
14
17
|
self.Index = -1
|
15
18
|
self.Name = name
|
16
19
|
self.Neighbor = {F0:None,F1:None,F2:None,F3:None} # Tetrahedra
|
17
|
-
self.Gluing
|
18
|
-
self.Class
|
19
|
-
self.Checked
|
20
|
+
self.Gluing = {F0:None,F1:None,F2:None,F3:None} # Permutations
|
21
|
+
self.Class = [None]*16 # list of equivalence classes
|
22
|
+
self.Checked = 0 # flag
|
20
23
|
|
21
24
|
def __repr__(self):
|
22
|
-
if self.Index != -1:
|
23
|
-
return ( 'tet'+ str(self.Index) )
|
25
|
+
if self.Index != -1:
|
26
|
+
return ( 'tet' + str(self.Index) )
|
24
27
|
else:
|
25
28
|
return '< floating tetrahedron ' + ' at ' + str(id(self)) + '>'
|
26
29
|
|
27
30
|
def attach(self, two_subsimplex, tet, perm_data):
|
28
|
-
if tet
|
31
|
+
if tet is None:
|
29
32
|
self.Neighbor[two_subsimplex] = None
|
30
33
|
self.Gluing[two_subsimplex] = None
|
31
34
|
else:
|
@@ -34,31 +37,30 @@ class Tetrahedron:
|
|
34
37
|
self.Gluing[two_subsimplex] = perm
|
35
38
|
tet.Neighbor[perm.image(two_subsimplex)] = self
|
36
39
|
tet.Gluing[perm.image(two_subsimplex)] = inv(self.Gluing[two_subsimplex])
|
37
|
-
|
38
|
-
#
|
39
|
-
#
|
40
|
+
|
41
|
+
# Reverse the orientation. Vertices are relabelled by a transposition
|
42
|
+
# and gluings are adjusted.
|
40
43
|
def reverse(self):
|
41
|
-
transpo = Perm4((1,0,2,3))
|
44
|
+
transpo = Perm4((1, 0, 2, 3))
|
42
45
|
nhbr = self.Neighbor.copy()
|
43
46
|
gluing = self.Gluing.copy()
|
44
47
|
for two_subsimplex in TwoSubsimplices:
|
45
48
|
relabeled = transpo.image(two_subsimplex)
|
46
|
-
if
|
47
|
-
perm = (gluing[two_subsimplex]*transpo).tuple()
|
49
|
+
if nhbr[two_subsimplex] is not None:
|
50
|
+
perm = (gluing[two_subsimplex] * transpo).tuple()
|
48
51
|
else:
|
49
52
|
perm = None
|
50
53
|
self.attach(relabeled, nhbr[two_subsimplex], perm)
|
51
54
|
|
52
|
-
# Unglues and removes references to self from neighbor.
|
53
|
-
#
|
55
|
+
# Unglues and removes references to self from neighbor.
|
54
56
|
def detach(self, two_subsimplex):
|
55
57
|
neighbor = self.Neighbor[two_subsimplex]
|
56
|
-
if neighbor
|
58
|
+
if neighbor is None:
|
57
59
|
return
|
58
60
|
neighbors_subsimplex = self.Gluing[two_subsimplex].image(two_subsimplex)
|
59
61
|
self.Neighbor[two_subsimplex] = None
|
60
62
|
self.Gluing[two_subsimplex] = None
|
61
|
-
if (neighbor.Neighbor and
|
63
|
+
if (neighbor.Neighbor and
|
62
64
|
neighbor.Neighbor[neighbors_subsimplex] == self):
|
63
65
|
neighbor.Neighbor[neighbors_subsimplex] = None
|
64
66
|
neighbor.Gluing[neighbors_subsimplex] = None
|
@@ -72,9 +74,9 @@ class Tetrahedron:
|
|
72
74
|
self.clear_Class()
|
73
75
|
|
74
76
|
def clear_Class(self):
|
75
|
-
self.Class
|
77
|
+
self.Class = [None]*16 # list of equivalence classes
|
76
78
|
|
77
|
-
def info(self, out
|
79
|
+
def info(self, out=sys.stdout):
|
78
80
|
if len(self.Name) == 0:
|
79
81
|
out.write(repr(self) + "\t%s\n" %
|
80
82
|
([self.Neighbor.get(s) for s in TwoSubsimplices]))
|
@@ -84,7 +86,7 @@ class Tetrahedron:
|
|
84
86
|
|
85
87
|
out.write("\t%s\n" % ([self.Gluing.get(s) for s in TwoSubsimplices]))
|
86
88
|
|
87
|
-
out.write("\tVertices: " + repr(self.Class[V0])
|
89
|
+
out.write("\tVertices: " + repr(self.Class[V0])
|
88
90
|
+ repr(self.Class[V1])
|
89
91
|
+ repr(self.Class[V2])
|
90
92
|
+ repr(self.Class[V3]) + '\n')
|
@@ -97,7 +99,7 @@ class Tetrahedron:
|
|
97
99
|
out.write("\tEdges: " + s + '\n')
|
98
100
|
s = ""
|
99
101
|
for edge in OneSubsimplices[3:]:
|
100
|
-
s = (s + "%s : %-10s " %
|
102
|
+
s = (s + "%s : %-10s " %
|
101
103
|
(SubsimplexName[edge], self.Class[edge]))
|
102
104
|
out.write("\t " + s + '\n')
|
103
105
|
|
@@ -105,4 +107,3 @@ class Tetrahedron:
|
|
105
107
|
|
106
108
|
def get_orientation_of_edge(self, a, b):
|
107
109
|
return self.Class[a | b].orientation_with_respect_to(self, a, b)
|
108
|
-
|
snappy/snap/t3mlite/vertex.py
CHANGED
@@ -1,16 +1,11 @@
|
|
1
|
-
|
1
|
+
# $Id: vertex.py,v 1.3 2003/03/07 17:29:28 culler Exp $
|
2
2
|
# t3m - software for studying triangulated 3-manifolds
|
3
3
|
# Copyright (C) 2002 Marc Culler, Nathan Dunfield and others
|
4
4
|
#
|
5
|
-
# This program is distributed under the terms of the
|
5
|
+
# This program is distributed under the terms of the
|
6
6
|
# GNU General Public License, version 2 or later, as published by
|
7
7
|
# the Free Software Foundation. See the file GPL.txt for details.
|
8
8
|
|
9
|
-
from .simplex import *
|
10
|
-
from .tetrahedron import *
|
11
|
-
from .corner import *
|
12
|
-
from .edge import *
|
13
|
-
|
14
9
|
class Vertex:
|
15
10
|
def __init__(self):
|
16
11
|
self.Index = -1
|
@@ -19,9 +14,10 @@ class Vertex:
|
|
19
14
|
self.Edges = [] # incident Edges
|
20
15
|
# An Edge will appear twice if both its endpoints
|
21
16
|
# are equal to this Vertex
|
17
|
+
|
22
18
|
def __repr__(self):
|
23
19
|
if self.Index > -1:
|
24
|
-
return ('v' + str(self.Index)
|
20
|
+
return ('v' + str(self.Index)
|
25
21
|
+ ' (' + self.IntOrBdry + ') ')
|
26
22
|
else:
|
27
23
|
return '< floating vertex' + str(id(self)) + ' >'
|
@@ -36,12 +32,11 @@ class Vertex:
|
|
36
32
|
pass
|
37
33
|
self.Index = -1
|
38
34
|
|
39
|
-
|
40
|
-
# The link of a vertex in an Mcomplex is a surface
|
41
|
-
# of arbitrary genus, possibly with non-empty boundary.
|
42
|
-
# For now I am pretending that links are closed and orientable
|
43
35
|
def link_genus(self):
|
36
|
+
# The link of a vertex in an Mcomplex is a surface
|
37
|
+
# of arbitrary genus, possibly with non-empty boundary.
|
38
|
+
# For now I am pretending that links are closed and orientable
|
44
39
|
sum = 12
|
45
40
|
for edge in self.Edges:
|
46
41
|
sum = sum - 6 + edge.valence()
|
47
|
-
return sum
|
42
|
+
return sum//12
|
snappy/snap/test.py
CHANGED
@@ -1,16 +1,47 @@
|
|
1
|
-
from
|
2
|
-
from ..sage_helper import _within_sage, doctest_modules
|
3
|
-
from ..pari import pari
|
1
|
+
from snappy import testing
|
4
2
|
import snappy
|
5
|
-
|
6
|
-
|
3
|
+
|
4
|
+
from snappy.sage_helper import _within_sage
|
5
|
+
from snappy.pari import pari
|
6
|
+
|
7
|
+
from snappy import snap
|
8
|
+
|
9
|
+
modules = [
|
10
|
+
snap,
|
11
|
+
snap.t3mlite.linalg,
|
12
|
+
snap.t3mlite.mcomplex,
|
13
|
+
snap.t3mlite.perm4,
|
14
|
+
snap.t3mlite.spun,
|
15
|
+
snap.character_varieties,
|
16
|
+
snap.slice_obs_HKL,
|
17
|
+
snap.nsagetools,
|
18
|
+
snap.polished_reps,
|
19
|
+
snap.interval_reps,
|
20
|
+
snap.fundamental_polyhedron,
|
21
|
+
snap.peripheral.dual_cellulation,
|
22
|
+
snap.peripheral.link,
|
23
|
+
snap.peripheral.peripheral
|
24
|
+
]
|
25
|
+
|
26
|
+
def run_doctests(verbose=False, print_info=True):
|
27
|
+
globs = {'Manifold':snappy.Manifold,
|
28
|
+
'ManifoldHP':snappy.ManifoldHP,
|
29
|
+
'Triangulation':snappy.Triangulation,
|
30
|
+
'Mcomplex':snappy.snap.t3mlite.Mcomplex,
|
31
|
+
'LinkSurface':snappy.snap.peripheral.link.LinkSurface}
|
32
|
+
return testing.doctest_modules(modules,
|
33
|
+
verbose=verbose,
|
34
|
+
print_info=print_info,
|
35
|
+
extraglobs=globs)
|
36
|
+
|
37
|
+
run_doctests.__name__ = snap.__name__
|
7
38
|
|
8
39
|
def _test_gluing_equations(manifold, shapes):
|
9
40
|
"""
|
10
41
|
Given a manifold and exact shapes, test whether the rectangular gluing
|
11
42
|
equations are fulfilled.
|
12
43
|
"""
|
13
|
-
one_minus_shapes = [
|
44
|
+
one_minus_shapes = [1 - shape for shape in shapes]
|
14
45
|
for A, B, c in manifold.gluing_equations('rect'):
|
15
46
|
val = c
|
16
47
|
for a, shape in zip(A, shapes):
|
@@ -21,6 +52,7 @@ def _test_gluing_equations(manifold, shapes):
|
|
21
52
|
return False
|
22
53
|
return True
|
23
54
|
|
55
|
+
|
24
56
|
def test_polished(dec_prec=200):
|
25
57
|
def test_manifold(manifold):
|
26
58
|
eqns = manifold.gluing_equations('rect')
|
@@ -28,18 +60,19 @@ def test_polished(dec_prec=200):
|
|
28
60
|
return snap.shapes.gluing_equation_error(eqns, shapes)
|
29
61
|
|
30
62
|
def test_census(name, census):
|
31
|
-
manifolds =
|
63
|
+
manifolds = list(census)
|
32
64
|
print('Checking gluing equations for %d %s manifolds' % (len(manifolds), name))
|
33
65
|
max_error = pari(0)
|
34
66
|
for i, M in enumerate(manifolds):
|
35
67
|
max_error = max(max_error, test_manifold(M))
|
36
|
-
print('\r ' + repr( (i, M) ).ljust(35) + ' Max error so far: %.2g' % float(max_error), end
|
68
|
+
print('\r ' + repr( (i, M) ).ljust(35) + ' Max error so far: %.2g' % float(max_error), end='')
|
37
69
|
print()
|
38
70
|
|
39
71
|
test_census('cusped census', snappy.OrientableCuspedCensus(filter='cusps>1')[-100:])
|
40
72
|
test_census('closed census', snappy.OrientableClosedCensus()[-100:])
|
41
73
|
test_census('4-component links', [M for M in snappy.LinkExteriors(num_cusps=4) if M.solution_type() == 'all tetrahedra positively oriented'])
|
42
74
|
|
75
|
+
|
43
76
|
def test_holonomy(dec_prec=200):
|
44
77
|
def test_manifold(manifold):
|
45
78
|
# This has several internal checks which raise exceptions
|
@@ -51,6 +84,7 @@ def test_holonomy(dec_prec=200):
|
|
51
84
|
for manifold in census()[-100:]:
|
52
85
|
test_manifold(manifold)
|
53
86
|
|
87
|
+
|
54
88
|
def test_fields(bits_prec=200, degree=20):
|
55
89
|
for census in [snappy.OrientableCuspedCensus, snappy.OrientableClosedCensus]:
|
56
90
|
print('Fields of 100 manifolds in ', census)
|
@@ -78,6 +112,7 @@ def test_fields(bits_prec=200, degree=20):
|
|
78
112
|
print('Problem with', manifold,
|
79
113
|
'(gluing equations violated)')
|
80
114
|
|
115
|
+
|
81
116
|
def test_ZHS(bits_prec=500, degree=20):
|
82
117
|
for manifold in snappy.OrientableClosedCensus:
|
83
118
|
if manifold.homology().order() == 1:
|
@@ -88,54 +123,12 @@ def test_ZHS(bits_prec=500, degree=20):
|
|
88
123
|
else:
|
89
124
|
print(manifold, ans)
|
90
125
|
|
126
|
+
|
91
127
|
def big_test():
|
92
128
|
test_polished()
|
93
129
|
if _within_sage:
|
94
130
|
test_holonomy()
|
95
131
|
test_fields()
|
96
132
|
|
97
|
-
|
98
|
-
def run_doctests(verbose=False, print_info=True):
|
99
|
-
from snappy.snap.t3mlite import linalg
|
100
|
-
from snappy.snap.t3mlite import spun
|
101
|
-
from snappy.snap.t3mlite import mcomplex
|
102
|
-
from snappy.snap import slice_obs_HKL
|
103
|
-
from snappy.snap import character_varieties
|
104
|
-
from snappy.snap import nsagetools
|
105
|
-
from snappy.snap import polished_reps
|
106
|
-
from snappy.snap import interval_reps
|
107
|
-
from snappy.snap import fundamental_polyhedron
|
108
|
-
from snappy.snap.peripheral import dual_cellulation
|
109
|
-
from snappy.snap.peripheral import link
|
110
|
-
from snappy.snap.peripheral import peripheral
|
111
|
-
|
112
|
-
modules = [
|
113
|
-
mcomplex,
|
114
|
-
linalg,
|
115
|
-
spun,
|
116
|
-
character_varieties,
|
117
|
-
nsagetools,
|
118
|
-
slice_obs_HKL,
|
119
|
-
polished_reps,
|
120
|
-
snap,
|
121
|
-
interval_reps,
|
122
|
-
fundamental_polyhedron,
|
123
|
-
dual_cellulation,
|
124
|
-
link,
|
125
|
-
peripheral,
|
126
|
-
]
|
127
|
-
|
128
|
-
globs = {'Manifold':snappy.Manifold,
|
129
|
-
'ManifoldHP':snappy.ManifoldHP,
|
130
|
-
'Triangulation':snappy.Triangulation,
|
131
|
-
'Mcomplex':snappy.snap.t3mlite.Mcomplex,
|
132
|
-
'LinkSurface':snappy.snap.peripheral.link.LinkSurface
|
133
|
-
}
|
134
|
-
|
135
|
-
return doctest_modules(modules, extraglobs=globs,
|
136
|
-
verbose=verbose, print_info=print_info)
|
137
|
-
|
138
133
|
if __name__ == '__main__':
|
139
|
-
|
140
|
-
verbose = len(optlist) > 0
|
141
|
-
run_doctests(verbose)
|
134
|
+
testing.run_doctests_as_main(run_doctests)
|
snappy/snap/utilities.py
CHANGED
@@ -7,30 +7,33 @@ interpreter.
|
|
7
7
|
"""
|
8
8
|
|
9
9
|
from ..sage_helper import _within_sage
|
10
|
-
from snappy.number import SnapPyNumbers, Number
|
10
|
+
from snappy.number import SnapPyNumbers, Number
|
11
11
|
from itertools import chain
|
12
12
|
from ..pari import pari, PariError
|
13
13
|
from .fundamental_polyhedron import Infinity
|
14
14
|
if _within_sage:
|
15
|
-
from
|
16
|
-
from
|
17
|
-
|
18
|
-
is_field
|
15
|
+
from ..sage_helper import matrix as sage_matrix, vector as sage_vector
|
16
|
+
from ..sage_helper import RealField_class, ComplexField_class
|
17
|
+
|
18
|
+
def is_field(R):
|
19
|
+
return isinstance(R, (SnapPyNumbers, RealField_class,
|
20
|
+
ComplexField_class))
|
19
21
|
else:
|
20
|
-
is_field
|
22
|
+
def is_field(R):
|
23
|
+
return isinstance(R, SnapPyNumbers)
|
21
24
|
|
22
25
|
|
23
|
-
class MatrixBase(
|
26
|
+
class MatrixBase():
|
24
27
|
"""Base class for Vector2 and Matrix2x2. Do not instantiate."""
|
25
28
|
_base_ring = None
|
26
29
|
|
27
30
|
def __len__(self):
|
28
31
|
return 2
|
29
|
-
|
32
|
+
|
30
33
|
def _pari_(self):
|
31
34
|
# force left multiplication by Numbers to use rmul
|
32
35
|
raise PariError
|
33
|
-
|
36
|
+
|
34
37
|
def base_ring(self):
|
35
38
|
"""If a base ring was set when initializing the matrix, then this
|
36
39
|
method will return that ring. Otherwise, the base ring is a
|
@@ -38,8 +41,7 @@ class MatrixBase(object):
|
|
38
41
|
of the elements. If a new Number is created using the computed
|
39
42
|
base ring and combined with the entries of this matrix, then the
|
40
43
|
precision of the result will be determined by the precisions of
|
41
|
-
the entries.
|
42
|
-
|
44
|
+
the entries.
|
43
45
|
"""
|
44
46
|
if self._base_ring:
|
45
47
|
return self._base_ring
|
@@ -48,9 +50,10 @@ class MatrixBase(object):
|
|
48
50
|
return SnapPyNumbers(precision=precision)
|
49
51
|
|
50
52
|
def list(self):
|
51
|
-
#Override this
|
53
|
+
# Override this
|
52
54
|
return []
|
53
|
-
|
55
|
+
|
56
|
+
|
54
57
|
class Vector2(MatrixBase):
|
55
58
|
"""A 2-dimensional vector whose entries are snappy Numbers."""
|
56
59
|
def __init__(self, *args):
|
@@ -61,11 +64,11 @@ class Vector2(MatrixBase):
|
|
61
64
|
self._base_ring = None
|
62
65
|
number = Number
|
63
66
|
if len(args) == 1:
|
64
|
-
args = args[0]
|
67
|
+
args = args[0]
|
65
68
|
if len(args) == 2:
|
66
|
-
self.x, self.y =
|
69
|
+
self.x, self.y = (number(t) for t in args)
|
67
70
|
else:
|
68
|
-
raise ValueError('Invalid initialization for a Vector2.')
|
71
|
+
raise ValueError('Invalid initialization for a Vector2.')
|
69
72
|
|
70
73
|
def __getitem__(self, index):
|
71
74
|
if index == 0:
|
@@ -74,12 +77,12 @@ class Vector2(MatrixBase):
|
|
74
77
|
return self.y
|
75
78
|
else:
|
76
79
|
raise IndexError('Invalid Vector2 index.')
|
77
|
-
|
80
|
+
|
78
81
|
def __repr__(self):
|
79
82
|
entries = [str(e) for e in self.list()]
|
80
83
|
size = max(map(len, entries))
|
81
|
-
entries = tuple(('%%-%d.%ds'%(size,size))%x for x in entries)
|
82
|
-
return '[ %s ]\n[ %s ]'%entries
|
84
|
+
entries = tuple(('%%-%d.%ds' % (size, size)) % x for x in entries)
|
85
|
+
return '[ %s ]\n[ %s ]' % entries
|
83
86
|
|
84
87
|
def __add__(self, other):
|
85
88
|
return Vector2(self.x + other.x, self.y + other.y)
|
@@ -87,19 +90,18 @@ class Vector2(MatrixBase):
|
|
87
90
|
def __sub__(self, other):
|
88
91
|
return Vector2(self.x - other.x, self.y - other.y)
|
89
92
|
|
90
|
-
def __mul__(self, other):
|
93
|
+
def __mul__(self, other):
|
91
94
|
if isinstance(other, Matrix2x2):
|
92
95
|
return Vector2(self.x * other.a + self.y * other.c,
|
93
96
|
self.x * other.b + self.y * other.d)
|
94
|
-
|
97
|
+
if isinstance(other, Number):
|
95
98
|
return Vector2(self.x * other, self.y * other)
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
return NotImplemented
|
99
|
+
try:
|
100
|
+
return self * self.base_ring()(other)
|
101
|
+
except (TypeError, ValueError):
|
102
|
+
return NotImplemented
|
101
103
|
|
102
|
-
def __rmul__(self, other):
|
104
|
+
def __rmul__(self, other):
|
103
105
|
return Vector2(self.x * other, self.y * other)
|
104
106
|
|
105
107
|
def __div__(self, other):
|
@@ -107,7 +109,7 @@ class Vector2(MatrixBase):
|
|
107
109
|
|
108
110
|
def __truediv__(self, other):
|
109
111
|
return Vector2(self.x / other, self.y / other)
|
110
|
-
|
112
|
+
|
111
113
|
def __neg__(self):
|
112
114
|
return Vector2(-self.x, -self.y)
|
113
115
|
|
@@ -116,16 +118,16 @@ class Vector2(MatrixBase):
|
|
116
118
|
|
117
119
|
def sage(self):
|
118
120
|
return sage_vector([self.x.sage(), self.y.sage()])
|
119
|
-
|
121
|
+
|
120
122
|
def norm(self, p=2):
|
121
123
|
if p == 1:
|
122
124
|
return self.x.abs() + self.y.abs()
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
elif p == Infinity:
|
125
|
+
if p == 2:
|
126
|
+
return ((self.x * self.x).abs() + (self.y * self.y).abs()).sqrt()
|
127
|
+
if p == Infinity:
|
127
128
|
return max(self.x.abs(), self.y.abs())
|
128
|
-
|
129
|
+
|
130
|
+
|
129
131
|
class Matrix2x2(MatrixBase):
|
130
132
|
"""A 2x2 matrix class whose entries are snappy Numbers."""
|
131
133
|
def __init__(self, *args):
|
@@ -136,32 +138,32 @@ class Matrix2x2(MatrixBase):
|
|
136
138
|
self._base_ring = None
|
137
139
|
number = Number
|
138
140
|
if len(args) == 1:
|
139
|
-
args = tuple(chain(*args[0]))
|
141
|
+
args = tuple(chain(*args[0]))
|
140
142
|
if len(args) == 4:
|
141
|
-
self.a, self.b, self.c, self.d =
|
143
|
+
self.a, self.b, self.c, self.d = (number(x) for x in args)
|
142
144
|
else:
|
143
|
-
raise ValueError('Invalid initialization for a Matrix2x2.')
|
145
|
+
raise ValueError('Invalid initialization for a Matrix2x2.')
|
144
146
|
|
145
147
|
def __repr__(self):
|
146
148
|
entries = [str(e) for e in self.list()]
|
147
149
|
size = max(map(len, entries))
|
148
|
-
entries = tuple(('%%-%d.%ds'%(size,size))%x for x in entries)
|
149
|
-
return '[ %s %s ]\n[ %s %s ]'%entries
|
150
|
+
entries = tuple(('%%-%d.%ds' % (size, size)) % x for x in entries)
|
151
|
+
return '[ %s %s ]\n[ %s %s ]' % entries
|
150
152
|
|
151
153
|
def __getitem__(self, index):
|
152
154
|
if isinstance(index, int):
|
153
155
|
if index == 0:
|
154
156
|
return [self.a, self.b]
|
155
|
-
|
157
|
+
if index == 1:
|
156
158
|
return [self.c, self.d]
|
157
159
|
elif isinstance(index, tuple) and len(index) == 2:
|
158
160
|
i, j = index
|
159
|
-
if
|
161
|
+
if i == 0:
|
160
162
|
return self.a if j == 0 else self.b
|
161
|
-
|
163
|
+
if i == 1:
|
162
164
|
return self.c if j == 0 else self.d
|
163
165
|
raise IndexError('Invalid 2x2 matrix index.')
|
164
|
-
|
166
|
+
|
165
167
|
def __add__(self, other):
|
166
168
|
return Matrix2x2(self.a + other.a,
|
167
169
|
self.b + other.b,
|
@@ -186,11 +188,10 @@ class Matrix2x2(MatrixBase):
|
|
186
188
|
if isinstance(other, Number):
|
187
189
|
return Matrix2x2(self.a * other, self.b * other,
|
188
190
|
self.c * other, self.d * other)
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
return NotImplemented
|
191
|
+
try:
|
192
|
+
return self * self.base_ring()(other)
|
193
|
+
except (TypeError, ValueError):
|
194
|
+
return NotImplemented
|
194
195
|
|
195
196
|
def __rmul__(self, other):
|
196
197
|
# Assumes that other is a scalar. This will not be
|
@@ -210,13 +211,13 @@ class Matrix2x2(MatrixBase):
|
|
210
211
|
|
211
212
|
def __neg__(self):
|
212
213
|
return Matrix2x2(-self.a, -self.b, -self.c, -self.d)
|
213
|
-
|
214
|
+
|
214
215
|
def __invert__(self):
|
215
216
|
try:
|
216
|
-
D = 1/self.det()
|
217
|
+
D = 1 / self.det()
|
217
218
|
except ZeroDivisionError:
|
218
|
-
raise ZeroDivisionError('matrix %s is not invertible.'%self)
|
219
|
-
return Matrix2x2(self.d*D, -self.b*D, -self.c*D, self.a*D)
|
219
|
+
raise ZeroDivisionError('matrix %s is not invertible.' % self)
|
220
|
+
return Matrix2x2(self.d * D, -self.b * D, -self.c * D, self.a * D)
|
220
221
|
|
221
222
|
def adjoint(self):
|
222
223
|
return Matrix2x2(self.d, -self.b, -self.c, self.a)
|
@@ -225,29 +226,29 @@ class Matrix2x2(MatrixBase):
|
|
225
226
|
return self.a * self.d - self.b * self.c
|
226
227
|
|
227
228
|
det = determinant
|
228
|
-
|
229
|
+
|
229
230
|
def trace(self):
|
230
231
|
return self.a + self.d
|
231
232
|
|
232
233
|
def eigenvalues(self):
|
233
|
-
#WARNING: This can take infinitely long!!!! (WHY???)
|
234
|
+
# WARNING: This can take infinitely long!!!! (WHY???)
|
234
235
|
R = self.base_ring()
|
235
236
|
x = pari('x')
|
236
237
|
a, b, c, d = map(pari, self.list())
|
237
|
-
p = x*x - (a + d)*x + (a*d - b*c)
|
238
|
+
p = x * x - (a + d) * x + (a * d - b * c)
|
238
239
|
roots = p.polroots(precision=R.precision())
|
239
240
|
return map(R, roots)
|
240
241
|
|
241
242
|
def norm(self, p=2):
|
242
243
|
if p == 1:
|
243
244
|
return max(self.a.abs() + self.c.abs(), self.b.abs() + self.d.abs())
|
244
|
-
|
245
|
-
return sum([x*x for x in self.list()]).sqrt()
|
246
|
-
|
245
|
+
if p == 'frob':
|
246
|
+
return sum([x * x for x in self.list()]).sqrt()
|
247
|
+
if p == Infinity:
|
247
248
|
return max(self.a.abs() + self.b.abs(), self.c.abs() + self.d.abs())
|
248
|
-
|
249
|
+
if p == 2:
|
249
250
|
return max([x.abs() for x in self.eigenvalues()])
|
250
|
-
|
251
|
+
|
251
252
|
def list(self):
|
252
253
|
return [self.a, self.b, self.c, self.d]
|
253
254
|
|
@@ -257,13 +258,14 @@ class Matrix2x2(MatrixBase):
|
|
257
258
|
|
258
259
|
def sage(self):
|
259
260
|
return sage_matrix(2, 2, [x.sage() for x in self.list()])
|
260
|
-
|
261
|
+
|
262
|
+
|
261
263
|
def indexset(n):
|
262
264
|
"""The orders of the non-zero bits in the binary expansion of n."""
|
263
265
|
i = 0
|
264
266
|
result = []
|
265
267
|
while True:
|
266
|
-
mask = 1<<i
|
268
|
+
mask = 1 << i
|
267
269
|
if n & mask:
|
268
270
|
result.append(i)
|
269
271
|
if n < mask:
|
@@ -271,6 +273,7 @@ def indexset(n):
|
|
271
273
|
i += 1
|
272
274
|
return result
|
273
275
|
|
276
|
+
|
274
277
|
def powerset(X):
|
275
278
|
"""Iterator for all finite subsequences of the iterable X"""
|
276
279
|
n = 0
|
@@ -279,9 +282,7 @@ def powerset(X):
|
|
279
282
|
segment.append(x)
|
280
283
|
while True:
|
281
284
|
try:
|
282
|
-
yield [
|
285
|
+
yield [segment[i] for i in indexset(n)]
|
283
286
|
except IndexError:
|
284
287
|
break
|
285
288
|
n += 1
|
286
|
-
|
287
|
-
|