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.
Files changed (401) hide show
  1. snappy/CyOpenGL.cpython-38-darwin.so +0 -0
  2. snappy/SnapPy.cpython-38-darwin.so +0 -0
  3. snappy/SnapPyHP.cpython-38-darwin.so +0 -0
  4. snappy/__init__.py +373 -426
  5. snappy/app.py +240 -75
  6. snappy/app_menus.py +93 -78
  7. snappy/browser.py +87 -63
  8. snappy/cache.py +5 -8
  9. snappy/canonical.py +249 -0
  10. snappy/{verify/cusp_shapes.py → cusps/__init__.py} +11 -19
  11. snappy/cusps/cusp_area_matrix.py +101 -0
  12. snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +39 -54
  13. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  14. snappy/cusps/test.py +21 -0
  15. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  16. snappy/database.py +40 -31
  17. snappy/db_utilities.py +13 -14
  18. snappy/decorated_isosig.py +377 -133
  19. snappy/dev/extended_ptolemy/complexVolumesClosed.py +42 -9
  20. snappy/dev/extended_ptolemy/extended.py +32 -25
  21. snappy/dev/extended_ptolemy/giac_rur.py +23 -8
  22. snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
  23. snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +2 -1
  24. snappy/dev/vericlosed/gimbalLoopFinder.py +5 -5
  25. snappy/dev/vericlosed/hyperbolicStructure.py +3 -3
  26. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +2 -2
  27. snappy/dev/vericlosed/truncatedComplex.py +3 -2
  28. snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +4 -3
  29. snappy/doc/_images/geodesics.jpg +0 -0
  30. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  31. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  32. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  33. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  34. snappy/doc/_sources/additional_classes.rst.txt +1 -0
  35. snappy/doc/_sources/credits.rst.txt +6 -1
  36. snappy/doc/_sources/development.rst.txt +69 -50
  37. snappy/doc/_sources/index.rst.txt +101 -66
  38. snappy/doc/_sources/installing.rst.txt +148 -165
  39. snappy/doc/_sources/news.rst.txt +136 -32
  40. snappy/doc/_sources/ptolemy.rst.txt +1 -1
  41. snappy/doc/_sources/ptolemy_examples1.rst.txt +9 -8
  42. snappy/doc/_sources/ptolemy_examples2.rst.txt +3 -3
  43. snappy/doc/_sources/ptolemy_examples3.rst.txt +14 -14
  44. snappy/doc/_sources/ptolemy_prelim.rst.txt +1 -1
  45. snappy/doc/_sources/snap.rst.txt +2 -2
  46. snappy/doc/_sources/snappy.rst.txt +1 -1
  47. snappy/doc/_sources/triangulation.rst.txt +3 -2
  48. snappy/doc/_sources/verify.rst.txt +89 -29
  49. snappy/doc/_sources/verify_internals.rst.txt +5 -16
  50. snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
  51. snappy/doc/_static/SnapPy.ico +0 -0
  52. snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  53. snappy/doc/_static/basic.css +47 -27
  54. snappy/doc/_static/css/badge_only.css +1 -0
  55. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  56. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  57. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  58. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  59. snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
  60. snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  61. snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  62. snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
  63. snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  64. snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
  65. snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  66. snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
  67. snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
  68. snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
  69. snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  70. snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
  71. snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
  72. snappy/doc/_static/css/theme.css +4 -0
  73. snappy/doc/_static/doctools.js +107 -274
  74. snappy/doc/_static/documentation_options.js +6 -5
  75. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  76. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  77. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  78. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  79. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  80. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  81. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  82. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  83. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  84. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  85. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  86. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  87. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  88. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  89. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  90. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  91. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  92. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  93. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  94. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  95. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  96. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  97. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  98. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  99. snappy/doc/_static/jquery.js +2 -2
  100. snappy/doc/_static/js/badge_only.js +1 -0
  101. snappy/doc/_static/js/theme.js +1 -0
  102. snappy/doc/_static/js/versions.js +228 -0
  103. snappy/doc/_static/language_data.js +3 -101
  104. snappy/doc/_static/pygments.css +1 -0
  105. snappy/doc/_static/searchtools.js +489 -398
  106. snappy/doc/_static/snappy_furo.css +33 -0
  107. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
  108. snappy/doc/_static/sphinx_highlight.js +154 -0
  109. snappy/doc/additional_classes.html +688 -263
  110. snappy/doc/bugs.html +107 -94
  111. snappy/doc/censuses.html +155 -127
  112. snappy/doc/credits.html +115 -104
  113. snappy/doc/development.html +184 -146
  114. snappy/doc/genindex.html +287 -204
  115. snappy/doc/index.html +189 -150
  116. snappy/doc/installing.html +259 -266
  117. snappy/doc/manifold.html +1626 -592
  118. snappy/doc/manifoldhp.html +119 -105
  119. snappy/doc/news.html +198 -104
  120. snappy/doc/objects.inv +0 -0
  121. snappy/doc/other.html +117 -105
  122. snappy/doc/platonic_census.html +161 -114
  123. snappy/doc/plink.html +113 -105
  124. snappy/doc/ptolemy.html +131 -108
  125. snappy/doc/ptolemy_classes.html +242 -223
  126. snappy/doc/ptolemy_examples1.html +144 -130
  127. snappy/doc/ptolemy_examples2.html +141 -129
  128. snappy/doc/ptolemy_examples3.html +148 -132
  129. snappy/doc/ptolemy_examples4.html +131 -111
  130. snappy/doc/ptolemy_prelim.html +162 -138
  131. snappy/doc/py-modindex.html +104 -69
  132. snappy/doc/screenshots.html +117 -108
  133. snappy/doc/search.html +115 -84
  134. snappy/doc/searchindex.js +1 -1
  135. snappy/doc/snap.html +109 -96
  136. snappy/doc/snappy.html +134 -97
  137. snappy/doc/spherogram.html +259 -187
  138. snappy/doc/todo.html +107 -94
  139. snappy/doc/triangulation.html +1380 -111
  140. snappy/doc/tutorial.html +107 -94
  141. snappy/doc/verify.html +194 -125
  142. snappy/doc/verify_internals.html +248 -686
  143. snappy/drilling/__init__.py +456 -0
  144. snappy/drilling/barycentric.py +103 -0
  145. snappy/drilling/constants.py +5 -0
  146. snappy/drilling/crush.py +270 -0
  147. snappy/drilling/cusps.py +125 -0
  148. snappy/drilling/debug.py +242 -0
  149. snappy/drilling/epsilons.py +6 -0
  150. snappy/drilling/exceptions.py +55 -0
  151. snappy/drilling/moves.py +620 -0
  152. snappy/drilling/peripheral_curves.py +210 -0
  153. snappy/drilling/perturb.py +188 -0
  154. snappy/drilling/shorten.py +36 -0
  155. snappy/drilling/subdivide.py +274 -0
  156. snappy/drilling/test.py +23 -0
  157. snappy/drilling/test_cases.py +126 -0
  158. snappy/drilling/tracing.py +351 -0
  159. snappy/exceptions.py +23 -3
  160. snappy/export_stl.py +20 -14
  161. snappy/exterior_to_link/__init__.py +2 -0
  162. snappy/exterior_to_link/barycentric_geometry.py +463 -0
  163. snappy/exterior_to_link/exceptions.py +6 -0
  164. snappy/exterior_to_link/geodesic_map.json +14408 -0
  165. snappy/exterior_to_link/hyp_utils.py +112 -0
  166. snappy/exterior_to_link/link_projection.py +323 -0
  167. snappy/exterior_to_link/main.py +197 -0
  168. snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
  169. snappy/exterior_to_link/mcomplex_with_link.py +687 -0
  170. snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
  171. snappy/exterior_to_link/pl_utils.py +491 -0
  172. snappy/exterior_to_link/put_in_S3.py +156 -0
  173. snappy/exterior_to_link/rational_linear_algebra.py +123 -0
  174. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
  175. snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
  176. snappy/exterior_to_link/stored_moves.py +475 -0
  177. snappy/exterior_to_link/test.py +31 -0
  178. snappy/geometric_structure/__init__.py +212 -0
  179. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  180. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  181. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  182. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  183. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  184. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  185. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  186. snappy/geometric_structure/geodesic/__init__.py +0 -0
  187. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  188. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  189. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  190. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  191. snappy/geometric_structure/geodesic/constants.py +6 -0
  192. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  193. snappy/geometric_structure/geodesic/fixed_points.py +93 -0
  194. snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
  195. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  196. snappy/geometric_structure/geodesic/line.py +30 -0
  197. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  198. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  199. snappy/geometric_structure/test.py +22 -0
  200. snappy/gui.py +36 -36
  201. snappy/horoviewer.py +50 -48
  202. snappy/hyperboloid/__init__.py +212 -0
  203. snappy/hyperboloid/distances.py +245 -0
  204. snappy/hyperboloid/horoball.py +19 -0
  205. snappy/hyperboloid/line.py +35 -0
  206. snappy/hyperboloid/point.py +9 -0
  207. snappy/hyperboloid/triangle.py +29 -0
  208. snappy/{infodialog.py → infowindow.py} +32 -33
  209. snappy/isometry_signature.py +382 -0
  210. snappy/len_spec/__init__.py +596 -0
  211. snappy/len_spec/geodesic_info.py +110 -0
  212. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  213. snappy/len_spec/geodesic_piece.py +143 -0
  214. snappy/len_spec/geometric_structure.py +182 -0
  215. snappy/len_spec/geometry.py +80 -0
  216. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  217. snappy/len_spec/spine.py +206 -0
  218. snappy/len_spec/test.py +24 -0
  219. snappy/len_spec/test_cases.py +69 -0
  220. snappy/len_spec/tile.py +275 -0
  221. snappy/len_spec/word.py +86 -0
  222. snappy/manifolds/__init__.py +1 -1
  223. snappy/math_basics.py +176 -0
  224. snappy/matrix.py +525 -0
  225. snappy/number.py +97 -21
  226. snappy/numeric_output_checker.py +37 -27
  227. snappy/pari.py +30 -69
  228. snappy/phone_home.py +25 -20
  229. snappy/polyviewer.py +39 -37
  230. snappy/ptolemy/__init__.py +4 -6
  231. snappy/ptolemy/component.py +14 -12
  232. snappy/ptolemy/coordinates.py +312 -295
  233. snappy/ptolemy/fieldExtensions.py +14 -12
  234. snappy/ptolemy/findLoops.py +43 -31
  235. snappy/ptolemy/geometricRep.py +24 -26
  236. snappy/ptolemy/homology.py +12 -7
  237. snappy/ptolemy/manifoldMethods.py +69 -70
  238. snappy/ptolemy/matrix.py +65 -26
  239. snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +18 -14
  240. snappy/ptolemy/polynomial.py +125 -119
  241. snappy/ptolemy/processComponents.py +36 -30
  242. snappy/ptolemy/processFileBase.py +79 -18
  243. snappy/ptolemy/processFileDispatch.py +13 -14
  244. snappy/ptolemy/processMagmaFile.py +44 -39
  245. snappy/ptolemy/processRurFile.py +18 -11
  246. snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +20 -17
  247. snappy/ptolemy/ptolemyObstructionClass.py +13 -17
  248. snappy/ptolemy/ptolemyVariety.py +190 -121
  249. snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +20 -19
  250. snappy/ptolemy/reginaWrapper.py +25 -29
  251. snappy/ptolemy/rur.py +6 -14
  252. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +27 -22
  253. snappy/ptolemy/test.py +247 -188
  254. snappy/ptolemy/utilities.py +41 -43
  255. snappy/raytracing/__init__.py +64 -0
  256. snappy/raytracing/additional_horospheres.py +64 -0
  257. snappy/raytracing/additional_len_spec_choices.py +63 -0
  258. snappy/raytracing/cohomology_fractal.py +10 -6
  259. snappy/raytracing/eyeball.py +123 -0
  260. snappy/raytracing/finite_raytracing_data.py +48 -38
  261. snappy/raytracing/finite_viewer.py +218 -210
  262. snappy/raytracing/geodesic_tube_info.py +174 -0
  263. snappy/raytracing/geodesics.py +246 -0
  264. snappy/raytracing/geodesics_window.py +258 -0
  265. snappy/raytracing/gui_utilities.py +152 -40
  266. snappy/raytracing/hyperboloid_navigation.py +102 -52
  267. snappy/raytracing/hyperboloid_utilities.py +114 -261
  268. snappy/raytracing/ideal_raytracing_data.py +256 -179
  269. snappy/raytracing/inside_viewer.py +522 -253
  270. snappy/raytracing/pack.py +22 -0
  271. snappy/raytracing/raytracing_data.py +46 -34
  272. snappy/raytracing/raytracing_view.py +190 -109
  273. snappy/raytracing/shaders/Eye.png +0 -0
  274. snappy/raytracing/shaders/NonGeometric.png +0 -0
  275. snappy/raytracing/shaders/__init__.py +60 -4
  276. snappy/raytracing/shaders/fragment.glsl +575 -148
  277. snappy/raytracing/test.py +29 -0
  278. snappy/raytracing/tooltip.py +146 -0
  279. snappy/raytracing/upper_halfspace_utilities.py +98 -0
  280. snappy/raytracing/view_scale_controller.py +98 -0
  281. snappy/raytracing/zoom_slider/__init__.py +32 -29
  282. snappy/raytracing/zoom_slider/test.py +2 -0
  283. snappy/sage_helper.py +69 -123
  284. snappy/{preferences.py → settings.py} +167 -145
  285. snappy/shell.py +4 -0
  286. snappy/snap/__init__.py +12 -8
  287. snappy/snap/character_varieties.py +24 -18
  288. snappy/snap/find_field.py +35 -34
  289. snappy/snap/fundamental_polyhedron.py +99 -85
  290. snappy/snap/generators.py +6 -8
  291. snappy/snap/interval_reps.py +18 -6
  292. snappy/snap/kernel_structures.py +8 -3
  293. snappy/snap/mcomplex_base.py +1 -2
  294. snappy/snap/nsagetools.py +107 -53
  295. snappy/snap/peripheral/__init__.py +1 -1
  296. snappy/snap/peripheral/dual_cellulation.py +15 -7
  297. snappy/snap/peripheral/link.py +20 -16
  298. snappy/snap/peripheral/peripheral.py +22 -14
  299. snappy/snap/peripheral/surface.py +47 -50
  300. snappy/snap/peripheral/test.py +8 -8
  301. snappy/snap/polished_reps.py +65 -40
  302. snappy/snap/shapes.py +41 -22
  303. snappy/snap/slice_obs_HKL.py +64 -25
  304. snappy/snap/t3mlite/arrow.py +88 -51
  305. snappy/snap/t3mlite/corner.py +5 -6
  306. snappy/snap/t3mlite/edge.py +32 -21
  307. snappy/snap/t3mlite/face.py +7 -9
  308. snappy/snap/t3mlite/files.py +31 -23
  309. snappy/snap/t3mlite/homology.py +14 -10
  310. snappy/snap/t3mlite/linalg.py +158 -56
  311. snappy/snap/t3mlite/mcomplex.py +739 -291
  312. snappy/snap/t3mlite/perm4.py +236 -84
  313. snappy/snap/t3mlite/setup.py +9 -10
  314. snappy/snap/t3mlite/simplex.py +65 -48
  315. snappy/snap/t3mlite/spun.py +42 -30
  316. snappy/snap/t3mlite/surface.py +45 -45
  317. snappy/snap/t3mlite/test.py +3 -0
  318. snappy/snap/t3mlite/test_vs_regina.py +17 -13
  319. snappy/snap/t3mlite/tetrahedron.py +25 -24
  320. snappy/snap/t3mlite/vertex.py +8 -13
  321. snappy/snap/test.py +45 -52
  322. snappy/snap/utilities.py +66 -65
  323. snappy/test.py +155 -158
  324. snappy/test_cases.py +263 -0
  325. snappy/testing.py +131 -0
  326. snappy/tiling/__init__.py +2 -0
  327. snappy/tiling/canonical_key_dict.py +59 -0
  328. snappy/tiling/dict_based_set.py +79 -0
  329. snappy/tiling/floor.py +49 -0
  330. snappy/tiling/hyperboloid_dict.py +54 -0
  331. snappy/tiling/iter_utils.py +78 -0
  332. snappy/tiling/lifted_tetrahedron.py +22 -0
  333. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  334. snappy/tiling/real_hash_dict.py +164 -0
  335. snappy/tiling/test.py +23 -0
  336. snappy/tiling/tile.py +215 -0
  337. snappy/tiling/triangle.py +33 -0
  338. snappy/tkterminal.py +313 -203
  339. snappy/twister/main.py +1 -8
  340. snappy/twister/twister_core.cpython-38-darwin.so +0 -0
  341. snappy/upper_halfspace/__init__.py +146 -0
  342. snappy/upper_halfspace/ideal_point.py +26 -0
  343. snappy/verify/__init__.py +4 -8
  344. snappy/verify/{verifyCanonical.py → canonical.py} +114 -97
  345. snappy/verify/complex_volume/__init__.py +3 -2
  346. snappy/verify/complex_volume/adjust_torsion.py +13 -11
  347. snappy/verify/complex_volume/closed.py +29 -24
  348. snappy/verify/complex_volume/compute_ptolemys.py +8 -6
  349. snappy/verify/complex_volume/cusped.py +10 -9
  350. snappy/verify/complex_volume/extended_bloch.py +14 -12
  351. snappy/verify/{cuspTranslations.py → cusp_translations.py} +15 -14
  352. snappy/verify/edge_equations.py +80 -0
  353. snappy/verify/exceptions.py +23 -56
  354. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +19 -15
  355. snappy/verify/interval_newton_shapes_engine.py +51 -211
  356. snappy/verify/interval_tree.py +27 -25
  357. snappy/verify/krawczyk_shapes_engine.py +47 -50
  358. snappy/verify/maximal_cusp_area_matrix/__init__.py +17 -86
  359. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +58 -48
  360. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +53 -57
  361. snappy/verify/{realAlgebra.py → real_algebra.py} +26 -20
  362. snappy/verify/shapes.py +10 -7
  363. snappy/verify/short_slopes.py +41 -42
  364. snappy/verify/{squareExtensions.py → square_extensions.py} +96 -92
  365. snappy/verify/test.py +59 -57
  366. snappy/verify/upper_halfspace/extended_matrix.py +5 -5
  367. snappy/verify/upper_halfspace/finite_point.py +44 -31
  368. snappy/verify/upper_halfspace/ideal_point.py +69 -57
  369. snappy/verify/volume.py +15 -12
  370. snappy/version.py +2 -3
  371. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/METADATA +14 -12
  372. snappy-3.2.dist-info/RECORD +503 -0
  373. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  374. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -1
  375. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/top_level.txt +10 -1
  376. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  377. snappy/doc/_static/classic.css +0 -266
  378. snappy/doc/_static/jquery-3.5.1.js +0 -10872
  379. snappy/doc/_static/sidebar.js +0 -159
  380. snappy/doc/_static/underscore-1.13.1.js +0 -2042
  381. snappy/doc/_static/underscore.js +0 -6
  382. snappy/doc/verify_canon.html +0 -283
  383. snappy/ppm_to_png.py +0 -243
  384. snappy/togl/__init__.py +0 -3
  385. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  386. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  387. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  388. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  389. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  390. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  391. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  392. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  393. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  394. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  395. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  396. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  397. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  398. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  399. snappy/verify/cuspCrossSection.py +0 -1413
  400. snappy/verify/mathHelpers.py +0 -64
  401. snappy-3.0.3.dist-info/RECORD +0 -360
@@ -1,31 +1,34 @@
1
- #$Id: tetrahedron.py,v 1.2 2002/09/20 03:52:16 culler Exp $
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 = {F0:None,F1:None,F2:None,F3:None} # Permutations
18
- self.Class = [None]*16 # list of equivalence classes
19
- self.Checked = 0 # flag
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 == None:
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
- # Reverse the orientation. Vertices are relabelled by a transposition
38
- # and gluings are adjusted.
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 not nhbr[two_subsimplex] == None:
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 == None:
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 = [None]*16 # list of equivalence classes
77
+ self.Class = [None]*16 # list of equivalence classes
76
78
 
77
- def info(self, out = sys.stdout):
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
-
@@ -1,16 +1,11 @@
1
- #$Id: vertex.py,v 1.3 2003/03/07 17:29:28 culler Exp $
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/12
42
+ return sum//12
snappy/snap/test.py CHANGED
@@ -1,16 +1,47 @@
1
- from __future__ import print_function
2
- from ..sage_helper import _within_sage, doctest_modules
3
- from ..pari import pari
1
+ from snappy import testing
4
2
  import snappy
5
- import snappy.snap as snap
6
- import doctest, collections, getopt, sys
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 = [ 1 - shape for shape in 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 = [M for M in census]
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
- optlist, args = getopt.getopt(sys.argv[1:], 'v', ['verbose'])
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, is_exact
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 sage.all import matrix as sage_matrix, vector as sage_vector
16
- from sage.rings.real_mpfr import RealField_class
17
- from ..sage_helper import ComplexField_class
18
- is_field = lambda R: isinstance(R, (SnapPyNumbers, RealField_class, ComplexField_class))
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 = lambda R: isinstance(R, SnapPyNumbers)
22
+ def is_field(R):
23
+ return isinstance(R, SnapPyNumbers)
21
24
 
22
25
 
23
- class MatrixBase(object):
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 = [number(t) for t in args]
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
- elif isinstance(other, Number):
97
+ if isinstance(other, Number):
95
98
  return Vector2(self.x * other, self.y * other)
96
- else:
97
- try:
98
- return self*base_ring()(other)
99
- except:
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
- elif p == 2:
124
- precision = self.base_ring().precision()
125
- return ((self.x*self.x).abs() + (self.y*self.y).abs()).sqrt()
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 = [number(x) for x in args]
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
- elif index == 1:
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 i == 0:
161
+ if i == 0:
160
162
  return self.a if j == 0 else self.b
161
- elif i == 1:
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
- else:
190
- try:
191
- return self*base_ring()(other)
192
- except:
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
- elif p == 'frob':
245
- return sum([x*x for x in self.list()]).sqrt()
246
- elif p == Infinity:
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
- elif p == 2:
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 [ segment[i] for i in indexset(n) ]
285
+ yield [segment[i] for i in indexset(n)]
283
286
  except IndexError:
284
287
  break
285
288
  n += 1
286
-
287
-