snappy 3.1.1__cp38-cp38-win_amd64.whl → 3.2__cp38-cp38-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. snappy/CyOpenGL.cp38-win_amd64.pyd +0 -0
  2. snappy/SnapPy.cp38-win_amd64.pyd +0 -0
  3. snappy/SnapPyHP.cp38-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 -75
  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 -183
  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 +113 -84
  271. snappy/twister/main.py +1 -7
  272. snappy/twister/twister_core.cp38-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.1.dist-info → snappy-3.2.dist-info}/METADATA +14 -10
  301. snappy-3.2.dist-info/RECORD +503 -0
  302. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  303. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  304. snappy/__pycache__/__init__.cpython-38.pyc +0 -0
  305. snappy/__pycache__/browser.cpython-38.pyc +0 -0
  306. snappy/__pycache__/cache.cpython-38.pyc +0 -0
  307. snappy/__pycache__/database.cpython-38.pyc +0 -0
  308. snappy/__pycache__/db_utilities.cpython-38.pyc +0 -0
  309. snappy/__pycache__/decorated_isosig.cpython-38.pyc +0 -0
  310. snappy/__pycache__/exceptions.cpython-38.pyc +0 -0
  311. snappy/__pycache__/export_stl.cpython-38.pyc +0 -0
  312. snappy/__pycache__/filedialog.cpython-38.pyc +0 -0
  313. snappy/__pycache__/gui.cpython-38.pyc +0 -0
  314. snappy/__pycache__/horoviewer.cpython-38.pyc +0 -0
  315. snappy/__pycache__/math_basics.cpython-38.pyc +0 -0
  316. snappy/__pycache__/matrix.cpython-38.pyc +0 -0
  317. snappy/__pycache__/number.cpython-38.pyc +0 -0
  318. snappy/__pycache__/numeric_output_checker.cpython-38.pyc +0 -0
  319. snappy/__pycache__/pari.cpython-38.pyc +0 -0
  320. snappy/__pycache__/polyviewer.cpython-38.pyc +0 -0
  321. snappy/__pycache__/sage_helper.cpython-38.pyc +0 -0
  322. snappy/__pycache__/version.cpython-38.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-38.pyc +0 -0
  331. snappy/drilling/__pycache__/constants.cpython-38.pyc +0 -0
  332. snappy/drilling/__pycache__/crush.cpython-38.pyc +0 -0
  333. snappy/drilling/__pycache__/cusps.cpython-38.pyc +0 -0
  334. snappy/drilling/__pycache__/debug.cpython-38.pyc +0 -0
  335. snappy/drilling/__pycache__/epsilons.cpython-38.pyc +0 -0
  336. snappy/drilling/__pycache__/exceptions.cpython-38.pyc +0 -0
  337. snappy/drilling/__pycache__/fixed_points.cpython-38.pyc +0 -0
  338. snappy/drilling/__pycache__/geodesic_info.cpython-38.pyc +0 -0
  339. snappy/drilling/__pycache__/geodesic_tube.cpython-38.pyc +0 -0
  340. snappy/drilling/__pycache__/geometric_structure.cpython-38.pyc +0 -0
  341. snappy/drilling/__pycache__/line.cpython-38.pyc +0 -0
  342. snappy/drilling/__pycache__/moves.cpython-38.pyc +0 -0
  343. snappy/drilling/__pycache__/peripheral_curves.cpython-38.pyc +0 -0
  344. snappy/drilling/__pycache__/perturb.cpython-38.pyc +0 -0
  345. snappy/drilling/__pycache__/quotient_space.cpython-38.pyc +0 -0
  346. snappy/drilling/__pycache__/spatial_dict.cpython-38.pyc +0 -0
  347. snappy/drilling/__pycache__/subdivide.cpython-38.pyc +0 -0
  348. snappy/drilling/__pycache__/tracing.cpython-38.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-38.pyc +0 -0
  355. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-38.pyc +0 -0
  356. snappy/exterior_to_link/__pycache__/exceptions.cpython-38.pyc +0 -0
  357. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-38.pyc +0 -0
  358. snappy/exterior_to_link/__pycache__/link_projection.cpython-38.pyc +0 -0
  359. snappy/exterior_to_link/__pycache__/main.cpython-38.pyc +0 -0
  360. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-38.pyc +0 -0
  361. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-38.pyc +0 -0
  362. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-38.pyc +0 -0
  363. snappy/exterior_to_link/__pycache__/pl_utils.cpython-38.pyc +0 -0
  364. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-38.pyc +0 -0
  365. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-38.pyc +0 -0
  366. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-38.pyc +0 -0
  367. snappy/exterior_to_link/__pycache__/stored_moves.cpython-38.pyc +0 -0
  368. snappy/hyperboloid/__pycache__/__init__.cpython-38.pyc +0 -0
  369. snappy/manifolds/__pycache__/__init__.cpython-38.pyc +0 -0
  370. snappy/ptolemy/__pycache__/__init__.cpython-38.pyc +0 -0
  371. snappy/ptolemy/__pycache__/component.cpython-38.pyc +0 -0
  372. snappy/ptolemy/__pycache__/coordinates.cpython-38.pyc +0 -0
  373. snappy/ptolemy/__pycache__/fieldExtensions.cpython-38.pyc +0 -0
  374. snappy/ptolemy/__pycache__/findLoops.cpython-38.pyc +0 -0
  375. snappy/ptolemy/__pycache__/homology.cpython-38.pyc +0 -0
  376. snappy/ptolemy/__pycache__/manifoldMethods.cpython-38.pyc +0 -0
  377. snappy/ptolemy/__pycache__/matrix.cpython-38.pyc +0 -0
  378. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-38.pyc +0 -0
  379. snappy/ptolemy/__pycache__/polynomial.cpython-38.pyc +0 -0
  380. snappy/ptolemy/__pycache__/processComponents.cpython-38.pyc +0 -0
  381. snappy/ptolemy/__pycache__/processFileBase.cpython-38.pyc +0 -0
  382. snappy/ptolemy/__pycache__/processFileDispatch.cpython-38.pyc +0 -0
  383. snappy/ptolemy/__pycache__/processMagmaFile.cpython-38.pyc +0 -0
  384. snappy/ptolemy/__pycache__/processRurFile.cpython-38.pyc +0 -0
  385. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-38.pyc +0 -0
  386. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-38.pyc +0 -0
  387. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-38.pyc +0 -0
  388. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
  389. snappy/ptolemy/__pycache__/rur.cpython-38.pyc +0 -0
  390. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
  391. snappy/ptolemy/__pycache__/utilities.cpython-38.pyc +0 -0
  392. snappy/snap/__pycache__/__init__.cpython-38.pyc +0 -0
  393. snappy/snap/__pycache__/character_varieties.cpython-38.pyc +0 -0
  394. snappy/snap/__pycache__/fundamental_polyhedron.cpython-38.pyc +0 -0
  395. snappy/snap/__pycache__/interval_reps.cpython-38.pyc +0 -0
  396. snappy/snap/__pycache__/kernel_structures.cpython-38.pyc +0 -0
  397. snappy/snap/__pycache__/mcomplex_base.cpython-38.pyc +0 -0
  398. snappy/snap/__pycache__/nsagetools.cpython-38.pyc +0 -0
  399. snappy/snap/__pycache__/polished_reps.cpython-38.pyc +0 -0
  400. snappy/snap/__pycache__/shapes.cpython-38.pyc +0 -0
  401. snappy/snap/__pycache__/slice_obs_HKL.cpython-38.pyc +0 -0
  402. snappy/snap/__pycache__/utilities.cpython-38.pyc +0 -0
  403. snappy/snap/peripheral/__pycache__/__init__.cpython-38.pyc +0 -0
  404. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-38.pyc +0 -0
  405. snappy/snap/peripheral/__pycache__/link.cpython-38.pyc +0 -0
  406. snappy/snap/peripheral/__pycache__/peripheral.cpython-38.pyc +0 -0
  407. snappy/snap/peripheral/__pycache__/surface.cpython-38.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/__init__.cpython-38.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/arrow.cpython-38.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/corner.cpython-38.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/edge.cpython-38.pyc +0 -0
  412. snappy/snap/t3mlite/__pycache__/face.cpython-38.pyc +0 -0
  413. snappy/snap/t3mlite/__pycache__/files.cpython-38.pyc +0 -0
  414. snappy/snap/t3mlite/__pycache__/homology.cpython-38.pyc +0 -0
  415. snappy/snap/t3mlite/__pycache__/linalg.cpython-38.pyc +0 -0
  416. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-38.pyc +0 -0
  417. snappy/snap/t3mlite/__pycache__/perm4.cpython-38.pyc +0 -0
  418. snappy/snap/t3mlite/__pycache__/simplex.cpython-38.pyc +0 -0
  419. snappy/snap/t3mlite/__pycache__/spun.cpython-38.pyc +0 -0
  420. snappy/snap/t3mlite/__pycache__/surface.cpython-38.pyc +0 -0
  421. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-38.pyc +0 -0
  422. snappy/snap/t3mlite/__pycache__/vertex.cpython-38.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-38.pyc +0 -0
  442. snappy/twister/__pycache__/main.cpython-38.pyc +0 -0
  443. snappy/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
  444. snappy/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
  445. snappy/verify/__pycache__/__init__.cpython-38.pyc +0 -0
  446. snappy/verify/__pycache__/cuspCrossSection.cpython-38.pyc +0 -0
  447. snappy/verify/__pycache__/cuspTranslations.cpython-38.pyc +0 -0
  448. snappy/verify/__pycache__/cusp_areas.cpython-38.pyc +0 -0
  449. snappy/verify/__pycache__/cusp_shapes.cpython-38.pyc +0 -0
  450. snappy/verify/__pycache__/exceptions.cpython-38.pyc +0 -0
  451. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-38.pyc +0 -0
  452. snappy/verify/__pycache__/interval_tree.cpython-38.pyc +0 -0
  453. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-38.pyc +0 -0
  454. snappy/verify/__pycache__/realAlgebra.cpython-38.pyc +0 -0
  455. snappy/verify/__pycache__/shapes.cpython-38.pyc +0 -0
  456. snappy/verify/__pycache__/short_slopes.cpython-38.pyc +0 -0
  457. snappy/verify/__pycache__/squareExtensions.cpython-38.pyc +0 -0
  458. snappy/verify/__pycache__/verifyCanonical.cpython-38.pyc +0 -0
  459. snappy/verify/__pycache__/verifyHyperbolicity.cpython-38.pyc +0 -0
  460. snappy/verify/__pycache__/volume.cpython-38.pyc +0 -0
  461. snappy/verify/complex_volume/__pycache__/__init__.cpython-38.pyc +0 -0
  462. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-38.pyc +0 -0
  463. snappy/verify/complex_volume/__pycache__/closed.cpython-38.pyc +0 -0
  464. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-38.pyc +0 -0
  465. snappy/verify/complex_volume/__pycache__/cusped.cpython-38.pyc +0 -0
  466. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-38.pyc +0 -0
  467. snappy/verify/cuspCrossSection.py +0 -1422
  468. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-38.pyc +0 -0
  469. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-38.pyc +0 -0
  470. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-38.pyc +0 -0
  471. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
  472. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-38.pyc +0 -0
  473. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-38.pyc +0 -0
  474. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
  475. snappy-3.1.1.dist-info/RECORD +0 -575
  476. {snappy-3.1.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
@@ -365,29 +387,37 @@ class TkTerm:
365
387
  self.text.tag_add('history', 'output_end', Tk_.INSERT)
366
388
 
367
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
368
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)
369
401
  self.text.insert(Tk_.INSERT, '\n')
370
- if not self.running_code:
371
- cell = self.text.get('output_end', Tk_.INSERT)
372
- self.process_return(cell)
373
- return 'break'
374
-
375
- def handle_shift_return(self, event):
376
- self.text.mark_set(Tk_.INSERT, Tk_.END)
377
- return self.handle_return()
378
-
379
- def process_return(self, cell):
402
+ cell = self.text.get('output_end', Tk_.INSERT)
380
403
  try:
381
404
  self.interact_handle_input(cell)
382
405
  except KeyboardInterrupt:
383
406
  self.write('(IP) Keyboard Interrupt: ')
384
407
  self.reset()
408
+ self.hist_pointer = 0
409
+ self.hist_stem = ''
385
410
  self.interact_prompt()
386
411
  self.text.see(Tk_.INSERT)
387
412
  if self.IP.more:
388
413
  self.text.insert(Tk_.INSERT, ' '*self._current_indent, ())
389
414
  self.hist_pointer = 0
390
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()
391
421
 
392
422
  def jump_up(self, event):
393
423
  return self.handle_up(event, jump=True)
@@ -463,25 +493,35 @@ class TkTerm:
463
493
  line = self.text.get('output_end', self.tab_index).strip('\n')
464
494
  word = delims.split(line)[-1]
465
495
  try:
466
- completions = self.IP.complete(word)[1]
496
+ stem, completions = self.IP.complete(word)
467
497
  except TypeError:
468
498
  completions = []
469
499
  if word.find('_') == -1:
470
500
  completions = [x for x in completions
471
501
  if x.find('__') == -1 and x.find('._') == -1]
472
- if len(completions) == 0:
502
+ # No meaningful completions. Ring the bell.
503
+ if len(completions) == 0 or len(completions) == 1 and completions[0] == stem:
473
504
  self.window.bell()
474
505
  self.tab_count = 0
475
506
  return 'break'
476
- stem = self.stem(completions)
477
- if len(stem) > len(word):
478
- self.do_completion(word, stem)
479
- elif len(completions) > 60 and self.tab_count == 1:
480
- 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('', '',
481
521
  ['%s possibilities -- hit tab again to view them all' %
482
- len(completions)])
522
+ len(completions)])
483
523
  else:
484
- self.show_completions(completions)
524
+ self.show_completions(word, stem, completions)
485
525
  if len(completions) <= 60:
486
526
  self.tab_count += 1
487
527
  return 'break'
@@ -490,20 +530,21 @@ class TkTerm:
490
530
  self.text.mark_set(Tk_.INSERT, 'output_end')
491
531
  return 'break'
492
532
 
493
- def do_completion(self, word, completion):
494
- tail = completion[len(word):]
533
+ def do_completion(self, stem, completion):
534
+ tail = completion[len(stem):]
495
535
  self.text.insert(self.tab_index, tail)
496
536
  self.tab_index = Tk_.END
497
537
  self.tab_count = 0
498
538
 
499
- 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]
500
542
  self.text.delete(self.tab_index, Tk_.END)
501
543
  width = self.text.winfo_width()
502
- font = Font(self.text, self.text.cget('font'))
503
- charwidth = width//self.char_size
544
+ charwidth = width // self.char_size
504
545
  biggest = 2 + max([len(x) for x in comps])
505
- num_cols = charwidth//biggest
506
- 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
507
548
  rows = []
508
549
  format = '%%-%ds' % biggest
509
550
  for n in range(num_rows):
@@ -519,17 +560,17 @@ class TkTerm:
519
560
  self.tab_index = None
520
561
  self.tab_count = 0
521
562
 
522
- def stem(self, wordlist):
523
- if len(wordlist) == 1:
524
- return wordlist[0]
525
- result = ''
526
- for n in range(1,100):
527
- 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}
528
569
  if len(heads) > 1:
529
570
  return result
530
571
  elif len(heads) == 1:
531
572
  result = heads.pop()
532
- return wordlist[0][:100]
573
+ return result
533
574
 
534
575
  def write_continuation_prompt(self):
535
576
  prompt_tokens = self._continuation_prompt(self._prompt_size)
@@ -673,28 +714,16 @@ class TkTerm:
673
714
 
674
715
  def start_interaction(self):
675
716
  """
676
- Print the banner and issue the first prompt.
717
+ Display a banner and prepare to begin interaction.
677
718
  """
678
- self.text.image_create(Tk_.END, image=self.icon)
679
- banner_label = Tk_.Label(self.text, text=self.banner,
680
- background='#ec0fffec0',
681
- foreground='DarkGreen',
682
- anchor=Tk_.W,
683
- justify=Tk_.LEFT,
684
- 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)
685
724
  self.text.window_create(Tk_.END, window=banner_label)
686
725
  self.text.insert(Tk_.END, '\n')
687
726
  self.text.mark_set('output_end', '2.0')
688
- # Set a reasonable default directory for files to be saved to.
689
- try:
690
- home = os.environ['HOME']
691
- except KeyError:
692
- home = os.path.expanduser("~")
693
- desktop = os.path.join(home, "Desktop")
694
- default_save_dir = desktop if os.path.exists(desktop) else home
695
- self.IP.magics_manager.magics['line']['cd']("-q " + default_save_dir)
696
- # Create the prompt and go!
697
- self.interact_prompt()
698
727
 
699
728
  def _input_prompt(self):
700
729
  result = [('Prompt', 'In['),
@@ -733,7 +762,7 @@ class TkTerm:
733
762
  """
734
763
  if not code.strip():
735
764
  return '\n'
736
- lines = [line for line in code.split('\n')]
765
+ lines = list(code.split('\n'))
737
766
  clean_lines = [lines[0].lstrip()]
738
767
  for line in lines[1:]:
739
768
  try:
@@ -749,7 +778,6 @@ class TkTerm:
749
778
  prompt and set the 'more' flag. If the code is valid and
750
779
  complete then run the code.
751
780
  """
752
- transformer = self.IP.input_transformer_manager
753
781
  assert cell.endswith('\n')
754
782
  if not cell.strip():
755
783
  self._current_indent = 0
@@ -758,7 +786,8 @@ class TkTerm:
758
786
  self._input_buffer += cell
759
787
  else:
760
788
  self._input_buffer = self.clean_code(cell)
761
- 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)
762
791
  self._current_indent = indent or 0
763
792
  if status == 'incomplete':
764
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