snappy 3.1__cp39-cp39-win_amd64.whl → 3.2__cp39-cp39-win_amd64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (476) hide show
  1. snappy/CyOpenGL.cp39-win_amd64.pyd +0 -0
  2. snappy/SnapPy.cp39-win_amd64.pyd +0 -0
  3. snappy/SnapPyHP.cp39-win_amd64.pyd +0 -0
  4. snappy/__init__.py +299 -402
  5. snappy/app.py +70 -20
  6. snappy/browser.py +18 -17
  7. snappy/canonical.py +249 -0
  8. snappy/{verify/cusp_shapes.py → cusps/__init__.py} +8 -18
  9. snappy/cusps/cusp_area_matrix.py +101 -0
  10. snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +23 -39
  11. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  12. snappy/cusps/test.py +21 -0
  13. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  14. snappy/database.py +10 -9
  15. snappy/decorated_isosig.py +337 -114
  16. snappy/dev/extended_ptolemy/complexVolumesClosed.py +40 -7
  17. snappy/dev/extended_ptolemy/extended.py +3 -3
  18. snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
  19. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +1 -1
  20. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  21. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  22. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  23. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  24. snappy/doc/_sources/additional_classes.rst.txt +40 -40
  25. snappy/doc/_sources/bugs.rst.txt +14 -14
  26. snappy/doc/_sources/censuses.rst.txt +51 -51
  27. snappy/doc/_sources/credits.rst.txt +75 -70
  28. snappy/doc/_sources/development.rst.txt +259 -239
  29. snappy/doc/_sources/index.rst.txt +182 -115
  30. snappy/doc/_sources/installing.rst.txt +247 -264
  31. snappy/doc/_sources/manifold.rst.txt +6 -6
  32. snappy/doc/_sources/manifoldhp.rst.txt +46 -46
  33. snappy/doc/_sources/news.rst.txt +355 -283
  34. snappy/doc/_sources/other.rst.txt +25 -25
  35. snappy/doc/_sources/platonic_census.rst.txt +20 -20
  36. snappy/doc/_sources/plink.rst.txt +102 -102
  37. snappy/doc/_sources/ptolemy.rst.txt +66 -66
  38. snappy/doc/_sources/ptolemy_classes.rst.txt +42 -42
  39. snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -297
  40. snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -363
  41. snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -301
  42. snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -61
  43. snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -105
  44. snappy/doc/_sources/screenshots.rst.txt +21 -21
  45. snappy/doc/_sources/snap.rst.txt +87 -87
  46. snappy/doc/_sources/snappy.rst.txt +28 -28
  47. snappy/doc/_sources/spherogram.rst.txt +103 -103
  48. snappy/doc/_sources/todo.rst.txt +47 -47
  49. snappy/doc/_sources/triangulation.rst.txt +11 -11
  50. snappy/doc/_sources/tutorial.rst.txt +49 -49
  51. snappy/doc/_sources/verify.rst.txt +210 -150
  52. snappy/doc/_sources/verify_internals.rst.txt +79 -90
  53. snappy/doc/_static/basic.css +924 -902
  54. snappy/doc/_static/css/badge_only.css +1 -1
  55. snappy/doc/_static/css/theme.css +1 -1
  56. snappy/doc/_static/doctools.js +1 -1
  57. snappy/doc/_static/documentation_options.js +12 -13
  58. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  59. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  60. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  61. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  62. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  63. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  64. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  65. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  66. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  67. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  68. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  69. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  70. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  71. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  72. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  73. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  74. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  75. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  76. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  77. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  78. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  79. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  80. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  81. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  82. snappy/doc/_static/js/versions.js +228 -0
  83. snappy/doc/_static/language_data.js +199 -199
  84. snappy/doc/_static/pygments.css +74 -73
  85. snappy/doc/_static/searchtools.js +125 -71
  86. snappy/doc/_static/snappy_furo.css +33 -33
  87. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
  88. snappy/doc/_static/sphinx_highlight.js +13 -3
  89. snappy/doc/additional_classes.html +1499 -1330
  90. snappy/doc/bugs.html +131 -134
  91. snappy/doc/censuses.html +426 -445
  92. snappy/doc/credits.html +180 -180
  93. snappy/doc/development.html +383 -363
  94. snappy/doc/genindex.html +1330 -1409
  95. snappy/doc/index.html +261 -206
  96. snappy/doc/installing.html +345 -363
  97. snappy/doc/manifold.html +3451 -2839
  98. snappy/doc/manifoldhp.html +179 -182
  99. snappy/doc/news.html +387 -329
  100. snappy/doc/objects.inv +0 -0
  101. snappy/doc/other.html +160 -162
  102. snappy/doc/platonic_census.html +374 -377
  103. snappy/doc/plink.html +209 -212
  104. snappy/doc/ptolemy.html +253 -255
  105. snappy/doc/ptolemy_classes.html +1143 -1146
  106. snappy/doc/ptolemy_examples1.html +408 -410
  107. snappy/doc/ptolemy_examples2.html +470 -473
  108. snappy/doc/ptolemy_examples3.html +413 -416
  109. snappy/doc/ptolemy_examples4.html +194 -197
  110. snappy/doc/ptolemy_prelim.html +247 -250
  111. snappy/doc/py-modindex.html +164 -167
  112. snappy/doc/screenshots.html +140 -142
  113. snappy/doc/search.html +134 -137
  114. snappy/doc/searchindex.js +1 -1
  115. snappy/doc/snap.html +201 -204
  116. snappy/doc/snappy.html +180 -182
  117. snappy/doc/spherogram.html +1210 -1213
  118. snappy/doc/todo.html +165 -168
  119. snappy/doc/triangulation.html +1583 -1474
  120. snappy/doc/tutorial.html +158 -161
  121. snappy/doc/verify.html +329 -275
  122. snappy/doc/verify_internals.html +1234 -1691
  123. snappy/drilling/__init__.py +153 -235
  124. snappy/drilling/barycentric.py +103 -0
  125. snappy/drilling/constants.py +0 -2
  126. snappy/drilling/crush.py +56 -130
  127. snappy/drilling/cusps.py +12 -6
  128. snappy/drilling/debug.py +2 -1
  129. snappy/drilling/exceptions.py +7 -40
  130. snappy/drilling/moves.py +302 -243
  131. snappy/drilling/perturb.py +63 -37
  132. snappy/drilling/shorten.py +36 -0
  133. snappy/drilling/subdivide.py +0 -5
  134. snappy/drilling/test.py +23 -0
  135. snappy/drilling/test_cases.py +126 -0
  136. snappy/drilling/tracing.py +9 -37
  137. snappy/exceptions.py +18 -5
  138. snappy/exterior_to_link/barycentric_geometry.py +2 -4
  139. snappy/exterior_to_link/main.py +8 -7
  140. snappy/exterior_to_link/mcomplex_with_link.py +2 -2
  141. snappy/exterior_to_link/rational_linear_algebra.py +1 -1
  142. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
  143. snappy/exterior_to_link/test.py +21 -33
  144. snappy/geometric_structure/__init__.py +212 -0
  145. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  146. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  147. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  148. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  149. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  150. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  151. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  152. snappy/geometric_structure/geodesic/__init__.py +0 -0
  153. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  154. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  155. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  156. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  157. snappy/geometric_structure/geodesic/constants.py +6 -0
  158. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  159. snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
  160. snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
  161. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  162. snappy/geometric_structure/geodesic/line.py +30 -0
  163. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  164. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  165. snappy/geometric_structure/test.py +22 -0
  166. snappy/gui.py +23 -13
  167. snappy/horoviewer.py +7 -7
  168. snappy/hyperboloid/__init__.py +96 -31
  169. snappy/hyperboloid/distances.py +245 -0
  170. snappy/hyperboloid/horoball.py +19 -0
  171. snappy/hyperboloid/line.py +35 -0
  172. snappy/hyperboloid/point.py +9 -0
  173. snappy/hyperboloid/triangle.py +29 -0
  174. snappy/isometry_signature.py +382 -0
  175. snappy/len_spec/__init__.py +596 -0
  176. snappy/len_spec/geodesic_info.py +110 -0
  177. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  178. snappy/len_spec/geodesic_piece.py +143 -0
  179. snappy/len_spec/geometric_structure.py +182 -0
  180. snappy/len_spec/geometry.py +80 -0
  181. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  182. snappy/len_spec/spine.py +206 -0
  183. snappy/len_spec/test.py +24 -0
  184. snappy/len_spec/test_cases.py +69 -0
  185. snappy/len_spec/tile.py +275 -0
  186. snappy/len_spec/word.py +86 -0
  187. snappy/math_basics.py +39 -13
  188. snappy/matrix.py +52 -9
  189. snappy/number.py +12 -6
  190. snappy/numeric_output_checker.py +2 -3
  191. snappy/pari.py +8 -4
  192. snappy/phone_home.py +2 -1
  193. snappy/polyviewer.py +8 -8
  194. snappy/ptolemy/__init__.py +1 -1
  195. snappy/ptolemy/component.py +2 -2
  196. snappy/ptolemy/coordinates.py +25 -25
  197. snappy/ptolemy/findLoops.py +9 -9
  198. snappy/ptolemy/manifoldMethods.py +27 -29
  199. snappy/ptolemy/polynomial.py +50 -57
  200. snappy/ptolemy/processFileBase.py +60 -0
  201. snappy/ptolemy/ptolemyVariety.py +109 -41
  202. snappy/ptolemy/reginaWrapper.py +4 -4
  203. snappy/ptolemy/rur.py +1 -1
  204. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
  205. snappy/ptolemy/test.py +99 -54
  206. snappy/ptolemy/utilities.py +1 -1
  207. snappy/raytracing/__init__.py +64 -0
  208. snappy/raytracing/additional_horospheres.py +64 -0
  209. snappy/raytracing/additional_len_spec_choices.py +63 -0
  210. snappy/raytracing/cohomology_fractal.py +0 -3
  211. snappy/raytracing/eyeball.py +123 -0
  212. snappy/raytracing/finite_raytracing_data.py +17 -17
  213. snappy/raytracing/finite_viewer.py +15 -15
  214. snappy/raytracing/geodesic_tube_info.py +93 -63
  215. snappy/raytracing/geodesics.py +94 -64
  216. snappy/raytracing/geodesics_window.py +56 -34
  217. snappy/raytracing/gui_utilities.py +21 -6
  218. snappy/raytracing/hyperboloid_navigation.py +29 -4
  219. snappy/raytracing/hyperboloid_utilities.py +73 -73
  220. snappy/raytracing/ideal_raytracing_data.py +121 -91
  221. snappy/raytracing/inside_viewer.py +199 -66
  222. snappy/raytracing/pack.py +22 -0
  223. snappy/raytracing/raytracing_data.py +37 -25
  224. snappy/raytracing/raytracing_view.py +70 -65
  225. snappy/raytracing/shaders/Eye.png +0 -0
  226. snappy/raytracing/shaders/NonGeometric.png +0 -0
  227. snappy/raytracing/shaders/__init__.py +39 -3
  228. snappy/raytracing/shaders/fragment.glsl +451 -133
  229. snappy/raytracing/test.py +29 -0
  230. snappy/raytracing/tooltip.py +146 -0
  231. snappy/raytracing/upper_halfspace_utilities.py +42 -9
  232. snappy/sage_helper.py +67 -134
  233. snappy/settings.py +90 -77
  234. snappy/shell.py +2 -0
  235. snappy/snap/character_varieties.py +2 -2
  236. snappy/snap/find_field.py +4 -3
  237. snappy/snap/fundamental_polyhedron.py +2 -2
  238. snappy/snap/kernel_structures.py +5 -1
  239. snappy/snap/nsagetools.py +9 -8
  240. snappy/snap/peripheral/dual_cellulation.py +4 -3
  241. snappy/snap/peripheral/peripheral.py +2 -2
  242. snappy/snap/peripheral/surface.py +5 -5
  243. snappy/snap/peripheral/test.py +1 -1
  244. snappy/snap/polished_reps.py +8 -8
  245. snappy/snap/slice_obs_HKL.py +16 -14
  246. snappy/snap/t3mlite/arrow.py +3 -3
  247. snappy/snap/t3mlite/edge.py +3 -3
  248. snappy/snap/t3mlite/homology.py +2 -2
  249. snappy/snap/t3mlite/mcomplex.py +3 -3
  250. snappy/snap/t3mlite/simplex.py +12 -0
  251. snappy/snap/t3mlite/spun.py +18 -17
  252. snappy/snap/t3mlite/test_vs_regina.py +4 -4
  253. snappy/snap/test.py +37 -53
  254. snappy/snap/utilities.py +4 -5
  255. snappy/test.py +121 -138
  256. snappy/test_cases.py +263 -0
  257. snappy/testing.py +131 -0
  258. snappy/tiling/__init__.py +2 -0
  259. snappy/tiling/canonical_key_dict.py +59 -0
  260. snappy/tiling/dict_based_set.py +79 -0
  261. snappy/tiling/floor.py +49 -0
  262. snappy/tiling/hyperboloid_dict.py +54 -0
  263. snappy/tiling/iter_utils.py +78 -0
  264. snappy/tiling/lifted_tetrahedron.py +22 -0
  265. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  266. snappy/tiling/real_hash_dict.py +164 -0
  267. snappy/tiling/test.py +23 -0
  268. snappy/tiling/tile.py +215 -0
  269. snappy/tiling/triangle.py +33 -0
  270. snappy/tkterminal.py +116 -86
  271. snappy/twister/main.py +1 -7
  272. snappy/twister/twister_core.cp39-win_amd64.pyd +0 -0
  273. snappy/upper_halfspace/__init__.py +78 -17
  274. snappy/verify/__init__.py +3 -7
  275. snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
  276. snappy/verify/complex_volume/adjust_torsion.py +1 -2
  277. snappy/verify/complex_volume/closed.py +13 -13
  278. snappy/verify/complex_volume/cusped.py +6 -6
  279. snappy/verify/complex_volume/extended_bloch.py +5 -8
  280. snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
  281. snappy/verify/edge_equations.py +80 -0
  282. snappy/verify/exceptions.py +0 -55
  283. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
  284. snappy/verify/interval_newton_shapes_engine.py +7 -5
  285. snappy/verify/interval_tree.py +5 -5
  286. snappy/verify/krawczyk_shapes_engine.py +17 -18
  287. snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
  288. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
  289. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
  290. snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
  291. snappy/verify/shapes.py +5 -3
  292. snappy/verify/short_slopes.py +39 -41
  293. snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
  294. snappy/verify/test.py +57 -60
  295. snappy/verify/upper_halfspace/extended_matrix.py +1 -1
  296. snappy/verify/upper_halfspace/finite_point.py +3 -4
  297. snappy/verify/upper_halfspace/ideal_point.py +9 -9
  298. snappy/verify/volume.py +2 -2
  299. snappy/version.py +2 -2
  300. {snappy-3.1.dist-info → snappy-3.2.dist-info}/METADATA +26 -11
  301. snappy-3.2.dist-info/RECORD +503 -0
  302. {snappy-3.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  303. {snappy-3.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  304. snappy/__pycache__/__init__.cpython-39.pyc +0 -0
  305. snappy/__pycache__/browser.cpython-39.pyc +0 -0
  306. snappy/__pycache__/cache.cpython-39.pyc +0 -0
  307. snappy/__pycache__/database.cpython-39.pyc +0 -0
  308. snappy/__pycache__/db_utilities.cpython-39.pyc +0 -0
  309. snappy/__pycache__/decorated_isosig.cpython-39.pyc +0 -0
  310. snappy/__pycache__/exceptions.cpython-39.pyc +0 -0
  311. snappy/__pycache__/export_stl.cpython-39.pyc +0 -0
  312. snappy/__pycache__/filedialog.cpython-39.pyc +0 -0
  313. snappy/__pycache__/gui.cpython-39.pyc +0 -0
  314. snappy/__pycache__/horoviewer.cpython-39.pyc +0 -0
  315. snappy/__pycache__/math_basics.cpython-39.pyc +0 -0
  316. snappy/__pycache__/matrix.cpython-39.pyc +0 -0
  317. snappy/__pycache__/number.cpython-39.pyc +0 -0
  318. snappy/__pycache__/numeric_output_checker.cpython-39.pyc +0 -0
  319. snappy/__pycache__/pari.cpython-39.pyc +0 -0
  320. snappy/__pycache__/polyviewer.cpython-39.pyc +0 -0
  321. snappy/__pycache__/sage_helper.cpython-39.pyc +0 -0
  322. snappy/__pycache__/version.cpython-39.pyc +0 -0
  323. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  324. snappy/doc/_static/jquery-3.6.0.js +0 -10881
  325. snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
  326. snappy/doc/_static/js/html5shiv.min.js +0 -4
  327. snappy/doc/_static/underscore-1.13.1.js +0 -2042
  328. snappy/doc/_static/underscore.js +0 -6
  329. snappy/doc/verify_canon.html +0 -304
  330. snappy/drilling/__pycache__/__init__.cpython-39.pyc +0 -0
  331. snappy/drilling/__pycache__/constants.cpython-39.pyc +0 -0
  332. snappy/drilling/__pycache__/crush.cpython-39.pyc +0 -0
  333. snappy/drilling/__pycache__/cusps.cpython-39.pyc +0 -0
  334. snappy/drilling/__pycache__/debug.cpython-39.pyc +0 -0
  335. snappy/drilling/__pycache__/epsilons.cpython-39.pyc +0 -0
  336. snappy/drilling/__pycache__/exceptions.cpython-39.pyc +0 -0
  337. snappy/drilling/__pycache__/fixed_points.cpython-39.pyc +0 -0
  338. snappy/drilling/__pycache__/geodesic_info.cpython-39.pyc +0 -0
  339. snappy/drilling/__pycache__/geodesic_tube.cpython-39.pyc +0 -0
  340. snappy/drilling/__pycache__/geometric_structure.cpython-39.pyc +0 -0
  341. snappy/drilling/__pycache__/line.cpython-39.pyc +0 -0
  342. snappy/drilling/__pycache__/moves.cpython-39.pyc +0 -0
  343. snappy/drilling/__pycache__/peripheral_curves.cpython-39.pyc +0 -0
  344. snappy/drilling/__pycache__/perturb.cpython-39.pyc +0 -0
  345. snappy/drilling/__pycache__/quotient_space.cpython-39.pyc +0 -0
  346. snappy/drilling/__pycache__/spatial_dict.cpython-39.pyc +0 -0
  347. snappy/drilling/__pycache__/subdivide.cpython-39.pyc +0 -0
  348. snappy/drilling/__pycache__/tracing.cpython-39.pyc +0 -0
  349. snappy/drilling/geodesic_tube.py +0 -441
  350. snappy/drilling/geometric_structure.py +0 -366
  351. snappy/drilling/line.py +0 -122
  352. snappy/drilling/quotient_space.py +0 -94
  353. snappy/drilling/spatial_dict.py +0 -128
  354. snappy/exterior_to_link/__pycache__/__init__.cpython-39.pyc +0 -0
  355. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-39.pyc +0 -0
  356. snappy/exterior_to_link/__pycache__/exceptions.cpython-39.pyc +0 -0
  357. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-39.pyc +0 -0
  358. snappy/exterior_to_link/__pycache__/link_projection.cpython-39.pyc +0 -0
  359. snappy/exterior_to_link/__pycache__/main.cpython-39.pyc +0 -0
  360. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-39.pyc +0 -0
  361. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-39.pyc +0 -0
  362. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-39.pyc +0 -0
  363. snappy/exterior_to_link/__pycache__/pl_utils.cpython-39.pyc +0 -0
  364. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-39.pyc +0 -0
  365. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-39.pyc +0 -0
  366. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-39.pyc +0 -0
  367. snappy/exterior_to_link/__pycache__/stored_moves.cpython-39.pyc +0 -0
  368. snappy/hyperboloid/__pycache__/__init__.cpython-39.pyc +0 -0
  369. snappy/manifolds/__pycache__/__init__.cpython-39.pyc +0 -0
  370. snappy/ptolemy/__pycache__/__init__.cpython-39.pyc +0 -0
  371. snappy/ptolemy/__pycache__/component.cpython-39.pyc +0 -0
  372. snappy/ptolemy/__pycache__/coordinates.cpython-39.pyc +0 -0
  373. snappy/ptolemy/__pycache__/fieldExtensions.cpython-39.pyc +0 -0
  374. snappy/ptolemy/__pycache__/findLoops.cpython-39.pyc +0 -0
  375. snappy/ptolemy/__pycache__/homology.cpython-39.pyc +0 -0
  376. snappy/ptolemy/__pycache__/manifoldMethods.cpython-39.pyc +0 -0
  377. snappy/ptolemy/__pycache__/matrix.cpython-39.pyc +0 -0
  378. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-39.pyc +0 -0
  379. snappy/ptolemy/__pycache__/polynomial.cpython-39.pyc +0 -0
  380. snappy/ptolemy/__pycache__/processComponents.cpython-39.pyc +0 -0
  381. snappy/ptolemy/__pycache__/processFileBase.cpython-39.pyc +0 -0
  382. snappy/ptolemy/__pycache__/processFileDispatch.cpython-39.pyc +0 -0
  383. snappy/ptolemy/__pycache__/processMagmaFile.cpython-39.pyc +0 -0
  384. snappy/ptolemy/__pycache__/processRurFile.cpython-39.pyc +0 -0
  385. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-39.pyc +0 -0
  386. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-39.pyc +0 -0
  387. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-39.pyc +0 -0
  388. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-39.pyc +0 -0
  389. snappy/ptolemy/__pycache__/rur.cpython-39.pyc +0 -0
  390. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-39.pyc +0 -0
  391. snappy/ptolemy/__pycache__/utilities.cpython-39.pyc +0 -0
  392. snappy/snap/__pycache__/__init__.cpython-39.pyc +0 -0
  393. snappy/snap/__pycache__/character_varieties.cpython-39.pyc +0 -0
  394. snappy/snap/__pycache__/fundamental_polyhedron.cpython-39.pyc +0 -0
  395. snappy/snap/__pycache__/interval_reps.cpython-39.pyc +0 -0
  396. snappy/snap/__pycache__/kernel_structures.cpython-39.pyc +0 -0
  397. snappy/snap/__pycache__/mcomplex_base.cpython-39.pyc +0 -0
  398. snappy/snap/__pycache__/nsagetools.cpython-39.pyc +0 -0
  399. snappy/snap/__pycache__/polished_reps.cpython-39.pyc +0 -0
  400. snappy/snap/__pycache__/shapes.cpython-39.pyc +0 -0
  401. snappy/snap/__pycache__/slice_obs_HKL.cpython-39.pyc +0 -0
  402. snappy/snap/__pycache__/utilities.cpython-39.pyc +0 -0
  403. snappy/snap/peripheral/__pycache__/__init__.cpython-39.pyc +0 -0
  404. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-39.pyc +0 -0
  405. snappy/snap/peripheral/__pycache__/link.cpython-39.pyc +0 -0
  406. snappy/snap/peripheral/__pycache__/peripheral.cpython-39.pyc +0 -0
  407. snappy/snap/peripheral/__pycache__/surface.cpython-39.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/__init__.cpython-39.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/arrow.cpython-39.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/corner.cpython-39.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/edge.cpython-39.pyc +0 -0
  412. snappy/snap/t3mlite/__pycache__/face.cpython-39.pyc +0 -0
  413. snappy/snap/t3mlite/__pycache__/files.cpython-39.pyc +0 -0
  414. snappy/snap/t3mlite/__pycache__/homology.cpython-39.pyc +0 -0
  415. snappy/snap/t3mlite/__pycache__/linalg.cpython-39.pyc +0 -0
  416. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-39.pyc +0 -0
  417. snappy/snap/t3mlite/__pycache__/perm4.cpython-39.pyc +0 -0
  418. snappy/snap/t3mlite/__pycache__/simplex.cpython-39.pyc +0 -0
  419. snappy/snap/t3mlite/__pycache__/spun.cpython-39.pyc +0 -0
  420. snappy/snap/t3mlite/__pycache__/surface.cpython-39.pyc +0 -0
  421. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-39.pyc +0 -0
  422. snappy/snap/t3mlite/__pycache__/vertex.cpython-39.pyc +0 -0
  423. snappy/togl/__init__.py +0 -3
  424. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  425. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  426. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  427. snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
  428. snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
  429. snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
  430. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  431. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  432. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  433. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  434. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  435. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  436. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  437. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  438. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  439. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  440. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  441. snappy/twister/__pycache__/__init__.cpython-39.pyc +0 -0
  442. snappy/twister/__pycache__/main.cpython-39.pyc +0 -0
  443. snappy/upper_halfspace/__pycache__/__init__.cpython-39.pyc +0 -0
  444. snappy/upper_halfspace/__pycache__/ideal_point.cpython-39.pyc +0 -0
  445. snappy/verify/__pycache__/__init__.cpython-39.pyc +0 -0
  446. snappy/verify/__pycache__/cuspCrossSection.cpython-39.pyc +0 -0
  447. snappy/verify/__pycache__/cuspTranslations.cpython-39.pyc +0 -0
  448. snappy/verify/__pycache__/cusp_areas.cpython-39.pyc +0 -0
  449. snappy/verify/__pycache__/cusp_shapes.cpython-39.pyc +0 -0
  450. snappy/verify/__pycache__/exceptions.cpython-39.pyc +0 -0
  451. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-39.pyc +0 -0
  452. snappy/verify/__pycache__/interval_tree.cpython-39.pyc +0 -0
  453. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-39.pyc +0 -0
  454. snappy/verify/__pycache__/realAlgebra.cpython-39.pyc +0 -0
  455. snappy/verify/__pycache__/shapes.cpython-39.pyc +0 -0
  456. snappy/verify/__pycache__/short_slopes.cpython-39.pyc +0 -0
  457. snappy/verify/__pycache__/squareExtensions.cpython-39.pyc +0 -0
  458. snappy/verify/__pycache__/verifyCanonical.cpython-39.pyc +0 -0
  459. snappy/verify/__pycache__/verifyHyperbolicity.cpython-39.pyc +0 -0
  460. snappy/verify/__pycache__/volume.cpython-39.pyc +0 -0
  461. snappy/verify/complex_volume/__pycache__/__init__.cpython-39.pyc +0 -0
  462. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-39.pyc +0 -0
  463. snappy/verify/complex_volume/__pycache__/closed.cpython-39.pyc +0 -0
  464. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-39.pyc +0 -0
  465. snappy/verify/complex_volume/__pycache__/cusped.cpython-39.pyc +0 -0
  466. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-39.pyc +0 -0
  467. snappy/verify/cuspCrossSection.py +0 -1422
  468. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-39.pyc +0 -0
  469. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-39.pyc +0 -0
  470. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-39.pyc +0 -0
  471. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-39.pyc +0 -0
  472. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-39.pyc +0 -0
  473. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-39.pyc +0 -0
  474. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-39.pyc +0 -0
  475. snappy-3.1.dist-info/RECORD +0 -575
  476. {snappy-3.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
snappy/tiling/test.py ADDED
@@ -0,0 +1,23 @@
1
+ from snappy import testing
2
+ import snappy
3
+
4
+ from snappy import tiling
5
+
6
+ modules = [
7
+ tiling.floor,
8
+ tiling.real_hash_dict,
9
+ tiling.canonical_key_dict,
10
+ tiling.dict_based_set
11
+ ]
12
+
13
+ def run_doctests(verbose=False, print_info=True):
14
+ globs = {'Manifold': snappy.Manifold}
15
+ return testing.doctest_modules(modules,
16
+ verbose=verbose,
17
+ print_info=print_info,
18
+ extraglobs=globs)
19
+
20
+ run_doctests.__name__ = tiling.__name__
21
+
22
+ if __name__ == '__main__':
23
+ testing.run_doctests_as_main(run_doctests)
snappy/tiling/tile.py ADDED
@@ -0,0 +1,215 @@
1
+ from .lifted_tetrahedron import LiftedTetrahedron
2
+ from .lifted_tetrahedron_set import (LiftedTetrahedronSet,
3
+ get_lifted_tetrahedron_set)
4
+
5
+ from ..hyperboloid.distances import lower_bound_distance_to_r13_triangle
6
+ from ..hyperboloid.triangle import R13IdealTriangle
7
+ from ..hyperboloid import o13_inverse
8
+ from ..snap.t3mlite import Mcomplex, Tetrahedron, simplex
9
+ from ..math_basics import is_RealIntervalFieldElement, lower # type: ignore
10
+ from ..sage_helper import _within_sage # type: ignore
11
+
12
+ if _within_sage:
13
+ from ..sage_helper import Infinity
14
+
15
+ import heapq
16
+
17
+ from typing import Sequence, Union
18
+
19
+ class Tile:
20
+ def __init__(self,
21
+ lower_bound_distance,
22
+ inverse_lifted_geometric_object,
23
+ lifted_tetrahedron : LiftedTetrahedron,
24
+ object_index = None):
25
+ self.lower_bound_distance = lower_bound_distance
26
+ self.inverse_lifted_geometric_object = inverse_lifted_geometric_object
27
+ self.lifted_tetrahedron = lifted_tetrahedron
28
+ # Used in maximal_cusp_area_matrix
29
+ self.object_index = object_index
30
+
31
+ def compute_tiles(*, # Everything is a keyword argument
32
+ geometric_object,
33
+ visited_lifted_tetrahedra : LiftedTetrahedronSet,
34
+ initial_lifted_tetrahedra : Sequence[LiftedTetrahedron],
35
+ replace_lifted_tetrahedron_function = None,
36
+ verified : bool
37
+ ) -> Sequence[Tile]:
38
+
39
+ """
40
+ Returns a stream of tiles where each tile is a tetrahedron lifted
41
+ to H^3 or a quotient of H^3.
42
+
43
+ That is, imagine a growing neighborhood about the given
44
+ geometric_object (such as an R13Point, R13Line or R13Horoball) in
45
+ H^3 or a quotient of H^3. The stream returns the tiles in the order
46
+ as they are intersected by the growing neighborhood.
47
+
48
+ Note that this is not precisely true since we only compute a lower
49
+ bound for the distance of the geometric object to the tetrahedra.
50
+
51
+ What is true is that tile.lower_bound_distance is (not strictly)
52
+ increasing in the stream and that if we look at all tiles up to
53
+ a certain point, then those tiles cover the neighborhood of radius
54
+ tile.lower_bound_distance about the geometric_object.
55
+
56
+ base_point is used to determine whether two lifted tetrahedra
57
+ are the same in H^3 or a quotient space of H^3.
58
+
59
+ visited_lifted_tetrahedra: data structure (passed in as empty) which
60
+ will be used here to record which lifted tetrahedra have already been
61
+ visited and been added to the result while tiling the quotient space.
62
+
63
+ An optional replace_lifted_tetrahedron_function callback can be
64
+ specified. This callback is invoked on any new lifted tetrahedron
65
+ and can return None or a list of lifted tetrahedra to replace the given
66
+ lifted tetrahedra. This is used when developing a geodesic (tube) to
67
+ skip over the pieces of a geodesic completely contained in a tube
68
+ about a core curve.
69
+ """
70
+
71
+ RF = visited_lifted_tetrahedra._base_point[0].parent()
72
+
73
+ if verified:
74
+ minus_infinity = RF(-Infinity)
75
+ else:
76
+ minus_infinity = RF(-1e20)
77
+
78
+ # The pending pieces as priority queue - that is, a python list
79
+ # but we use heapq to access it.
80
+ pending_lifted_tetrahedra : Sequence[_PendingLiftedTetrahedron] = []
81
+
82
+ # Start tiling the neighborhood about the geometric object using
83
+ # the given lifted tetrahedra.
84
+ #
85
+ # It is assumed that at least one of the given lifted tetraheedra
86
+ # intersects the given geometric object for the tiling to be correct.
87
+ #
88
+ # If this assumption is false, we could fail in the following way:
89
+ # assume that the given lifted tetrahedra are far away from the given
90
+ # object. Then the algorithm below thinks we are done, before we
91
+ # even started properly tiling - and we obviously get an incomplete
92
+ # result.
93
+ #
94
+ for lifted_tetrahedron in initial_lifted_tetrahedra:
95
+ heapq.heappush(
96
+ pending_lifted_tetrahedra,
97
+ _PendingLiftedTetrahedron(
98
+ lifted_tetrahedron, minus_infinity))
99
+
100
+ while True:
101
+ pending_lifted_tetrahedron : _PendingLiftedTetrahedron = (
102
+ heapq.heappop(pending_lifted_tetrahedra))
103
+
104
+ if not visited_lifted_tetrahedra.add(
105
+ pending_lifted_tetrahedron.lifted_tetrahedron):
106
+ continue
107
+
108
+ tet = pending_lifted_tetrahedron.lifted_tetrahedron.tet
109
+ m = pending_lifted_tetrahedron.lifted_tetrahedron.o13_matrix
110
+
111
+ # Imagine the fixed lift of the given geometric object and how it
112
+ # relates to the lifted tetrahedron which is the image of
113
+ # the tetrahedron in the fundamental domain under the matrix.
114
+ #
115
+ # Applying the inverse matrix moves the tetrahedron back into
116
+ # the fundamental domain and thus we obtain the (inverse) lift of
117
+ # the geometric object intresecting the fundamental domain.
118
+ #
119
+ inverse_lifted_geometric_object = (
120
+ geometric_object.transformed(o13_inverse(m)))
121
+
122
+ if replace_lifted_tetrahedron_function:
123
+ new_lifted_tetrahedra = replace_lifted_tetrahedron_function(
124
+ pending_lifted_tetrahedron.lifted_tetrahedron,
125
+ geometric_object,
126
+ inverse_lifted_geometric_object,
127
+ verified)
128
+ if new_lifted_tetrahedra is not None:
129
+ for lifted_tetrahedron in new_lifted_tetrahedra:
130
+ heapq.heappush(
131
+ pending_lifted_tetrahedra,
132
+ _PendingLiftedTetrahedron(
133
+ lifted_tetrahedron, minus_infinity))
134
+ continue
135
+
136
+ # Emit Tile
137
+ yield Tile(pending_lifted_tetrahedron.lower_bound_distance,
138
+ inverse_lifted_geometric_object,
139
+ pending_lifted_tetrahedron.lifted_tetrahedron)
140
+
141
+ # For all faces ...
142
+ for f, new_tet in tet.Neighbor.items():
143
+ # ... except the one that was used to reach this lifted tetrahedron
144
+ if f == pending_lifted_tetrahedron.entry_cell:
145
+ continue
146
+
147
+ entry_face = tet.Gluing[f].image(f)
148
+ heapq.heappush(
149
+ pending_lifted_tetrahedra,
150
+ _PendingLiftedTetrahedron(
151
+ LiftedTetrahedron(
152
+ new_tet,
153
+ # Inverse of tet.O13_matrices[f]
154
+ m * new_tet.O13_matrices[entry_face]),
155
+ # Distance of this face to inverse lifted
156
+ # geometric object
157
+ # (equal to distance of face entry_face of
158
+ # new_tet)
159
+ lower_bound_distance_to_r13_triangle(
160
+ inverse_lifted_geometric_object,
161
+ tet.R13_triangles[f],
162
+ verified),
163
+ entry_cell=entry_face))
164
+
165
+ class _PendingLiftedTetrahedron:
166
+ """
167
+ A lifted tetrahedron that still needs to be processed by by compute_tiles
168
+ together with the face through which this lifted tetrahedron was
169
+ reached.
170
+
171
+ The lifted tetrahedron lives in a (potentially trivial) quotient space of
172
+ the hyperboloid model.
173
+
174
+ The algorithm in compute_tile might add the same lifted tetrahedron
175
+ multiple times to the queue of pending pieces as there are four
176
+ neighboring lifted tetrahedra from which this lifted tetrahedron can
177
+ be reached.
178
+
179
+ Let L be the geometric object (in the quotient space) about which we
180
+ develop a neighborhood. lower_bound is a lower bound on the distance between
181
+ L and the face through which this lifted tetrahedron was reached.
182
+ Note that lower_bound might be larger than the distance between L and
183
+ this lifted tetrahedron (which is the minimum of all distances between
184
+ L and any of the faces of this lifted tetrahedron).
185
+
186
+ The < operator is overloaded so that the piece with the lowest
187
+ lower_bound will be picked up next by a priority queue.
188
+
189
+ If pieces are processed in this order, then the lower_bound of the
190
+ next piece will actually be a lower bound for the distance between L
191
+ and the lifted tetrahedron (with other pending pieces for the same
192
+ lifted tetrahedron having higher values for lower_bound and thus
193
+ being further down the queue).
194
+ """
195
+
196
+ def __init__(self,
197
+ lifted_tetrahedron : LiftedTetrahedron,
198
+ lower_bound_distance,
199
+ entry_cell : int = simplex.T):
200
+ self.lifted_tetrahedron = lifted_tetrahedron
201
+ self.lower_bound_distance = lower_bound_distance
202
+
203
+ # Either element of simplex.ZeroSubsimplices (if piece was reached
204
+ # through another piece) or simplex.T (if this pending piece was
205
+ # used to start tiling).
206
+ self.entry_cell = entry_cell
207
+
208
+ # For convenience, lower_bound is an interval but it is only
209
+ # the left value of the interval that is relevant and that we
210
+ # should use: A < B can be False for two intervals even
211
+ # when A's left value is lower than B's left value.
212
+ self._key = lower(lower_bound_distance)
213
+
214
+ def __lt__(self, other):
215
+ return self._key < other._key
@@ -0,0 +1,33 @@
1
+ from ..snap.t3mlite import Mcomplex, Tetrahedron, simplex
2
+
3
+ from ..hyperboloid.line import R13Line
4
+ from ..hyperboloid.triangle import R13IdealTriangle, triangle_bounding_plane
5
+
6
+ __all__ = ['add_triangles_to_tetrahedra']
7
+
8
+ def add_triangles_to_tetrahedra(mcomplex : Mcomplex) -> None:
9
+ for tet in mcomplex.Tetrahedra:
10
+ _add_triangles_to_tetrahedron(tet)
11
+
12
+ def _add_triangles_to_tetrahedron(tet : Tetrahedron) -> None:
13
+ edges = {
14
+ e: R13Line([tet.R13_vertices[simplex.Head[e]],
15
+ tet.R13_vertices[simplex.Tail[e]]])
16
+ for e in simplex.OneSubsimplices }
17
+
18
+ tet.R13_triangles = {
19
+ f : R13IdealTriangle(
20
+ tet.R13_planes[f],
21
+ [ _triangle_bounding_plane_for_face_edge(tet, f, f & other_f)
22
+ for other_f in simplex.TwoSubsimplices
23
+ if f != other_f ],
24
+ [ edges[f & other_f]
25
+ for other_f in simplex.TwoSubsimplices
26
+ if f != other_f ])
27
+ for f in simplex.TwoSubsimplices }
28
+
29
+ def _triangle_bounding_plane_for_face_edge(tet, face, edge):
30
+ return triangle_bounding_plane(
31
+ tet.R13_vertices[face - edge],
32
+ tet.R13_vertices[simplex.Head[edge]],
33
+ tet.R13_vertices[simplex.Tail[edge]])
snappy/tkterminal.py CHANGED
@@ -3,16 +3,13 @@ import os
3
3
  import sys
4
4
  import re
5
5
  from urllib.request import pathname2url
6
-
7
- from IPython.utils import io
8
- from IPython.core.autocall import IPyAutocall
9
-
10
- import snappy
11
- from .gui import *
6
+ import tkinter as Tk_
7
+ from tkinter import ttk
8
+ from tkinter.font import Font
9
+ from tkinter.font import families as font_families
12
10
  from tkinter.messagebox import askyesno
11
+ from IPython.utils import io
13
12
 
14
- snappy_path = os.path.abspath(os.path.dirname(snappy.__file__))
15
- icon_file = os.path.join(snappy_path, 'info_icon.gif')
16
13
  debug_Tk = True
17
14
  ansi_seqs = re.compile(r'(?:\x01*\x1b\[((?:[0-9]*;)*[0-9]*.)\x02*)*([^\x01\x1b]*)',
18
15
  re.MULTILINE)
@@ -35,6 +32,40 @@ ansi_colors = {'0;30m': 'Black',
35
32
  delims = re.compile(r'[\s\[\]\{\}\(\)\+\-\=\'`~!@#\$\^\&\*]+')
36
33
 
37
34
 
35
+ class FontChoice:
36
+ def __init__(self, family, size, weight, slant):
37
+ self.family = family
38
+ self.size = size
39
+ self.weight = weight
40
+ self.slant = slant
41
+ self.rest = f'{self.weight} {self.slant}'
42
+
43
+ def as_tuple(self):
44
+ size = self.size
45
+ if sys.platform == 'darwin' and Tk_.TkVersion >= 9.0:
46
+ size = int(size/1.3)
47
+ return (self.family, size, self.rest)
48
+
49
+ def __repr__(self):
50
+ return 'FontChoice' + repr((self.family, self.size, self.weight, self.slant))
51
+
52
+ def bold(self):
53
+ return FontChoice(self.family, self.size, 'bold', self.slant)
54
+
55
+
56
+ def default_terminal_font():
57
+ size = 13 if sys.platform == 'darwin' else 11
58
+ family = Font(font='TkFixedFont').actual()['family']
59
+ if sys.platform == 'win32':
60
+ # Default is Courier New which is ugly and appears blurry.
61
+ available = font_families()
62
+ for better in ['Consolas', 'Cascadia Mono SemiLight']:
63
+ if better in available:
64
+ family = better
65
+
66
+ return FontChoice(family, size, 'normal', 'roman')
67
+
68
+
38
69
  class Tk(Tk_.Tk):
39
70
  def __init__(self, error_handler=None):
40
71
  Tk_.Tk.__init__(self, className='snappy')
@@ -42,15 +73,9 @@ class Tk(Tk_.Tk):
42
73
  # calls this function to report their occurrence.
43
74
  if error_handler:
44
75
  self.report_callback_exception = error_handler
45
- # In Python 2.7 the _default root does not get set correctly.
46
- if not Tk_._default_root:
47
- Tk_._default_root = self
48
76
 
49
- # Some ideas for the TkTerm class were borrowed from code written by
50
- # Eitan Isaacson, IBM Corp.
51
77
 
52
-
53
- class TkTerm:
78
+ class TkTerminalBase:
54
79
  """
55
80
  A Tkinter terminal window that runs an IPython shell. This class
56
81
  supports the IOStream interface, and can function as a replacement
@@ -62,8 +87,6 @@ class TkTerm:
62
87
  io.stdout = sys.stdout = self
63
88
  else:
64
89
  self.window = window = Tk(self.report_callback_exception)
65
- # self.encoding = sys.stdout.encoding
66
- # self.saved_io = (sys.stdout, sys.stderr)
67
90
  io.stdout = io.stderr = sys.stdout = sys.stderr = self
68
91
  self._input_buffer = ''
69
92
  self._current_indent = 0
@@ -71,7 +94,6 @@ class TkTerm:
71
94
  window.option_add('*Menu.tearOff', 0)
72
95
  window.title(name)
73
96
  window.protocol("WM_DELETE_WINDOW", self.close)
74
- self.icon = Tk_.PhotoImage(file=icon_file)
75
97
  self.frame = frame = Tk_.Frame(window)
76
98
  self.text = text = Tk_.Text(frame,
77
99
  width=85,
@@ -83,7 +105,7 @@ class TkTerm:
83
105
  highlightthickness=0,
84
106
  relief=Tk_.FLAT
85
107
  )
86
- self.set_font(Font(text, text.cget('font')))
108
+ self.set_font(default_terminal_font())
87
109
  self.scroller = scroller = Tk_.Scrollbar(frame, command=text.yview)
88
110
  text.config(yscrollcommand=scroller.set)
89
111
  scroller.pack(side=Tk_.RIGHT, fill=Tk_.Y, pady=10)
@@ -180,7 +202,7 @@ class TkTerm:
180
202
  self.blockers = {}
181
203
  self.can_quit = True
182
204
  self.close_callback = lambda :None
183
-
205
+
184
206
  # Emulate a ListedWindow. We are listed, even though we are unique.
185
207
  def bring_to_front(self):
186
208
  self.window.deiconify()
@@ -251,18 +273,18 @@ class TkTerm:
251
273
  sys.last_traceback = traceback
252
274
  self.IP.showtraceback()
253
275
 
254
- def set_font(self, fontdesc):
255
- self.text.config(font=fontdesc)
256
- normal_font = Font(self.text, self.text.cget('font'))
257
- self.bold_font = bold_font = Font(self.text, self.text.cget('font'))
258
- self.bold_font.config(weight='bold')
276
+ def set_font(self, font_choice):
277
+ normal_tuple = font_choice.as_tuple()
278
+ bold_tuple = font_choice.bold().as_tuple()
279
+ normal_font = Font(font=font_choice.as_tuple())
259
280
  self.char_size = normal_font.measure('M')
281
+ self.text.config(font=normal_tuple)
260
282
  text = self.text
261
- text.tag_config('output', font=normal_font)
262
- text.tag_config('Prompt', foreground='#0000cc', font=normal_font)
263
- text.tag_config('PromptNum', foreground='#0000bb', font=bold_font)
264
- text.tag_config('OutPrompt', foreground='#cc0000', font=normal_font)
265
- text.tag_config('OutPromptNum', foreground='#bb0000', font=bold_font)
283
+ text.tag_config('output', font=normal_tuple)
284
+ text.tag_config('Prompt', foreground='#0000cc', font=normal_tuple)
285
+ text.tag_config('PromptNum', foreground='#0000bb', font=bold_tuple)
286
+ text.tag_config('OutPrompt', foreground='#cc0000', font=normal_tuple)
287
+ text.tag_config('OutPromptNum', foreground='#bb0000', font=bold_tuple)
266
288
 
267
289
  def add_blocker(self, window, message):
268
290
  self.blockers[window] = message
@@ -278,8 +300,9 @@ class TkTerm:
278
300
  topmost = blocker
279
301
  blocker.attributes('-topmost', False)
280
302
  message = self.blockers[blocker]
281
- answer = askyesno('Quit', message + '\nDo you care?')
282
- if answer:
303
+ answer = askyesno('Quit',
304
+ message + '\nDo you want to quit anyway?')
305
+ if not answer:
283
306
  can_quit = False
284
307
  break;
285
308
  if topmost:
@@ -364,29 +387,37 @@ class TkTerm:
364
387
  self.text.tag_add('history', 'output_end', Tk_.INSERT)
365
388
 
366
389
  def handle_return(self, event=None):
390
+ # If the input consists of one complete line of code we run it,
391
+ # regardless of where the insert cursor is located. Otherwise we only
392
+ # run the code if the cursor is at the end of the input
367
393
  self.clear_completions()
394
+ if self.running_code:
395
+ return 'break'
396
+ cursor = int(self.text.index(Tk_.INSERT).split('.')[0])
397
+ last = int(self.text.index(Tk_.END).split('.')[0])
398
+ first = int(self.text.index('output_end').split('.')[0])
399
+ if cursor == first == last - 1: # single line input
400
+ self.text.mark_set(Tk_.INSERT, Tk_.END)
368
401
  self.text.insert(Tk_.INSERT, '\n')
369
- if not self.running_code:
370
- cell = self.text.get('output_end', Tk_.INSERT)
371
- self.process_return(cell)
372
- return 'break'
373
-
374
- def handle_shift_return(self, event):
375
- self.text.mark_set(Tk_.INSERT, Tk_.END)
376
- return self.handle_return()
377
-
378
- def process_return(self, cell):
402
+ cell = self.text.get('output_end', Tk_.INSERT)
379
403
  try:
380
404
  self.interact_handle_input(cell)
381
405
  except KeyboardInterrupt:
382
406
  self.write('(IP) Keyboard Interrupt: ')
383
407
  self.reset()
408
+ self.hist_pointer = 0
409
+ self.hist_stem = ''
384
410
  self.interact_prompt()
385
411
  self.text.see(Tk_.INSERT)
386
412
  if self.IP.more:
387
413
  self.text.insert(Tk_.INSERT, ' '*self._current_indent, ())
388
414
  self.hist_pointer = 0
389
415
  self.hist_stem = ''
416
+ return 'break'
417
+
418
+ def handle_shift_return(self, event):
419
+ self.text.mark_set(Tk_.INSERT, Tk_.END)
420
+ return self.handle_return()
390
421
 
391
422
  def jump_up(self, event):
392
423
  return self.handle_up(event, jump=True)
@@ -462,25 +493,35 @@ class TkTerm:
462
493
  line = self.text.get('output_end', self.tab_index).strip('\n')
463
494
  word = delims.split(line)[-1]
464
495
  try:
465
- completions = self.IP.complete(word)[1]
496
+ stem, completions = self.IP.complete(word)
466
497
  except TypeError:
467
498
  completions = []
468
499
  if word.find('_') == -1:
469
500
  completions = [x for x in completions
470
501
  if x.find('__') == -1 and x.find('._') == -1]
471
- if len(completions) == 0:
502
+ # No meaningful completions. Ring the bell.
503
+ if len(completions) == 0 or len(completions) == 1 and completions[0] == stem:
472
504
  self.window.bell()
473
505
  self.tab_count = 0
474
506
  return 'break'
475
- stem = self.stem(completions)
476
- if len(stem) > len(word):
477
- self.do_completion(word, stem)
478
- elif len(completions) > 60 and self.tab_count == 1:
479
- self.show_completions(
507
+ # Only one completion. Use it.
508
+ if len(completions) == 1:
509
+ self.do_completion(stem, completions[0])
510
+ self.tab_count = 0
511
+ return 'break'
512
+ max_stem = self.max_stem(stem, completions)
513
+ # Add the maximal stem of all completions if it extends the word,
514
+ if len(max_stem) > len(word):
515
+ self.do_completion(stem, max_stem)
516
+ self.tab_count = 0
517
+ return 'break'
518
+ # Show the possible completions, with a warning if there are lots.
519
+ if len(completions) > 60 and self.tab_count == 1:
520
+ self.show_completions('', '',
480
521
  ['%s possibilities -- hit tab again to view them all' %
481
- len(completions)])
522
+ len(completions)])
482
523
  else:
483
- self.show_completions(completions)
524
+ self.show_completions(word, stem, completions)
484
525
  if len(completions) <= 60:
485
526
  self.tab_count += 1
486
527
  return 'break'
@@ -489,20 +530,21 @@ class TkTerm:
489
530
  self.text.mark_set(Tk_.INSERT, 'output_end')
490
531
  return 'break'
491
532
 
492
- def do_completion(self, word, completion):
493
- tail = completion[len(word):]
533
+ def do_completion(self, stem, completion):
534
+ tail = completion[len(stem):]
494
535
  self.text.insert(self.tab_index, tail)
495
536
  self.tab_index = Tk_.END
496
537
  self.tab_count = 0
497
538
 
498
- def show_completions(self, comps):
539
+ def show_completions(self, word, stem, comps):
540
+ n = len(stem)
541
+ comps = [word + c[n:] for c in comps]
499
542
  self.text.delete(self.tab_index, Tk_.END)
500
543
  width = self.text.winfo_width()
501
- font = Font(self.text, self.text.cget('font'))
502
- charwidth = width//self.char_size
544
+ charwidth = width // self.char_size
503
545
  biggest = 2 + max([len(x) for x in comps])
504
- num_cols = charwidth//biggest
505
- num_rows = (len(comps) + num_cols - 1)//num_cols
546
+ num_cols = max(charwidth // biggest, 1)
547
+ num_rows = (len(comps) + num_cols - 1) // num_cols
506
548
  rows = []
507
549
  format = '%%-%ds' % biggest
508
550
  for n in range(num_rows):
@@ -518,17 +560,17 @@ class TkTerm:
518
560
  self.tab_index = None
519
561
  self.tab_count = 0
520
562
 
521
- def stem(self, wordlist):
522
- if len(wordlist) == 1:
523
- return wordlist[0]
524
- result = ''
525
- for n in range(1,100):
526
- heads = set(w[:n] for w in wordlist)
563
+ def max_stem(self, stem, completions):
564
+ if len(completions) == 1:
565
+ return completions[0]
566
+ result = stem
567
+ for n in range(len(stem) + 1, 100):
568
+ heads = {w[:n] for w in completions}
527
569
  if len(heads) > 1:
528
570
  return result
529
571
  elif len(heads) == 1:
530
572
  result = heads.pop()
531
- return wordlist[0][:100]
573
+ return result
532
574
 
533
575
  def write_continuation_prompt(self):
534
576
  prompt_tokens = self._continuation_prompt(self._prompt_size)
@@ -672,28 +714,16 @@ class TkTerm:
672
714
 
673
715
  def start_interaction(self):
674
716
  """
675
- Print the banner and issue the first prompt.
717
+ Display a banner and prepare to begin interaction.
676
718
  """
677
- self.text.image_create(Tk_.END, image=self.icon)
678
- banner_label = Tk_.Label(self.text, text=self.banner,
679
- background='#ec0fffec0',
680
- foreground='DarkGreen',
681
- anchor=Tk_.W,
682
- justify=Tk_.LEFT,
683
- font=self.settings['font'])
719
+ # Subclasses should override this method
720
+ banner_label = Tk_.Label(self.text,
721
+ text="Please override the start_interaction method.",
722
+ anchor=Tk_.W,
723
+ justify=Tk_.LEFT)
684
724
  self.text.window_create(Tk_.END, window=banner_label)
685
725
  self.text.insert(Tk_.END, '\n')
686
726
  self.text.mark_set('output_end', '2.0')
687
- # Set a reasonable default directory for files to be saved to.
688
- try:
689
- home = os.environ['HOME']
690
- except KeyError:
691
- home = os.path.expanduser("~")
692
- desktop = os.path.join(home, "Desktop")
693
- default_save_dir = desktop if os.path.exists(desktop) else home
694
- self.IP.magics_manager.magics['line']['cd']("-q " + default_save_dir)
695
- # Create the prompt and go!
696
- self.interact_prompt()
697
727
 
698
728
  def _input_prompt(self):
699
729
  result = [('Prompt', 'In['),
@@ -732,7 +762,7 @@ class TkTerm:
732
762
  """
733
763
  if not code.strip():
734
764
  return '\n'
735
- lines = [line for line in code.split('\n')]
765
+ lines = list(code.split('\n'))
736
766
  clean_lines = [lines[0].lstrip()]
737
767
  for line in lines[1:]:
738
768
  try:
@@ -748,7 +778,6 @@ class TkTerm:
748
778
  prompt and set the 'more' flag. If the code is valid and
749
779
  complete then run the code.
750
780
  """
751
- transformer = self.IP.input_transformer_manager
752
781
  assert cell.endswith('\n')
753
782
  if not cell.strip():
754
783
  self._current_indent = 0
@@ -757,7 +786,8 @@ class TkTerm:
757
786
  self._input_buffer += cell
758
787
  else:
759
788
  self._input_buffer = self.clean_code(cell)
760
- status, indent = transformer.check_complete(self._input_buffer)
789
+ transformed_cell = self.IP.transform_cell(self._input_buffer)
790
+ status, indent = self.IP.check_complete(transformed_cell)
761
791
  self._current_indent = indent or 0
762
792
  if status == 'incomplete':
763
793
  self.IP.more = True
snappy/twister/main.py CHANGED
@@ -8,12 +8,6 @@ import snappy
8
8
  from plink import LinkManager
9
9
  from .twister_core import build_bundle, build_splitting, twister_version
10
10
 
11
- # Python 3 compatibility
12
- try:
13
- basestring
14
- except NameError: # Python 3
15
- basestring = unicode = str
16
-
17
11
  surface_database_path = os.path.join(os.path.dirname(__file__), 'surfaces')
18
12
  surface_database = set(os.listdir(surface_database_path))
19
13
  version = twister_version()
@@ -22,7 +16,7 @@ def _get_surface(surface):
22
16
  if isinstance(surface, tuple) and len(surface) == 2 and isinstance(surface[0], int) and isinstance(surface[1], int):
23
17
  return LP_surface(surface[0], surface[1])
24
18
 
25
- if isinstance(surface, basestring):
19
+ if isinstance(surface, str):
26
20
  # If surface is actually the contents of a surface file.
27
21
  if surface.startswith('# A Twister surface file'):
28
22
  return surface