snappy 3.3__cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (541) hide show
  1. snappy/CyOpenGL.cpython-310-aarch64-linux-gnu.so +0 -0
  2. snappy/SnapPy.cpython-310-aarch64-linux-gnu.so +0 -0
  3. snappy/SnapPy.ico +0 -0
  4. snappy/SnapPy.png +0 -0
  5. snappy/SnapPyHP.cpython-310-aarch64-linux-gnu.so +0 -0
  6. snappy/__init__.py +534 -0
  7. snappy/app.py +604 -0
  8. snappy/app_menus.py +372 -0
  9. snappy/browser.py +998 -0
  10. snappy/cache.py +25 -0
  11. snappy/canonical.py +249 -0
  12. snappy/cusps/__init__.py +280 -0
  13. snappy/cusps/cusp_area_matrix.py +98 -0
  14. snappy/cusps/cusp_areas_from_matrix.py +96 -0
  15. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  16. snappy/cusps/short_slopes_for_cusp.py +217 -0
  17. snappy/cusps/test.py +22 -0
  18. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  19. snappy/database.py +454 -0
  20. snappy/db_utilities.py +79 -0
  21. snappy/decorated_isosig.py +717 -0
  22. snappy/dev/__init__.py +0 -0
  23. snappy/dev/extended_ptolemy/__init__.py +8 -0
  24. snappy/dev/extended_ptolemy/closed.py +106 -0
  25. snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
  26. snappy/dev/extended_ptolemy/direct.py +42 -0
  27. snappy/dev/extended_ptolemy/extended.py +406 -0
  28. snappy/dev/extended_ptolemy/giac_helper.py +43 -0
  29. snappy/dev/extended_ptolemy/giac_rur.py +129 -0
  30. snappy/dev/extended_ptolemy/gluing.py +46 -0
  31. snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
  32. snappy/dev/extended_ptolemy/printMatrices.py +70 -0
  33. snappy/dev/vericlosed/__init__.py +1 -0
  34. snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
  35. snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
  36. snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
  37. snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
  38. snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
  39. snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
  40. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
  41. snappy/dev/vericlosed/orb/__init__.py +1 -0
  42. snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
  43. snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
  44. snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
  45. snappy/dev/vericlosed/test.py +54 -0
  46. snappy/dev/vericlosed/truncatedComplex.py +176 -0
  47. snappy/dev/vericlosed/verificationError.py +58 -0
  48. snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
  49. snappy/doc/_images/SnapPy-196.png +0 -0
  50. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  51. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  52. snappy/doc/_images/mac.png +0 -0
  53. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  54. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  55. snappy/doc/_images/plink-action.png +0 -0
  56. snappy/doc/_images/ubuntu.png +0 -0
  57. snappy/doc/_images/win7.png +0 -0
  58. snappy/doc/_sources/additional_classes.rst.txt +40 -0
  59. snappy/doc/_sources/bugs.rst.txt +14 -0
  60. snappy/doc/_sources/censuses.rst.txt +52 -0
  61. snappy/doc/_sources/credits.rst.txt +81 -0
  62. snappy/doc/_sources/development.rst.txt +261 -0
  63. snappy/doc/_sources/index.rst.txt +215 -0
  64. snappy/doc/_sources/installing.rst.txt +249 -0
  65. snappy/doc/_sources/manifold.rst.txt +6 -0
  66. snappy/doc/_sources/manifoldhp.rst.txt +46 -0
  67. snappy/doc/_sources/news.rst.txt +425 -0
  68. snappy/doc/_sources/other.rst.txt +25 -0
  69. snappy/doc/_sources/platonic_census.rst.txt +20 -0
  70. snappy/doc/_sources/plink.rst.txt +102 -0
  71. snappy/doc/_sources/ptolemy.rst.txt +66 -0
  72. snappy/doc/_sources/ptolemy_classes.rst.txt +42 -0
  73. snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -0
  74. snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -0
  75. snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -0
  76. snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -0
  77. snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -0
  78. snappy/doc/_sources/screenshots.rst.txt +21 -0
  79. snappy/doc/_sources/snap.rst.txt +87 -0
  80. snappy/doc/_sources/snappy.rst.txt +28 -0
  81. snappy/doc/_sources/spherogram.rst.txt +103 -0
  82. snappy/doc/_sources/todo.rst.txt +47 -0
  83. snappy/doc/_sources/triangulation.rst.txt +11 -0
  84. snappy/doc/_sources/tutorial.rst.txt +49 -0
  85. snappy/doc/_sources/verify.rst.txt +210 -0
  86. snappy/doc/_sources/verify_internals.rst.txt +79 -0
  87. snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
  88. snappy/doc/_static/SnapPy.ico +0 -0
  89. snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  90. snappy/doc/_static/basic.css +906 -0
  91. snappy/doc/_static/css/badge_only.css +1 -0
  92. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  93. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  94. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  95. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  96. snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
  97. snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  98. snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  99. snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
  100. snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  101. snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
  102. snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  103. snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
  104. snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
  105. snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
  106. snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  107. snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
  108. snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
  109. snappy/doc/_static/css/theme.css +4 -0
  110. snappy/doc/_static/doctools.js +149 -0
  111. snappy/doc/_static/documentation_options.js +13 -0
  112. snappy/doc/_static/file.png +0 -0
  113. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  114. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  115. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  116. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  117. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  118. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  119. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  120. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  121. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  122. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  123. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  124. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  125. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  126. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  127. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  128. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  129. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  130. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  131. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  132. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  133. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  134. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  135. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  136. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  137. snappy/doc/_static/jquery.js +2 -0
  138. snappy/doc/_static/js/badge_only.js +1 -0
  139. snappy/doc/_static/js/theme.js +1 -0
  140. snappy/doc/_static/js/versions.js +228 -0
  141. snappy/doc/_static/language_data.js +192 -0
  142. snappy/doc/_static/minus.png +0 -0
  143. snappy/doc/_static/plus.png +0 -0
  144. snappy/doc/_static/pygments.css +75 -0
  145. snappy/doc/_static/searchtools.js +635 -0
  146. snappy/doc/_static/snappy_furo.css +33 -0
  147. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
  148. snappy/doc/_static/sphinx_highlight.js +154 -0
  149. snappy/doc/additional_classes.html +1500 -0
  150. snappy/doc/bugs.html +132 -0
  151. snappy/doc/censuses.html +453 -0
  152. snappy/doc/credits.html +184 -0
  153. snappy/doc/development.html +385 -0
  154. snappy/doc/doc-latest/additional_classes.html +1500 -0
  155. snappy/doc/doc-latest/bugs.html +132 -0
  156. snappy/doc/doc-latest/censuses.html +453 -0
  157. snappy/doc/doc-latest/credits.html +184 -0
  158. snappy/doc/doc-latest/development.html +385 -0
  159. snappy/doc/doc-latest/genindex.html +1349 -0
  160. snappy/doc/doc-latest/index.html +287 -0
  161. snappy/doc/doc-latest/installing.html +346 -0
  162. snappy/doc/doc-latest/manifold.html +3632 -0
  163. snappy/doc/doc-latest/manifoldhp.html +180 -0
  164. snappy/doc/doc-latest/news.html +438 -0
  165. snappy/doc/doc-latest/objects.inv +0 -0
  166. snappy/doc/doc-latest/other.html +160 -0
  167. snappy/doc/doc-latest/platonic_census.html +376 -0
  168. snappy/doc/doc-latest/plink.html +210 -0
  169. snappy/doc/doc-latest/ptolemy.html +253 -0
  170. snappy/doc/doc-latest/ptolemy_classes.html +1144 -0
  171. snappy/doc/doc-latest/ptolemy_examples1.html +409 -0
  172. snappy/doc/doc-latest/ptolemy_examples2.html +471 -0
  173. snappy/doc/doc-latest/ptolemy_examples3.html +414 -0
  174. snappy/doc/doc-latest/ptolemy_examples4.html +195 -0
  175. snappy/doc/doc-latest/ptolemy_prelim.html +248 -0
  176. snappy/doc/doc-latest/py-modindex.html +165 -0
  177. snappy/doc/doc-latest/screenshots.html +141 -0
  178. snappy/doc/doc-latest/search.html +135 -0
  179. snappy/doc/doc-latest/searchindex.js +1 -0
  180. snappy/doc/doc-latest/snap.html +202 -0
  181. snappy/doc/doc-latest/snappy.html +181 -0
  182. snappy/doc/doc-latest/spherogram.html +1346 -0
  183. snappy/doc/doc-latest/todo.html +166 -0
  184. snappy/doc/doc-latest/triangulation.html +1676 -0
  185. snappy/doc/doc-latest/tutorial.html +159 -0
  186. snappy/doc/doc-latest/verify.html +330 -0
  187. snappy/doc/doc-latest/verify_internals.html +1235 -0
  188. snappy/doc/genindex.html +1349 -0
  189. snappy/doc/index.html +287 -0
  190. snappy/doc/installing.html +346 -0
  191. snappy/doc/manifold.html +3632 -0
  192. snappy/doc/manifoldhp.html +180 -0
  193. snappy/doc/news.html +438 -0
  194. snappy/doc/objects.inv +0 -0
  195. snappy/doc/other.html +160 -0
  196. snappy/doc/platonic_census.html +376 -0
  197. snappy/doc/plink.html +210 -0
  198. snappy/doc/ptolemy.html +253 -0
  199. snappy/doc/ptolemy_classes.html +1144 -0
  200. snappy/doc/ptolemy_examples1.html +409 -0
  201. snappy/doc/ptolemy_examples2.html +471 -0
  202. snappy/doc/ptolemy_examples3.html +414 -0
  203. snappy/doc/ptolemy_examples4.html +195 -0
  204. snappy/doc/ptolemy_prelim.html +248 -0
  205. snappy/doc/py-modindex.html +165 -0
  206. snappy/doc/screenshots.html +141 -0
  207. snappy/doc/search.html +135 -0
  208. snappy/doc/searchindex.js +1 -0
  209. snappy/doc/snap.html +202 -0
  210. snappy/doc/snappy.html +181 -0
  211. snappy/doc/spherogram.html +1346 -0
  212. snappy/doc/todo.html +166 -0
  213. snappy/doc/triangulation.html +1676 -0
  214. snappy/doc/tutorial.html +159 -0
  215. snappy/doc/verify.html +330 -0
  216. snappy/doc/verify_internals.html +1235 -0
  217. snappy/drilling/__init__.py +456 -0
  218. snappy/drilling/barycentric.py +103 -0
  219. snappy/drilling/constants.py +5 -0
  220. snappy/drilling/crush.py +270 -0
  221. snappy/drilling/cusps.py +125 -0
  222. snappy/drilling/debug.py +242 -0
  223. snappy/drilling/epsilons.py +6 -0
  224. snappy/drilling/exceptions.py +55 -0
  225. snappy/drilling/moves.py +620 -0
  226. snappy/drilling/peripheral_curves.py +210 -0
  227. snappy/drilling/perturb.py +188 -0
  228. snappy/drilling/shorten.py +36 -0
  229. snappy/drilling/subdivide.py +274 -0
  230. snappy/drilling/test.py +23 -0
  231. snappy/drilling/test_cases.py +132 -0
  232. snappy/drilling/tracing.py +351 -0
  233. snappy/exceptions.py +26 -0
  234. snappy/export_stl.py +120 -0
  235. snappy/exterior_to_link/__init__.py +2 -0
  236. snappy/exterior_to_link/barycentric_geometry.py +463 -0
  237. snappy/exterior_to_link/exceptions.py +6 -0
  238. snappy/exterior_to_link/geodesic_map.json +14408 -0
  239. snappy/exterior_to_link/hyp_utils.py +112 -0
  240. snappy/exterior_to_link/link_projection.py +323 -0
  241. snappy/exterior_to_link/main.py +198 -0
  242. snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
  243. snappy/exterior_to_link/mcomplex_with_link.py +687 -0
  244. snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
  245. snappy/exterior_to_link/pl_utils.py +491 -0
  246. snappy/exterior_to_link/put_in_S3.py +156 -0
  247. snappy/exterior_to_link/rational_linear_algebra.py +130 -0
  248. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
  249. snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
  250. snappy/exterior_to_link/stored_moves.py +475 -0
  251. snappy/exterior_to_link/test.py +31 -0
  252. snappy/filedialog.py +28 -0
  253. snappy/geometric_structure/__init__.py +212 -0
  254. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  255. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +691 -0
  256. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +480 -0
  257. snappy/geometric_structure/cusp_neighborhood/exceptions.py +41 -0
  258. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +294 -0
  259. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +156 -0
  260. snappy/geometric_structure/cusp_neighborhood/vertices.py +35 -0
  261. snappy/geometric_structure/geodesic/__init__.py +0 -0
  262. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  263. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  264. snappy/geometric_structure/geodesic/canonical_representatives.py +52 -0
  265. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  266. snappy/geometric_structure/geodesic/constants.py +6 -0
  267. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  268. snappy/geometric_structure/geodesic/fixed_points.py +106 -0
  269. snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
  270. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  271. snappy/geometric_structure/geodesic/line.py +30 -0
  272. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  273. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +128 -0
  274. snappy/geometric_structure/test.py +22 -0
  275. snappy/gui.py +121 -0
  276. snappy/horoviewer.py +443 -0
  277. snappy/hyperboloid/__init__.py +212 -0
  278. snappy/hyperboloid/distances.py +259 -0
  279. snappy/hyperboloid/horoball.py +19 -0
  280. snappy/hyperboloid/line.py +35 -0
  281. snappy/hyperboloid/point.py +9 -0
  282. snappy/hyperboloid/triangle.py +29 -0
  283. snappy/info_icon.gif +0 -0
  284. snappy/infowindow.py +65 -0
  285. snappy/isometry_signature.py +389 -0
  286. snappy/len_spec/__init__.py +609 -0
  287. snappy/len_spec/geodesic_info.py +129 -0
  288. snappy/len_spec/geodesic_key_info_dict.py +116 -0
  289. snappy/len_spec/geodesic_piece.py +146 -0
  290. snappy/len_spec/geometric_structure.py +182 -0
  291. snappy/len_spec/geometry.py +136 -0
  292. snappy/len_spec/length_spectrum_geodesic_info.py +185 -0
  293. snappy/len_spec/spine.py +128 -0
  294. snappy/len_spec/test.py +24 -0
  295. snappy/len_spec/test_cases.py +69 -0
  296. snappy/len_spec/tile.py +276 -0
  297. snappy/len_spec/word.py +86 -0
  298. snappy/manifolds/HTWKnots/alternating.gz +0 -0
  299. snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
  300. snappy/manifolds/__init__.py +3 -0
  301. snappy/margulis/__init__.py +332 -0
  302. snappy/margulis/cusp_neighborhood_neighborhood.py +66 -0
  303. snappy/margulis/geodesic_neighborhood.py +152 -0
  304. snappy/margulis/margulis_info.py +21 -0
  305. snappy/margulis/mu_from_neighborhood_pair.py +175 -0
  306. snappy/margulis/neighborhood.py +29 -0
  307. snappy/margulis/test.py +22 -0
  308. snappy/math_basics.py +187 -0
  309. snappy/matrix.py +525 -0
  310. snappy/number.py +657 -0
  311. snappy/numeric_output_checker.py +345 -0
  312. snappy/pari.py +41 -0
  313. snappy/phone_home.py +57 -0
  314. snappy/polyviewer.py +259 -0
  315. snappy/ptolemy/__init__.py +17 -0
  316. snappy/ptolemy/component.py +103 -0
  317. snappy/ptolemy/coordinates.py +2290 -0
  318. snappy/ptolemy/fieldExtensions.py +153 -0
  319. snappy/ptolemy/findLoops.py +473 -0
  320. snappy/ptolemy/geometricRep.py +59 -0
  321. snappy/ptolemy/homology.py +165 -0
  322. snappy/ptolemy/magma/default.magma_template +229 -0
  323. snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
  324. snappy/ptolemy/manifoldMethods.py +395 -0
  325. snappy/ptolemy/matrix.py +350 -0
  326. snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
  327. snappy/ptolemy/polynomial.py +856 -0
  328. snappy/ptolemy/processComponents.py +173 -0
  329. snappy/ptolemy/processFileBase.py +247 -0
  330. snappy/ptolemy/processFileDispatch.py +46 -0
  331. snappy/ptolemy/processMagmaFile.py +392 -0
  332. snappy/ptolemy/processRurFile.py +150 -0
  333. snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
  334. snappy/ptolemy/ptolemyObstructionClass.py +64 -0
  335. snappy/ptolemy/ptolemyVariety.py +995 -0
  336. snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
  337. snappy/ptolemy/reginaWrapper.py +698 -0
  338. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  339. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  340. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  341. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  342. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  343. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  344. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  345. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  346. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  347. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  348. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
  349. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  350. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  351. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
  352. snappy/ptolemy/rur.py +545 -0
  353. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
  354. snappy/ptolemy/test.py +1126 -0
  355. snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
  356. snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
  357. snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
  358. snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
  359. snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
  360. snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
  361. snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
  362. snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
  363. snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
  364. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  365. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  366. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  367. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  368. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  369. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  370. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  371. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  372. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
  373. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
  374. snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
  375. snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
  376. snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
  377. snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
  378. snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
  379. snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
  380. snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
  381. snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
  382. snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
  383. snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
  384. snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
  385. snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
  386. snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
  387. snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
  388. snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
  389. snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
  390. snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
  391. snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
  392. snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
  393. snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  394. snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  395. snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
  396. snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
  397. snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  398. snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  399. snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
  400. snappy/ptolemy/utilities.py +236 -0
  401. snappy/raytracing/__init__.py +64 -0
  402. snappy/raytracing/additional_horospheres.py +64 -0
  403. snappy/raytracing/additional_len_spec_choices.py +63 -0
  404. snappy/raytracing/cohomology_fractal.py +197 -0
  405. snappy/raytracing/eyeball.py +124 -0
  406. snappy/raytracing/finite_raytracing_data.py +237 -0
  407. snappy/raytracing/finite_viewer.py +590 -0
  408. snappy/raytracing/geodesic_tube_info.py +174 -0
  409. snappy/raytracing/geodesics.py +246 -0
  410. snappy/raytracing/geodesics_window.py +258 -0
  411. snappy/raytracing/gui_utilities.py +293 -0
  412. snappy/raytracing/hyperboloid_navigation.py +556 -0
  413. snappy/raytracing/hyperboloid_utilities.py +234 -0
  414. snappy/raytracing/ideal_raytracing_data.py +592 -0
  415. snappy/raytracing/inside_viewer.py +974 -0
  416. snappy/raytracing/pack.py +22 -0
  417. snappy/raytracing/raytracing_data.py +126 -0
  418. snappy/raytracing/raytracing_view.py +454 -0
  419. snappy/raytracing/shaders/Eye.png +0 -0
  420. snappy/raytracing/shaders/NonGeometric.png +0 -0
  421. snappy/raytracing/shaders/__init__.py +101 -0
  422. snappy/raytracing/shaders/fragment.glsl +1744 -0
  423. snappy/raytracing/test.py +29 -0
  424. snappy/raytracing/tooltip.py +146 -0
  425. snappy/raytracing/upper_halfspace_utilities.py +98 -0
  426. snappy/raytracing/view_scale_controller.py +98 -0
  427. snappy/raytracing/zoom_slider/__init__.py +263 -0
  428. snappy/raytracing/zoom_slider/inward.png +0 -0
  429. snappy/raytracing/zoom_slider/inward18.png +0 -0
  430. snappy/raytracing/zoom_slider/outward.png +0 -0
  431. snappy/raytracing/zoom_slider/outward18.png +0 -0
  432. snappy/raytracing/zoom_slider/test.py +20 -0
  433. snappy/sage_helper.py +119 -0
  434. snappy/settings.py +407 -0
  435. snappy/shell.py +53 -0
  436. snappy/snap/__init__.py +117 -0
  437. snappy/snap/character_varieties.py +375 -0
  438. snappy/snap/find_field.py +372 -0
  439. snappy/snap/fox_milnor.py +271 -0
  440. snappy/snap/fundamental_polyhedron.py +569 -0
  441. snappy/snap/generators.py +39 -0
  442. snappy/snap/interval_reps.py +81 -0
  443. snappy/snap/kernel_structures.py +128 -0
  444. snappy/snap/mcomplex_base.py +18 -0
  445. snappy/snap/nsagetools.py +716 -0
  446. snappy/snap/peripheral/__init__.py +1 -0
  447. snappy/snap/peripheral/dual_cellulation.py +219 -0
  448. snappy/snap/peripheral/link.py +127 -0
  449. snappy/snap/peripheral/peripheral.py +159 -0
  450. snappy/snap/peripheral/surface.py +522 -0
  451. snappy/snap/peripheral/test.py +35 -0
  452. snappy/snap/polished_reps.py +335 -0
  453. snappy/snap/shapes.py +152 -0
  454. snappy/snap/slice_obs_HKL/__init__.py +194 -0
  455. snappy/snap/slice_obs_HKL/basics.py +236 -0
  456. snappy/snap/slice_obs_HKL/direct.py +217 -0
  457. snappy/snap/slice_obs_HKL/poly_norm.py +212 -0
  458. snappy/snap/slice_obs_HKL/rep_theory.py +424 -0
  459. snappy/snap/t3mlite/__init__.py +2 -0
  460. snappy/snap/t3mlite/arrow.py +243 -0
  461. snappy/snap/t3mlite/corner.py +22 -0
  462. snappy/snap/t3mlite/edge.py +172 -0
  463. snappy/snap/t3mlite/face.py +37 -0
  464. snappy/snap/t3mlite/files.py +211 -0
  465. snappy/snap/t3mlite/homology.py +53 -0
  466. snappy/snap/t3mlite/linalg.py +419 -0
  467. snappy/snap/t3mlite/mcomplex.py +1499 -0
  468. snappy/snap/t3mlite/perm4.py +320 -0
  469. snappy/snap/t3mlite/setup.py +12 -0
  470. snappy/snap/t3mlite/simplex.py +199 -0
  471. snappy/snap/t3mlite/spun.py +297 -0
  472. snappy/snap/t3mlite/surface.py +519 -0
  473. snappy/snap/t3mlite/test.py +20 -0
  474. snappy/snap/t3mlite/test_vs_regina.py +86 -0
  475. snappy/snap/t3mlite/tetrahedron.py +109 -0
  476. snappy/snap/t3mlite/vertex.py +42 -0
  477. snappy/snap/test.py +139 -0
  478. snappy/snap/utilities.py +288 -0
  479. snappy/test.py +213 -0
  480. snappy/test_cases.py +263 -0
  481. snappy/testing.py +131 -0
  482. snappy/tiling/__init__.py +2 -0
  483. snappy/tiling/dict_based_set.py +79 -0
  484. snappy/tiling/floor.py +49 -0
  485. snappy/tiling/hyperboloid_dict.py +54 -0
  486. snappy/tiling/iter_utils.py +78 -0
  487. snappy/tiling/lifted_tetrahedron.py +22 -0
  488. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  489. snappy/tiling/quotient_dict.py +70 -0
  490. snappy/tiling/real_hash_dict.py +164 -0
  491. snappy/tiling/test.py +23 -0
  492. snappy/tiling/tile.py +224 -0
  493. snappy/tiling/triangle.py +33 -0
  494. snappy/tkterminal.py +920 -0
  495. snappy/twister/__init__.py +20 -0
  496. snappy/twister/main.py +646 -0
  497. snappy/twister/surfaces/S_0_1 +3 -0
  498. snappy/twister/surfaces/S_0_2 +3 -0
  499. snappy/twister/surfaces/S_0_4 +7 -0
  500. snappy/twister/surfaces/S_0_4_Lantern +8 -0
  501. snappy/twister/surfaces/S_1 +3 -0
  502. snappy/twister/surfaces/S_1_1 +4 -0
  503. snappy/twister/surfaces/S_1_2 +5 -0
  504. snappy/twister/surfaces/S_1_2_5 +6 -0
  505. snappy/twister/surfaces/S_2 +6 -0
  506. snappy/twister/surfaces/S_2_1 +8 -0
  507. snappy/twister/surfaces/S_2_heeg +10 -0
  508. snappy/twister/surfaces/S_3 +8 -0
  509. snappy/twister/surfaces/S_3_1 +10 -0
  510. snappy/twister/surfaces/S_4_1 +12 -0
  511. snappy/twister/surfaces/S_5_1 +14 -0
  512. snappy/twister/surfaces/heeg_fig8 +9 -0
  513. snappy/twister/twister_core.cpython-310-aarch64-linux-gnu.so +0 -0
  514. snappy/upper_halfspace/__init__.py +146 -0
  515. snappy/upper_halfspace/ideal_point.py +29 -0
  516. snappy/verify/__init__.py +13 -0
  517. snappy/verify/canonical.py +542 -0
  518. snappy/verify/complex_volume/__init__.py +18 -0
  519. snappy/verify/complex_volume/adjust_torsion.py +86 -0
  520. snappy/verify/complex_volume/closed.py +168 -0
  521. snappy/verify/complex_volume/compute_ptolemys.py +90 -0
  522. snappy/verify/complex_volume/cusped.py +56 -0
  523. snappy/verify/complex_volume/extended_bloch.py +201 -0
  524. snappy/verify/cusp_translations.py +85 -0
  525. snappy/verify/edge_equations.py +80 -0
  526. snappy/verify/exceptions.py +254 -0
  527. snappy/verify/hyperbolicity.py +224 -0
  528. snappy/verify/interval_newton_shapes_engine.py +523 -0
  529. snappy/verify/interval_tree.py +400 -0
  530. snappy/verify/krawczyk_shapes_engine.py +518 -0
  531. snappy/verify/real_algebra.py +286 -0
  532. snappy/verify/shapes.py +25 -0
  533. snappy/verify/square_extensions.py +1005 -0
  534. snappy/verify/test.py +72 -0
  535. snappy/verify/volume.py +128 -0
  536. snappy/version.py +2 -0
  537. snappy-3.3.dist-info/METADATA +58 -0
  538. snappy-3.3.dist-info/RECORD +541 -0
  539. snappy-3.3.dist-info/WHEEL +6 -0
  540. snappy-3.3.dist-info/entry_points.txt +2 -0
  541. snappy-3.3.dist-info/top_level.txt +28 -0
@@ -0,0 +1,392 @@
1
+ from .polynomial import Polynomial
2
+ from .ptolemyVarietyPrimeIdealGroebnerBasis import PtolemyVarietyPrimeIdealGroebnerBasis
3
+ from . import processFileBase
4
+ from . import utilities
5
+ import snappy
6
+
7
+ import re
8
+ import sys
9
+ import tempfile
10
+ import subprocess
11
+ import shutil
12
+
13
+ ###############################################################################
14
+ # functions
15
+
16
+
17
+ def decomposition_from_magma(text):
18
+
19
+ py_eval = processFileBase.get_py_eval(text)
20
+ manifold_thunk = processFileBase.get_manifold_thunk(text)
21
+
22
+ untyped_decomposition = processFileBase.find_section(
23
+ text, "IDEAL=DECOMPOSITION")
24
+ primary_decomposition = processFileBase.find_section(
25
+ text, "PRIMARY=DECOMPOSITION")
26
+ radical_decomposition = processFileBase.find_section(
27
+ text, "RADICAL=DECOMPOSITION")
28
+
29
+ if untyped_decomposition:
30
+ decomposition = untyped_decomposition[0]
31
+ elif primary_decomposition:
32
+ decomposition = primary_decomposition[0]
33
+ elif radical_decomposition:
34
+ decomposition = radical_decomposition[0]
35
+ else:
36
+ raise ValueError(
37
+ "File not recognized as magma output "
38
+ "(missing primary decomposition or radical decomposition)")
39
+
40
+ # Remove "\" at the wrapped lines
41
+ decomposition = utilities.join_long_lines_deleting_whitespace(
42
+ decomposition)
43
+
44
+ # Remove outer square brackets
45
+ decomposition = processFileBase.remove_outer_square_brackets(decomposition)
46
+
47
+ decomposition_comps = [ c.strip() for c in decomposition.split(']') ]
48
+ decomposition_components = [ c + ']' for c in decomposition_comps if c ]
49
+
50
+ free_variables_section = processFileBase.find_section(
51
+ text, "FREE=VARIABLES=IN=COMPONENTS")
52
+ if free_variables_section:
53
+ free_variables = eval(free_variables_section[0])
54
+ else:
55
+ free_variables = len(decomposition_components) * [None]
56
+
57
+ witnesses_section = processFileBase.find_section(
58
+ text, "WITNESSES=FOR=COMPONENTS")
59
+ if witnesses_section:
60
+ witnesses_sections = processFileBase.find_section(
61
+ witnesses_section[0], "WITNESSES")
62
+ else:
63
+ witnesses_sections = len(decomposition_components) * [""]
64
+
65
+ genuses_section = processFileBase.find_section(
66
+ text, "GENUSES=FOR=COMPONENTS")
67
+ if genuses_section:
68
+ genuses_sections = processFileBase.find_section(
69
+ genuses_section[0], "GENUS=FOR=COMPONENT")
70
+ else:
71
+ genuses_sections = len(decomposition_components) * [""]
72
+
73
+ def process_match(i, comp, free_vars, witnesses_txt, genus_txt):
74
+
75
+ if i != 0:
76
+ if not comp[0] == ',':
77
+ raise ValueError("Parsing decomposition, expected "
78
+ "separating comma.")
79
+ comp = comp[1:].strip()
80
+
81
+ if genus_txt.strip():
82
+ genus = int(genus_txt)
83
+ else:
84
+ genus = None
85
+
86
+ witnesses_txts = processFileBase.find_section(
87
+ witnesses_txt, "WITNESS")
88
+
89
+ witnesses = [
90
+ _parse_ideal_groebner_basis(
91
+ utilities.join_long_lines_deleting_whitespace(t).strip(),
92
+ py_eval, manifold_thunk, free_vars, [], genus)
93
+ for t in witnesses_txts ]
94
+
95
+ return _parse_ideal_groebner_basis(comp, py_eval, manifold_thunk,
96
+ free_vars, witnesses, genus)
97
+
98
+ return utilities.MethodMappingList(
99
+ [ process_match(i, comp, free_vars, witnesses, genus_txt)
100
+ for i, (comp, free_vars, witnesses, genus_txt)
101
+ in enumerate(zip(decomposition_components,
102
+ free_variables,
103
+ witnesses_sections,
104
+ genuses_sections)) ])
105
+
106
+
107
+ def _parse_ideal_groebner_basis(text, py_eval, manifold_thunk,
108
+ free_vars, witnesses, genus):
109
+ match = re.match(
110
+ r"Ideal of Polynomial ring of rank.*?\n"
111
+ r"\s*?(Order:\s*?(.*?)|(.*?)\s*?Order)\n"
112
+ r"\s*?Variables:(.*?\n)+"
113
+ r".*?Dimension (\d+).*?\s*([^,]*[Pp]rime)?.*?\n"
114
+ r"(\s*?Size of variety over algebraically closed field: (\d+).*?\n)?"
115
+ r"\s*Groebner basis:\n"
116
+ r"\s*?\[([^\[\]]*)\]$",
117
+ text)
118
+
119
+ if not match:
120
+ raise ValueError("Parsing error in component of "
121
+ "decomposition: %s" % text)
122
+
123
+ (
124
+ tot_order_str, post_order_str, pre_order_str,
125
+ var_str,
126
+ dimension_str, prime_str,
127
+ variety_str, size_str,
128
+
129
+ poly_strs ) = match.groups()
130
+
131
+ dimension = int(dimension_str)
132
+
133
+ if dimension == 0:
134
+ polys = [ Polynomial.parse_string(p)
135
+ for p in poly_strs.replace('\n',' ').split(',') ]
136
+ else:
137
+ polys = []
138
+
139
+ order_str = post_order_str if post_order_str else pre_order_str
140
+ if not order_str:
141
+ raise ValueError("Could not parse order in decomposition")
142
+
143
+ if order_str.strip().lower() == 'lexicographical':
144
+ term_order = 'lex'
145
+ else:
146
+ term_order = 'other'
147
+
148
+ is_prime = (prime_str is None) or (prime_str.lower() == 'prime')
149
+
150
+ return PtolemyVarietyPrimeIdealGroebnerBasis(
151
+ polys=polys,
152
+ term_order=term_order,
153
+ size=processFileBase.parse_int_or_empty(size_str),
154
+ dimension=dimension,
155
+ is_prime=is_prime,
156
+ free_variables=free_vars,
157
+ py_eval=py_eval,
158
+ manifold_thunk=manifold_thunk,
159
+ witnesses=witnesses,
160
+ genus=genus)
161
+
162
+
163
+ def triangulation_from_magma(text):
164
+ """
165
+ Reads the output from a magma computation and extracts the manifold for
166
+ which this output contains solutions.
167
+ """
168
+ return processFileBase.get_manifold(text)
169
+
170
+
171
+ def triangulation_from_magma_file(filename):
172
+ """
173
+ Reads the output from a magma computation from the file with the given
174
+ filename and extracts the manifold for which the file contains solutions.
175
+ """
176
+
177
+ return processFileBase.get_manifold_from_file(filename)
178
+
179
+
180
+ def contains_magma_output(text):
181
+ return ("IDEAL=DECOMPOSITION=BEGINS" in text or
182
+ "PRIMARY=DECOMPOSITION=BEGINS" in text or
183
+ "RADICAL=DECOMPOSITION=BEGINS" in text)
184
+
185
+
186
+ def solutions_from_magma_file(filename, numerical=False):
187
+ """
188
+ Obsolete, use processFileDispatch.parse_solutions_from_file instead.
189
+
190
+ Reads the output from a magma computation from the file with the given
191
+ filename and returns a list of solutions. Also see solutions_from_magma.
192
+ A non-zero dimensional component of the variety is reported as
193
+ NonZeroDimensionalComponent.
194
+ """
195
+
196
+ return solutions_from_magma(open(filename).read(), numerical)
197
+
198
+
199
+ def solutions_from_magma(output, numerical=False):
200
+ """
201
+ Obsolete, use processFileDispatch.parse_solutions instead.
202
+
203
+ Assumes the given string is the output of a magma computation, parses
204
+ it and returns a list of solutions.
205
+ A non-zero dimensional component of the variety is reported as
206
+ NonZeroDimensionalComponent.
207
+ """
208
+
209
+ return decomposition_from_magma(output).solutions(
210
+ numerical=numerical)
211
+
212
+
213
+ def magma_executable():
214
+ for name in ['magma', 'magma.exe']:
215
+ if shutil.which(name):
216
+ return name
217
+ return None
218
+
219
+
220
+ def run_magma(content,
221
+ filename_base, memory_limit, directory, verbose):
222
+ """
223
+ call magma on the given content and
224
+ """
225
+
226
+ magma = magma_executable()
227
+ if magma is None:
228
+ raise ValueError('Sorry, could not find the Magma executable')
229
+
230
+ if directory:
231
+ resolved_dir = directory
232
+ if not resolved_dir[-1] == '/':
233
+ resolved_dir = resolved_dir + '/'
234
+ else:
235
+ resolved_dir = tempfile.mkdtemp() + '/'
236
+
237
+ in_file = resolved_dir + filename_base + '.magma'
238
+ out_file = resolved_dir + filename_base + '.magma_out'
239
+
240
+ if verbose:
241
+ print("Writing to file:", in_file)
242
+
243
+ open(in_file, 'wb').write(content.encode('ascii'))
244
+
245
+ if verbose:
246
+ print("Magma's output in:", out_file)
247
+
248
+ if sys.platform.startswith('win'):
249
+ cmd = 'echo | %s "%s" > "%s"' % (magma, in_file, out_file)
250
+ else:
251
+ cmd = 'ulimit -m %d; echo | %s "%s" > "%s"' % (
252
+ int(memory_limit / 1024), magma, in_file, out_file)
253
+
254
+ if verbose:
255
+ print("Command:", cmd)
256
+ print("Starting magma...")
257
+
258
+ retcode = subprocess.call(cmd, shell=True)
259
+
260
+ result = open(out_file, 'r').read()
261
+
262
+ if verbose:
263
+ print("magma finished.")
264
+ print("Parsing magma result...")
265
+
266
+ return decomposition_from_magma(result)
267
+
268
+ ###############################################################################
269
+ # magma test
270
+
271
+
272
+ _magma_output_for_4_1__sl3 = """
273
+ ==TRIANGULATION=BEGINS==
274
+ % Triangulation
275
+ 4_1
276
+ geometric_solution 2.02988321
277
+ oriented_manifold
278
+ CS_known -0.0000000000000001
279
+
280
+ 1 0
281
+ torus 0.000000000000 0.000000000000
282
+
283
+ 2
284
+ 1 1 1 1
285
+ 0132 1302 1023 2031
286
+ 0 0 0 0
287
+ 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0
288
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
289
+ 0 1 0 -1 -1 0 2 -1 0 -1 0 1 0 1 -1 0
290
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
291
+ 0.500000000000 0.866025403784
292
+
293
+ 0 0 0 0
294
+ 0132 1302 1023 2031
295
+ 0 0 0 0
296
+ 0 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0
297
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
298
+ 0 1 -2 1 1 0 0 -1 0 1 0 -1 0 -1 1 0
299
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
300
+ 0.500000000000 0.866025403784
301
+
302
+
303
+ ==TRIANGULATION=ENDS==
304
+ PY=EVAL=SECTION=BEGINS=HERE
305
+ {'variable_dict' :
306
+ (lambda d, negation = (lambda x:-x): {
307
+ 'c_1020_0' : d['c_0012_1'],
308
+ 'c_1020_1' : d['1'],
309
+ 'c_0201_0' : d['c_0201_0'],
310
+ 'c_0201_1' : d['c_0201_0'],
311
+ 'c_2100_0' : d['1'],
312
+ 'c_2100_1' : d['c_0012_1'],
313
+ 'c_2010_0' : d['1'],
314
+ 'c_2010_1' : d['c_0012_1'],
315
+ 'c_0102_0' : d['c_0102_0'],
316
+ 'c_0102_1' : d['c_0102_0'],
317
+ 'c_1101_0' : d['c_1101_0'],
318
+ 'c_1101_1' : negation(d['c_1101_0']),
319
+ 'c_1200_0' : d['c_0012_1'],
320
+ 'c_1200_1' : d['1'],
321
+ 'c_1110_0' : negation(d['c_1011_1']),
322
+ 'c_1110_1' : negation(d['c_1011_0']),
323
+ 'c_0120_0' : d['c_0102_0'],
324
+ 'c_0120_1' : d['c_0102_0'],
325
+ 'c_2001_0' : d['c_0201_0'],
326
+ 'c_2001_1' : d['c_0201_0'],
327
+ 'c_0012_0' : d['1'],
328
+ 'c_0012_1' : d['c_0012_1'],
329
+ 'c_0111_0' : d['1'],
330
+ 'c_0111_1' : negation(d['1']),
331
+ 'c_0210_0' : d['c_0201_0'],
332
+ 'c_0210_1' : d['c_0201_0'],
333
+ 'c_1002_0' : d['c_0102_0'],
334
+ 'c_1002_1' : d['c_0102_0'],
335
+ 'c_1011_0' : d['c_1011_0'],
336
+ 'c_1011_1' : d['c_1011_1'],
337
+ 'c_0021_0' : d['c_0012_1'],
338
+ 'c_0021_1' : d['1']})}
339
+ PY=EVAL=SECTION=ENDS=HERE
340
+ PRIMARY=DECOMPOSITION=BEGINS=HERE
341
+ [
342
+ Ideal of Polynomial ring of rank 7 over Rational Field
343
+ Lexicographical Order
344
+ Variables: t, c_0012_1, c_0102_0, c_0201_0, c_1011_0, c_1011_1, c_1101_0
345
+ Dimension 0, Radical, Prime
346
+ Size of variety over algebraically closed field: 2
347
+ Groebner basis:
348
+ [
349
+ t - 3/8*c_1011_1 - 1/2,
350
+ c_0012_1 + 1/2*c_1011_1 + 3/2,
351
+ c_0102_0 + 1/2*c_1011_1 + 1/2,
352
+ c_0201_0 + 1/2*c_1011_1 + 1/2,
353
+ c_1011_0 - c_1011_1 - 3,
354
+ c_1011_1^2 + 3*c_1011_1 + 4,
355
+ c_1101_0 - 1
356
+ ],
357
+ Ideal of Polynomial ring of rank 7 over Rational Field
358
+ Lexicographical Order
359
+ Variables: t, c_0012_1, c_0102_0, c_0201_0, c_1011_0, c_1011_1, c_1101_0
360
+ Dimension 0, Radical, Prime
361
+ Size of variety over algebraically closed field: 2
362
+ Groebner basis:
363
+ [
364
+ t - 1/2*c_1101_0 - 15/8,
365
+ c_0012_1 - 1,
366
+ c_0102_0 + 4/3*c_1101_0 - 2/3,
367
+ c_0201_0 - 4/3*c_1101_0 - 1/3,
368
+ c_1011_0 - 1/3*c_1101_0 - 1/3,
369
+ c_1011_1 + 1/3*c_1101_0 + 1/3,
370
+ c_1101_0^2 - 1/4*c_1101_0 + 1
371
+ ],
372
+ Ideal of Polynomial ring of rank 7 over Rational Field
373
+ Lexicographical Order
374
+ Variables: t, c_0012_1, c_0102_0, c_0201_0, c_1011_0, c_1011_1, c_1101_0
375
+ Dimension 0, Radical, Prime
376
+ Size of variety over algebraically closed field: 2
377
+ Groebner basis:
378
+ [
379
+ t - c_1011_1 - 1,
380
+ c_0012_1 - 1,
381
+ c_0102_0 - c_1011_1,
382
+ c_0201_0 - c_1011_1,
383
+ c_1011_0 + c_1011_1,
384
+ c_1011_1^2 + c_1011_1 + 1,
385
+ c_1101_0 - 1
386
+ ]
387
+ ]
388
+ PRIMARY=DECOMPOSITION=ENDS=HERE
389
+ CPUTIME : 0.020
390
+
391
+ Total time: 0.419 seconds, Total memory usage: 5.62MB
392
+ """
@@ -0,0 +1,150 @@
1
+ import re
2
+
3
+ from .utilities import MethodMappingList
4
+ from .component import NonZeroDimensionalComponent
5
+ from .coordinates import PtolemyCoordinates
6
+ from .rur import RUR
7
+ from . import processFileBase
8
+ from ..pari import pari
9
+
10
+
11
+ def contains_rur(text):
12
+ return 'RUR=DECOMPOSITION=BEGINS' in text
13
+
14
+
15
+ def decomposition_from_rur(text):
16
+
17
+ py_eval = processFileBase.get_py_eval(text)
18
+ manifold_thunk = processFileBase.get_manifold_thunk(text)
19
+
20
+ rursection = processFileBase.find_unique_section(text, "RUR=DECOMPOSITION")
21
+
22
+ rurs = processFileBase.find_section(rursection, "COMPONENT")
23
+
24
+ result = MethodMappingList(
25
+ [ SolutionContainer(
26
+ _process_rur_component(rur, py_eval, manifold_thunk))
27
+ for rur in rurs ])
28
+
29
+ return result
30
+
31
+
32
+ def _process_rur_component(text, py_eval, manifold_thunk):
33
+ lines = text.split('\n')
34
+
35
+ dimension = None
36
+ is_prime = False
37
+ format = None
38
+
39
+ body = ""
40
+ for line in lines:
41
+ m = re.match(r'==(.*):(.*)', line)
42
+ if m:
43
+ key, val = m.groups()
44
+ val = val.strip()
45
+ if key == "DIMENSION":
46
+ dimension = int(val)
47
+ elif key == "IS_PRIME":
48
+ if val == "TRUE":
49
+ is_prime = True
50
+ elif val != "FALSE":
51
+ raise Exception("IS_PRIME needs to be TRUE or FALSE")
52
+ elif key == "FORMAT":
53
+ format = val
54
+ else:
55
+ raise Exception("Unrecognized key %s" % key)
56
+ else:
57
+ body += line + "\n"
58
+
59
+ if dimension is None:
60
+ return NonZeroDimensionalComponent()
61
+ if dimension > 0:
62
+ return NonZeroDimensionalComponent(dimension=dimension)
63
+
64
+ if format is None:
65
+ raise Exception("No format specified")
66
+
67
+ if format == "MAPLE-LIKE":
68
+ d = parse_maple_like_rur(body.strip())
69
+ return PtolemyCoordinates(d, is_numerical=False,
70
+ py_eval_section=py_eval,
71
+ manifold_thunk=manifold_thunk)
72
+ else:
73
+ raise Exception("Unknown format %s" % format)
74
+
75
+
76
+ def parse_maple_like_rur(text):
77
+
78
+ m = re.match(r"(.*?)\s*=\s*0\s*,\s*\{(.*?)\}", text, re.DOTALL)
79
+
80
+ if not m:
81
+ raise Exception("Format not detected")
82
+
83
+ poly_text, assignments_text = m.groups()
84
+ var = _find_var_of_poly(poly_text)
85
+
86
+ poly = pari(poly_text.replace(var, 'x'))
87
+ assignments_text = assignments_text.replace(var, 'x')
88
+
89
+ return dict([_parse_assignment(assignment, poly)
90
+ for assignment in assignments_text.split(',')])
91
+
92
+
93
+ def parse_rs_rur(text, variables):
94
+
95
+ m = re.match(r'\[([^,\]]+),\s*([^,\]]+),\s*\[([^\]]+)\]\s*,\s*\[\s*\]\s*\]',
96
+ text, re.DOTALL)
97
+
98
+ if not m:
99
+ raise Exception("Format not detected")
100
+
101
+ extension_str, denominator_str, numerators_str = m.groups()
102
+
103
+ var = _find_var_of_poly(extension_str)
104
+
105
+ extension = pari(extension_str.replace(var, 'x'))
106
+ denominator = pari(denominator_str.replace(var, 'x'))
107
+ numerators = [ pari(numerator_str.replace(var, 'x'))
108
+ for numerator_str in numerators_str.split(',') ]
109
+
110
+ fracs = [
111
+ RUR( [ ( numerator.Mod(extension), 1),
112
+ (denominator.Mod(extension), -1) ] )
113
+ for numerator in numerators ]
114
+
115
+ return dict(list(zip(variables, fracs)) + [('1', RUR.from_int(1))])
116
+
117
+
118
+ def _find_var_of_poly(text):
119
+ return re.search(r'[_A-Za-z][_A-Za-z0-9]*',text).group(0)
120
+
121
+
122
+ def _parse_assignment(text, poly):
123
+ var, expression = re.match(r'\s*([_A-Za-z][_A-Za-z0-9]*)\s*=\s*(.*)$',
124
+ text).groups()
125
+
126
+ return (
127
+ var,
128
+ RUR.from_pari_fraction_and_number_field(pari(expression), poly))
129
+
130
+
131
+ _test_case = """
132
+ _Z^6-3*_Z^5+3*_Z^4-2*_Z^3+_Z-1 = 0,
133
+ {c_0012_0 = 1, c_0012_2 = _Z^5-3*_Z^4+3*_Z^3-_Z^2-2*_Z+1, c_0111_2 = -_Z*(_Z^4-2*_Z^3+_Z-1), c_1011_0 = -_Z^2*(-1+_Z), c_1101_0 = -_Z*(-1+_Z), c_1101_1 = _Z*(-1+_Z), c_1110_0 = _Z, a = (_Z^3+_Z^2)/(_Z^3+34*_Z^2+3)}
134
+ """
135
+
136
+
137
+ class SolutionContainer():
138
+ def __init__(self, solutions):
139
+ self._solutions = solutions
140
+
141
+ def solutions(self, numerical=False):
142
+ if numerical:
143
+ return self._solutions.numerical()
144
+ else:
145
+ return self._solutions
146
+
147
+ def number_field(self):
148
+ return self._solutions.number_field()
149
+
150
+ # print parse_maple_like_rur(_test_case)
@@ -0,0 +1,102 @@
1
+ from . import matrix
2
+ from .polynomial import Polynomial
3
+ from ..pari import pari
4
+
5
+
6
+ class PtolemyGeneralizedObstructionClass():
7
+ """
8
+ Represents an obstruction cocycle of a PSL(n,C) representation in
9
+ H^2(M,partial M;Z/n).
10
+
11
+ >>> from snappy import Manifold
12
+ >>> M = Manifold("m004")
13
+
14
+ Create an obstruction class, this has to be in the kernel of d^2:
15
+
16
+ >>> c = PtolemyGeneralizedObstructionClass([2,0,0,1])
17
+
18
+ For better accounting, give it an index:
19
+
20
+ >>> c = PtolemyGeneralizedObstructionClass([2,0,0,1], index = 1)
21
+
22
+ Get corresponding ptolemy variety:
23
+
24
+ >>> p = M.ptolemy_variety(N=3, obstruction_class=c)
25
+
26
+ Canonical filename base:
27
+
28
+ >>> p.filename_base()
29
+ 'm004__sl3_c1'
30
+
31
+ Now pick something not in the kernel:
32
+
33
+ >>> c = PtolemyGeneralizedObstructionClass([1,0,0,1])
34
+ >>> p = M.ptolemy_variety(N=3, obstruction_class=c)
35
+ Traceback (most recent call last):
36
+ ...
37
+ AssertionError: PtolemyGeneralizedObstructionClass not in kernel of d2
38
+
39
+ """
40
+
41
+ def __init__(self, H2_class, index=None, N=None, manifold=None):
42
+
43
+ self.H2_class = H2_class
44
+ self._index = index
45
+ self._N = N
46
+ self._manifold = manifold
47
+
48
+ def _checkManifoldAndN(self, manifold, N):
49
+ if self._manifold is not None:
50
+ assert manifold == self._manifold, (
51
+ "PtolemyGeneralizedObstructionClass for wrong manifold")
52
+
53
+ if self._N is not None:
54
+ assert N == self._N, (
55
+ "PtolemyGeneralizedObstructionClass for wrong N")
56
+
57
+ assert len(self.H2_class) == 2 * manifold.num_tetrahedra(), (
58
+ "PtolemyGeneralizedObstructionClass does not match number of "
59
+ "face classes")
60
+
61
+ # compute boundary maps for cellular chain complex
62
+ chain_d3, dummy_rows, dummy_columns = (
63
+ manifold._ptolemy_equations_boundary_map_3())
64
+
65
+ # transpose to compute cohomology
66
+ cochain_d2 = matrix.matrix_transpose(chain_d3)
67
+
68
+ assert matrix.is_vector_zero(
69
+ matrix.vector_modulo(
70
+ matrix.matrix_mult_vector(cochain_d2, self.H2_class),
71
+ N)), ("PtolemyGeneralizedObstructionClass not in kernel of "
72
+ "d2")
73
+
74
+ def _is_non_trivial(self, N):
75
+ for h in self.H2_class:
76
+ if h % N != 0:
77
+ return True
78
+ return False
79
+
80
+ def _get_equation_for_u(self, N):
81
+
82
+ # the information about the root of unity u we use:
83
+ # returns order_of_u, identified_variables, equations
84
+
85
+ if self._is_non_trivial(N):
86
+
87
+ # If we have a non-trivial obstruction class
88
+
89
+ if N == 2:
90
+ # For N == 2, we set u to -1, no extra equations necessary
91
+ return 2, []
92
+
93
+ else:
94
+ # Return the cyclotomic polynomial as extra equation in u
95
+ cyclo = Polynomial.parse_string(str(pari.polcyclo(N, 'u')))
96
+ return N, [cyclo]
97
+ else:
98
+ # If we have the trivial cohomology class, no u returned
99
+ return 1, []
100
+
101
+ def __repr__(self):
102
+ return "PtolemyGeneralizedObstructionClass(%s)" % self.H2_class
@@ -0,0 +1,64 @@
1
+ class PtolemyObstructionClass():
2
+ """
3
+ Represents an obstruction cocycle of a pSL(n,C) representation as
4
+ described in Definition 1.7 of
5
+
6
+ Garoufalidis, Thurston, Zickert
7
+ The Complex Volume of SL(n,C)-Representations of 3-Manifolds
8
+ https://arxiv.org/abs/1111.2828
9
+
10
+ To generate such an obstruction class, call:
11
+
12
+ >>> from snappy import Manifold
13
+ >>> M = Manifold("4_1")
14
+ >>> cs = M.ptolemy_obstruction_classes()
15
+
16
+ Print out the values:
17
+
18
+ >>> for c in cs: print(c)
19
+ 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)
20
+ 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)
21
+ """
22
+
23
+ def __init__(self, manifold, index, H2_element, explain_basis,
24
+ identified_face_classes):
25
+
26
+ self._manifold = manifold
27
+ self._index = index
28
+ self._H2_element = H2_element
29
+ self._explain_basis = explain_basis
30
+ self._identified_face_classes = identified_face_classes
31
+
32
+ def H2_element_entry_to_identified_variable(entry, variable):
33
+ return ((-1)**entry, 0, variable, 1)
34
+
35
+ self.identified_variables = (
36
+ [H2_element_entry_to_identified_variable(entry, variable)
37
+ for entry, variable in zip(H2_element, explain_basis)] +
38
+ [(+1, 0, var1, var2)
39
+ for sign, power, var1, var2 in self._identified_face_classes])
40
+
41
+ def _checkManifoldAndN(self, manifold, N):
42
+ if self._manifold is not None:
43
+ assert manifold == self._manifold, (
44
+ "PtolemyObstructionClass for wrong manifold")
45
+
46
+ assert N % 2 == 0, (
47
+ "PtolemyObstructionClass only makes sense for even N, "
48
+ "try PtolemyGeneralizedObstructionClass")
49
+
50
+ def __repr__(self):
51
+
52
+ def to_string(i):
53
+ sign, power, var1, var2 = i
54
+ var2 = str(var2)
55
+
56
+ assert sign in [+1, -1]
57
+
58
+ if sign == +1:
59
+ return var1 + " - " + var2
60
+ else:
61
+ return var1 + " + " + var2
62
+
63
+ return "PtolemyObstructionClass(%s)" % ', '.join(
64
+ to_string(i) for i in self.identified_variables)