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/sage_helper.py ADDED
@@ -0,0 +1,119 @@
1
+ """
2
+ Helper code for dealing with additional functionality when Sage is
3
+ present.
4
+
5
+ Any method which works only in Sage should be decorated with
6
+ "@sage_method" and any doctests (in Sage methods or not) which should
7
+ be run only in Sage should be styled with input prompt "sage:" rather
8
+ than the usual ">>>".
9
+ """
10
+
11
+ try:
12
+ import sage.structure.sage_object
13
+ _within_sage = True
14
+ except ImportError:
15
+ _within_sage = False
16
+
17
+ class SageNotAvailable(Exception):
18
+ pass
19
+
20
+ if _within_sage:
21
+ def sage_method(function):
22
+ function._sage_method = True
23
+ return function
24
+
25
+ try:
26
+ # Monolithic Sage library
27
+ from sage.all import RealField, RealDoubleElement, gcd, xgcd, prod, powerset
28
+ from sage.all import MatrixSpace, matrix, vector, ZZ
29
+ from sage.all import Integer, Rational, QQ, RR, CC
30
+ from sage.all import sqrt
31
+ from sage.all import I, Infinity
32
+ from sage.all import arccosh
33
+ from sage.all import RIF, CIF
34
+ from sage.all import (cached_method, real_part, imag_part, round, ceil, floor, log,
35
+ CDF, ComplexDoubleField, ComplexField, CyclotomicField, NumberField, PolynomialRing, identity_matrix)
36
+ from sage.all import FiniteField as GF
37
+ from sage.all import VectorSpace, ChainComplex
38
+ from sage.all import ComplexBallField, exp, sin, block_matrix, prime_range, det
39
+ from sage.all import LaurentPolynomialRing, AbelianGroup, GroupAlgebra
40
+ from sage.all import is_prime, is_prime_power, is_power_of_two, prime_range, prime_powers
41
+ from sage.all import gap
42
+ except ImportError:
43
+ # Modularized Sage library
44
+ from sage.algebras.group_algebra import GroupAlgebra
45
+ from sage.arith.misc import (gcd, xgcd, is_prime, is_prime_power,
46
+ is_power_of_two, prime_range, prime_powers)
47
+ from sage.combinat.subset import powerset
48
+ from sage.functions.hyperbolic import arccosh
49
+ from sage.functions.log import exp
50
+ from sage.functions.other import (real as real_part,
51
+ imag as imag_part,
52
+ ceil,
53
+ floor)
54
+ from sage.functions.trig import sin
55
+ from sage.groups.abelian_gps.abelian_group import AbelianGroup
56
+ from sage.homology.chain_complex import ChainComplex
57
+ from sage.matrix.constructor import Matrix as matrix
58
+ from sage.matrix.matrix_space import MatrixSpace
59
+ from sage.matrix.special import block_matrix, identity_matrix
60
+ from sage.misc.cachefunc import cached_method
61
+ from sage.misc.functional import det, log, round, sqrt
62
+ from sage.misc.misc_c import prod
63
+ from sage.modules.free_module import VectorSpace
64
+ from sage.modules.free_module_element import free_module_element as vector
65
+ from sage.rings.cc import CC
66
+ from sage.rings.cif import CIF
67
+ from sage.rings.complex_arb import ComplexBallField
68
+ from sage.rings.complex_double import CDF, ComplexDoubleField
69
+ from sage.rings.complex_mpfr import ComplexField
70
+ from sage.rings.fast_arith import prime_range
71
+ from sage.rings.finite_rings.finite_field_constructor import FiniteField as GF
72
+ from sage.rings.imaginary_unit import I
73
+ from sage.rings.infinity import Infinity
74
+ from sage.rings.integer import Integer
75
+ from sage.rings.integer_ring import ZZ
76
+ from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing
77
+ from sage.rings.number_field.number_field import CyclotomicField, NumberField
78
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
79
+ from sage.rings.rational import Rational
80
+ from sage.rings.rational_field import QQ
81
+ from sage.rings.real_double import RealDoubleElement
82
+ from sage.rings.real_mpfi import RIF
83
+ from sage.rings.real_mpfr import RealField, RealNumber, RR
84
+
85
+ from sage.rings.complex_interval_field import ComplexIntervalField
86
+ from sage.rings.real_mpfi import RealIntervalFieldElement, RealIntervalField
87
+ from sage.rings.real_mpfr import RealNumber, RealField_class
88
+ from sage.structure.sage_object import SageObject
89
+
90
+ try: # Sage >= 9.3, see https://trac.sagemath.org/ticket/24483
91
+ from sage.rings.complex_mpfr import (ComplexField,
92
+ ComplexField_class,
93
+ create_ComplexNumber)
94
+ except ImportError:
95
+ from sage.rings.complex_field import ComplexField, ComplexField_class
96
+ from sage.rings.complex_number import create_ComplexNumber
97
+
98
+ else:
99
+ import decorator
100
+
101
+ def _sage_method(function, *args, **kw):
102
+ raise SageNotAvailable('Sorry, this feature requires using SnapPy inside Sage.')
103
+
104
+ def sage_method(function):
105
+ return decorator.decorator(_sage_method, function)
106
+
107
+ # Not currently used, but could be exploited by an interpreter to hide
108
+ # sage_methods when in plain Python.
109
+
110
+ def sage_methods(obj):
111
+ ans = []
112
+ for attr in dir(obj):
113
+ try:
114
+ methods = getattr(obj, attr)
115
+ if methods._sage_method is True:
116
+ ans.append(methods)
117
+ except AttributeError:
118
+ pass
119
+ return ans
snappy/settings.py ADDED
@@ -0,0 +1,407 @@
1
+ import os
2
+ import sys
3
+ import plistlib
4
+ from .gui import *
5
+ from .app_menus import ListedWindow
6
+ from .tkterminal import FontChoice, default_terminal_font
7
+
8
+ def clip_font_size(size):
9
+ try:
10
+ value = int(size)
11
+ except:
12
+ return 13 if sys.platform == 'darwin' else 11
13
+ if value < 10:
14
+ return 10
15
+ if value > 36:
16
+ return 36
17
+ return size
18
+
19
+ class Settings:
20
+ def __init__(self):
21
+ self.setting_dict = {
22
+ 'autocall' : False,
23
+ 'font' : self.default_font(),
24
+ 'cusp_horoballs' : True,
25
+ 'cusp_triangulation' : True,
26
+ 'cusp_ford_domain' : True,
27
+ 'cusp_parallelogram' : True,
28
+ 'cusp_labels' : False,
29
+ 'cusp_cutoff' : '0.1000',
30
+ 'keyboard' : 'QWERTY'}
31
+ self.cache = {}
32
+ self.cache_settings()
33
+ self.find_settings()
34
+ self.read_settings()
35
+
36
+ def __getitem__(self, x):
37
+ return self.setting_dict[x]
38
+
39
+ def __setitem__(self, x, y):
40
+ self.setting_dict[x] = y
41
+
42
+ def __repr__(self):
43
+ return str(self.setting_dict)
44
+
45
+ def items(self):
46
+ return self.setting_dict.items()
47
+
48
+ def get(self, key, default):
49
+ return self.setting_dict.get(key, default)
50
+
51
+ def default_font(self):
52
+ return default_terminal_font()
53
+
54
+ def find_settings(self):
55
+ if sys.platform == 'darwin':
56
+ home = os.environ['HOME']
57
+ # File is 'Preferences' rather than 'Settings' for backwards
58
+ # compatibility.
59
+ self.setting_file = os.path.join(home, 'Library',
60
+ 'Preferences',
61
+ 'org.computop.SnapPy.plist')
62
+ elif sys.platform == 'linux2' or sys.platform == 'linux':
63
+ home = os.environ['HOME']
64
+ self.setting_file = os.path.join(home, '.SnapPy.plist')
65
+ elif sys.platform == 'win32':
66
+ home = os.environ['USERPROFILE']
67
+ self.setting_file = os.path.join(home, '.SnapPy.plist')
68
+ else:
69
+ self.setting_file = None
70
+
71
+ def read_settings(self):
72
+ if self.setting_file and os.path.exists(self.setting_file):
73
+ with open(self.setting_file, 'rb') as setting_file:
74
+ new_settings = plistlib.load(setting_file)
75
+
76
+ if 'font' in new_settings:
77
+ family, size, info = new_settings['font']
78
+ # Guard against crazy values in the settings plist file.
79
+ size = clip_font_size(size)
80
+ weight, slant = info.split()
81
+ new_settings['font'] = FontChoice(family, size, weight, slant)
82
+
83
+ self.setting_dict.update(new_settings)
84
+
85
+ def write_settings(self):
86
+ if self.setting_file:
87
+ setting_dict = self.setting_dict.copy()
88
+ font = self.setting_dict['font']
89
+ setting_dict['font'] = (font.family, font.size, font.rest)
90
+ if hasattr(plistlib, 'dump'):
91
+ with open(self.setting_file, 'wb') as setting_file:
92
+ plistlib.dump(setting_dict, setting_file)
93
+ else:
94
+ plistlib.writePlist(setting_dict, self.setting_file)
95
+
96
+ def cache_settings(self):
97
+ self.cache.update(self.setting_dict)
98
+
99
+ def revert_settings(self):
100
+ self.setting_dict.update(self.cache)
101
+ self.apply_settings()
102
+
103
+ def changed(self):
104
+ return [key for key in self.cache.keys() if
105
+ self.cache[key] != self.setting_dict[key]]
106
+
107
+ # Override this in a subclass.
108
+ def apply_settings(self):
109
+ print(self.setting_dict)
110
+
111
+
112
+ class SettingsDialog(Dialog):
113
+ def __init__(self, parent, settings, title='SnapPy Settings'):
114
+ self.parent = parent
115
+ self.style = SnapPyStyle()
116
+ self.settings = settings
117
+ self.settings.cache_settings()
118
+ self.okay = False
119
+ Tk_.Toplevel.__init__(self, master=parent, class_='snappy')
120
+ frame = ttk.Frame(self, padding=(0, 10, 0, 0))
121
+ self.title(title)
122
+ self.notebook = notebook = ttk.Notebook(frame)
123
+ self.build_font_pane(notebook)
124
+ self.build_shell_pane(notebook)
125
+ self.build_cusp_pane(notebook)
126
+ self.build_inside_pane(notebook)
127
+ notebook.add(self.font_frame, text='Font')
128
+ notebook.add(self.shell_frame, text='Shell')
129
+ notebook.add(self.cusp_frame, text='Cusps')
130
+ notebook.add(self.inside_frame, text='Inside')
131
+ notebook.grid(row=0, column=0)
132
+ self.buttonbox()
133
+ notebook.pack(padx=0, pady=0)
134
+ frame.pack()
135
+ self.button_frame.pack(fill=Tk_.X)
136
+ self.protocol('WM_DELETE_WINDOW', self.cancel)
137
+ self.attributes('-topmost', True)
138
+
139
+ def run(self):
140
+ self.wait_window(self)
141
+
142
+ def validate(self):
143
+ cutoff = self.cutoff.get()
144
+ try:
145
+ float(cutoff)
146
+ self.settings['cusp_cutoff'] = cutoff
147
+ except ValueError:
148
+ showerror('Invalid input',
149
+ 'Please enter a number for the cutoff.')
150
+ return False
151
+ self.settings.apply_settings()
152
+ self.okay = True
153
+ return True
154
+
155
+ def revert(self):
156
+ self.settings.revert_settings()
157
+ self.cancel()
158
+
159
+ def buttonbox(self):
160
+ self.button_frame = box = ttk.Frame(self, padding=(0, 0, 0, 20))
161
+ box.grid_columnconfigure(0, weight=1)
162
+ box.grid_columnconfigure(2, weight=1)
163
+ OK = ttk.Button(box, text="OK", width=10, command=self.ok,
164
+ default=Tk_.ACTIVE)
165
+ OK.grid(row=0, column=0, sticky=Tk_.NE, padx=5)
166
+ Apply = ttk.Button(box, text="Apply", width=10,
167
+ command=self.settings.apply_settings)
168
+ Apply.grid(row=0, column=1, sticky=Tk_.N, padx=5)
169
+ Cancel = ttk.Button(box, text="Cancel", width=10, command=self.revert)
170
+ Cancel.grid(row=0, column=2, sticky=Tk_.NW, padx=5)
171
+ self.bind("<Return>", lambda event : OK.focus_set())
172
+ self.bind("<Escape>", self.cancel)
173
+
174
+ def show_body(self):
175
+ self.body_frame.grid(row=1, column=0, padx=5, pady=5,
176
+ sticky=Tk_.N + Tk_.S + Tk_.W + Tk_.E)
177
+ self.body_frame.focus_set()
178
+
179
+ def build_font_pane(self, parent):
180
+ current_font = self.settings['font']
181
+ groupBG = self.style.groupBG
182
+ self.font_frame = font_frame = ttk.Frame(parent)
183
+ font_frame.columnconfigure(2, weight=1)
184
+ font_frame.columnconfigure(0, weight=1)
185
+ self.list_frame = list_frame = ttk.Frame(font_frame)
186
+ self.font_list = font_list = Tk_.Listbox(list_frame,
187
+ selectmode=Tk_.SINGLE)
188
+ font_list.grid(row=0, column=0, pady=(20,30))
189
+ font_scroller = ttk.Scrollbar(list_frame,
190
+ command=font_list.yview)
191
+ font_list.config(yscrollcommand=font_scroller.set)
192
+ font_scroller.grid(row=0, column=1, sticky=Tk_.N + Tk_.S, pady=(20,30))
193
+ list_frame.grid(rowspan=6, column=0)
194
+
195
+ label = ttk.Label(self.font_frame, text='Size: ')
196
+ label.grid(row=0, column=1, sticky=Tk_.E, pady=(20,0))
197
+ self.font_sizer = sizer = Spinbox(font_frame, from_=10, to_=36, width=4,
198
+ command=self.set_font_sample)
199
+ def check_font_size(size):
200
+ try:
201
+ value = int(size)
202
+ except:
203
+ sizer.set(13 if sys.platform == 'darwin' else 11)
204
+ return False
205
+ if value < 10:
206
+ sizer.set(10)
207
+ return False
208
+ if value > 36:
209
+ sizer.set(36)
210
+ return False
211
+ return True
212
+ validator = parent.register(check_font_size)
213
+ sizer.config(validate ="key", validatecommand =(validator, '%P'))
214
+ sizer.delete(0,2)
215
+ sizer.insert(0, clip_font_size(current_font.size))
216
+ sizer.bind('<Return>', self.set_font_sample)
217
+ sizer.bind('<Tab>', self.set_font_sample)
218
+ self.current_size = current_font.size
219
+ sizer.grid(row=0, column=2, sticky=Tk_.W, pady=(20,0))
220
+ label = ttk.Label(font_frame, text='Weight: ')
221
+ label.grid(row=1, column=1, sticky=Tk_.E)
222
+ self.font_weight = weight = Tk_.StringVar(value=current_font.weight)
223
+ radio = ttk.Radiobutton(font_frame, text='normal', variable=weight,
224
+ value='normal', command=self.set_font_sample)
225
+ radio.grid(row=1, column=2, sticky=Tk_.W)
226
+ radio = ttk.Radiobutton(font_frame, text='bold', variable=weight,
227
+ value='bold', command=self.set_font_sample)
228
+ radio.grid(row=2, column=2, sticky=Tk_.W)
229
+ label = ttk.Label(font_frame, text='Slant: ')
230
+ label.grid(row=3, column=1, sticky=Tk_.E)
231
+ self.font_slant = slant = Tk_.StringVar(value=current_font.slant)
232
+ radio = ttk.Radiobutton(font_frame, text='roman', variable=slant,
233
+ value='roman', command=self.set_font_sample)
234
+ radio.grid(row=3, column=2, sticky=Tk_.W)
235
+ radio = ttk.Radiobutton(font_frame, text='italic', variable=slant,
236
+ value='italic', command=self.set_font_sample)
237
+ radio.grid(row=4, column=2, sticky=Tk_.W)
238
+
239
+ self.fixed_only = Tk_.BooleanVar(value=True)
240
+ self.check_fixed = ttk.Checkbutton(font_frame, variable=self.fixed_only,
241
+ text='Fixed-width fonts only',
242
+ command=self.set_font_families)
243
+ self.check_fixed.grid(row=6, column=0, pady=(0, 10), sticky=Tk_.N)
244
+ self.sample = sample = Tk_.Text(font_frame,
245
+ width=40, height=6,
246
+ highlightthickness=0,
247
+ relief=Tk_.FLAT,
248
+ font=self.settings['font'].as_tuple())
249
+ self.sample.bind('<Button-1>', lambda event: 'break')
250
+ self.sample.insert(Tk_.INSERT, '\nABCDEFGHIJKLMNOPQRSTUVWXYZ\n'
251
+ 'abcdefghijklmnopqrstuvwxyz')
252
+ sample.tag_add('all', '1.0', Tk_.END)
253
+ font_list.bind('<ButtonRelease-1>', self.set_font_sample)
254
+ self.sample.grid(row=7, columnspan=4, padx=10, pady=10, sticky=Tk_.E+Tk_.W)
255
+ self.set_font_families()
256
+ self.set_font_sample()
257
+
258
+ def set_font_families(self):
259
+ families = {f for f in font_families()
260
+ if f[0] != '@' and f.lower().find('emoji') < 0} # omit vertical fonts, emojis
261
+ if self.fixed_only.get():
262
+ families = {f for f in families if Font(family=f).metrics('fixed')}
263
+ families.add(self.settings['font'].family)
264
+ self.families = families = sorted(families)
265
+ if self.font_list.size() > 0:
266
+ self.font_list.delete(0, self.font_list.size() - 1)
267
+ for family in families:
268
+ self.font_list.insert(Tk_.END, family)
269
+ self.current_family = families.index(self.settings['font'].family)
270
+ self.font_list.selection_set(self.current_family)
271
+ self.font_list.see(self.current_family)
272
+
273
+ def get_font(self):
274
+ selection = self.font_list.curselection()
275
+ if selection:
276
+ index = int(selection[0])
277
+ self.current_family = index
278
+ else:
279
+ index = self.current_family
280
+ family = self.families[index]
281
+ try:
282
+ size = int(self.font_sizer.get())
283
+ except ValueError:
284
+ size = self.current_size
285
+ self.font_sizer.delete(0, Tk_.END)
286
+ self.font_sizer.insert(0, str(size))
287
+ self.font_list.selection_set(self.current_family)
288
+ return FontChoice(family, size,
289
+ self.font_weight.get(), self.font_slant.get())
290
+
291
+ def set_font_sample(self, event=None):
292
+ new_font = self.get_font()
293
+ self.settings['font'] = new_font
294
+ self.sample.tag_config('all', justify=Tk_.CENTER,
295
+ font=new_font.as_tuple())
296
+
297
+ def build_shell_pane(self, parent):
298
+ groupBG = self.style.groupBG
299
+ self.autocall = Tk_.BooleanVar(value=self.settings['autocall'])
300
+ self.update_idletasks()
301
+ self.shell_frame = shell_frame = ttk.Frame(parent)
302
+ shell_frame.rowconfigure(3, weight=1)
303
+ shell_frame.columnconfigure(0, weight=1)
304
+ shell_frame.columnconfigure(3, weight=1)
305
+ # Keep the height the same as the height of the font pane.
306
+ strut = ttk.Frame(shell_frame, width=1)
307
+ strut.grid(rowspan=5, column=0)
308
+ next_label = ttk.Label(shell_frame, anchor=Tk_.W,
309
+ text='Which IPython features would you like to enable?')
310
+ next_label.grid(row=0, column=1, columnspan=2, sticky=Tk_.W, pady=(20,0))
311
+ next_check = ttk.Checkbutton(shell_frame, variable=self.autocall,
312
+ text='IPython autocall',
313
+ command=self.set_autocall)
314
+ next_check.grid(row=1, column=1, sticky=Tk_.W, pady=(10,0))
315
+ next_check.grid(row=2, column=1, sticky=Tk_.W, pady=(5,0))
316
+
317
+ def set_autocall(self):
318
+ self.settings['autocall'] = self.autocall.get()
319
+
320
+ def build_cusp_pane(self, parent):
321
+ groupBG = self.style.groupBG
322
+ self.cusp_frame = cusp_frame = ttk.Frame(parent)
323
+ self.horoballs = Tk_.BooleanVar(value=self.settings['cusp_horoballs'])
324
+ self.triangulation = Tk_.BooleanVar(value=self.settings['cusp_triangulation'])
325
+ self.ford = Tk_.BooleanVar(value=self.settings['cusp_ford_domain'])
326
+ self.labels = Tk_.BooleanVar(value=self.settings['cusp_labels'])
327
+ self.parallelogram = Tk_.BooleanVar(value=self.settings['cusp_parallelogram'])
328
+ self.cutoff = Tk_.StringVar(value=self.settings['cusp_cutoff'])
329
+ self.update_idletasks()
330
+ cusp_frame.rowconfigure(8, weight=1)
331
+ cusp_frame.columnconfigure(0, weight=1)
332
+ cusp_frame.columnconfigure(3, weight=1)
333
+ strut = ttk.Frame(cusp_frame, width=1)
334
+ strut.grid(rowspan=8, column=0)
335
+ next_label = ttk.Label(cusp_frame,
336
+ text='Which elements should be visible when you first '
337
+ 'view the cusp neighborhood?')
338
+ next_label.grid(row=0, column=1, columnspan=2, sticky=Tk_.W, pady=(20,10))
339
+ next_check = ttk.Checkbutton(cusp_frame, variable=self.horoballs,
340
+ text='Horoballs',
341
+ command=self.set_horoballs)
342
+ next_check.grid(row=1, column=1, sticky=Tk_.W, padx=(30, 0))
343
+ next_check = ttk.Checkbutton(cusp_frame, variable=self.triangulation,
344
+ text='Triangulation',
345
+ command=self.set_triangulation)
346
+ next_check.grid(row=2, column=1, sticky=Tk_.W, padx=(30, 0))
347
+ next_check = ttk.Checkbutton(cusp_frame, variable=self.ford,
348
+ text='Ford domain',
349
+ command=self.set_ford)
350
+ next_check.grid(row=3, column=1, sticky=Tk_.W, padx=(30, 0))
351
+ next_check = ttk.Checkbutton(cusp_frame, variable=self.labels,
352
+ text='Labels',
353
+ command=self.set_labels)
354
+ next_check.grid(row=4, column=1, sticky=Tk_.W, padx=(30, 0))
355
+ next_check = ttk.Checkbutton(cusp_frame, variable=self.parallelogram,
356
+ text='Parallelogram',
357
+ command=self.set_parallelogram)
358
+ next_check.grid(row=5, column=1, sticky=Tk_.W, padx=(30, 0))
359
+ next_label = ttk.Label(cusp_frame,
360
+ text='What should the initial cutoff be?')
361
+ next_label.grid(row=6, column=1, columnspan=2, pady=(20,10), sticky=Tk_.W)
362
+ cutoff_entry = ttk.Entry(cusp_frame, textvariable=self.cutoff, width=15)
363
+ cutoff_entry.grid(row=7, column=1, columnspan=2, sticky=Tk_.W,
364
+ pady=(0,10), padx=(30,0))
365
+
366
+ def set_horoballs(self):
367
+ self.settings['cusp_horoballs'] = self.horoballs.get()
368
+
369
+ def set_triangulation(self):
370
+ self.settings['cusp_triangulation'] = self.triangulation.get()
371
+
372
+ def set_ford(self):
373
+ self.settings['cusp_ford_domain'] = self.ford.get()
374
+
375
+ def set_labels(self):
376
+ self.settings['cusp_labels'] = self.labels.get()
377
+
378
+ def set_parallelogram(self):
379
+ self.settings['cusp_parallelogram'] = self.parallelogram.get()
380
+
381
+ def build_inside_pane(self, parent):
382
+ groupBG = self.style.groupBG
383
+ self.keyboard = Tk_.Variable(value=self.settings['keyboard'])
384
+ self.inside_frame = frame = ttk.Frame(parent)
385
+ frame.rowconfigure(3, weight=1)
386
+ frame.columnconfigure(0, weight=1)
387
+ frame.columnconfigure(3, weight=1)
388
+ # Keep the height the same as the height of the font pane.
389
+ strut = ttk.Frame(frame, width=1)
390
+ strut.grid(rowspan=5, column=0)
391
+ keyboard_label = ttk.Label(frame, anchor=Tk_.W,
392
+ text='Which keyboard layout are you using?')
393
+ keyboard_label.grid(row=0, column=1, columnspan=2, sticky=Tk_.W, pady=(20,0))
394
+ keyboard_button = ttk.OptionMenu(frame, self.keyboard, self.keyboard.get(),
395
+ 'QWERTY', 'AZERTY', 'QWERTZ', command=self.set_keyboard)
396
+ keyboard_button.grid(row=1, column=1, columnspan=2, sticky=Tk_.W, pady=(10, 0))
397
+
398
+ def set_keyboard(self, value):
399
+ self.settings['keyboard'] = value
400
+
401
+
402
+ if __name__ == '__main__':
403
+ parent = Tk_.Tk(className='snappy')
404
+ settings = Settings()
405
+ settings.apply_settings()
406
+ SettingsDialog(parent, settings)
407
+ parent.mainloop()
snappy/shell.py ADDED
@@ -0,0 +1,53 @@
1
+ # -*- coding: utf-8 -*-
2
+ # SnapPy's subclass of the IPython InteractiveShellEmbed
3
+ from IPython.core.displayhook import DisplayHook
4
+ try:
5
+ from IPython.terminal.embed import InteractiveShellEmbed
6
+ except ImportError:
7
+ from IPython.frontend.terminal.embed import InteractiveShellEmbed
8
+
9
+
10
+ class SnapPyPromptDisplayHook(DisplayHook):
11
+ """
12
+ A DisplayHook used when displaying SnapPy's output prompts. This
13
+ subclass overrides one method in order to write the output prompt
14
+ into the SnapPy console instead of sys.stdout.
15
+ """
16
+
17
+ def write_output_prompt(self):
18
+ output = self.shell.output
19
+ output.write(self.shell.separate_out)
20
+ # If we're not displaying a prompt, it effectively ends with a newline,
21
+ # because the output will be left-aligned.
22
+ self.prompt_end_newline = True
23
+ if self.do_full_cache:
24
+ tokens = self.shell.prompts.out_prompt_tokens()
25
+ prompt_txt = ''.join(s for t, s in tokens)
26
+ if prompt_txt and not prompt_txt.endswith('\n'):
27
+ # Ask for a newline before multiline output
28
+ self.prompt_end_newline = False
29
+ for token, text in tokens:
30
+ output.write(text, style=(token[0],))
31
+
32
+
33
+ class SnapPyInteractiveShellEmbed(InteractiveShellEmbed):
34
+ """
35
+ An embedded IPython shell which can use a TkTerm for all of its
36
+ input and output, including the output prompt.
37
+ """
38
+ readline_use = False
39
+ autoindent_use = False
40
+ colors_force = True
41
+ separate_out = '\n'
42
+ separate_in = ''
43
+ show_rewritten_input = False
44
+ pt_app = None
45
+
46
+ def __init__(self, *args, **kwargs):
47
+ super(InteractiveShellEmbed, self).__init__(*args, **kwargs)
48
+ # Currently, using jedi means no completions at all.
49
+ self.Completer.use_jedi = False
50
+ self.magics_manager.magics['line']['colors']('LightBG')
51
+
52
+ def _displayhook_class_default(self):
53
+ return SnapPyPromptDisplayHook