snappy 3.0.3__cp38-cp38-macosx_11_0_arm64.whl → 3.2__cp38-cp38-macosx_11_0_arm64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (401) hide show
  1. snappy/CyOpenGL.cpython-38-darwin.so +0 -0
  2. snappy/SnapPy.cpython-38-darwin.so +0 -0
  3. snappy/SnapPyHP.cpython-38-darwin.so +0 -0
  4. snappy/__init__.py +373 -426
  5. snappy/app.py +240 -75
  6. snappy/app_menus.py +93 -78
  7. snappy/browser.py +87 -63
  8. snappy/cache.py +5 -8
  9. snappy/canonical.py +249 -0
  10. snappy/{verify/cusp_shapes.py → cusps/__init__.py} +11 -19
  11. snappy/cusps/cusp_area_matrix.py +101 -0
  12. snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +39 -54
  13. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  14. snappy/cusps/test.py +21 -0
  15. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  16. snappy/database.py +40 -31
  17. snappy/db_utilities.py +13 -14
  18. snappy/decorated_isosig.py +377 -133
  19. snappy/dev/extended_ptolemy/complexVolumesClosed.py +42 -9
  20. snappy/dev/extended_ptolemy/extended.py +32 -25
  21. snappy/dev/extended_ptolemy/giac_rur.py +23 -8
  22. snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
  23. snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +2 -1
  24. snappy/dev/vericlosed/gimbalLoopFinder.py +5 -5
  25. snappy/dev/vericlosed/hyperbolicStructure.py +3 -3
  26. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +2 -2
  27. snappy/dev/vericlosed/truncatedComplex.py +3 -2
  28. snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +4 -3
  29. snappy/doc/_images/geodesics.jpg +0 -0
  30. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  31. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  32. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  33. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  34. snappy/doc/_sources/additional_classes.rst.txt +1 -0
  35. snappy/doc/_sources/credits.rst.txt +6 -1
  36. snappy/doc/_sources/development.rst.txt +69 -50
  37. snappy/doc/_sources/index.rst.txt +101 -66
  38. snappy/doc/_sources/installing.rst.txt +148 -165
  39. snappy/doc/_sources/news.rst.txt +136 -32
  40. snappy/doc/_sources/ptolemy.rst.txt +1 -1
  41. snappy/doc/_sources/ptolemy_examples1.rst.txt +9 -8
  42. snappy/doc/_sources/ptolemy_examples2.rst.txt +3 -3
  43. snappy/doc/_sources/ptolemy_examples3.rst.txt +14 -14
  44. snappy/doc/_sources/ptolemy_prelim.rst.txt +1 -1
  45. snappy/doc/_sources/snap.rst.txt +2 -2
  46. snappy/doc/_sources/snappy.rst.txt +1 -1
  47. snappy/doc/_sources/triangulation.rst.txt +3 -2
  48. snappy/doc/_sources/verify.rst.txt +89 -29
  49. snappy/doc/_sources/verify_internals.rst.txt +5 -16
  50. snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
  51. snappy/doc/_static/SnapPy.ico +0 -0
  52. snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  53. snappy/doc/_static/basic.css +47 -27
  54. snappy/doc/_static/css/badge_only.css +1 -0
  55. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  56. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  57. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  58. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  59. snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
  60. snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  61. snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  62. snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
  63. snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  64. snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
  65. snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  66. snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
  67. snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
  68. snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
  69. snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  70. snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
  71. snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
  72. snappy/doc/_static/css/theme.css +4 -0
  73. snappy/doc/_static/doctools.js +107 -274
  74. snappy/doc/_static/documentation_options.js +6 -5
  75. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  76. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  77. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  78. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  79. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  80. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  81. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  82. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  83. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  84. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  85. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  86. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  87. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  88. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  89. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  90. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  91. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  92. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  93. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  94. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  95. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  96. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  97. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  98. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  99. snappy/doc/_static/jquery.js +2 -2
  100. snappy/doc/_static/js/badge_only.js +1 -0
  101. snappy/doc/_static/js/theme.js +1 -0
  102. snappy/doc/_static/js/versions.js +228 -0
  103. snappy/doc/_static/language_data.js +3 -101
  104. snappy/doc/_static/pygments.css +1 -0
  105. snappy/doc/_static/searchtools.js +489 -398
  106. snappy/doc/_static/snappy_furo.css +33 -0
  107. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
  108. snappy/doc/_static/sphinx_highlight.js +154 -0
  109. snappy/doc/additional_classes.html +688 -263
  110. snappy/doc/bugs.html +107 -94
  111. snappy/doc/censuses.html +155 -127
  112. snappy/doc/credits.html +115 -104
  113. snappy/doc/development.html +184 -146
  114. snappy/doc/genindex.html +287 -204
  115. snappy/doc/index.html +189 -150
  116. snappy/doc/installing.html +259 -266
  117. snappy/doc/manifold.html +1626 -592
  118. snappy/doc/manifoldhp.html +119 -105
  119. snappy/doc/news.html +198 -104
  120. snappy/doc/objects.inv +0 -0
  121. snappy/doc/other.html +117 -105
  122. snappy/doc/platonic_census.html +161 -114
  123. snappy/doc/plink.html +113 -105
  124. snappy/doc/ptolemy.html +131 -108
  125. snappy/doc/ptolemy_classes.html +242 -223
  126. snappy/doc/ptolemy_examples1.html +144 -130
  127. snappy/doc/ptolemy_examples2.html +141 -129
  128. snappy/doc/ptolemy_examples3.html +148 -132
  129. snappy/doc/ptolemy_examples4.html +131 -111
  130. snappy/doc/ptolemy_prelim.html +162 -138
  131. snappy/doc/py-modindex.html +104 -69
  132. snappy/doc/screenshots.html +117 -108
  133. snappy/doc/search.html +115 -84
  134. snappy/doc/searchindex.js +1 -1
  135. snappy/doc/snap.html +109 -96
  136. snappy/doc/snappy.html +134 -97
  137. snappy/doc/spherogram.html +259 -187
  138. snappy/doc/todo.html +107 -94
  139. snappy/doc/triangulation.html +1380 -111
  140. snappy/doc/tutorial.html +107 -94
  141. snappy/doc/verify.html +194 -125
  142. snappy/doc/verify_internals.html +248 -686
  143. snappy/drilling/__init__.py +456 -0
  144. snappy/drilling/barycentric.py +103 -0
  145. snappy/drilling/constants.py +5 -0
  146. snappy/drilling/crush.py +270 -0
  147. snappy/drilling/cusps.py +125 -0
  148. snappy/drilling/debug.py +242 -0
  149. snappy/drilling/epsilons.py +6 -0
  150. snappy/drilling/exceptions.py +55 -0
  151. snappy/drilling/moves.py +620 -0
  152. snappy/drilling/peripheral_curves.py +210 -0
  153. snappy/drilling/perturb.py +188 -0
  154. snappy/drilling/shorten.py +36 -0
  155. snappy/drilling/subdivide.py +274 -0
  156. snappy/drilling/test.py +23 -0
  157. snappy/drilling/test_cases.py +126 -0
  158. snappy/drilling/tracing.py +351 -0
  159. snappy/exceptions.py +23 -3
  160. snappy/export_stl.py +20 -14
  161. snappy/exterior_to_link/__init__.py +2 -0
  162. snappy/exterior_to_link/barycentric_geometry.py +463 -0
  163. snappy/exterior_to_link/exceptions.py +6 -0
  164. snappy/exterior_to_link/geodesic_map.json +14408 -0
  165. snappy/exterior_to_link/hyp_utils.py +112 -0
  166. snappy/exterior_to_link/link_projection.py +323 -0
  167. snappy/exterior_to_link/main.py +197 -0
  168. snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
  169. snappy/exterior_to_link/mcomplex_with_link.py +687 -0
  170. snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
  171. snappy/exterior_to_link/pl_utils.py +491 -0
  172. snappy/exterior_to_link/put_in_S3.py +156 -0
  173. snappy/exterior_to_link/rational_linear_algebra.py +123 -0
  174. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
  175. snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
  176. snappy/exterior_to_link/stored_moves.py +475 -0
  177. snappy/exterior_to_link/test.py +31 -0
  178. snappy/geometric_structure/__init__.py +212 -0
  179. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  180. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  181. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  182. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  183. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  184. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  185. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  186. snappy/geometric_structure/geodesic/__init__.py +0 -0
  187. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  188. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  189. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  190. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  191. snappy/geometric_structure/geodesic/constants.py +6 -0
  192. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  193. snappy/geometric_structure/geodesic/fixed_points.py +93 -0
  194. snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
  195. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  196. snappy/geometric_structure/geodesic/line.py +30 -0
  197. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  198. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  199. snappy/geometric_structure/test.py +22 -0
  200. snappy/gui.py +36 -36
  201. snappy/horoviewer.py +50 -48
  202. snappy/hyperboloid/__init__.py +212 -0
  203. snappy/hyperboloid/distances.py +245 -0
  204. snappy/hyperboloid/horoball.py +19 -0
  205. snappy/hyperboloid/line.py +35 -0
  206. snappy/hyperboloid/point.py +9 -0
  207. snappy/hyperboloid/triangle.py +29 -0
  208. snappy/{infodialog.py → infowindow.py} +32 -33
  209. snappy/isometry_signature.py +382 -0
  210. snappy/len_spec/__init__.py +596 -0
  211. snappy/len_spec/geodesic_info.py +110 -0
  212. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  213. snappy/len_spec/geodesic_piece.py +143 -0
  214. snappy/len_spec/geometric_structure.py +182 -0
  215. snappy/len_spec/geometry.py +80 -0
  216. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  217. snappy/len_spec/spine.py +206 -0
  218. snappy/len_spec/test.py +24 -0
  219. snappy/len_spec/test_cases.py +69 -0
  220. snappy/len_spec/tile.py +275 -0
  221. snappy/len_spec/word.py +86 -0
  222. snappy/manifolds/__init__.py +1 -1
  223. snappy/math_basics.py +176 -0
  224. snappy/matrix.py +525 -0
  225. snappy/number.py +97 -21
  226. snappy/numeric_output_checker.py +37 -27
  227. snappy/pari.py +30 -69
  228. snappy/phone_home.py +25 -20
  229. snappy/polyviewer.py +39 -37
  230. snappy/ptolemy/__init__.py +4 -6
  231. snappy/ptolemy/component.py +14 -12
  232. snappy/ptolemy/coordinates.py +312 -295
  233. snappy/ptolemy/fieldExtensions.py +14 -12
  234. snappy/ptolemy/findLoops.py +43 -31
  235. snappy/ptolemy/geometricRep.py +24 -26
  236. snappy/ptolemy/homology.py +12 -7
  237. snappy/ptolemy/manifoldMethods.py +69 -70
  238. snappy/ptolemy/matrix.py +65 -26
  239. snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +18 -14
  240. snappy/ptolemy/polynomial.py +125 -119
  241. snappy/ptolemy/processComponents.py +36 -30
  242. snappy/ptolemy/processFileBase.py +79 -18
  243. snappy/ptolemy/processFileDispatch.py +13 -14
  244. snappy/ptolemy/processMagmaFile.py +44 -39
  245. snappy/ptolemy/processRurFile.py +18 -11
  246. snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +20 -17
  247. snappy/ptolemy/ptolemyObstructionClass.py +13 -17
  248. snappy/ptolemy/ptolemyVariety.py +190 -121
  249. snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +20 -19
  250. snappy/ptolemy/reginaWrapper.py +25 -29
  251. snappy/ptolemy/rur.py +6 -14
  252. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +27 -22
  253. snappy/ptolemy/test.py +247 -188
  254. snappy/ptolemy/utilities.py +41 -43
  255. snappy/raytracing/__init__.py +64 -0
  256. snappy/raytracing/additional_horospheres.py +64 -0
  257. snappy/raytracing/additional_len_spec_choices.py +63 -0
  258. snappy/raytracing/cohomology_fractal.py +10 -6
  259. snappy/raytracing/eyeball.py +123 -0
  260. snappy/raytracing/finite_raytracing_data.py +48 -38
  261. snappy/raytracing/finite_viewer.py +218 -210
  262. snappy/raytracing/geodesic_tube_info.py +174 -0
  263. snappy/raytracing/geodesics.py +246 -0
  264. snappy/raytracing/geodesics_window.py +258 -0
  265. snappy/raytracing/gui_utilities.py +152 -40
  266. snappy/raytracing/hyperboloid_navigation.py +102 -52
  267. snappy/raytracing/hyperboloid_utilities.py +114 -261
  268. snappy/raytracing/ideal_raytracing_data.py +256 -179
  269. snappy/raytracing/inside_viewer.py +522 -253
  270. snappy/raytracing/pack.py +22 -0
  271. snappy/raytracing/raytracing_data.py +46 -34
  272. snappy/raytracing/raytracing_view.py +190 -109
  273. snappy/raytracing/shaders/Eye.png +0 -0
  274. snappy/raytracing/shaders/NonGeometric.png +0 -0
  275. snappy/raytracing/shaders/__init__.py +60 -4
  276. snappy/raytracing/shaders/fragment.glsl +575 -148
  277. snappy/raytracing/test.py +29 -0
  278. snappy/raytracing/tooltip.py +146 -0
  279. snappy/raytracing/upper_halfspace_utilities.py +98 -0
  280. snappy/raytracing/view_scale_controller.py +98 -0
  281. snappy/raytracing/zoom_slider/__init__.py +32 -29
  282. snappy/raytracing/zoom_slider/test.py +2 -0
  283. snappy/sage_helper.py +69 -123
  284. snappy/{preferences.py → settings.py} +167 -145
  285. snappy/shell.py +4 -0
  286. snappy/snap/__init__.py +12 -8
  287. snappy/snap/character_varieties.py +24 -18
  288. snappy/snap/find_field.py +35 -34
  289. snappy/snap/fundamental_polyhedron.py +99 -85
  290. snappy/snap/generators.py +6 -8
  291. snappy/snap/interval_reps.py +18 -6
  292. snappy/snap/kernel_structures.py +8 -3
  293. snappy/snap/mcomplex_base.py +1 -2
  294. snappy/snap/nsagetools.py +107 -53
  295. snappy/snap/peripheral/__init__.py +1 -1
  296. snappy/snap/peripheral/dual_cellulation.py +15 -7
  297. snappy/snap/peripheral/link.py +20 -16
  298. snappy/snap/peripheral/peripheral.py +22 -14
  299. snappy/snap/peripheral/surface.py +47 -50
  300. snappy/snap/peripheral/test.py +8 -8
  301. snappy/snap/polished_reps.py +65 -40
  302. snappy/snap/shapes.py +41 -22
  303. snappy/snap/slice_obs_HKL.py +64 -25
  304. snappy/snap/t3mlite/arrow.py +88 -51
  305. snappy/snap/t3mlite/corner.py +5 -6
  306. snappy/snap/t3mlite/edge.py +32 -21
  307. snappy/snap/t3mlite/face.py +7 -9
  308. snappy/snap/t3mlite/files.py +31 -23
  309. snappy/snap/t3mlite/homology.py +14 -10
  310. snappy/snap/t3mlite/linalg.py +158 -56
  311. snappy/snap/t3mlite/mcomplex.py +739 -291
  312. snappy/snap/t3mlite/perm4.py +236 -84
  313. snappy/snap/t3mlite/setup.py +9 -10
  314. snappy/snap/t3mlite/simplex.py +65 -48
  315. snappy/snap/t3mlite/spun.py +42 -30
  316. snappy/snap/t3mlite/surface.py +45 -45
  317. snappy/snap/t3mlite/test.py +3 -0
  318. snappy/snap/t3mlite/test_vs_regina.py +17 -13
  319. snappy/snap/t3mlite/tetrahedron.py +25 -24
  320. snappy/snap/t3mlite/vertex.py +8 -13
  321. snappy/snap/test.py +45 -52
  322. snappy/snap/utilities.py +66 -65
  323. snappy/test.py +155 -158
  324. snappy/test_cases.py +263 -0
  325. snappy/testing.py +131 -0
  326. snappy/tiling/__init__.py +2 -0
  327. snappy/tiling/canonical_key_dict.py +59 -0
  328. snappy/tiling/dict_based_set.py +79 -0
  329. snappy/tiling/floor.py +49 -0
  330. snappy/tiling/hyperboloid_dict.py +54 -0
  331. snappy/tiling/iter_utils.py +78 -0
  332. snappy/tiling/lifted_tetrahedron.py +22 -0
  333. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  334. snappy/tiling/real_hash_dict.py +164 -0
  335. snappy/tiling/test.py +23 -0
  336. snappy/tiling/tile.py +215 -0
  337. snappy/tiling/triangle.py +33 -0
  338. snappy/tkterminal.py +313 -203
  339. snappy/twister/main.py +1 -8
  340. snappy/twister/twister_core.cpython-38-darwin.so +0 -0
  341. snappy/upper_halfspace/__init__.py +146 -0
  342. snappy/upper_halfspace/ideal_point.py +26 -0
  343. snappy/verify/__init__.py +4 -8
  344. snappy/verify/{verifyCanonical.py → canonical.py} +114 -97
  345. snappy/verify/complex_volume/__init__.py +3 -2
  346. snappy/verify/complex_volume/adjust_torsion.py +13 -11
  347. snappy/verify/complex_volume/closed.py +29 -24
  348. snappy/verify/complex_volume/compute_ptolemys.py +8 -6
  349. snappy/verify/complex_volume/cusped.py +10 -9
  350. snappy/verify/complex_volume/extended_bloch.py +14 -12
  351. snappy/verify/{cuspTranslations.py → cusp_translations.py} +15 -14
  352. snappy/verify/edge_equations.py +80 -0
  353. snappy/verify/exceptions.py +23 -56
  354. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +19 -15
  355. snappy/verify/interval_newton_shapes_engine.py +51 -211
  356. snappy/verify/interval_tree.py +27 -25
  357. snappy/verify/krawczyk_shapes_engine.py +47 -50
  358. snappy/verify/maximal_cusp_area_matrix/__init__.py +17 -86
  359. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +58 -48
  360. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +53 -57
  361. snappy/verify/{realAlgebra.py → real_algebra.py} +26 -20
  362. snappy/verify/shapes.py +10 -7
  363. snappy/verify/short_slopes.py +41 -42
  364. snappy/verify/{squareExtensions.py → square_extensions.py} +96 -92
  365. snappy/verify/test.py +59 -57
  366. snappy/verify/upper_halfspace/extended_matrix.py +5 -5
  367. snappy/verify/upper_halfspace/finite_point.py +44 -31
  368. snappy/verify/upper_halfspace/ideal_point.py +69 -57
  369. snappy/verify/volume.py +15 -12
  370. snappy/version.py +2 -3
  371. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/METADATA +14 -12
  372. snappy-3.2.dist-info/RECORD +503 -0
  373. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  374. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -1
  375. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/top_level.txt +10 -1
  376. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  377. snappy/doc/_static/classic.css +0 -266
  378. snappy/doc/_static/jquery-3.5.1.js +0 -10872
  379. snappy/doc/_static/sidebar.js +0 -159
  380. snappy/doc/_static/underscore-1.13.1.js +0 -2042
  381. snappy/doc/_static/underscore.js +0 -6
  382. snappy/doc/verify_canon.html +0 -283
  383. snappy/ppm_to_png.py +0 -243
  384. snappy/togl/__init__.py +0 -3
  385. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  386. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  387. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  388. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  389. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  390. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  391. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  392. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  393. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  394. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  395. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  396. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  397. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  398. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  399. snappy/verify/cuspCrossSection.py +0 -1413
  400. snappy/verify/mathHelpers.py +0 -64
  401. snappy-3.0.3.dist-info/RECORD +0 -360
snappy/browser.py CHANGED
@@ -1,7 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
- from __future__ import unicode_literals
3
- from builtins import range
4
- import sys, os
2
+ import sys
3
+ import os
5
4
  from .gui import *
6
5
  from .polyviewer import PolyhedronViewer
7
6
  from .horoviewer import HoroballViewer
@@ -14,10 +13,14 @@ from .exceptions import SnapPeaFatalError
14
13
  from plink import LinkViewer, LinkEditor
15
14
  from plink.ipython_tools import IPythonTkRoot
16
15
  from spherogram.links.orthogonal import OrthogonalLinkDiagram
16
+ try:
17
+ from tkinter.simpledialog import _place_window
18
+ except:
19
+ pass
17
20
 
18
21
 
19
22
  main_window = None
20
- #TODO: Find these dimensions by introspection.
23
+ # TODO: Find these dimensions by introspection.
21
24
  cusp_box_height = 105
22
25
  if sys.platform == 'darwin':
23
26
  cusp_box_width = 180
@@ -34,9 +37,9 @@ class SelectableText(ttk.Frame):
34
37
  background color matches the background of a depth 2 LabelFrame
35
38
  by default.
36
39
  """
37
- def __init__(self, master, labeltext='', width=18, depth=2):
38
- ttk.Frame.__init__(self, master)
39
- self.var = Tk_.StringVar(master)
40
+ def __init__(self, container, labeltext='', width=18, depth=2):
41
+ ttk.Frame.__init__(self, container)
42
+ self.var = Tk_.StringVar(container)
40
43
  style = SnapPyStyle()
41
44
  bg_color = style.groupBG if depth == 1 else style.subgroupBG
42
45
  self.label = label = ttk.Label(self, text=labeltext)
@@ -56,6 +59,7 @@ class SelectableText(ttk.Frame):
56
59
  def get(self):
57
60
  return self.var.get()
58
61
 
62
+
59
63
  class AutoScrollbar(Tk_.Scrollbar):
60
64
  # Frederick Lundh's scrollbar that hides itself if it's not needed.
61
65
  def set(self, lo, hi):
@@ -65,15 +69,16 @@ class AutoScrollbar(Tk_.Scrollbar):
65
69
  self.grid()
66
70
  Tk_.Scrollbar.set(self, lo, hi)
67
71
 
72
+
68
73
  class SelectableMessage(ttk.Frame):
69
74
  """
70
75
  A disabled Text widget which allows selection of text. On the mac
71
76
  the selection does not highlight correctly unless the Text widget has
72
77
  focus and does not clear correctly unless the state is NORMAL.
73
78
  """
74
- def __init__(self, master):
75
- self.master = master
76
- ttk.Frame.__init__(self, master)
79
+ def __init__(self, container):
80
+ self.container = container
81
+ ttk.Frame.__init__(self, container)
77
82
  self.scrollbar = AutoScrollbar(self, orient=Tk_.VERTICAL)
78
83
  self.text = text = Tk_.Text(self, width=60, height=12,
79
84
  highlightthickness=0, relief=Tk_.FLAT,
@@ -105,33 +110,37 @@ class SelectableMessage(ttk.Frame):
105
110
  def copy(self, event):
106
111
  self.text.selection_get(selection='CLIPBOARD')
107
112
 
113
+
108
114
  class DirichletTab(PolyhedronViewer):
109
- def __init__(self, master, facedicts=[], title='Polyhedron Tab', parent=None):
115
+ def __init__(self, container, facedicts=[], title='Polyhedron Tab', parent=None):
110
116
  self.main_window = main_window
111
117
  self.style = style = SnapPyStyle()
112
- PolyhedronViewer.__init__(self, master, facedicts=facedicts,
118
+ PolyhedronViewer.__init__(self, container, facedicts=facedicts,
113
119
  title=title, bgcolor=style.groupBG)
120
+
114
121
  def update_menus(self, menubar):
115
122
  menubar.children['help'].activate(
116
123
  [ app_menus.help_polyhedron_viewer_label,
117
124
  app_menus.help_report_bugs_label ])
118
125
 
126
+
119
127
  class CuspNeighborhoodTab(HoroballViewer):
120
128
  def __init__(self, nbhd, title='Polyhedron Tab'):
121
129
  self.main_window = main_window
122
130
  style = SnapPyStyle()
123
131
  if main_window:
124
132
  HoroballViewer.__init__(self, nbhd, title=title,
125
- bgcolor=style.groupBG, prefs=main_window.prefs)
133
+ bgcolor=style.groupBG, settings=main_window.settings)
126
134
  else:
127
135
  HoroballViewer.__init__(self, nbhd, title=title,
128
- bgcolor=style.groupBG)
136
+ bgcolor=style.groupBG)
129
137
 
130
138
  def update_menus(self, menubar):
131
139
  menubar.children['help'].activate(
132
140
  [ app_menus.help_horoball_viewer_label,
133
141
  app_menus.help_report_bugs_label])
134
142
 
143
+
135
144
  class LinkTab(LinkViewer):
136
145
  def __init__(self, data, window):
137
146
  self.style = style = SnapPyStyle()
@@ -143,13 +152,13 @@ class LinkTab(LinkViewer):
143
152
  def close(self, event=None):
144
153
  pass
145
154
 
155
+
146
156
  class Browser(Tk_.Toplevel):
147
157
  """
148
158
  Toplevel window displaying a Dehn filling control panel and
149
159
  a notebook with tabs that show numerical or graphical information
150
160
  about the manifold.
151
161
  """
152
-
153
162
  def __init__(self, manifold, root=None, main_window=None):
154
163
  if root is None:
155
164
  if Tk_._default_root:
@@ -181,16 +190,14 @@ class Browser(Tk_.Toplevel):
181
190
  self.protocol("WM_DELETE_WINDOW", self.close)
182
191
  if sys.platform == 'darwin':
183
192
  self.bind_all('<Command-Key-w>', self.close)
184
- elif sys.platform == 'linux2' or sys.platform == 'linux':
193
+ elif sys.platform == 'linux':
185
194
  self.bind_all('<Alt-Key-F4>', self.close)
186
-
187
195
  self.side_panel = side_panel = self.build_side_panel()
188
196
 
189
197
  self.notebook = notebook = ttk.Notebook(self)
190
198
  self.invariants_tab = invariants_tab = self.build_invariants()
191
199
  self.dirichlet_viewer = DirichletTab(self)
192
200
  self.horoball_viewer = CuspNeighborhoodTab(self)
193
-
194
201
  self.fillings_changed_callback = None
195
202
 
196
203
  self.bottombar = bottombar = ttk.Frame(self, height=20)
@@ -216,7 +223,7 @@ class Browser(Tk_.Toplevel):
216
223
  notebook.add(invariants_tab, text='Invariants', padding=[0])
217
224
  notebook.add(self.dirichlet_viewer, text='Dirichlet')
218
225
  notebook.add(self.horoball_viewer, text='Cusp Nbhds')
219
- notebook.add(self.build_inside_view(), text = 'Inside view')
226
+ notebook.add(self.build_inside_view(), text='Inside View')
220
227
  notebook.add(symmetry_tab, text='Symmetry', padding=[0])
221
228
  if link_tab:
222
229
  notebook.add(link_tab.canvas, text='Link')
@@ -232,9 +239,12 @@ class Browser(Tk_.Toplevel):
232
239
  self.modeline.pack(fill=Tk_.BOTH, expand=True, padx=30)
233
240
  self.update_modeline()
234
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)
235
245
 
236
246
  def __repr__(self):
237
- return 'Browser window for %s\n'%self.manifold
247
+ return 'Browser window for %s\n' % self.manifold
238
248
 
239
249
  build_menus = browser_menus
240
250
 
@@ -263,15 +273,15 @@ class Browser(Tk_.Toplevel):
263
273
  canvas.configure(background=self.style.groupBG)
264
274
  canvas.grid(row=0, column=0, sticky=Tk_.NSEW)
265
275
  filling_scrollbar.config(command=canvas.yview)
266
- self.filling_vars=[]
276
+ self.filling_vars = []
267
277
 
268
278
  # Embedded windows in a canvas are clipped to their parent, not to
269
279
  # the canvas.
270
280
  cusp_parent = self.filling_canvas if self.filling_canvas else filling
271
281
  for n in range(num_cusps):
272
282
  R, G, B, A = GetColor(n)
273
- color = '#%.3x%.3x%.3x'%(int(R*4095), int(G*4095), int(B*4095))
274
- cusp = ttk.Labelframe(cusp_parent, text='Cusp %d'%n)
283
+ color = '#%.3x%.3x%.3x' % (int(R*4095), int(G*4095), int(B*4095))
284
+ cusp = ttk.Labelframe(cusp_parent, text='Cusp %d' % n)
275
285
  mer_var = Tk_.StringVar(self, value='0')
276
286
  long_var = Tk_.StringVar(self, value='0')
277
287
  self.filling_vars.append((mer_var, long_var))
@@ -283,14 +293,14 @@ class Browser(Tk_.Toplevel):
283
293
  row=1, column=1, sticky=Tk_.E)
284
294
  meridian = Spinbox(cusp, width=4, textvariable=mer_var,
285
295
  from_=-1000, to=1000, increment=1,
286
- name=':%s:0'%n, validate='focusout',
296
+ name=':%s:0' % n, validate='focusout',
287
297
  validatecommand=(self.register(self.validate_coeff),'%P','%W')
288
298
  )
289
299
  meridian.bind('<Return>', self.do_filling)
290
300
  meridian.grid(row=0, column=2, sticky=Tk_.W, padx=0, pady=3)
291
301
  longitude = Spinbox(cusp, width=4, textvariable=long_var,
292
302
  from_=-1000, to=1000, increment=1,
293
- name=':%s:1'%n, validate='focusout',
303
+ name=':%s:1' % n, validate='focusout',
294
304
  validatecommand=(self.register(self.validate_coeff),'%P','%W')
295
305
  )
296
306
  longitude.bind('<Return>', self.do_filling)
@@ -337,7 +347,7 @@ class Browser(Tk_.Toplevel):
337
347
  self.aka_viewer = aka_viewer = ttk.Treeview(
338
348
  self.aka,
339
349
  selectmode='none',
340
- height=4,
350
+ height=2 if sys.platform == 'linux' else 4,
341
351
  columns=['manifold', 'as_link'],
342
352
  show='headings')
343
353
  aka_viewer.heading('manifold', text='Manifold')
@@ -381,7 +391,7 @@ class Browser(Tk_.Toplevel):
381
391
  ttk.Label(self.length_spectrum_frame, text='Cutoff:').grid(
382
392
  row=0, column=0, sticky=Tk_.E, pady=5)
383
393
  self.length_cutoff = 1.0
384
- self.cutoff_var=Tk_.StringVar(self, self.length_cutoff)
394
+ self.cutoff_var = Tk_.StringVar(self, self.length_cutoff)
385
395
  self.cutoff_entry = cutoff_entry = ttk.Entry(
386
396
  self.length_spectrum_frame,
387
397
  takefocus=False,
@@ -396,7 +406,7 @@ class Browser(Tk_.Toplevel):
396
406
  height=6, show='headings', selectmode='none',
397
407
  columns=['mult', 'length', 'topology', 'parity'],
398
408
  )
399
- #TODO: compute column widths by measuring text.
409
+ # TODO: compute column widths by measuring text.
400
410
  geodesics.heading('mult', text='Mult.')
401
411
  geodesics.column('mult', stretch=False, width=60)
402
412
  geodesics.heading('length', text='Complex Length')
@@ -421,7 +431,7 @@ class Browser(Tk_.Toplevel):
421
431
  message1 = ttk.Label(frame,
422
432
  text='Future releases of SnapPy will show more information here.')
423
433
  message2 = ttk.Label(frame,
424
- text = 'Type SymmetryGroup.<tab> in the command shell to see '
434
+ text='Type SymmetryGroup.<tab> in the command shell to see '
425
435
  'what is available.')
426
436
  message1.grid(row=1, column=0, pady=(40, 10))
427
437
  message2.grid(row=2, column=0)
@@ -442,7 +452,7 @@ class Browser(Tk_.Toplevel):
442
452
  if not self.manifold.is_orientable():
443
453
  text = ("Inside view for non-orientable manifolds such as %s "
444
454
  "is not supported yet.") % self.manifold.name()
445
- return ttk.Label(self, text = text)
455
+ return ttk.Label(self, text=text)
446
456
 
447
457
  try:
448
458
  # delayed import to avoid cycle
@@ -455,7 +465,7 @@ class Browser(Tk_.Toplevel):
455
465
  import traceback
456
466
  text = ("Could not instantiate inside view. "
457
467
  "Error was:\n\n%s" % traceback.format_exc())
458
- return ttk.Label(self, text = text)
468
+ return ttk.Label(self, text=text)
459
469
 
460
470
  def update_menus(self, menubar):
461
471
  """Default menus used by the Invariants, Symmetry and Link tabs."""
@@ -467,12 +477,12 @@ class Browser(Tk_.Toplevel):
467
477
  modeline.delete(1.0, Tk_.END)
468
478
  if not self.manifold.is_orientable():
469
479
  modeline.insert(Tk_.END, 'Non-orientable; ')
470
- modeline.insert(Tk_.END, '%s tetrahedra; %s'%(
480
+ modeline.insert(Tk_.END, '%s tetrahedra; %s' % (
471
481
  self.manifold.num_tetrahedra(), self.manifold.solution_type()))
472
482
  if len(self.dirichlet) == 0:
473
- modeline.insert(Tk_.END,
474
- ' * failed to compute Dirichlet domain!',
475
- 'alert')
483
+ modeline.insert(Tk_.END,
484
+ ' * failed to compute Dirichlet domain!',
485
+ 'alert')
476
486
  modeline.config(state=Tk_.DISABLED)
477
487
 
478
488
  def update_modeline_and_side_panel(self):
@@ -497,6 +507,8 @@ class Browser(Tk_.Toplevel):
497
507
  elif tab_name == 'Link':
498
508
  self.update_menus(self.menubar)
499
509
  self.link_tab.draw()
510
+ elif tab_name == 'Inside View':
511
+ self.inside_view.widget.focus_set()
500
512
  elif tab_name == 'Symmetry':
501
513
  self.update_menus(self.menubar)
502
514
  self.update_symmetry()
@@ -508,7 +520,7 @@ class Browser(Tk_.Toplevel):
508
520
  current_fillings = [c.filling for c in self.manifold.cusp_info()]
509
521
  for n, coeffs in enumerate(current_fillings):
510
522
  for m in (0,1):
511
- value = '%g'%coeffs[m]
523
+ value = '%g' % coeffs[m]
512
524
  value = '0' if value == '-0' else value
513
525
  self.filling_vars[n][m].set(value)
514
526
 
@@ -530,8 +542,8 @@ class Browser(Tk_.Toplevel):
530
542
  except ValueError:
531
543
  self.homology.set('')
532
544
  self.compute_pi_one()
533
- self.update_length_spectrum()
534
545
  self.update_dirichlet()
546
+ self.update_length_spectrum()
535
547
  self.update_aka()
536
548
  self.recompute_invariants = False
537
549
 
@@ -568,9 +580,10 @@ class Browser(Tk_.Toplevel):
568
580
 
569
581
  def update_aka(self):
570
582
  self._write_aka_info()
571
- #self.identifier.identify(self.manifold)
572
- #self.aka_after_id = self.after(100, self._aka_callback)
583
+ # self.identifier.identify(self.manifold)
584
+ # self.aka_after_id = self.after(100, self._aka_callback)
573
585
  M = self.manifold.copy()
586
+
574
587
  def format_name(N):
575
588
  if all(N.cusp_info('is_complete')):
576
589
  return N.name()
@@ -619,6 +632,9 @@ class Browser(Tk_.Toplevel):
619
632
  self.dirichlet = []
620
633
  self.update_modeline()
621
634
  self.dirichlet_viewer.new_polyhedron(self.dirichlet)
635
+ if self.inside_view:
636
+ self.inside_view.show_failed_dirichlet(
637
+ show=len(self.dirichlet) == 0)
622
638
 
623
639
  def update_cusps(self):
624
640
  try:
@@ -647,7 +663,7 @@ class Browser(Tk_.Toplevel):
647
663
  if P == '':
648
664
  var.set('0')
649
665
  else:
650
- value = '%g'%self.manifold.cusp_info()[cusp].filling[curve]
666
+ value = '%g' % self.manifold.cusp_info()[cusp].filling[curve]
651
667
  value = '0' if value == '-0' else value
652
668
  var.set(value)
653
669
  return False
@@ -674,8 +690,8 @@ class Browser(Tk_.Toplevel):
674
690
  self.manifold.dehn_fill(filling_spec)
675
691
  current_fillings = [c.filling for c in self.manifold.cusp_info()]
676
692
  for n, coeffs in enumerate(current_fillings):
677
- for m in (0,1):
678
- value = '%g'%coeffs[m]
693
+ for m in (0, 1):
694
+ value = '%g' % coeffs[m]
679
695
  value = '0' if value == '-0' else value
680
696
  self.filling_vars[n][m].set(value)
681
697
  self.update_cusps()
@@ -719,11 +735,11 @@ class Browser(Tk_.Toplevel):
719
735
  tab_name = self.notebook.tab(self.notebook.select(), 'text')
720
736
  if tab_name in ('Invariants', 'Link', 'Symmetry'):
721
737
  try:
722
- selected = self.selection_get()
738
+ selected = self.selection_get()
723
739
  except:
724
740
  selected = False
725
741
  if selected:
726
- return {'Copy' : self.edit_copy}
742
+ return {'Copy': self.edit_copy}
727
743
  return {}
728
744
 
729
745
  def edit_copy(self):
@@ -734,12 +750,19 @@ class Browser(Tk_.Toplevel):
734
750
  except:
735
751
  pass
736
752
 
737
- def test(self):
753
+ def dirichlet_help(self):
754
+ self.dirichlet_viewer.widget.help()
755
+
756
+ def horoball_help(self):
757
+ self.horoball_viewer.widget.help()
758
+
759
+ def test(self, use_modernopengl=True):
738
760
  self.update_idletasks()
739
761
  print('Testing browser')
740
762
  self.after(1000, self.notebook.select, self.dirichlet_viewer)
741
763
  self.after(2500, self.notebook.select, self.horoball_viewer)
742
- self.after(4000, self.notebook.select, self.inside_view)
764
+ if use_modernopengl:
765
+ self.after(4000, self.notebook.select, self.inside_view)
743
766
  if self.link_tab:
744
767
  self.after(5500, self.notebook.select, self.link_tab.canvas)
745
768
  self.after(7000, self.close)
@@ -747,15 +770,15 @@ class Browser(Tk_.Toplevel):
747
770
  self.after(5500, self.close)
748
771
  self.wait_window(self)
749
772
 
773
+
750
774
  class Driller(SimpleDialog):
751
- def __init__(self, master, manifold):
775
+ def __init__(self, parent, manifold):
752
776
  self.manifold = manifold
753
777
  self.num = 0 # make the superclass happy
754
778
  self.max_segments = 6
755
779
  self.result = []
756
780
  style = SnapPyStyle()
757
- self.root = root = Tk_.Toplevel(master, class_='SnapPy',
758
- bg=style.windowBG)
781
+ self.root = root = Tk_.Toplevel(parent, class_='SnapPy', bg=style.windowBG)
759
782
  title = 'Drill'
760
783
  root.title(title)
761
784
  root.iconname(title)
@@ -763,7 +786,7 @@ class Driller(SimpleDialog):
763
786
  top_frame = ttk.Frame(self.root)
764
787
  top_frame.grid_columnconfigure(0, weight=1)
765
788
  top_frame.grid_rowconfigure(2, weight=1)
766
- msg_font = Font(family=style.font_info['family'],
789
+ msg_font = dict(family=style.font_info['family'],
767
790
  weight='bold',
768
791
  size=int(style.font_info['size']*1.2))
769
792
  msg = ttk.Label(top_frame, font=msg_font,
@@ -807,7 +830,7 @@ class Driller(SimpleDialog):
807
830
  button.pack(side=Tk_.LEFT, padx=6)
808
831
  button_frame.pack(pady=6)
809
832
  self.root.protocol('WM_DELETE_WINDOW', self.wm_delete_window)
810
- self._set_transient(master)
833
+ _place_window(self.root, parent)
811
834
 
812
835
  def show_curves(self):
813
836
  self.curves.delete(*self.curves.get_children())
@@ -843,13 +866,14 @@ class Driller(SimpleDialog):
843
866
  return False
844
867
  return True
845
868
 
869
+
846
870
  class Coverer(SimpleDialog):
847
- def __init__(self, master, manifold):
871
+ def __init__(self, parent, manifold):
848
872
  self.manifold = manifold.copy()
849
873
  self.num = 0 # make the superclass happy
850
874
  self.result = []
851
875
  style = SnapPyStyle()
852
- self.root = root = Tk_.Toplevel(master, class_='SnapPy', bg=style.windowBG)
876
+ self.root = root = Tk_.Toplevel(parent, class_='SnapPy', bg=style.windowBG)
853
877
  title = 'Cover'
854
878
  root.title(title)
855
879
  root.iconname(title)
@@ -858,16 +882,15 @@ class Coverer(SimpleDialog):
858
882
  top_frame.grid_rowconfigure(2, weight=1)
859
883
  top_frame.grid_columnconfigure(0, weight=1)
860
884
  top_frame.grid_columnconfigure(1, weight=1)
861
- msg_font = Font(family=style.font_info['family'],
885
+ msg_font = dict(family=style.font_info['family'],
862
886
  weight='bold',
863
887
  size=int(style.font_info['size']*1.2))
864
888
  msg = ttk.Label(top_frame, font=msg_font,
865
889
  text='Choose covering spaces to browse:')
866
890
  msg.grid(row=0, column=0, columnspan=3, pady=10)
867
891
  degree_frame = ttk.Frame(top_frame)
868
- degree_frame.grid_columnconfigure(1, weight=1)
892
+ degree_frame.grid_columnconfigure(2, weight=1)
869
893
  self.degree_var = degree_var = Tk_.StringVar()
870
- degree_var.trace('w', self.show_covers)
871
894
  ttk.Label(degree_frame, text='Degree: ').grid(
872
895
  row=0, column=0, sticky=Tk_.E)
873
896
  self.degree_option = degree_option = ttk.OptionMenu(
@@ -878,15 +901,11 @@ class Coverer(SimpleDialog):
878
901
  )
879
902
  degree_option.grid(row=0, column=1)
880
903
  self.cyclic_var = cyclic_var = Tk_.BooleanVar()
881
- cyclic_var.trace('w', self.show_covers)
882
904
  cyclic_or_not = ttk.Checkbutton(degree_frame,
883
905
  variable=cyclic_var,
884
906
  text='cyclic covers only',
885
907
  )
886
908
  cyclic_or_not.grid(row=0, column=2, padx=6, sticky=Tk_.W)
887
- self.action = action = ttk.Button(degree_frame, text='Recompute',
888
- command=self.show_covers)
889
- action.grid(row=0, column=3, padx=8, sticky=Tk_.W)
890
909
  degree_frame.grid(row=1, column=0, pady=2, padx=6, sticky=Tk_.EW)
891
910
  self.covers = covers = ttk.Treeview(
892
911
  top_frame,
@@ -915,21 +934,25 @@ class Coverer(SimpleDialog):
915
934
  button.grid(row=0, column=1, sticky=Tk_.W, padx=6)
916
935
  button_frame.pack(pady=6, fill=Tk_.BOTH, expand=1)
917
936
  self.root.protocol('WM_DELETE_WINDOW', self.cancel)
918
- self._set_transient(master)
937
+ try:
938
+ _place_window(self.root, parent)
939
+ except AttributeError:
940
+ self._set_transient(container)
919
941
  degree_var.set('2')
920
942
  cyclic_var.set(True)
921
943
  self.show_covers()
944
+ degree_var.trace_add('write', self.show_covers)
945
+ cyclic_var.trace_add('write', self.show_covers)
946
+
922
947
 
923
948
  def clear_list(self, *args):
924
949
  self.covers.delete(*self.covers.get_children())
925
950
  self.browse.config(default='normal')
926
- self.action.config(default='active')
927
951
  self.state = 'not ready'
928
952
 
929
953
  def show_covers(self, *args):
930
954
  self.state = 'ready'
931
955
  self.browse.config(default='active')
932
- self.action.config(default='normal')
933
956
  self.covers.delete(*self.covers.get_children())
934
957
  degree = int(self.degree_var.get())
935
958
  if self.cyclic_var.get():
@@ -964,6 +987,7 @@ class Coverer(SimpleDialog):
964
987
  self.root.grab_set()
965
988
  self.root.wait_window()
966
989
 
990
+
967
991
  if __name__ == '__main__':
968
992
  from snappy import Manifold
969
993
  root = Tk_.Tk()
snappy/cache.py CHANGED
@@ -1,28 +1,25 @@
1
- from __future__ import print_function
2
-
3
1
  class SnapPyCache(dict):
4
2
  """
5
3
  Implementation of a simple cache used by the Manifold and Triangulation
6
4
  to save the results of methods which require a significant amount of
7
5
  computation.
8
-
6
+
9
7
  This cache uses the tuple (method.__name, args, kwargs) as its key.
10
8
  """
11
9
  debug = False
12
10
  _clear = dict.clear
13
-
11
+
14
12
  def save(self, answer, method_name, *args, **kwargs):
15
13
  self[(method_name, args, tuple(kwargs.items()))] = answer
16
14
  return answer
17
-
15
+
18
16
  def lookup(self, method_name, *args, **kwargs):
19
17
  return self[(method_name, args, tuple(kwargs.items()))]
20
18
 
21
19
  def clear(self, key=None, message=''):
22
20
  if self.debug:
23
- print('_clear_cache: %s'%message)
24
- if key is None:
21
+ print('_clear_cache: %s' % message)
22
+ if key is None:
25
23
  self._clear()
26
24
  else:
27
25
  self.pop(key)
28
-