snappy 3.1.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 -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.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.1.dist-info → snappy-3.2.dist-info}/METADATA +26 -11
  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-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.1.dist-info/RECORD +0 -575
  476. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
snappy/app.py CHANGED
@@ -22,7 +22,7 @@ from .settings import Settings, SettingsDialog
22
22
  from .phone_home import update_needed
23
23
  from .SnapPy import SnapPea_interrupt, msg_stream
24
24
  from .shell import SnapPyInteractiveShellEmbed
25
- from .tkterminal import TkTerm, snappy_path
25
+ from .tkterminal import TkTerminalBase
26
26
 
27
27
  from plink import LinkEditor
28
28
  from plink.smooth import Smoother
@@ -34,7 +34,7 @@ if 'SNAPPYHOME' in os.environ:
34
34
  os.environ['HOME'] = os.environ['SNAPPYHOME']
35
35
 
36
36
 
37
- class SnapPyTerm(TkTerm, ListedWindow):
37
+ class SnapPyTerm(TkTerminalBase, ListedWindow):
38
38
  """
39
39
  The main window of the SnapPy app, which runs an embedded IPython shell.
40
40
  """
@@ -47,9 +47,10 @@ class SnapPyTerm(TkTerm, ListedWindow):
47
47
  self.main_window = self
48
48
  self.menu_title = 'SnapPy Shell'
49
49
  self.register_window(self)
50
- TkTerm.__init__(self, shell, name='SnapPy Command Shell')
50
+ TkTerminalBase.__init__(self, shell, name='SnapPy Command Shell')
51
51
  self.settings = SnapPySettings(self)
52
52
  self.start_interaction()
53
+ self.interact_prompt()
53
54
  if sys.platform == 'darwin':
54
55
  assert str(self.window) == "."
55
56
  # Under OS X, the main window shouldn't be closable.
@@ -61,6 +62,34 @@ class SnapPyTerm(TkTerm, ListedWindow):
61
62
  self.window.tk.call('set', '::tk::dialog::file::showHiddenVar', '0')
62
63
  self.encoding = None
63
64
 
65
+ def start_interaction(self):
66
+ """
67
+ Display a banner and prepare to begin interaction.
68
+ """
69
+ snappy_path = os.path.abspath(os.path.dirname(__file__))
70
+ icon_file = os.path.join(snappy_path, 'info_icon.gif')
71
+ # Keep a reference to the icon.
72
+ self.icon = Tk_.PhotoImage(file=icon_file)
73
+
74
+ self.text.image_create(Tk_.END, image=self.icon)
75
+ banner_label = Tk_.Label(self.text, text=self.banner,
76
+ background='#ec0fffec0',
77
+ foreground='DarkGreen',
78
+ anchor=Tk_.W,
79
+ justify=Tk_.LEFT,
80
+ font=self.settings['font'].as_tuple())
81
+ self.text.window_create(Tk_.END, window=banner_label)
82
+ self.text.insert(Tk_.END, '\n')
83
+ self.text.mark_set('output_end', '2.0')
84
+ # Set a reasonable default directory for files to be saved to.
85
+ try:
86
+ home = os.environ['HOME']
87
+ except KeyError:
88
+ home = os.path.expanduser("~")
89
+ desktop = os.path.join(home, "Desktop")
90
+ default_save_dir = desktop if os.path.exists(desktop) else home
91
+ self.IP.magics_manager.magics['line']['cd']("-q " + default_save_dir)
92
+
64
93
  def add_bindings(self):
65
94
  self.window.bind('<<Paste>>', self.edit_paste)
66
95
 
@@ -237,8 +266,10 @@ class SnapPyBrowser(Browser, ListedWindow):
237
266
  self.dirichlet_viewer.help_button.configure(command=self.dirichlet_help)
238
267
 
239
268
  def close(self, event=None):
269
+ terminal.window.focus_force()
240
270
  self.unregister_window(self)
241
- self.destroy()
271
+ self.withdraw()
272
+ self.after(100, self.destroy)
242
273
 
243
274
  def apply_settings(self):
244
275
  if self.inside_view:
@@ -359,8 +390,9 @@ class SnapPyPolyhedronViewer(PolyhedronViewer):
359
390
  def help_window(self):
360
391
  window = self.parent
361
392
  if not hasattr(window, 'polyhedron_help'):
362
- window.polyhedron_help = InfoWindow(window, 'Polyhedron Viewer Help',
363
- self.widget.help_text, 'polyhedron_help')
393
+ window.polyhedron_help = InfoWindow(
394
+ window, 'Polyhedron Viewer Help',
395
+ self.widget.help_text, 'polyhedron_help')
364
396
  else:
365
397
  window.polyhedron_help.deiconify()
366
398
  window.polyhedron_help.lift()
@@ -394,7 +426,7 @@ class SnapPyInsideViewer(InsideViewer):
394
426
  class SnapPySettings(Settings, ListedWindow):
395
427
  def __init__(self, terminal):
396
428
  self.terminal = terminal
397
- Settings.__init__(self, terminal.text)
429
+ Settings.__init__(self)
398
430
  self.apply_settings()
399
431
 
400
432
  def apply_settings(self):
@@ -402,16 +434,10 @@ class SnapPySettings(Settings, ListedWindow):
402
434
  changed = self.changed()
403
435
  IP = self.terminal.IP
404
436
  self.terminal.quiet = True
405
- if 'autocall' in changed:
406
- if self.setting_dict['autocall']:
407
- IP.magics_manager.magics['line']['autocall'](2)
408
- else:
409
- IP.magics_manager.magics['line']['autocall'](0)
410
- if 'automagic' in changed:
411
- if self.setting_dict['automagic']:
412
- IP.magics_manager.magics['line']['automagic']('on')
413
- else:
414
- IP.magics_manager.magics['line']['automagic']('off')
437
+ if self.setting_dict['autocall']:
438
+ IP.magics_manager.magics['line']['autocall']('2')
439
+ else:
440
+ IP.magics_manager.magics['line']['autocall']('0')
415
441
  self.terminal.quiet = False
416
442
  for window in self.window_list:
417
443
  window.apply_settings()
@@ -477,18 +503,19 @@ def set_icon(window):
477
503
  if sys.platform == 'win32':
478
504
  try:
479
505
  import snappy
480
- ico = os.path.join(os.path.dirname(snappy.__file__), 'SnapPy.ico')
506
+ ico = os.path.join(os.path.dirname(__file__), 'SnapPy.ico')
481
507
  window.iconbitmap(default=ico)
482
508
  except:
483
509
  pass
484
510
  if sys.platform == 'darwin':
485
511
  if not sys.executable.endswith('SnapPy.app/Contents/MacOS/python'):
512
+ snappy_path = os.path.abspath(os.path.dirname(__file__))
513
+ icon_file = os.path.join(snappy_path, 'info_icon.gif')
486
514
  image_file = os.path.join(snappy_path, 'SnapPy.png')
487
515
  if os.path.exists(image_file):
488
516
  dock_icon = Tk_.PhotoImage(file=image_file)
489
517
  window.eval('wm iconphoto . -default %s' % dock_icon)
490
518
 
491
-
492
519
  # from multiprocessing import Process
493
520
  class SnapPyKernelServer():
494
521
  """
@@ -521,7 +548,9 @@ def main():
521
548
  terminal = SnapPyTerm()
522
549
  sys.stdout = terminal
523
550
  set_icon(terminal.window)
524
- SnapPy_ns = dict([(x, getattr(snappy, x)) for x in snappy.__all__])
551
+ terminal.window.call('bind', 'TNotebook', '<Right>', '')
552
+ terminal.window.call('bind', 'TNotebook', '<Left>', '')
553
+ SnapPy_ns = {x: getattr(snappy, x) for x in snappy.__all__}
525
554
  # SnapPy_ns['kernel_server'] = kernel_server
526
555
  SnapPy_ns['exit'] = SnapPy_ns['quit'] = SnapPyExit()
527
556
  SnapPy_ns['pager'] = None
@@ -546,6 +575,27 @@ def main():
546
575
  LP.UI_callback = HP.UI_callback = terminal.SnapPea_callback
547
576
  # if not snappy.SnapPy._within_sage:
548
577
  # snappy.pari.UI_callback = terminal.PARI_callback
578
+
579
+ """
580
+ Experimental optional Tk themes on linux. You need to install
581
+ tksvg from source for Python 3.10 or newer like so::
582
+
583
+ sudo apt install cmake build-essential tcl-dev tk-dev python3-tk
584
+ python -m pip install scikit-build
585
+ git clone --recursive https://github.com/TkinterEP/python-tksvg.git
586
+ cd python-tksvg
587
+ python -m pip install .
588
+
589
+ then you can do::
590
+
591
+ python -m pip install python-awthemes
592
+
593
+ and uncomment the next four lines.
594
+ """
595
+ # terminal.window.call('tk', 'scaling', 2.0) # Not sure this actually does anything
596
+ # import awthemes
597
+ # style = awthemes.AwthemesStyle(terminal.window)
598
+ # style.theme_use('awbreeze')
549
599
  terminal.window.lift()
550
600
  terminal.window.mainloop()
551
601
  # kernel_server.stop()
snappy/browser.py CHANGED
@@ -190,9 +190,8 @@ class Browser(Tk_.Toplevel):
190
190
  self.protocol("WM_DELETE_WINDOW", self.close)
191
191
  if sys.platform == 'darwin':
192
192
  self.bind_all('<Command-Key-w>', self.close)
193
- elif sys.platform == 'linux2' or sys.platform == 'linux':
193
+ elif sys.platform == 'linux':
194
194
  self.bind_all('<Alt-Key-F4>', self.close)
195
-
196
195
  self.side_panel = side_panel = self.build_side_panel()
197
196
 
198
197
  self.notebook = notebook = ttk.Notebook(self)
@@ -224,7 +223,7 @@ class Browser(Tk_.Toplevel):
224
223
  notebook.add(invariants_tab, text='Invariants', padding=[0])
225
224
  notebook.add(self.dirichlet_viewer, text='Dirichlet')
226
225
  notebook.add(self.horoball_viewer, text='Cusp Nbhds')
227
- notebook.add(self.build_inside_view(), text='Inside view')
226
+ notebook.add(self.build_inside_view(), text='Inside View')
228
227
  notebook.add(symmetry_tab, text='Symmetry', padding=[0])
229
228
  if link_tab:
230
229
  notebook.add(link_tab.canvas, text='Link')
@@ -240,6 +239,9 @@ class Browser(Tk_.Toplevel):
240
239
  self.modeline.pack(fill=Tk_.BOTH, expand=True, padx=30)
241
240
  self.update_modeline()
242
241
  self.update_idletasks()
242
+ self.wm_geometry(self.wm_geometry())
243
+ # Make sure the invariants get computed, even on Windows.
244
+ self.after_idle(self.update_current_tab)
243
245
 
244
246
  def __repr__(self):
245
247
  return 'Browser window for %s\n' % self.manifold
@@ -345,7 +347,7 @@ class Browser(Tk_.Toplevel):
345
347
  self.aka_viewer = aka_viewer = ttk.Treeview(
346
348
  self.aka,
347
349
  selectmode='none',
348
- height=4,
350
+ height=2 if sys.platform == 'linux' else 4,
349
351
  columns=['manifold', 'as_link'],
350
352
  show='headings')
351
353
  aka_viewer.heading('manifold', text='Manifold')
@@ -505,6 +507,8 @@ class Browser(Tk_.Toplevel):
505
507
  elif tab_name == 'Link':
506
508
  self.update_menus(self.menubar)
507
509
  self.link_tab.draw()
510
+ elif tab_name == 'Inside View':
511
+ self.inside_view.widget.focus_set()
508
512
  elif tab_name == 'Symmetry':
509
513
  self.update_menus(self.menubar)
510
514
  self.update_symmetry()
@@ -538,8 +542,8 @@ class Browser(Tk_.Toplevel):
538
542
  except ValueError:
539
543
  self.homology.set('')
540
544
  self.compute_pi_one()
541
- self.update_length_spectrum()
542
545
  self.update_dirichlet()
546
+ self.update_length_spectrum()
543
547
  self.update_aka()
544
548
  self.recompute_invariants = False
545
549
 
@@ -752,12 +756,13 @@ class Browser(Tk_.Toplevel):
752
756
  def horoball_help(self):
753
757
  self.horoball_viewer.widget.help()
754
758
 
755
- def test(self):
759
+ def test(self, use_modernopengl=True):
756
760
  self.update_idletasks()
757
761
  print('Testing browser')
758
762
  self.after(1000, self.notebook.select, self.dirichlet_viewer)
759
763
  self.after(2500, self.notebook.select, self.horoball_viewer)
760
- self.after(4000, self.notebook.select, self.inside_view)
764
+ if use_modernopengl:
765
+ self.after(4000, self.notebook.select, self.inside_view)
761
766
  if self.link_tab:
762
767
  self.after(5500, self.notebook.select, self.link_tab.canvas)
763
768
  self.after(7000, self.close)
@@ -781,7 +786,7 @@ class Driller(SimpleDialog):
781
786
  top_frame = ttk.Frame(self.root)
782
787
  top_frame.grid_columnconfigure(0, weight=1)
783
788
  top_frame.grid_rowconfigure(2, weight=1)
784
- msg_font = Font(family=style.font_info['family'],
789
+ msg_font = dict(family=style.font_info['family'],
785
790
  weight='bold',
786
791
  size=int(style.font_info['size']*1.2))
787
792
  msg = ttk.Label(top_frame, font=msg_font,
@@ -877,16 +882,15 @@ class Coverer(SimpleDialog):
877
882
  top_frame.grid_rowconfigure(2, weight=1)
878
883
  top_frame.grid_columnconfigure(0, weight=1)
879
884
  top_frame.grid_columnconfigure(1, weight=1)
880
- msg_font = Font(family=style.font_info['family'],
885
+ msg_font = dict(family=style.font_info['family'],
881
886
  weight='bold',
882
887
  size=int(style.font_info['size']*1.2))
883
888
  msg = ttk.Label(top_frame, font=msg_font,
884
889
  text='Choose covering spaces to browse:')
885
890
  msg.grid(row=0, column=0, columnspan=3, pady=10)
886
891
  degree_frame = ttk.Frame(top_frame)
887
- degree_frame.grid_columnconfigure(1, weight=1)
892
+ degree_frame.grid_columnconfigure(2, weight=1)
888
893
  self.degree_var = degree_var = Tk_.StringVar()
889
- degree_var.trace('w', self.show_covers)
890
894
  ttk.Label(degree_frame, text='Degree: ').grid(
891
895
  row=0, column=0, sticky=Tk_.E)
892
896
  self.degree_option = degree_option = ttk.OptionMenu(
@@ -897,15 +901,11 @@ class Coverer(SimpleDialog):
897
901
  )
898
902
  degree_option.grid(row=0, column=1)
899
903
  self.cyclic_var = cyclic_var = Tk_.BooleanVar()
900
- cyclic_var.trace('w', self.show_covers)
901
904
  cyclic_or_not = ttk.Checkbutton(degree_frame,
902
905
  variable=cyclic_var,
903
906
  text='cyclic covers only',
904
907
  )
905
908
  cyclic_or_not.grid(row=0, column=2, padx=6, sticky=Tk_.W)
906
- self.action = action = ttk.Button(degree_frame, text='Recompute',
907
- command=self.show_covers)
908
- action.grid(row=0, column=3, padx=8, sticky=Tk_.W)
909
909
  degree_frame.grid(row=1, column=0, pady=2, padx=6, sticky=Tk_.EW)
910
910
  self.covers = covers = ttk.Treeview(
911
911
  top_frame,
@@ -941,17 +941,18 @@ class Coverer(SimpleDialog):
941
941
  degree_var.set('2')
942
942
  cyclic_var.set(True)
943
943
  self.show_covers()
944
+ degree_var.trace_add('write', self.show_covers)
945
+ cyclic_var.trace_add('write', self.show_covers)
946
+
944
947
 
945
948
  def clear_list(self, *args):
946
949
  self.covers.delete(*self.covers.get_children())
947
950
  self.browse.config(default='normal')
948
- self.action.config(default='active')
949
951
  self.state = 'not ready'
950
952
 
951
953
  def show_covers(self, *args):
952
954
  self.state = 'ready'
953
955
  self.browse.config(default='active')
954
- self.action.config(default='normal')
955
956
  self.covers.delete(*self.covers.get_children())
956
957
  degree = int(self.degree_var.get())
957
958
  if self.cyclic_var.get():
snappy/canonical.py ADDED
@@ -0,0 +1,249 @@
1
+ from . import verify
2
+ from . import Triangulation, TriangulationHP, Manifold, ManifoldHP
3
+
4
+ from typing import Optional, Union, Sequence, Tuple
5
+
6
+ __all__ = ['canonical_retriangulation', 'canonical_retriangulation_hp']
7
+
8
+ def _canonical_retriangulation(
9
+ manifold : Union[Manifold, ManifoldHP],
10
+ verified : bool,
11
+ interval_bits_precs : Sequence[int],
12
+ exact_bits_prec_and_degrees : Sequence[Tuple[int, int]],
13
+ verbose : bool) -> Union[Triangulation, TriangulationHP,
14
+ Manifold, ManifoldHP]:
15
+ """
16
+ Returns a triangulation canonically associated to the hyperbolic manifold.
17
+ That is, the triangulation is (up to combinatorial isomorphism relabeling
18
+ the tetrahedra and vertices) completely determined by the isometry type of
19
+ the hyperbolic manifold.
20
+
21
+ Manifolds with incomplete cusps are rejected (unlike in the case of
22
+ :meth:`isometry_signature <snappy.Manifold.isometry_signature>`).
23
+
24
+ We now describe the canonical retriangulation. If all cells of
25
+ the canonical cell decomposition (defined by `Epstein and Penner '88
26
+ <https://projecteuclid.org/euclid.jdg/1214441650>`_) are tetrahedral,
27
+ :meth:`canonical_retriangulation <Manifold.canonical_retriangulation>`
28
+ simply returns that ideal triangulation as a
29
+ :class:`Manifold <snappy.Manifold>`. Here is an example::
30
+
31
+ >>> M = Manifold("m015")
32
+ >>> K = M.canonical_retriangulation()
33
+ >>> K.has_finite_vertices()
34
+ False
35
+ >>> K.solution_type()
36
+ 'all tetrahedra positively oriented'
37
+
38
+ If there are non-tetrahedral cells,
39
+ :meth:`canonical_retriangulation <Manifold.canonical_retriangulation>`
40
+ subdivides the canonical cell decomposition. It introduces a finite vertex
41
+ for each canonical cell resulting in a
42
+ :class:`Triangulation <snappy.Triangulation>`. Here is an example where the
43
+ canonical cell is a cube::
44
+
45
+ >>> M = Manifold("m412")
46
+ >>> K = M.canonical_retriangulation()
47
+ >>> K.has_finite_vertices()
48
+ True
49
+
50
+ The canonical retriangulation can be used to find the symmetries of a
51
+ single manifold. It also can compute the isometries between two
52
+ manifolds. We do this using
53
+ :meth:`isomorphisms_to <snappy.Triangulation.isomorphisms_to>`::
54
+
55
+ >>> M = Manifold("5_2").canonical_retriangulation()
56
+ >>> N = Manifold("m015").canonical_retriangulation()
57
+ >>> M.isomorphisms_to(M) #doctest: +ELLIPSIS
58
+ [0 -> 0
59
+ [1 0]
60
+ [0 1]
61
+ ...
62
+ >>> M.isomorphisms_to(N) #doctest: +ELLIPSIS
63
+ [0 -> 0
64
+ [-1 2]
65
+ [ 0 -1]
66
+ ...
67
+
68
+ The canonical retriangulation is also the basis for the
69
+ :meth:`isometry_signature <snappy.Manifold.isometry_signature>`.
70
+
71
+ **Subdivision**
72
+
73
+ If the canonical cell decomposition has a non-tetrahedral cell, the method
74
+ subdivides. You can think of the subdivision in either of the following
75
+ (equivalent) ways:
76
+
77
+ - A coarsening of the barycentric subdivision with only a quarter of the
78
+ number of tetrahedra. That is, take the barycentric subdivision and
79
+ merge the four tetrahedra adjacent to a barycentric edge connecting
80
+ an edge midpoint to a face midpoint.
81
+ - Taking the double suspension of each face (which is an ideal n-gon)
82
+ about the centers of the two neighboring 3-cells. Then split each
83
+ such topological "lens" into n tetrahedra along its central axis.
84
+
85
+ **Verified computations**
86
+
87
+ While the canonical retriangulation is combinatorial, some intermediate
88
+ computations are numerical. Thus, if :attr:`verified = False`,
89
+ floating-point issues can arise.
90
+ (Arguably this gave rise to a mistake in the
91
+ non-orientable census. ``x101`` and ``x103`` were later identified as
92
+ the same by `Burton '14 <http://arxiv.org/abs/1311.7615>`_.)
93
+
94
+ The method can be made :ref:`verified <verify-primer>` by passing
95
+ :attr:`verified = True`::
96
+
97
+ sage: M = Manifold("v2986")
98
+ sage: K = M.canonical_retriangulation(verified = True)
99
+ sage: K.has_finite_vertices() # Cell decomposition verified to be tetrahedral
100
+ False
101
+ sage: K.triangulation_isosig(decorated=False) # Verified isometry signature.
102
+ 'jvLALQQdeefgihihiokcmmwwswg'
103
+ sage: len(K.isomorphisms_to(K)) # Verified to have no (non-trivial) symmetries.
104
+ 1
105
+
106
+ Interval arithmetic can only be used to verify the canonical cell decomposition
107
+ if all cells are tetrahedral. For non-tetrahedral cells, the method
108
+ automatically switches to
109
+ exact methods to verify the canonical cell decomposition. That is, it uses
110
+ snap-like methods
111
+ (`LLL-algorithm <http://en.wikipedia.org/wiki/Lenstra%E2%80%93Lenstra%E2%80%93Lov%C3%A1sz_lattice_basis_reduction_algorithm>`_)
112
+ to guess a representation of the
113
+ shapes in the shape field. It then uses exact arithmetic to verify the
114
+ shapes form a valid geometric structure and compute the necessary tilts
115
+ to verify the canonical cell decomposition. Note that this can take a
116
+ long time!
117
+
118
+ Here is an example where exact methods are used::
119
+
120
+ sage: M = Manifold("m412")
121
+ sage: K = M.canonical_retriangulation(verified = True)
122
+ sage: K.has_finite_vertices() # Has non-tetrahedral cell
123
+ True
124
+
125
+ If the canonical retriangulation cannot be verified, an exception will be
126
+ raised. (Note that this is new (and safer) in Version 3.2. Prior to that
127
+ version, :meth:`Manifold.canonical_retriangulation` could return ``None``
128
+ instead.)
129
+
130
+ Here is an example where we skip the (potentially lengthy) exact methods
131
+ needed to verify a non-tetrahedral cell. The method fails (early
132
+ and with an exception) since the cells are actually tetrahedral::
133
+
134
+ sage: M = Manifold("m412")
135
+ sage: K = M.canonical_retriangulation(verified = True, exact_bits_prec_and_degrees = []) # doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL
136
+ Traceback (most recent call last):
137
+ ...
138
+ snappy.verify.exceptions.TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: ... < 0
139
+
140
+ :param verified:
141
+ Use :ref:`verified computation <verify-primer>`.
142
+ :param interval_bits_precs:
143
+ Only relevant if :attr:`verified = True`.
144
+ A list of (increasing) precisions used to try to
145
+ certify the canonical cell decomposition using intervals. Each
146
+ precision is tried until we succeed. If none succeeded, we move on
147
+ to exact methods.
148
+ :param exact_bits_prec_and_degrees:
149
+ Only relevant if :attr:`verified = True`.
150
+ A list of pairs (precision, max degree) used when the
151
+ LLL-algorithm is trying to find the defining
152
+ polynomial of the shape field with
153
+ ``ListOfApproximateAlgebraicNumbers.find_field``.
154
+ Each pair is tried until we succeed.
155
+ :param verbose:
156
+ Print information about the methods tried to compute and verify the
157
+ canonical retriangulation.
158
+ :return:
159
+ If the canonical cell decomposition exists entirely of
160
+ (hyperbolic ideal) tetrahedra, a :class:`Manifold` with those
161
+ tetrahedra.
162
+ Otherwise, a :class:`Triangulation` that is a subdivision of the
163
+ canonical cell decomposition.
164
+ """
165
+
166
+ # More information on the canonical retriangulation can be found in the
167
+ # SnapPea kernel ``canonize_part_2.c`` and in Section 3.1 of
168
+ # `Fominykh, Garoufalidis, Goerner, Tarkaev, Vesnin <http://arxiv.org/abs/1502.00383>`_.
169
+
170
+ if not all(manifold.cusp_info('complete?')):
171
+ # It is unclear what to do when there are filling coefficients.
172
+ # The SnapPea kernel ignores them and uses the complete structure
173
+ # to compute the canonical retriangulation.
174
+ #
175
+ # That makes sense to, e.g., compute a canonical representation
176
+ # of a surgery diagram.
177
+ #
178
+ # In other situations, it makes perfectly sense to fill the cusps
179
+ # instead. That is, e.g., what the isometry_signature does.
180
+ #
181
+ # Since it is ambiguous, I decided to simply reject it here.
182
+ #
183
+ # It is easy enough for a user to either call fill_triangulation
184
+ # or to save the coefficients and unfill all cusps.
185
+ #
186
+ raise ValueError(
187
+ 'Canonical retriangulation needs all cusps to be complete.')
188
+
189
+ if verified:
190
+ # verified_canonical_retriangulation has code to check
191
+ # for incomplete cusps and fill them that never gets
192
+ # executed because of the above "if"
193
+ return verify.verified_canonical_retriangulation(
194
+ manifold,
195
+ interval_bits_precs=interval_bits_precs,
196
+ exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
197
+ verbose=verbose)
198
+ else:
199
+ # Note that the SnapPea kernel actually ignores Dehn-fillings
200
+ # when computing the canonical retriangulation.
201
+ if not all(manifold.cusp_info('complete?')):
202
+ # Never executed because of above "if".
203
+ manifold = manifold.filled_triangulation()
204
+ if not all(manifold.cusp_info('complete?')):
205
+ raise ValueError(
206
+ 'Could not compute filled triangulation. '
207
+ 'Are the filling coefficients co-prime integers?')
208
+
209
+ K = manifold._canonical_retriangulation()
210
+ if K.has_finite_vertices():
211
+ return K
212
+ else:
213
+ if isinstance(manifold, ManifoldHP):
214
+ return ManifoldHP(K)
215
+ else:
216
+ return Manifold(K)
217
+
218
+ # Wraps _canonical_retriangulation to have the correct return type
219
+ def canonical_retriangulation(
220
+ manifold : Manifold,
221
+ verified : bool = False,
222
+ interval_bits_precs : Sequence[int] = verify.default_interval_bits_precs,
223
+ exact_bits_prec_and_degrees : Sequence[Tuple[int, int]] = verify.default_exact_bits_prec_and_degrees,
224
+ verbose : bool = False) -> Union[Triangulation, Manifold]:
225
+ return _canonical_retriangulation(
226
+ manifold,
227
+ verified = verified,
228
+ interval_bits_precs = interval_bits_precs,
229
+ exact_bits_prec_and_degrees = exact_bits_prec_and_degrees,
230
+ verbose = verbose)
231
+ canonical_retriangulation.__doc__ = _canonical_retriangulation.__doc__
232
+
233
+ # Wraps _canonical_retriangulation to have the correct return type
234
+ def canonical_retriangulation_hp(
235
+ manifold : ManifoldHP,
236
+ verified : bool = False,
237
+ interval_bits_precs : Sequence[int] = verify.default_interval_bits_precs,
238
+ exact_bits_prec_and_degrees : Sequence[Tuple[int, int]] = verify.default_exact_bits_prec_and_degrees,
239
+ verbose : bool = False) -> Union[TriangulationHP, ManifoldHP]:
240
+ return _canonical_retriangulation(
241
+ manifold,
242
+ verified = verified,
243
+ interval_bits_precs = interval_bits_precs,
244
+ exact_bits_prec_and_degrees = exact_bits_prec_and_degrees,
245
+ verbose = verbose)
246
+ canonical_retriangulation_hp.__doc__ = _canonical_retriangulation.__doc__
247
+
248
+
249
+
@@ -1,25 +1,15 @@
1
- from .cuspCrossSection import ComplexCuspCrossSection
2
- from .shapes import compute_hyperbolic_shapes
3
-
4
- __all__ = ['NonorientableManifoldError', 'compute_cusp_shapes']
5
-
6
-
7
- class NonorientableManifoldError(RuntimeError):
8
- """
9
- Exception raised when trying to compute cusp shapes for a non-orientable
10
- manifold.
11
- """
12
- def __init__(self, manifold):
13
- self.manifold = manifold
14
-
15
- def __str__(self):
16
- return (('Cannot compute cusp shapes for non-orientable '
17
- 'manifold %s') % self.manifold)
1
+ """
2
+ Computing data about cusps such as cusp matrix, shape, translations
3
+ and exceptional slopes.
4
+ """
18
5
 
6
+ from ..geometric_structure.cusp_neighborhood.complex_cusp_cross_section import ComplexCuspCrossSection
7
+ from ..verify.shapes import compute_hyperbolic_shapes
8
+ from ..exceptions import NonorientableManifoldError
19
9
 
20
10
  def compute_cusp_shapes(manifold, verified, bits_prec=None):
21
11
  """
22
- Compute verified cusp shapes (following the SnapPea kernel convention,
12
+ Compute cusp shapes. Following the SnapPea kernel convention,
23
13
  it returns the conjugate of the quotient of the translations
24
14
  corresponding to the longitude and meridian for each cusp.
25
15