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
snappy/app.py ADDED
@@ -0,0 +1,604 @@
1
+ # -*- coding: utf-8 -*-
2
+ import os
3
+ import sys
4
+ import re
5
+ import time
6
+ from collections.abc import Mapping # Python 3.5 or newer
7
+ from IPython.core.displayhook import DisplayHook
8
+ from tkinter import messagebox
9
+ from .gui import *
10
+ from . import filedialog
11
+ from .exceptions import SnapPeaFatalError
12
+ from .app_menus import HelpMenu, EditMenu, WindowMenu, ListedWindow
13
+ from .app_menus import dirichlet_menus, horoball_menus, inside_view_menus, plink_menus
14
+ from .app_menus import add_menu, scut, open_html_docs
15
+ from .browser import Browser
16
+ from .horoviewer import HoroballViewer
17
+ from .infowindow import about_snappy, InfoWindow
18
+ from .polyviewer import PolyhedronViewer
19
+ from .raytracing.inside_viewer import InsideViewer
20
+ from .settings import Settings, SettingsDialog
21
+ from .phone_home import update_needed
22
+ from .SnapPy import SnapPea_interrupt, msg_stream
23
+ from .shell import SnapPyInteractiveShellEmbed
24
+ from .tkterminal import TkTerminalBase
25
+
26
+ from plink import LinkEditor
27
+ from plink.smooth import Smoother
28
+
29
+ if 'SNAPPYHOME' in os.environ:
30
+ if sys.platform == 'win32':
31
+ os.environ['USERPROFILE'] = os.environ['SNAPPYHOME']
32
+ else:
33
+ os.environ['HOME'] = os.environ['SNAPPYHOME']
34
+
35
+
36
+ class SnapPyTerm(TkTerminalBase, ListedWindow):
37
+ """
38
+ The main window of the SnapPy app, which runs an embedded IPython shell.
39
+ """
40
+
41
+ def __init__(self):
42
+ self.ipython_shell = shell = SnapPyInteractiveShellEmbed.instance(
43
+ banner1=app_banner + update_needed())
44
+ shell.output = self
45
+ shell.set_hook('show_in_pager', IPython_pager)
46
+ self.main_window = self
47
+ self.menu_title = 'SnapPy Shell'
48
+ self.register_window(self)
49
+ TkTerminalBase.__init__(self, shell, name='SnapPy Command Shell')
50
+ self.settings = SnapPySettings(self)
51
+ self.start_interaction()
52
+ self.interact_prompt()
53
+ if sys.platform == 'darwin':
54
+ assert str(self.window) == "."
55
+ # Under OS X, the main window shouldn't be closable.
56
+ self.window.protocol('WM_DELETE_WINDOW', lambda : self.window.iconify())
57
+ self.window.createcommand("::tk::mac::OpenDocument", self.OSX_open_filelist)
58
+ else:
59
+ self.window.tk.call('namespace', 'import', '::tk::dialog::file::')
60
+ self.window.tk.call('set', '::tk::dialog::file::showHiddenBtn', '1')
61
+ self.window.tk.call('set', '::tk::dialog::file::showHiddenVar', '0')
62
+ self.encoding = None
63
+
64
+ def start_interaction(self):
65
+ """
66
+ Display a banner and prepare to begin interaction.
67
+ """
68
+ snappy_path = os.path.abspath(os.path.dirname(__file__))
69
+ icon_file = os.path.join(snappy_path, 'info_icon.gif')
70
+ # Keep a reference to the icon.
71
+ self.icon = Tk_.PhotoImage(file=icon_file)
72
+
73
+ self.text.image_create(Tk_.END, image=self.icon)
74
+ banner_label = Tk_.Label(self.text, text=self.banner,
75
+ background='#ec0fffec0',
76
+ foreground='DarkGreen',
77
+ anchor=Tk_.W,
78
+ justify=Tk_.LEFT,
79
+ font=self.settings['font'].as_tuple())
80
+ self.text.window_create(Tk_.END, window=banner_label)
81
+ self.text.insert(Tk_.END, '\n')
82
+ self.text.mark_set('output_end', '2.0')
83
+ # Set a reasonable default directory for files to be saved to.
84
+ try:
85
+ home = os.environ['HOME']
86
+ except KeyError:
87
+ home = os.path.expanduser("~")
88
+ desktop = os.path.join(home, "Desktop")
89
+ default_save_dir = desktop if os.path.exists(desktop) else home
90
+ self.IP.magics_manager.magics['line']['cd']("-q " + default_save_dir)
91
+
92
+ def add_bindings(self):
93
+ self.window.bind('<<Paste>>', self.edit_paste)
94
+
95
+ def about_window(self):
96
+ window = self.window
97
+ if not hasattr(window, 'about_snappy'):
98
+ window.about_snappy = about_snappy(window)
99
+ else:
100
+ window.about_snappy.deiconify()
101
+ window.about_snappy.lift()
102
+ window.about_snappy.focus_force()
103
+
104
+ def build_menus(self):
105
+ window = self.window
106
+ self.menubar = menubar = Tk_.Menu(window)
107
+ Python_menu = Tk_.Menu(menubar, name="apple")
108
+ Python_menu.add_command(label='About SnapPy...',
109
+ command=self.about_window)
110
+ if sys.platform == 'darwin':
111
+ window.createcommand('::tk::mac::ShowPreferences', self.edit_settings)
112
+ # By default, the Quit menu command terminates the Python process.
113
+ # That is not so friendly if cleanup is needed.
114
+ window.createcommand('::tk::mac::Quit', self.close)
115
+ else:
116
+ Python_menu.add_separator()
117
+ Python_menu.add_command(label='Settings...',
118
+ command=self.edit_settings)
119
+ Python_menu.add_separator()
120
+ Python_menu.add_command(label='Quit SnapPy', command=self.close)
121
+ menubar.add_cascade(label='SnapPy', menu=Python_menu)
122
+ File_menu = Tk_.Menu(menubar, name='file')
123
+ add_menu(window, File_menu, 'Open...', self.open_file)
124
+ add_menu(window, File_menu, 'Open link...', self.open_link_file)
125
+ add_menu(window, File_menu, 'Save', self.save_file, state='disabled')
126
+ add_menu(window, File_menu, 'Save as...', self.save_file_as)
127
+ menubar.add_cascade(label='File', menu=File_menu)
128
+ menubar.add_cascade(label='Edit ', menu=EditMenu(menubar, self.edit_actions))
129
+ if sys.platform == 'darwin':
130
+ menubar.add_cascade(label='View', menu=Tk_.Menu(menubar, name='view'))
131
+ menubar.add_cascade(label='Window', menu=WindowMenu(menubar))
132
+ help_menu = HelpMenu(menubar)
133
+ if sys.platform == 'darwin':
134
+ window.createcommand('::tk::mac::ShowHelp', help_menu.show_SnapPy_help)
135
+ menubar.add_cascade(label='Help', menu=help_menu)
136
+
137
+ def edit_settings(self):
138
+ terminal.can_quit = False
139
+ if sys.platform == 'darwin':
140
+ self.window.deletecommand('::tk::mac::ShowPreferences')
141
+ else:
142
+ apple_menu = self.menubar.children['apple']
143
+ apple_menu.entryconfig(2, state='disabled')
144
+ dialog = SettingsDialog(self.window, self.settings)
145
+ terminal.add_blocker(dialog,
146
+ 'Changes to your settings will be lost if you quit SnapPy now.')
147
+ dialog.run()
148
+ terminal.remove_blocker(dialog)
149
+ if dialog.okay:
150
+ answer = messagebox.askyesno('Save?',
151
+ 'Do you want to save these settings?')
152
+ if answer:
153
+ self.settings.write_settings()
154
+ if sys.platform == 'darwin':
155
+ self.window.createcommand('::tk::mac::ShowPreferences', self.edit_settings)
156
+ else:
157
+ apple_menu.entryconfig(2, state='active')
158
+ self.can_quit = True
159
+
160
+ def OSX_open_filelist(self, *args):
161
+ for arg in args:
162
+ sys.stderr.write(repr(arg)+'\n')
163
+
164
+ def open_file(self, event=None):
165
+ openfile = filedialog.askopenfile(
166
+ parent=self.window,
167
+ title='Run Saved Transcript In Current Namespace',
168
+ defaultextension='.py',
169
+ filetypes=[
170
+ ("Python and text files", "*.py *.ipy *.txt", "TEXT"),
171
+ ("All text files", "", "TEXT"),
172
+ ("All files", "")])
173
+ if openfile:
174
+ lines = openfile.readlines()
175
+ openfile.close()
176
+ if re.search(r"%\s*([vV]irtual)*\s*[lL]ink\s*[Pp]rojection", lines[0]):
177
+ messagebox.showwarning('Bad file',
178
+ 'This is a SnapPea link projection file, '
179
+ 'not a session transcript.')
180
+ elif re.search(r"%\s*[tT]riangulation", lines[0]):
181
+ messagebox.showwarning('Bad file',
182
+ 'This is a SnapPea triangulation file, '
183
+ 'not a session transcript.')
184
+ elif re.search(r"%\s*Generators", lines[0]):
185
+ messagebox.showwarning('Bad file',
186
+ 'This is a SnapPea generator file, '
187
+ 'not a session transcript.')
188
+ else:
189
+ while lines[0][0] in ('#', '\n'):
190
+ lines.pop(0)
191
+ for line in lines:
192
+ # Skip comments.
193
+ if line.startswith('#'):
194
+ continue
195
+ # Simulate the user typing this line of code; strip off
196
+ # the indentation since that has already been printed by
197
+ # interact_prompt.
198
+ self.write(line[:-1].lstrip(), mark=Tk_.INSERT, advance=False)
199
+ # Then simulate the user pressing the Enter key.
200
+ self.handle_return(event=None)
201
+
202
+ def open_link_file(self, event=None):
203
+ openfile = filedialog.askopenfile(
204
+ title='Load Link Projection File',
205
+ defaultextension='.lnk',
206
+ filetypes=[
207
+ ("Link and text files", "*.lnk *.txt", "TEXT"),
208
+ ("All text files", "", "TEXT"),
209
+ ("All files", "")])
210
+ if openfile:
211
+ if not re.search(r"%\s*([vV]irtual)*\s*[lL]ink\s*[Pp]rojection", openfile.readline()):
212
+ messagebox.showwarning('Bad file',
213
+ 'This is not a SnapPea link projection file')
214
+ openfile.close()
215
+ else:
216
+ name = openfile.name
217
+ openfile.close()
218
+ line = "Manifold()\n"
219
+ self.write(line)
220
+ self.interact_handle_input(line)
221
+ self.interact_prompt()
222
+ M = self.IP.user_ns['_']
223
+ M.LE.load(file_name=name)
224
+
225
+ def save_file_as(self, event=None):
226
+ savefile = filedialog.asksaveasfile(
227
+ parent=self.window,
228
+ mode='w',
229
+ title='Save Transcript as a Python script',
230
+ defaultextension='.py',
231
+ filetypes=[
232
+ ("Python and text files", "*.py *.ipy *.txt", "TEXT"),
233
+ ("All text files", "", "TEXT"),
234
+ ("All files", "")])
235
+ if savefile:
236
+ savefile.write("""\
237
+ #!/usr/bin/env/python
238
+ # This script was saved by SnapPy on %s.
239
+ """ % time.asctime())
240
+ inputs = self.IP.history_manager.input_hist_raw
241
+ results = self.IP.history_manager.output_hist
242
+ for n in range(1,len(inputs)):
243
+ savefile.write('\n'+re.sub('\n+','\n',inputs[n]) + '\n')
244
+ try:
245
+ output = repr(results[n]).split('\n')
246
+ except:
247
+ continue
248
+ for line in output:
249
+ savefile.write('#' + line + '\n')
250
+ savefile.close()
251
+
252
+ def save_file(self, event=None):
253
+ self.window.bell()
254
+ self.write2('Save As\n')
255
+
256
+ # These classes assume that the global variable "terminal" exists
257
+
258
+
259
+ class SnapPyBrowser(Browser, ListedWindow):
260
+ def __init__(self, manifold, root=None, main_window=None):
261
+ Browser.__init__(self, manifold, root=root, main_window=terminal)
262
+ self.settings = terminal.settings
263
+ self.menu_title = self.title()
264
+ self.register_window(self)
265
+ self.dirichlet_viewer.help_button.configure(command=self.dirichlet_help)
266
+
267
+ def close(self, event=None):
268
+ terminal.window.focus_force()
269
+ self.unregister_window(self)
270
+ self.withdraw()
271
+ self.after(100, self.destroy)
272
+
273
+ def apply_settings(self):
274
+ if self.inside_view:
275
+ self.inside_view.apply_settings(self.main_window.settings)
276
+
277
+ def dirichlet_help(self):
278
+ if not hasattr(self, 'polyhedron_help'):
279
+ self.polyhedron_help = InfoWindow(self, 'Polyhedron Viewer Help',
280
+ self.dirichlet_viewer.widget.help_text,
281
+ 'polyhedron_help')
282
+ else:
283
+ self.polyhedron_help.deiconify()
284
+ self.polyhedron_help.lift()
285
+ self.polyhedron_help.focus_force()
286
+
287
+ def horoball_help(self):
288
+ if not hasattr(self, 'horoviewer_help'):
289
+ self.horoviewer_help = InfoWindow(self, 'Horoball Viewer Help',
290
+ self.horoball_viewer.widget.help_text,
291
+ 'horoviewer_help')
292
+ else:
293
+ self.horoviewer_help.deiconify()
294
+ self.horoviewer_help.lift()
295
+ self.horoviewer_help.focus_force()
296
+
297
+
298
+ class SnapPyLinkEditor(LinkEditor, ListedWindow):
299
+ def __init__(self, root=None, no_arcs=False, callback=None, cb_menu='',
300
+ manifold=None, file_name=None):
301
+ self.manifold = manifold
302
+ self.main_window = terminal
303
+ LinkEditor.__init__(self, root=terminal.window, no_arcs=no_arcs,
304
+ callback=callback, cb_menu=cb_menu,
305
+ manifold=manifold, file_name=file_name)
306
+ self.set_title()
307
+ self.register_window(self)
308
+ self.window.focus_set()
309
+ self.window.after_idle(self.set_title)
310
+
311
+ def done(self, event=None):
312
+ self.unregister_window(self)
313
+ self.window.withdraw()
314
+
315
+ def reopen(self):
316
+ self.register_window(self)
317
+ self.window.deiconify()
318
+
319
+ def deiconify(self):
320
+ self.window.deiconify()
321
+
322
+ def lift(self):
323
+ self.window.lift()
324
+
325
+ def focus_force(self):
326
+ self.window.focus_force()
327
+
328
+ def set_title(self):
329
+ # Try to determine the variable associated to the manifold:
330
+ title = 'Plink Editor'
331
+ if self.IP:
332
+ ns = self.IP.user_ns
333
+ names = [name for name in ns
334
+ if ns[name] is self.manifold]
335
+ if names:
336
+ names.sort(key=lambda x : '}'+x if x.startswith('_') else x)
337
+ if names[0] == '_':
338
+ count = self.IP.execution_count
339
+ title += ' - Out[%d]' % count
340
+ else:
341
+ title += ' - %s' % names[0]
342
+ else:
343
+ count = self.IP.execution_count
344
+ if ns['_'] is self.manifold:
345
+ title += ' - Out[%d]' % count
346
+ self.window.title(title)
347
+ self.menu_title = title
348
+
349
+ _build_menus = plink_menus
350
+
351
+ def load(self, event=None, file_name=None):
352
+ LinkEditor.load(self, file_name)
353
+
354
+ def save(self, event=None):
355
+ LinkEditor.save(self)
356
+
357
+ def howto(self):
358
+ open_html_docs('plink.html')
359
+
360
+ __repr__ = object.__repr__
361
+
362
+
363
+ class SnapPyViewerWindow(ViewerWindow, ListedWindow):
364
+ def __init__(self, *args, **kwargs):
365
+ ViewerWindow.__init__(self, *args, **kwargs)
366
+ self.main_window = terminal
367
+ self.menu_title = self.title()
368
+ self.register_window(self)
369
+
370
+ def apply_settings(self):
371
+ # The view's apply_settings method has a different signature. It
372
+ # expects to be passed a Settings object.
373
+ self.view.apply_settings(self.main_window.settings)
374
+
375
+ def close(self, event=None):
376
+ self.unregister_window(self)
377
+ self.view = None
378
+ self.destroy()
379
+
380
+
381
+ class SnapPyPolyhedronViewer(PolyhedronViewer):
382
+
383
+ build_menus = dirichlet_menus
384
+
385
+ def __init__(self, *args, **kwargs):
386
+ PolyhedronViewer.__init__(self, *args, **kwargs, main_window=terminal)
387
+ self.help_button.configure(command=self.help_window)
388
+
389
+ def help_window(self):
390
+ window = self.parent
391
+ if not hasattr(window, 'polyhedron_help'):
392
+ window.polyhedron_help = InfoWindow(
393
+ window, 'Polyhedron Viewer Help',
394
+ self.widget.help_text, 'polyhedron_help')
395
+ else:
396
+ window.polyhedron_help.deiconify()
397
+ window.polyhedron_help.lift()
398
+ window.polyhedron_help.focus_force()
399
+
400
+
401
+ class SnapPyHoroballViewer(HoroballViewer):
402
+
403
+ build_menus = horoball_menus
404
+
405
+ def __init__(self, *args, **kwargs):
406
+ HoroballViewer.__init__(self, *args, **kwargs, main_window=terminal)
407
+ self.main_window = terminal
408
+
409
+ def help_window(self):
410
+ window = self.parent
411
+ if not hasattr(window, 'horoball_help'):
412
+ window.horoball_help = InfoWindow(window, 'Horoball Viewer Help',
413
+ self.widget.help_text, 'horoball_help')
414
+ else:
415
+ window.horoball_help.deiconify()
416
+ window.horoball_help.lift()
417
+ window.horoball_help.focus_force()
418
+
419
+
420
+ class SnapPyInsideViewer(InsideViewer):
421
+
422
+ build_menus = inside_view_menus
423
+
424
+
425
+ class SnapPySettings(Settings, ListedWindow):
426
+ def __init__(self, terminal):
427
+ self.terminal = terminal
428
+ Settings.__init__(self)
429
+ self.apply_settings()
430
+
431
+ def apply_settings(self):
432
+ self.terminal.set_font(self['font'])
433
+ changed = self.changed()
434
+ IP = self.terminal.IP
435
+ self.terminal.quiet = True
436
+ if self.setting_dict['autocall']:
437
+ IP.magics_manager.magics['line']['autocall']('2')
438
+ else:
439
+ IP.magics_manager.magics['line']['autocall']('0')
440
+ self.terminal.quiet = False
441
+ for window in self.window_list:
442
+ window.apply_settings()
443
+
444
+
445
+ app_banner = """
446
+ Hi. It's SnapPy.
447
+ SnapPy is based on the SnapPea kernel, written by Jeff Weeks.
448
+ Type "Manifold?" to get started.
449
+ """
450
+
451
+ help_banner = """Type X? for help with X.
452
+ Use the Help menu or type help() to view the SnapPy documentation."""
453
+
454
+
455
+ class SnapPyExit:
456
+ """
457
+ Replacement for the IPython ExitAutocall class
458
+ """
459
+ def __repr__(self):
460
+ return 'Please use the SnapPy menu to quit.'
461
+ __str__ = __repr__
462
+
463
+ def __call__(self):
464
+ return self
465
+
466
+ # This hack avoids an unnecessary warning from IPython saying that
467
+ # _Helper is not included in the app2py site.py file.
468
+
469
+
470
+ class _Helper():
471
+ pass
472
+
473
+
474
+ import site
475
+ site._Helper = _Helper
476
+
477
+ # This will be used for paging by IPython help.
478
+
479
+
480
+ def IPython_pager(self, text, start=0, screen_lines=0):
481
+ if isinstance(text, Mapping):
482
+ text = text['text/plain']
483
+ terminal.page(text)
484
+
485
+
486
+ # This will be used for paging by pydoc help.
487
+ import pydoc
488
+
489
+
490
+ def pydoc_pager(text):
491
+ terminal.page(pydoc.plain(text))
492
+
493
+
494
+ pydoc.getpager() # this call creates the global variable pydoc.pager
495
+ pydoc.pager = pydoc_pager
496
+
497
+
498
+ # This sets the "system menu" icon in the title bar to be the SnapPy
499
+ # icon (in Windows and ??KDE??)
500
+
501
+ def set_icon(window):
502
+ if sys.platform == 'win32':
503
+ try:
504
+ import snappy
505
+ ico = os.path.join(os.path.dirname(__file__), 'SnapPy.ico')
506
+ window.iconbitmap(default=ico)
507
+ except:
508
+ pass
509
+ if sys.platform == 'darwin':
510
+ if not sys.executable.endswith('SnapPy.app/Contents/MacOS/python'):
511
+ snappy_path = os.path.abspath(os.path.dirname(__file__))
512
+ icon_file = os.path.join(snappy_path, 'info_icon.gif')
513
+ image_file = os.path.join(snappy_path, 'SnapPy.png')
514
+ if os.path.exists(image_file):
515
+ dock_icon = Tk_.PhotoImage(file=image_file)
516
+ window.eval('wm iconphoto . -default %s' % dock_icon)
517
+
518
+ # from multiprocessing import Process
519
+ class SnapPyKernelServer():
520
+ """
521
+ Placeholder for a real SnapPyKernelServer which the app can use to
522
+ asynchronously compute data about manifolds.
523
+ """
524
+ def __init__(self):
525
+ self._process = Process(target=self.task)
526
+ self._process.start()
527
+
528
+ def task(self):
529
+ while 1:
530
+ # uncomment these two lines to watch the fake process running
531
+ # print('.', end='')
532
+ # sys.stdout.flush()
533
+ time.sleep(2)
534
+
535
+ def stop(self):
536
+ self._process.terminate()
537
+
538
+ def __del__(self):
539
+ if self._process.is_alive():
540
+ self._process.terminate()
541
+
542
+
543
+ def main():
544
+ global terminal
545
+ import snappy
546
+ # kernel_server = SnapPyKernelServer()
547
+ terminal = SnapPyTerm()
548
+ sys.stdout = terminal
549
+ set_icon(terminal.window)
550
+ terminal.window.call('bind', 'TNotebook', '<Right>', '')
551
+ terminal.window.call('bind', 'TNotebook', '<Left>', '')
552
+ SnapPy_ns = {x: getattr(snappy, x) for x in snappy.__all__}
553
+ # SnapPy_ns['kernel_server'] = kernel_server
554
+ SnapPy_ns['exit'] = SnapPy_ns['quit'] = SnapPyExit()
555
+ SnapPy_ns['pager'] = None
556
+ helper = pydoc.Helper(input=terminal, output=terminal)
557
+ helper.__call__ = lambda x=None : helper.help(x) if x else SnapPy_help()
558
+ helper.__repr__ = lambda : help_banner
559
+ SnapPy_ns['help'] = helper
560
+ terminal.ipython_shell.user_ns.update(SnapPy_ns)
561
+ snappy.browser.main_window = terminal
562
+ LP, HP = snappy.SnapPy, snappy.SnapPyHP
563
+ LP.LinkEditor = HP.LinkEditor = SnapPyLinkEditor
564
+ SnapPyLinkEditor.IP = terminal.ipython_shell
565
+ LP.ViewerWindow = HP.ViewerWindow = SnapPyViewerWindow
566
+ LP.PolyhedronViewer = HP.PolyhedronViewer = SnapPyPolyhedronViewer
567
+ LP.HoroballViewer = HP.HoroballViewer = SnapPyHoroballViewer
568
+ snappy.ViewerWindow = SnapPyViewerWindow
569
+ snappy.ViewerWindow.main_window = terminal
570
+ snappy.InsideViewer = SnapPyInsideViewer
571
+ snappy.InsideViewer.main_window = terminal
572
+ LP.Browser = HP.Browser = SnapPyBrowser
573
+ LP.msg_stream.write = HP.msg_stream.write = terminal.write2
574
+ LP.UI_callback = HP.UI_callback = terminal.SnapPea_callback
575
+ # if not snappy.SnapPy._within_sage:
576
+ # snappy.pari.UI_callback = terminal.PARI_callback
577
+
578
+ """
579
+ Experimental optional Tk themes on linux. You need to install
580
+ tksvg from source for Python 3.10 or newer like so::
581
+
582
+ sudo apt install cmake build-essential tcl-dev tk-dev python3-tk
583
+ python -m pip install scikit-build
584
+ git clone --recursive https://github.com/TkinterEP/python-tksvg.git
585
+ cd python-tksvg
586
+ python -m pip install .
587
+
588
+ then you can do::
589
+
590
+ python -m pip install python-awthemes
591
+
592
+ and uncomment the next four lines.
593
+ """
594
+ # terminal.window.call('tk', 'scaling', 2.0) # Not sure this actually does anything
595
+ # import awthemes
596
+ # style = awthemes.AwthemesStyle(terminal.window)
597
+ # style.theme_use('awbreeze')
598
+ terminal.window.lift()
599
+ terminal.window.mainloop()
600
+ # kernel_server.stop()
601
+
602
+
603
+ if __name__ == "__main__":
604
+ main()