snappy 3.2__cp311-cp311-macosx_10_12_x86_64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (503) hide show
  1. snappy/CyOpenGL.cpython-311-darwin.so +0 -0
  2. snappy/SnapPy.cpython-311-darwin.so +0 -0
  3. snappy/SnapPy.ico +0 -0
  4. snappy/SnapPy.png +0 -0
  5. snappy/SnapPyHP.cpython-311-darwin.so +0 -0
  6. snappy/__init__.py +760 -0
  7. snappy/app.py +605 -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 +38 -0
  13. snappy/cusps/cusp_area_matrix.py +101 -0
  14. snappy/cusps/cusp_areas_from_matrix.py +173 -0
  15. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  16. snappy/cusps/test.py +21 -0
  17. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  18. snappy/database.py +454 -0
  19. snappy/db_utilities.py +79 -0
  20. snappy/decorated_isosig.py +710 -0
  21. snappy/dev/__init__.py +0 -0
  22. snappy/dev/extended_ptolemy/__init__.py +8 -0
  23. snappy/dev/extended_ptolemy/closed.py +106 -0
  24. snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
  25. snappy/dev/extended_ptolemy/direct.py +42 -0
  26. snappy/dev/extended_ptolemy/extended.py +406 -0
  27. snappy/dev/extended_ptolemy/giac_helper.py +43 -0
  28. snappy/dev/extended_ptolemy/giac_rur.py +129 -0
  29. snappy/dev/extended_ptolemy/gluing.py +46 -0
  30. snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
  31. snappy/dev/extended_ptolemy/printMatrices.py +70 -0
  32. snappy/dev/vericlosed/__init__.py +1 -0
  33. snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
  34. snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
  35. snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
  36. snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
  37. snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
  38. snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
  39. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
  40. snappy/dev/vericlosed/orb/__init__.py +1 -0
  41. snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
  42. snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
  43. snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
  44. snappy/dev/vericlosed/test.py +54 -0
  45. snappy/dev/vericlosed/truncatedComplex.py +176 -0
  46. snappy/dev/vericlosed/verificationError.py +58 -0
  47. snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
  48. snappy/doc/_images/SnapPy-196.png +0 -0
  49. snappy/doc/_images/geodesics.jpg +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 +51 -0
  61. snappy/doc/_sources/credits.rst.txt +75 -0
  62. snappy/doc/_sources/development.rst.txt +259 -0
  63. snappy/doc/_sources/index.rst.txt +182 -0
  64. snappy/doc/_sources/installing.rst.txt +247 -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 +355 -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 +925 -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 +156 -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 +199 -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 +620 -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 +427 -0
  152. snappy/doc/credits.html +181 -0
  153. snappy/doc/development.html +384 -0
  154. snappy/doc/genindex.html +1331 -0
  155. snappy/doc/index.html +262 -0
  156. snappy/doc/installing.html +346 -0
  157. snappy/doc/manifold.html +3452 -0
  158. snappy/doc/manifoldhp.html +180 -0
  159. snappy/doc/news.html +388 -0
  160. snappy/doc/objects.inv +0 -0
  161. snappy/doc/other.html +161 -0
  162. snappy/doc/platonic_census.html +375 -0
  163. snappy/doc/plink.html +210 -0
  164. snappy/doc/ptolemy.html +254 -0
  165. snappy/doc/ptolemy_classes.html +1144 -0
  166. snappy/doc/ptolemy_examples1.html +409 -0
  167. snappy/doc/ptolemy_examples2.html +471 -0
  168. snappy/doc/ptolemy_examples3.html +414 -0
  169. snappy/doc/ptolemy_examples4.html +195 -0
  170. snappy/doc/ptolemy_prelim.html +248 -0
  171. snappy/doc/py-modindex.html +165 -0
  172. snappy/doc/screenshots.html +141 -0
  173. snappy/doc/search.html +135 -0
  174. snappy/doc/searchindex.js +1 -0
  175. snappy/doc/snap.html +202 -0
  176. snappy/doc/snappy.html +181 -0
  177. snappy/doc/spherogram.html +1211 -0
  178. snappy/doc/todo.html +166 -0
  179. snappy/doc/triangulation.html +1584 -0
  180. snappy/doc/tutorial.html +159 -0
  181. snappy/doc/verify.html +330 -0
  182. snappy/doc/verify_internals.html +1235 -0
  183. snappy/drilling/__init__.py +456 -0
  184. snappy/drilling/barycentric.py +103 -0
  185. snappy/drilling/constants.py +5 -0
  186. snappy/drilling/crush.py +270 -0
  187. snappy/drilling/cusps.py +125 -0
  188. snappy/drilling/debug.py +242 -0
  189. snappy/drilling/epsilons.py +6 -0
  190. snappy/drilling/exceptions.py +55 -0
  191. snappy/drilling/moves.py +620 -0
  192. snappy/drilling/peripheral_curves.py +210 -0
  193. snappy/drilling/perturb.py +188 -0
  194. snappy/drilling/shorten.py +36 -0
  195. snappy/drilling/subdivide.py +274 -0
  196. snappy/drilling/test.py +23 -0
  197. snappy/drilling/test_cases.py +126 -0
  198. snappy/drilling/tracing.py +351 -0
  199. snappy/exceptions.py +26 -0
  200. snappy/export_stl.py +120 -0
  201. snappy/exterior_to_link/__init__.py +2 -0
  202. snappy/exterior_to_link/barycentric_geometry.py +463 -0
  203. snappy/exterior_to_link/exceptions.py +6 -0
  204. snappy/exterior_to_link/geodesic_map.json +14408 -0
  205. snappy/exterior_to_link/hyp_utils.py +112 -0
  206. snappy/exterior_to_link/link_projection.py +323 -0
  207. snappy/exterior_to_link/main.py +197 -0
  208. snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
  209. snappy/exterior_to_link/mcomplex_with_link.py +687 -0
  210. snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
  211. snappy/exterior_to_link/pl_utils.py +491 -0
  212. snappy/exterior_to_link/put_in_S3.py +156 -0
  213. snappy/exterior_to_link/rational_linear_algebra.py +123 -0
  214. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
  215. snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
  216. snappy/exterior_to_link/stored_moves.py +475 -0
  217. snappy/exterior_to_link/test.py +31 -0
  218. snappy/filedialog.py +28 -0
  219. snappy/geometric_structure/__init__.py +212 -0
  220. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  221. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  222. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  223. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  224. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  225. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  226. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  227. snappy/geometric_structure/geodesic/__init__.py +0 -0
  228. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  229. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  230. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  231. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  232. snappy/geometric_structure/geodesic/constants.py +6 -0
  233. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  234. snappy/geometric_structure/geodesic/fixed_points.py +93 -0
  235. snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
  236. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  237. snappy/geometric_structure/geodesic/line.py +30 -0
  238. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  239. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  240. snappy/geometric_structure/test.py +22 -0
  241. snappy/gui.py +121 -0
  242. snappy/horoviewer.py +443 -0
  243. snappy/hyperboloid/__init__.py +212 -0
  244. snappy/hyperboloid/distances.py +245 -0
  245. snappy/hyperboloid/horoball.py +19 -0
  246. snappy/hyperboloid/line.py +35 -0
  247. snappy/hyperboloid/point.py +9 -0
  248. snappy/hyperboloid/triangle.py +29 -0
  249. snappy/info_icon.gif +0 -0
  250. snappy/infowindow.py +65 -0
  251. snappy/isometry_signature.py +382 -0
  252. snappy/len_spec/__init__.py +596 -0
  253. snappy/len_spec/geodesic_info.py +110 -0
  254. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  255. snappy/len_spec/geodesic_piece.py +143 -0
  256. snappy/len_spec/geometric_structure.py +182 -0
  257. snappy/len_spec/geometry.py +80 -0
  258. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  259. snappy/len_spec/spine.py +206 -0
  260. snappy/len_spec/test.py +24 -0
  261. snappy/len_spec/test_cases.py +69 -0
  262. snappy/len_spec/tile.py +275 -0
  263. snappy/len_spec/word.py +86 -0
  264. snappy/manifolds/HTWKnots/alternating.gz +0 -0
  265. snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
  266. snappy/manifolds/__init__.py +3 -0
  267. snappy/math_basics.py +176 -0
  268. snappy/matrix.py +525 -0
  269. snappy/number.py +657 -0
  270. snappy/numeric_output_checker.py +345 -0
  271. snappy/pari.py +41 -0
  272. snappy/phone_home.py +57 -0
  273. snappy/polyviewer.py +259 -0
  274. snappy/ptolemy/__init__.py +17 -0
  275. snappy/ptolemy/component.py +103 -0
  276. snappy/ptolemy/coordinates.py +2290 -0
  277. snappy/ptolemy/fieldExtensions.py +153 -0
  278. snappy/ptolemy/findLoops.py +473 -0
  279. snappy/ptolemy/geometricRep.py +59 -0
  280. snappy/ptolemy/homology.py +165 -0
  281. snappy/ptolemy/magma/default.magma_template +229 -0
  282. snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
  283. snappy/ptolemy/manifoldMethods.py +395 -0
  284. snappy/ptolemy/matrix.py +350 -0
  285. snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
  286. snappy/ptolemy/polynomial.py +857 -0
  287. snappy/ptolemy/processComponents.py +173 -0
  288. snappy/ptolemy/processFileBase.py +247 -0
  289. snappy/ptolemy/processFileDispatch.py +46 -0
  290. snappy/ptolemy/processMagmaFile.py +392 -0
  291. snappy/ptolemy/processRurFile.py +150 -0
  292. snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
  293. snappy/ptolemy/ptolemyObstructionClass.py +64 -0
  294. snappy/ptolemy/ptolemyVariety.py +1029 -0
  295. snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
  296. snappy/ptolemy/reginaWrapper.py +698 -0
  297. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  298. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  299. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  300. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  301. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  302. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  303. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  304. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  305. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  306. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  307. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
  308. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  309. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  310. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
  311. snappy/ptolemy/rur.py +545 -0
  312. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
  313. snappy/ptolemy/test.py +1126 -0
  314. snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
  315. snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
  316. snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
  317. snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
  318. snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
  319. snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
  320. snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
  321. snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
  322. snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
  323. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  324. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  325. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  326. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  327. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  328. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  329. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  330. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  331. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
  332. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
  333. snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
  334. snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
  335. snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
  336. snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
  337. snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
  338. snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
  339. snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
  340. snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
  341. snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
  342. snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
  343. snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
  344. snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
  345. snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
  346. snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
  347. snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
  348. snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
  349. snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
  350. snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
  351. snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
  352. snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  353. snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  354. snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
  355. snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
  356. snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  357. snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  358. snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
  359. snappy/ptolemy/utilities.py +236 -0
  360. snappy/raytracing/__init__.py +64 -0
  361. snappy/raytracing/additional_horospheres.py +64 -0
  362. snappy/raytracing/additional_len_spec_choices.py +63 -0
  363. snappy/raytracing/cohomology_fractal.py +197 -0
  364. snappy/raytracing/eyeball.py +123 -0
  365. snappy/raytracing/finite_raytracing_data.py +237 -0
  366. snappy/raytracing/finite_viewer.py +590 -0
  367. snappy/raytracing/geodesic_tube_info.py +174 -0
  368. snappy/raytracing/geodesics.py +246 -0
  369. snappy/raytracing/geodesics_window.py +258 -0
  370. snappy/raytracing/gui_utilities.py +293 -0
  371. snappy/raytracing/hyperboloid_navigation.py +556 -0
  372. snappy/raytracing/hyperboloid_utilities.py +234 -0
  373. snappy/raytracing/ideal_raytracing_data.py +592 -0
  374. snappy/raytracing/inside_viewer.py +974 -0
  375. snappy/raytracing/pack.py +22 -0
  376. snappy/raytracing/raytracing_data.py +126 -0
  377. snappy/raytracing/raytracing_view.py +454 -0
  378. snappy/raytracing/shaders/Eye.png +0 -0
  379. snappy/raytracing/shaders/NonGeometric.png +0 -0
  380. snappy/raytracing/shaders/__init__.py +101 -0
  381. snappy/raytracing/shaders/fragment.glsl +1744 -0
  382. snappy/raytracing/test.py +29 -0
  383. snappy/raytracing/tooltip.py +146 -0
  384. snappy/raytracing/upper_halfspace_utilities.py +98 -0
  385. snappy/raytracing/view_scale_controller.py +98 -0
  386. snappy/raytracing/zoom_slider/__init__.py +263 -0
  387. snappy/raytracing/zoom_slider/inward.png +0 -0
  388. snappy/raytracing/zoom_slider/inward18.png +0 -0
  389. snappy/raytracing/zoom_slider/outward.png +0 -0
  390. snappy/raytracing/zoom_slider/outward18.png +0 -0
  391. snappy/raytracing/zoom_slider/test.py +20 -0
  392. snappy/sage_helper.py +117 -0
  393. snappy/settings.py +409 -0
  394. snappy/shell.py +53 -0
  395. snappy/snap/__init__.py +114 -0
  396. snappy/snap/character_varieties.py +375 -0
  397. snappy/snap/find_field.py +372 -0
  398. snappy/snap/fundamental_polyhedron.py +569 -0
  399. snappy/snap/generators.py +39 -0
  400. snappy/snap/interval_reps.py +81 -0
  401. snappy/snap/kernel_structures.py +128 -0
  402. snappy/snap/mcomplex_base.py +18 -0
  403. snappy/snap/nsagetools.py +702 -0
  404. snappy/snap/peripheral/__init__.py +1 -0
  405. snappy/snap/peripheral/dual_cellulation.py +219 -0
  406. snappy/snap/peripheral/link.py +127 -0
  407. snappy/snap/peripheral/peripheral.py +159 -0
  408. snappy/snap/peripheral/surface.py +522 -0
  409. snappy/snap/peripheral/test.py +35 -0
  410. snappy/snap/polished_reps.py +335 -0
  411. snappy/snap/shapes.py +152 -0
  412. snappy/snap/slice_obs_HKL.py +668 -0
  413. snappy/snap/t3mlite/__init__.py +2 -0
  414. snappy/snap/t3mlite/arrow.py +243 -0
  415. snappy/snap/t3mlite/corner.py +22 -0
  416. snappy/snap/t3mlite/edge.py +172 -0
  417. snappy/snap/t3mlite/face.py +37 -0
  418. snappy/snap/t3mlite/files.py +211 -0
  419. snappy/snap/t3mlite/homology.py +53 -0
  420. snappy/snap/t3mlite/linalg.py +419 -0
  421. snappy/snap/t3mlite/mcomplex.py +1499 -0
  422. snappy/snap/t3mlite/perm4.py +320 -0
  423. snappy/snap/t3mlite/setup.py +12 -0
  424. snappy/snap/t3mlite/simplex.py +199 -0
  425. snappy/snap/t3mlite/spun.py +297 -0
  426. snappy/snap/t3mlite/surface.py +519 -0
  427. snappy/snap/t3mlite/test.py +20 -0
  428. snappy/snap/t3mlite/test_vs_regina.py +86 -0
  429. snappy/snap/t3mlite/tetrahedron.py +109 -0
  430. snappy/snap/t3mlite/vertex.py +42 -0
  431. snappy/snap/test.py +134 -0
  432. snappy/snap/utilities.py +288 -0
  433. snappy/test.py +209 -0
  434. snappy/test_cases.py +263 -0
  435. snappy/testing.py +131 -0
  436. snappy/tiling/__init__.py +2 -0
  437. snappy/tiling/canonical_key_dict.py +59 -0
  438. snappy/tiling/dict_based_set.py +79 -0
  439. snappy/tiling/floor.py +49 -0
  440. snappy/tiling/hyperboloid_dict.py +54 -0
  441. snappy/tiling/iter_utils.py +78 -0
  442. snappy/tiling/lifted_tetrahedron.py +22 -0
  443. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  444. snappy/tiling/real_hash_dict.py +164 -0
  445. snappy/tiling/test.py +23 -0
  446. snappy/tiling/tile.py +215 -0
  447. snappy/tiling/triangle.py +33 -0
  448. snappy/tkterminal.py +920 -0
  449. snappy/twister/__init__.py +20 -0
  450. snappy/twister/main.py +646 -0
  451. snappy/twister/surfaces/S_0_1 +3 -0
  452. snappy/twister/surfaces/S_0_2 +3 -0
  453. snappy/twister/surfaces/S_0_4 +7 -0
  454. snappy/twister/surfaces/S_0_4_Lantern +8 -0
  455. snappy/twister/surfaces/S_1 +3 -0
  456. snappy/twister/surfaces/S_1_1 +4 -0
  457. snappy/twister/surfaces/S_1_2 +5 -0
  458. snappy/twister/surfaces/S_1_2_5 +6 -0
  459. snappy/twister/surfaces/S_2 +6 -0
  460. snappy/twister/surfaces/S_2_1 +8 -0
  461. snappy/twister/surfaces/S_2_heeg +10 -0
  462. snappy/twister/surfaces/S_3 +8 -0
  463. snappy/twister/surfaces/S_3_1 +10 -0
  464. snappy/twister/surfaces/S_4_1 +12 -0
  465. snappy/twister/surfaces/S_5_1 +14 -0
  466. snappy/twister/surfaces/heeg_fig8 +9 -0
  467. snappy/twister/twister_core.cpython-311-darwin.so +0 -0
  468. snappy/upper_halfspace/__init__.py +146 -0
  469. snappy/upper_halfspace/ideal_point.py +26 -0
  470. snappy/verify/__init__.py +13 -0
  471. snappy/verify/canonical.py +542 -0
  472. snappy/verify/complex_volume/__init__.py +18 -0
  473. snappy/verify/complex_volume/adjust_torsion.py +86 -0
  474. snappy/verify/complex_volume/closed.py +168 -0
  475. snappy/verify/complex_volume/compute_ptolemys.py +90 -0
  476. snappy/verify/complex_volume/cusped.py +56 -0
  477. snappy/verify/complex_volume/extended_bloch.py +201 -0
  478. snappy/verify/cusp_translations.py +85 -0
  479. snappy/verify/edge_equations.py +80 -0
  480. snappy/verify/exceptions.py +254 -0
  481. snappy/verify/hyperbolicity.py +224 -0
  482. snappy/verify/interval_newton_shapes_engine.py +523 -0
  483. snappy/verify/interval_tree.py +400 -0
  484. snappy/verify/krawczyk_shapes_engine.py +518 -0
  485. snappy/verify/maximal_cusp_area_matrix/__init__.py +46 -0
  486. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +419 -0
  487. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +153 -0
  488. snappy/verify/real_algebra.py +286 -0
  489. snappy/verify/shapes.py +25 -0
  490. snappy/verify/short_slopes.py +200 -0
  491. snappy/verify/square_extensions.py +1005 -0
  492. snappy/verify/test.py +78 -0
  493. snappy/verify/upper_halfspace/__init__.py +9 -0
  494. snappy/verify/upper_halfspace/extended_matrix.py +100 -0
  495. snappy/verify/upper_halfspace/finite_point.py +283 -0
  496. snappy/verify/upper_halfspace/ideal_point.py +426 -0
  497. snappy/verify/volume.py +128 -0
  498. snappy/version.py +2 -0
  499. snappy-3.2.dist-info/METADATA +58 -0
  500. snappy-3.2.dist-info/RECORD +503 -0
  501. snappy-3.2.dist-info/WHEEL +5 -0
  502. snappy-3.2.dist-info/entry_points.txt +2 -0
  503. snappy-3.2.dist-info/top_level.txt +28 -0
snappy/sage_helper.py ADDED
@@ -0,0 +1,117 @@
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
41
+ except ImportError:
42
+ # Modularized Sage library
43
+ from sage.algebras.group_algebra import GroupAlgebra
44
+ from sage.arith.misc import gcd, xgcd, is_prime
45
+ from sage.combinat.subset import powerset
46
+ from sage.functions.hyperbolic import arccosh
47
+ from sage.functions.log import exp
48
+ from sage.functions.other import (real as real_part,
49
+ imag as imag_part,
50
+ ceil,
51
+ floor)
52
+ from sage.functions.trig import sin
53
+ from sage.groups.abelian_gps.abelian_group import AbelianGroup
54
+ from sage.homology.chain_complex import ChainComplex
55
+ from sage.matrix.constructor import Matrix as matrix
56
+ from sage.matrix.matrix_space import MatrixSpace
57
+ from sage.matrix.special import block_matrix, identity_matrix
58
+ from sage.misc.cachefunc import cached_method
59
+ from sage.misc.functional import det, log, round, sqrt
60
+ from sage.misc.misc_c import prod
61
+ from sage.modules.free_module import VectorSpace
62
+ from sage.modules.free_module_element import free_module_element as vector
63
+ from sage.rings.cc import CC
64
+ from sage.rings.cif import CIF
65
+ from sage.rings.complex_arb import ComplexBallField
66
+ from sage.rings.complex_double import CDF, ComplexDoubleField
67
+ from sage.rings.complex_mpfr import ComplexField
68
+ from sage.rings.fast_arith import prime_range
69
+ from sage.rings.finite_rings.finite_field_constructor import FiniteField as GF
70
+ from sage.rings.imaginary_unit import I
71
+ from sage.rings.infinity import Infinity
72
+ from sage.rings.integer import Integer
73
+ from sage.rings.integer_ring import ZZ
74
+ from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing
75
+ from sage.rings.number_field.number_field import CyclotomicField, NumberField
76
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
77
+ from sage.rings.rational import Rational
78
+ from sage.rings.rational_field import QQ
79
+ from sage.rings.real_double import RealDoubleElement
80
+ from sage.rings.real_mpfi import RIF
81
+ from sage.rings.real_mpfr import RealField, RealNumber, RR
82
+
83
+ from sage.rings.complex_interval_field import ComplexIntervalField
84
+ from sage.rings.real_mpfi import is_RealIntervalFieldElement, RealIntervalField
85
+ from sage.rings.real_mpfr import RealNumber, RealField_class
86
+ from sage.structure.sage_object import SageObject
87
+
88
+ try: # Sage >= 9.3, see https://trac.sagemath.org/ticket/24483
89
+ from sage.rings.complex_mpfr import (ComplexField,
90
+ ComplexField_class,
91
+ create_ComplexNumber)
92
+ except ImportError:
93
+ from sage.rings.complex_field import ComplexField, ComplexField_class
94
+ from sage.rings.complex_number import create_ComplexNumber
95
+
96
+ else:
97
+ import decorator
98
+
99
+ def _sage_method(function, *args, **kw):
100
+ raise SageNotAvailable('Sorry, this feature requires using SnapPy inside Sage.')
101
+
102
+ def sage_method(function):
103
+ return decorator.decorator(_sage_method, function)
104
+
105
+ # Not currently used, but could be exploited by an interpreter to hide
106
+ # sage_methods when in plain Python.
107
+
108
+ def sage_methods(obj):
109
+ ans = []
110
+ for attr in dir(obj):
111
+ try:
112
+ methods = getattr(obj, attr)
113
+ if methods._sage_method is True:
114
+ ans.append(methods)
115
+ except AttributeError:
116
+ pass
117
+ return ans
snappy/settings.py ADDED
@@ -0,0 +1,409 @@
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:
73
+ try:
74
+ if hasattr(plistlib, 'load'):
75
+ with open(self.setting_file, 'rb') as setting_file:
76
+ self.setting_dict.update(plistlib.load(setting_file))
77
+ else:
78
+ self.setting_dict.update(plistlib.readPlist(self.setting_file))
79
+ family, size, info = self.setting_dict['font']
80
+ # Guard against crazy values in the settings plist file.
81
+ size = clip_font_size(size)
82
+ weight, slant = info.split()
83
+ self.setting_dict['font'] = FontChoice(family, size, weight, slant)
84
+ except OSError:
85
+ pass
86
+
87
+ def write_settings(self):
88
+ if self.setting_file:
89
+ setting_dict = self.setting_dict.copy()
90
+ font = self.setting_dict['font']
91
+ setting_dict['font'] = (font.family, font.size, font.rest)
92
+ if hasattr(plistlib, 'dump'):
93
+ with open(self.setting_file, 'wb') as setting_file:
94
+ plistlib.dump(setting_dict, setting_file)
95
+ else:
96
+ plistlib.writePlist(setting_dict, self.setting_file)
97
+
98
+ def cache_settings(self):
99
+ self.cache.update(self.setting_dict)
100
+
101
+ def revert_settings(self):
102
+ self.setting_dict.update(self.cache)
103
+ self.apply_settings()
104
+
105
+ def changed(self):
106
+ return [key for key in self.cache.keys() if
107
+ self.cache[key] != self.setting_dict[key]]
108
+
109
+ # Override this in a subclass.
110
+ def apply_settings(self):
111
+ print(self.setting_dict)
112
+
113
+
114
+ class SettingsDialog(Dialog):
115
+ def __init__(self, parent, settings, title='SnapPy Settings'):
116
+ self.parent = parent
117
+ self.style = SnapPyStyle()
118
+ self.settings = settings
119
+ self.settings.cache_settings()
120
+ self.okay = False
121
+ Tk_.Toplevel.__init__(self, master=parent, class_='snappy')
122
+ frame = ttk.Frame(self, padding=(0, 10, 0, 0))
123
+ self.title(title)
124
+ self.notebook = notebook = ttk.Notebook(frame)
125
+ self.build_font_pane(notebook)
126
+ self.build_shell_pane(notebook)
127
+ self.build_cusp_pane(notebook)
128
+ self.build_inside_pane(notebook)
129
+ notebook.add(self.font_frame, text='Font')
130
+ notebook.add(self.shell_frame, text='Shell')
131
+ notebook.add(self.cusp_frame, text='Cusps')
132
+ notebook.add(self.inside_frame, text='Inside')
133
+ notebook.grid(row=0, column=0)
134
+ self.buttonbox()
135
+ notebook.pack(padx=0, pady=0)
136
+ frame.pack()
137
+ self.button_frame.pack(fill=Tk_.X)
138
+ self.protocol('WM_DELETE_WINDOW', self.cancel)
139
+ self.attributes('-topmost', True)
140
+
141
+ def run(self):
142
+ self.wait_window(self)
143
+
144
+ def validate(self):
145
+ cutoff = self.cutoff.get()
146
+ try:
147
+ float(cutoff)
148
+ self.settings['cusp_cutoff'] = cutoff
149
+ except ValueError:
150
+ showerror('Invalid input',
151
+ 'Please enter a number for the cutoff.')
152
+ return False
153
+ self.settings.apply_settings()
154
+ self.okay = True
155
+ return True
156
+
157
+ def revert(self):
158
+ self.settings.revert_settings()
159
+ self.cancel()
160
+
161
+ def buttonbox(self):
162
+ self.button_frame = box = ttk.Frame(self, padding=(0, 0, 0, 20))
163
+ box.grid_columnconfigure(0, weight=1)
164
+ box.grid_columnconfigure(2, weight=1)
165
+ OK = ttk.Button(box, text="OK", width=10, command=self.ok,
166
+ default=Tk_.ACTIVE)
167
+ OK.grid(row=0, column=0, sticky=Tk_.NE, padx=5)
168
+ Apply = ttk.Button(box, text="Apply", width=10,
169
+ command=self.settings.apply_settings)
170
+ Apply.grid(row=0, column=1, sticky=Tk_.N, padx=5)
171
+ Cancel = ttk.Button(box, text="Cancel", width=10, command=self.revert)
172
+ Cancel.grid(row=0, column=2, sticky=Tk_.NW, padx=5)
173
+ self.bind("<Return>", lambda event : OK.focus_set())
174
+ self.bind("<Escape>", self.cancel)
175
+
176
+ def show_body(self):
177
+ self.body_frame.grid(row=1, column=0, padx=5, pady=5,
178
+ sticky=Tk_.N + Tk_.S + Tk_.W + Tk_.E)
179
+ self.body_frame.focus_set()
180
+
181
+ def build_font_pane(self, parent):
182
+ current_font = self.settings['font']
183
+ groupBG = self.style.groupBG
184
+ self.font_frame = font_frame = ttk.Frame(parent)
185
+ font_frame.columnconfigure(2, weight=1)
186
+ font_frame.columnconfigure(0, weight=1)
187
+ self.list_frame = list_frame = ttk.Frame(font_frame)
188
+ self.font_list = font_list = Tk_.Listbox(list_frame,
189
+ selectmode=Tk_.SINGLE)
190
+ font_list.grid(row=0, column=0, pady=(20,30))
191
+ font_scroller = ttk.Scrollbar(list_frame,
192
+ command=font_list.yview)
193
+ font_list.config(yscrollcommand=font_scroller.set)
194
+ font_scroller.grid(row=0, column=1, sticky=Tk_.N + Tk_.S, pady=(20,30))
195
+ list_frame.grid(rowspan=6, column=0)
196
+
197
+ label = ttk.Label(self.font_frame, text='Size: ')
198
+ label.grid(row=0, column=1, sticky=Tk_.E, pady=(20,0))
199
+ self.font_sizer = sizer = Spinbox(font_frame, from_=10, to_=36, width=4,
200
+ command=self.set_font_sample)
201
+ def check_font_size(size):
202
+ try:
203
+ value = int(size)
204
+ except:
205
+ sizer.set(13 if sys.platform == 'darwin' else 11)
206
+ return False
207
+ if value < 10:
208
+ sizer.set(10)
209
+ return False
210
+ if value > 36:
211
+ sizer.set(36)
212
+ return False
213
+ return True
214
+ validator = parent.register(check_font_size)
215
+ sizer.config(validate ="key", validatecommand =(validator, '%P'))
216
+ sizer.delete(0,2)
217
+ sizer.insert(0, clip_font_size(current_font.size))
218
+ sizer.bind('<Return>', self.set_font_sample)
219
+ sizer.bind('<Tab>', self.set_font_sample)
220
+ self.current_size = current_font.size
221
+ sizer.grid(row=0, column=2, sticky=Tk_.W, pady=(20,0))
222
+ label = ttk.Label(font_frame, text='Weight: ')
223
+ label.grid(row=1, column=1, sticky=Tk_.E)
224
+ self.font_weight = weight = Tk_.StringVar(value=current_font.weight)
225
+ radio = ttk.Radiobutton(font_frame, text='normal', variable=weight,
226
+ value='normal', command=self.set_font_sample)
227
+ radio.grid(row=1, column=2, sticky=Tk_.W)
228
+ radio = ttk.Radiobutton(font_frame, text='bold', variable=weight,
229
+ value='bold', command=self.set_font_sample)
230
+ radio.grid(row=2, column=2, sticky=Tk_.W)
231
+ label = ttk.Label(font_frame, text='Slant: ')
232
+ label.grid(row=3, column=1, sticky=Tk_.E)
233
+ self.font_slant = slant = Tk_.StringVar(value=current_font.slant)
234
+ radio = ttk.Radiobutton(font_frame, text='roman', variable=slant,
235
+ value='roman', command=self.set_font_sample)
236
+ radio.grid(row=3, column=2, sticky=Tk_.W)
237
+ radio = ttk.Radiobutton(font_frame, text='italic', variable=slant,
238
+ value='italic', command=self.set_font_sample)
239
+ radio.grid(row=4, column=2, sticky=Tk_.W)
240
+
241
+ self.fixed_only = Tk_.BooleanVar(value=True)
242
+ self.check_fixed = ttk.Checkbutton(font_frame, variable=self.fixed_only,
243
+ text='Fixed-width fonts only',
244
+ command=self.set_font_families)
245
+ self.check_fixed.grid(row=6, column=0, pady=(0, 10), sticky=Tk_.N)
246
+ self.sample = sample = Tk_.Text(font_frame,
247
+ width=40, height=6,
248
+ highlightthickness=0,
249
+ relief=Tk_.FLAT,
250
+ font=self.settings['font'].as_tuple())
251
+ self.sample.bind('<Button-1>', lambda event: 'break')
252
+ self.sample.insert(Tk_.INSERT, '\nABCDEFGHIJKLMNOPQRSTUVWXYZ\n'
253
+ 'abcdefghijklmnopqrstuvwxyz')
254
+ sample.tag_add('all', '1.0', Tk_.END)
255
+ font_list.bind('<ButtonRelease-1>', self.set_font_sample)
256
+ self.sample.grid(row=7, columnspan=4, padx=10, pady=10, sticky=Tk_.E+Tk_.W)
257
+ self.set_font_families()
258
+ self.set_font_sample()
259
+
260
+ def set_font_families(self):
261
+ families = {f for f in font_families()
262
+ if f[0] != '@' and f.lower().find('emoji') < 0} # omit vertical fonts, emojis
263
+ if self.fixed_only.get():
264
+ families = {f for f in families if Font(family=f).metrics('fixed')}
265
+ families.add(self.settings['font'].family)
266
+ self.families = families = sorted(families)
267
+ if self.font_list.size() > 0:
268
+ self.font_list.delete(0, self.font_list.size() - 1)
269
+ for family in families:
270
+ self.font_list.insert(Tk_.END, family)
271
+ self.current_family = families.index(self.settings['font'].family)
272
+ self.font_list.selection_set(self.current_family)
273
+ self.font_list.see(self.current_family)
274
+
275
+ def get_font(self):
276
+ selection = self.font_list.curselection()
277
+ if selection:
278
+ index = int(selection[0])
279
+ self.current_family = index
280
+ else:
281
+ index = self.current_family
282
+ family = self.families[index]
283
+ try:
284
+ size = int(self.font_sizer.get())
285
+ except ValueError:
286
+ size = self.current_size
287
+ self.font_sizer.delete(0, Tk_.END)
288
+ self.font_sizer.insert(0, str(size))
289
+ self.font_list.selection_set(self.current_family)
290
+ return FontChoice(family, size,
291
+ self.font_weight.get(), self.font_slant.get())
292
+
293
+ def set_font_sample(self, event=None):
294
+ new_font = self.get_font()
295
+ self.settings['font'] = new_font
296
+ self.sample.tag_config('all', justify=Tk_.CENTER,
297
+ font=new_font.as_tuple())
298
+
299
+ def build_shell_pane(self, parent):
300
+ groupBG = self.style.groupBG
301
+ self.autocall = Tk_.BooleanVar(value=self.settings['autocall'])
302
+ self.update_idletasks()
303
+ self.shell_frame = shell_frame = ttk.Frame(parent)
304
+ shell_frame.rowconfigure(3, weight=1)
305
+ shell_frame.columnconfigure(0, weight=1)
306
+ shell_frame.columnconfigure(3, weight=1)
307
+ # Keep the height the same as the height of the font pane.
308
+ strut = ttk.Frame(shell_frame, width=1)
309
+ strut.grid(rowspan=5, column=0)
310
+ next_label = ttk.Label(shell_frame, anchor=Tk_.W,
311
+ text='Which IPython features would you like to enable?')
312
+ next_label.grid(row=0, column=1, columnspan=2, sticky=Tk_.W, pady=(20,0))
313
+ next_check = ttk.Checkbutton(shell_frame, variable=self.autocall,
314
+ text='IPython autocall',
315
+ command=self.set_autocall)
316
+ next_check.grid(row=1, column=1, sticky=Tk_.W, pady=(10,0))
317
+ next_check.grid(row=2, column=1, sticky=Tk_.W, pady=(5,0))
318
+
319
+ def set_autocall(self):
320
+ self.settings['autocall'] = self.autocall.get()
321
+
322
+ def build_cusp_pane(self, parent):
323
+ groupBG = self.style.groupBG
324
+ self.cusp_frame = cusp_frame = ttk.Frame(parent)
325
+ self.horoballs = Tk_.BooleanVar(value=self.settings['cusp_horoballs'])
326
+ self.triangulation = Tk_.BooleanVar(value=self.settings['cusp_triangulation'])
327
+ self.ford = Tk_.BooleanVar(value=self.settings['cusp_ford_domain'])
328
+ self.labels = Tk_.BooleanVar(value=self.settings['cusp_labels'])
329
+ self.parallelogram = Tk_.BooleanVar(value=self.settings['cusp_parallelogram'])
330
+ self.cutoff = Tk_.StringVar(value=self.settings['cusp_cutoff'])
331
+ self.update_idletasks()
332
+ cusp_frame.rowconfigure(8, weight=1)
333
+ cusp_frame.columnconfigure(0, weight=1)
334
+ cusp_frame.columnconfigure(3, weight=1)
335
+ strut = ttk.Frame(cusp_frame, width=1)
336
+ strut.grid(rowspan=8, column=0)
337
+ next_label = ttk.Label(cusp_frame,
338
+ text='Which elements should be visible when you first '
339
+ 'view the cusp neighborhood?')
340
+ next_label.grid(row=0, column=1, columnspan=2, sticky=Tk_.W, pady=(20,10))
341
+ next_check = ttk.Checkbutton(cusp_frame, variable=self.horoballs,
342
+ text='Horoballs',
343
+ command=self.set_horoballs)
344
+ next_check.grid(row=1, column=1, sticky=Tk_.W, padx=(30, 0))
345
+ next_check = ttk.Checkbutton(cusp_frame, variable=self.triangulation,
346
+ text='Triangulation',
347
+ command=self.set_triangulation)
348
+ next_check.grid(row=2, column=1, sticky=Tk_.W, padx=(30, 0))
349
+ next_check = ttk.Checkbutton(cusp_frame, variable=self.ford,
350
+ text='Ford domain',
351
+ command=self.set_ford)
352
+ next_check.grid(row=3, column=1, sticky=Tk_.W, padx=(30, 0))
353
+ next_check = ttk.Checkbutton(cusp_frame, variable=self.labels,
354
+ text='Labels',
355
+ command=self.set_labels)
356
+ next_check.grid(row=4, column=1, sticky=Tk_.W, padx=(30, 0))
357
+ next_check = ttk.Checkbutton(cusp_frame, variable=self.parallelogram,
358
+ text='Parallelogram',
359
+ command=self.set_parallelogram)
360
+ next_check.grid(row=5, column=1, sticky=Tk_.W, padx=(30, 0))
361
+ next_label = ttk.Label(cusp_frame,
362
+ text='What should the initial cutoff be?')
363
+ next_label.grid(row=6, column=1, columnspan=2, pady=(20,10), sticky=Tk_.W)
364
+ cutoff_entry = ttk.Entry(cusp_frame, textvariable=self.cutoff, width=15)
365
+ cutoff_entry.grid(row=7, column=1, columnspan=2, sticky=Tk_.W,
366
+ pady=(0,10), padx=(30,0))
367
+
368
+ def set_horoballs(self):
369
+ self.settings['cusp_horoballs'] = self.horoballs.get()
370
+
371
+ def set_triangulation(self):
372
+ self.settings['cusp_triangulation'] = self.triangulation.get()
373
+
374
+ def set_ford(self):
375
+ self.settings['cusp_ford_domain'] = self.ford.get()
376
+
377
+ def set_labels(self):
378
+ self.settings['cusp_labels'] = self.labels.get()
379
+
380
+ def set_parallelogram(self):
381
+ self.settings['cusp_parallelogram'] = self.parallelogram.get()
382
+
383
+ def build_inside_pane(self, parent):
384
+ groupBG = self.style.groupBG
385
+ self.keyboard = Tk_.Variable(value=self.settings['keyboard'])
386
+ self.inside_frame = frame = ttk.Frame(parent)
387
+ frame.rowconfigure(3, weight=1)
388
+ frame.columnconfigure(0, weight=1)
389
+ frame.columnconfigure(3, weight=1)
390
+ # Keep the height the same as the height of the font pane.
391
+ strut = ttk.Frame(frame, width=1)
392
+ strut.grid(rowspan=5, column=0)
393
+ keyboard_label = ttk.Label(frame, anchor=Tk_.W,
394
+ text='Which keyboard layout are you using?')
395
+ keyboard_label.grid(row=0, column=1, columnspan=2, sticky=Tk_.W, pady=(20,0))
396
+ keyboard_button = ttk.OptionMenu(frame, self.keyboard, self.keyboard.get(),
397
+ 'QWERTY', 'AZERTY', 'QWERTZ', command=self.set_keyboard)
398
+ keyboard_button.grid(row=1, column=1, columnspan=2, sticky=Tk_.W, pady=(10, 0))
399
+
400
+ def set_keyboard(self, value):
401
+ self.settings['keyboard'] = value
402
+
403
+
404
+ if __name__ == '__main__':
405
+ parent = Tk_.Tk(className='snappy')
406
+ settings = Settings()
407
+ settings.apply_settings()
408
+ SettingsDialog(parent, settings)
409
+ 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