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,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
- http://arxiv.org/abs/1111.2828
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
- === Examples ===
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 clases for 4_1:
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 = index,
133
- N = N, manifold = manifold)
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
- http://arxiv.org/abs/1111.2828
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
- http://arxiv.org/abs/1207.6711
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
- === Arguments ===
191
+ :param N: which SL(N,C) we want the variety.
189
192
 
190
- N --- which SL(N,C) we want the variety.
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
- obstruction_class --- class from Definition 1.7 of (1).
193
- None for trivial class or a value returned from get_ptolemy_obstruction_classes.
194
- Short cuts: obstruction_class = 'all' returns a list of Ptolemy varieties
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
- simplify --- boolean to indicate whether to simplify the equations which
199
- significantly reduces the number of variables.
200
- Simplifying means that several identified Ptolemy coordinates x = y = z = ...
201
- are eliminated instead of adding relations x - y = 0, y - z = 0, ...
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
- eliminate_fixed_ptolemys --- boolean to indicate whether to eliminate
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
- === If you have a magma installation ===
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
- === If you do not have a magma installation ===
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
- === Continue here whether you have or do not have magma ===
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
- === ONLY DOCTESTS, NOT PART OF DOCUMENTATION ===
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 = simplify,
342
- eliminate_fixed_ptolemys = 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 = simplify,
384
- eliminate_fixed_ptolemys = 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 = simplify,
395
- eliminate_fixed_ptolemys = 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 = 1)) == 0
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 = [ upleft(row) + upright(row) for row in range(len(m))]
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 not entry is None:
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 not entry is None:
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 = 1)
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 = 1)
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 = None,
266
- sort_rows_key = None):
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