snappy 3.3__cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (541) hide show
  1. snappy/CyOpenGL.cpython-310-aarch64-linux-gnu.so +0 -0
  2. snappy/SnapPy.cpython-310-aarch64-linux-gnu.so +0 -0
  3. snappy/SnapPy.ico +0 -0
  4. snappy/SnapPy.png +0 -0
  5. snappy/SnapPyHP.cpython-310-aarch64-linux-gnu.so +0 -0
  6. snappy/__init__.py +534 -0
  7. snappy/app.py +604 -0
  8. snappy/app_menus.py +372 -0
  9. snappy/browser.py +998 -0
  10. snappy/cache.py +25 -0
  11. snappy/canonical.py +249 -0
  12. snappy/cusps/__init__.py +280 -0
  13. snappy/cusps/cusp_area_matrix.py +98 -0
  14. snappy/cusps/cusp_areas_from_matrix.py +96 -0
  15. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  16. snappy/cusps/short_slopes_for_cusp.py +217 -0
  17. snappy/cusps/test.py +22 -0
  18. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  19. snappy/database.py +454 -0
  20. snappy/db_utilities.py +79 -0
  21. snappy/decorated_isosig.py +717 -0
  22. snappy/dev/__init__.py +0 -0
  23. snappy/dev/extended_ptolemy/__init__.py +8 -0
  24. snappy/dev/extended_ptolemy/closed.py +106 -0
  25. snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
  26. snappy/dev/extended_ptolemy/direct.py +42 -0
  27. snappy/dev/extended_ptolemy/extended.py +406 -0
  28. snappy/dev/extended_ptolemy/giac_helper.py +43 -0
  29. snappy/dev/extended_ptolemy/giac_rur.py +129 -0
  30. snappy/dev/extended_ptolemy/gluing.py +46 -0
  31. snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
  32. snappy/dev/extended_ptolemy/printMatrices.py +70 -0
  33. snappy/dev/vericlosed/__init__.py +1 -0
  34. snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
  35. snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
  36. snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
  37. snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
  38. snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
  39. snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
  40. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
  41. snappy/dev/vericlosed/orb/__init__.py +1 -0
  42. snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
  43. snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
  44. snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
  45. snappy/dev/vericlosed/test.py +54 -0
  46. snappy/dev/vericlosed/truncatedComplex.py +176 -0
  47. snappy/dev/vericlosed/verificationError.py +58 -0
  48. snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
  49. snappy/doc/_images/SnapPy-196.png +0 -0
  50. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  51. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  52. snappy/doc/_images/mac.png +0 -0
  53. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  54. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  55. snappy/doc/_images/plink-action.png +0 -0
  56. snappy/doc/_images/ubuntu.png +0 -0
  57. snappy/doc/_images/win7.png +0 -0
  58. snappy/doc/_sources/additional_classes.rst.txt +40 -0
  59. snappy/doc/_sources/bugs.rst.txt +14 -0
  60. snappy/doc/_sources/censuses.rst.txt +52 -0
  61. snappy/doc/_sources/credits.rst.txt +81 -0
  62. snappy/doc/_sources/development.rst.txt +261 -0
  63. snappy/doc/_sources/index.rst.txt +215 -0
  64. snappy/doc/_sources/installing.rst.txt +249 -0
  65. snappy/doc/_sources/manifold.rst.txt +6 -0
  66. snappy/doc/_sources/manifoldhp.rst.txt +46 -0
  67. snappy/doc/_sources/news.rst.txt +425 -0
  68. snappy/doc/_sources/other.rst.txt +25 -0
  69. snappy/doc/_sources/platonic_census.rst.txt +20 -0
  70. snappy/doc/_sources/plink.rst.txt +102 -0
  71. snappy/doc/_sources/ptolemy.rst.txt +66 -0
  72. snappy/doc/_sources/ptolemy_classes.rst.txt +42 -0
  73. snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -0
  74. snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -0
  75. snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -0
  76. snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -0
  77. snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -0
  78. snappy/doc/_sources/screenshots.rst.txt +21 -0
  79. snappy/doc/_sources/snap.rst.txt +87 -0
  80. snappy/doc/_sources/snappy.rst.txt +28 -0
  81. snappy/doc/_sources/spherogram.rst.txt +103 -0
  82. snappy/doc/_sources/todo.rst.txt +47 -0
  83. snappy/doc/_sources/triangulation.rst.txt +11 -0
  84. snappy/doc/_sources/tutorial.rst.txt +49 -0
  85. snappy/doc/_sources/verify.rst.txt +210 -0
  86. snappy/doc/_sources/verify_internals.rst.txt +79 -0
  87. snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
  88. snappy/doc/_static/SnapPy.ico +0 -0
  89. snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  90. snappy/doc/_static/basic.css +906 -0
  91. snappy/doc/_static/css/badge_only.css +1 -0
  92. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  93. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  94. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  95. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  96. snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
  97. snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  98. snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  99. snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
  100. snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  101. snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
  102. snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  103. snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
  104. snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
  105. snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
  106. snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  107. snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
  108. snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
  109. snappy/doc/_static/css/theme.css +4 -0
  110. snappy/doc/_static/doctools.js +149 -0
  111. snappy/doc/_static/documentation_options.js +13 -0
  112. snappy/doc/_static/file.png +0 -0
  113. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  114. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  115. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  116. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  117. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  118. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  119. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  120. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  121. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  122. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  123. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  124. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  125. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  126. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  127. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  128. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  129. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  130. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  131. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  132. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  133. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  134. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  135. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  136. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  137. snappy/doc/_static/jquery.js +2 -0
  138. snappy/doc/_static/js/badge_only.js +1 -0
  139. snappy/doc/_static/js/theme.js +1 -0
  140. snappy/doc/_static/js/versions.js +228 -0
  141. snappy/doc/_static/language_data.js +192 -0
  142. snappy/doc/_static/minus.png +0 -0
  143. snappy/doc/_static/plus.png +0 -0
  144. snappy/doc/_static/pygments.css +75 -0
  145. snappy/doc/_static/searchtools.js +635 -0
  146. snappy/doc/_static/snappy_furo.css +33 -0
  147. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
  148. snappy/doc/_static/sphinx_highlight.js +154 -0
  149. snappy/doc/additional_classes.html +1500 -0
  150. snappy/doc/bugs.html +132 -0
  151. snappy/doc/censuses.html +453 -0
  152. snappy/doc/credits.html +184 -0
  153. snappy/doc/development.html +385 -0
  154. snappy/doc/doc-latest/additional_classes.html +1500 -0
  155. snappy/doc/doc-latest/bugs.html +132 -0
  156. snappy/doc/doc-latest/censuses.html +453 -0
  157. snappy/doc/doc-latest/credits.html +184 -0
  158. snappy/doc/doc-latest/development.html +385 -0
  159. snappy/doc/doc-latest/genindex.html +1349 -0
  160. snappy/doc/doc-latest/index.html +287 -0
  161. snappy/doc/doc-latest/installing.html +346 -0
  162. snappy/doc/doc-latest/manifold.html +3632 -0
  163. snappy/doc/doc-latest/manifoldhp.html +180 -0
  164. snappy/doc/doc-latest/news.html +438 -0
  165. snappy/doc/doc-latest/objects.inv +0 -0
  166. snappy/doc/doc-latest/other.html +160 -0
  167. snappy/doc/doc-latest/platonic_census.html +376 -0
  168. snappy/doc/doc-latest/plink.html +210 -0
  169. snappy/doc/doc-latest/ptolemy.html +253 -0
  170. snappy/doc/doc-latest/ptolemy_classes.html +1144 -0
  171. snappy/doc/doc-latest/ptolemy_examples1.html +409 -0
  172. snappy/doc/doc-latest/ptolemy_examples2.html +471 -0
  173. snappy/doc/doc-latest/ptolemy_examples3.html +414 -0
  174. snappy/doc/doc-latest/ptolemy_examples4.html +195 -0
  175. snappy/doc/doc-latest/ptolemy_prelim.html +248 -0
  176. snappy/doc/doc-latest/py-modindex.html +165 -0
  177. snappy/doc/doc-latest/screenshots.html +141 -0
  178. snappy/doc/doc-latest/search.html +135 -0
  179. snappy/doc/doc-latest/searchindex.js +1 -0
  180. snappy/doc/doc-latest/snap.html +202 -0
  181. snappy/doc/doc-latest/snappy.html +181 -0
  182. snappy/doc/doc-latest/spherogram.html +1346 -0
  183. snappy/doc/doc-latest/todo.html +166 -0
  184. snappy/doc/doc-latest/triangulation.html +1676 -0
  185. snappy/doc/doc-latest/tutorial.html +159 -0
  186. snappy/doc/doc-latest/verify.html +330 -0
  187. snappy/doc/doc-latest/verify_internals.html +1235 -0
  188. snappy/doc/genindex.html +1349 -0
  189. snappy/doc/index.html +287 -0
  190. snappy/doc/installing.html +346 -0
  191. snappy/doc/manifold.html +3632 -0
  192. snappy/doc/manifoldhp.html +180 -0
  193. snappy/doc/news.html +438 -0
  194. snappy/doc/objects.inv +0 -0
  195. snappy/doc/other.html +160 -0
  196. snappy/doc/platonic_census.html +376 -0
  197. snappy/doc/plink.html +210 -0
  198. snappy/doc/ptolemy.html +253 -0
  199. snappy/doc/ptolemy_classes.html +1144 -0
  200. snappy/doc/ptolemy_examples1.html +409 -0
  201. snappy/doc/ptolemy_examples2.html +471 -0
  202. snappy/doc/ptolemy_examples3.html +414 -0
  203. snappy/doc/ptolemy_examples4.html +195 -0
  204. snappy/doc/ptolemy_prelim.html +248 -0
  205. snappy/doc/py-modindex.html +165 -0
  206. snappy/doc/screenshots.html +141 -0
  207. snappy/doc/search.html +135 -0
  208. snappy/doc/searchindex.js +1 -0
  209. snappy/doc/snap.html +202 -0
  210. snappy/doc/snappy.html +181 -0
  211. snappy/doc/spherogram.html +1346 -0
  212. snappy/doc/todo.html +166 -0
  213. snappy/doc/triangulation.html +1676 -0
  214. snappy/doc/tutorial.html +159 -0
  215. snappy/doc/verify.html +330 -0
  216. snappy/doc/verify_internals.html +1235 -0
  217. snappy/drilling/__init__.py +456 -0
  218. snappy/drilling/barycentric.py +103 -0
  219. snappy/drilling/constants.py +5 -0
  220. snappy/drilling/crush.py +270 -0
  221. snappy/drilling/cusps.py +125 -0
  222. snappy/drilling/debug.py +242 -0
  223. snappy/drilling/epsilons.py +6 -0
  224. snappy/drilling/exceptions.py +55 -0
  225. snappy/drilling/moves.py +620 -0
  226. snappy/drilling/peripheral_curves.py +210 -0
  227. snappy/drilling/perturb.py +188 -0
  228. snappy/drilling/shorten.py +36 -0
  229. snappy/drilling/subdivide.py +274 -0
  230. snappy/drilling/test.py +23 -0
  231. snappy/drilling/test_cases.py +132 -0
  232. snappy/drilling/tracing.py +351 -0
  233. snappy/exceptions.py +26 -0
  234. snappy/export_stl.py +120 -0
  235. snappy/exterior_to_link/__init__.py +2 -0
  236. snappy/exterior_to_link/barycentric_geometry.py +463 -0
  237. snappy/exterior_to_link/exceptions.py +6 -0
  238. snappy/exterior_to_link/geodesic_map.json +14408 -0
  239. snappy/exterior_to_link/hyp_utils.py +112 -0
  240. snappy/exterior_to_link/link_projection.py +323 -0
  241. snappy/exterior_to_link/main.py +198 -0
  242. snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
  243. snappy/exterior_to_link/mcomplex_with_link.py +687 -0
  244. snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
  245. snappy/exterior_to_link/pl_utils.py +491 -0
  246. snappy/exterior_to_link/put_in_S3.py +156 -0
  247. snappy/exterior_to_link/rational_linear_algebra.py +130 -0
  248. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
  249. snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
  250. snappy/exterior_to_link/stored_moves.py +475 -0
  251. snappy/exterior_to_link/test.py +31 -0
  252. snappy/filedialog.py +28 -0
  253. snappy/geometric_structure/__init__.py +212 -0
  254. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  255. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +691 -0
  256. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +480 -0
  257. snappy/geometric_structure/cusp_neighborhood/exceptions.py +41 -0
  258. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +294 -0
  259. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +156 -0
  260. snappy/geometric_structure/cusp_neighborhood/vertices.py +35 -0
  261. snappy/geometric_structure/geodesic/__init__.py +0 -0
  262. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  263. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  264. snappy/geometric_structure/geodesic/canonical_representatives.py +52 -0
  265. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  266. snappy/geometric_structure/geodesic/constants.py +6 -0
  267. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  268. snappy/geometric_structure/geodesic/fixed_points.py +106 -0
  269. snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
  270. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  271. snappy/geometric_structure/geodesic/line.py +30 -0
  272. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  273. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +128 -0
  274. snappy/geometric_structure/test.py +22 -0
  275. snappy/gui.py +121 -0
  276. snappy/horoviewer.py +443 -0
  277. snappy/hyperboloid/__init__.py +212 -0
  278. snappy/hyperboloid/distances.py +259 -0
  279. snappy/hyperboloid/horoball.py +19 -0
  280. snappy/hyperboloid/line.py +35 -0
  281. snappy/hyperboloid/point.py +9 -0
  282. snappy/hyperboloid/triangle.py +29 -0
  283. snappy/info_icon.gif +0 -0
  284. snappy/infowindow.py +65 -0
  285. snappy/isometry_signature.py +389 -0
  286. snappy/len_spec/__init__.py +609 -0
  287. snappy/len_spec/geodesic_info.py +129 -0
  288. snappy/len_spec/geodesic_key_info_dict.py +116 -0
  289. snappy/len_spec/geodesic_piece.py +146 -0
  290. snappy/len_spec/geometric_structure.py +182 -0
  291. snappy/len_spec/geometry.py +136 -0
  292. snappy/len_spec/length_spectrum_geodesic_info.py +185 -0
  293. snappy/len_spec/spine.py +128 -0
  294. snappy/len_spec/test.py +24 -0
  295. snappy/len_spec/test_cases.py +69 -0
  296. snappy/len_spec/tile.py +276 -0
  297. snappy/len_spec/word.py +86 -0
  298. snappy/manifolds/HTWKnots/alternating.gz +0 -0
  299. snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
  300. snappy/manifolds/__init__.py +3 -0
  301. snappy/margulis/__init__.py +332 -0
  302. snappy/margulis/cusp_neighborhood_neighborhood.py +66 -0
  303. snappy/margulis/geodesic_neighborhood.py +152 -0
  304. snappy/margulis/margulis_info.py +21 -0
  305. snappy/margulis/mu_from_neighborhood_pair.py +175 -0
  306. snappy/margulis/neighborhood.py +29 -0
  307. snappy/margulis/test.py +22 -0
  308. snappy/math_basics.py +187 -0
  309. snappy/matrix.py +525 -0
  310. snappy/number.py +657 -0
  311. snappy/numeric_output_checker.py +345 -0
  312. snappy/pari.py +41 -0
  313. snappy/phone_home.py +57 -0
  314. snappy/polyviewer.py +259 -0
  315. snappy/ptolemy/__init__.py +17 -0
  316. snappy/ptolemy/component.py +103 -0
  317. snappy/ptolemy/coordinates.py +2290 -0
  318. snappy/ptolemy/fieldExtensions.py +153 -0
  319. snappy/ptolemy/findLoops.py +473 -0
  320. snappy/ptolemy/geometricRep.py +59 -0
  321. snappy/ptolemy/homology.py +165 -0
  322. snappy/ptolemy/magma/default.magma_template +229 -0
  323. snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
  324. snappy/ptolemy/manifoldMethods.py +395 -0
  325. snappy/ptolemy/matrix.py +350 -0
  326. snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
  327. snappy/ptolemy/polynomial.py +856 -0
  328. snappy/ptolemy/processComponents.py +173 -0
  329. snappy/ptolemy/processFileBase.py +247 -0
  330. snappy/ptolemy/processFileDispatch.py +46 -0
  331. snappy/ptolemy/processMagmaFile.py +392 -0
  332. snappy/ptolemy/processRurFile.py +150 -0
  333. snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
  334. snappy/ptolemy/ptolemyObstructionClass.py +64 -0
  335. snappy/ptolemy/ptolemyVariety.py +995 -0
  336. snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
  337. snappy/ptolemy/reginaWrapper.py +698 -0
  338. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  339. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  340. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  341. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  342. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  343. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  344. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  345. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  346. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  347. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  348. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
  349. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  350. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  351. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
  352. snappy/ptolemy/rur.py +545 -0
  353. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
  354. snappy/ptolemy/test.py +1126 -0
  355. snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
  356. snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
  357. snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
  358. snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
  359. snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
  360. snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
  361. snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
  362. snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
  363. snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
  364. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  365. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  366. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  367. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  368. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  369. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  370. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  371. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  372. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
  373. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
  374. snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
  375. snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
  376. snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
  377. snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
  378. snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
  379. snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
  380. snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
  381. snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
  382. snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
  383. snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
  384. snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
  385. snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
  386. snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
  387. snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
  388. snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
  389. snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
  390. snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
  391. snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
  392. snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
  393. snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  394. snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  395. snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
  396. snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
  397. snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  398. snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  399. snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
  400. snappy/ptolemy/utilities.py +236 -0
  401. snappy/raytracing/__init__.py +64 -0
  402. snappy/raytracing/additional_horospheres.py +64 -0
  403. snappy/raytracing/additional_len_spec_choices.py +63 -0
  404. snappy/raytracing/cohomology_fractal.py +197 -0
  405. snappy/raytracing/eyeball.py +124 -0
  406. snappy/raytracing/finite_raytracing_data.py +237 -0
  407. snappy/raytracing/finite_viewer.py +590 -0
  408. snappy/raytracing/geodesic_tube_info.py +174 -0
  409. snappy/raytracing/geodesics.py +246 -0
  410. snappy/raytracing/geodesics_window.py +258 -0
  411. snappy/raytracing/gui_utilities.py +293 -0
  412. snappy/raytracing/hyperboloid_navigation.py +556 -0
  413. snappy/raytracing/hyperboloid_utilities.py +234 -0
  414. snappy/raytracing/ideal_raytracing_data.py +592 -0
  415. snappy/raytracing/inside_viewer.py +974 -0
  416. snappy/raytracing/pack.py +22 -0
  417. snappy/raytracing/raytracing_data.py +126 -0
  418. snappy/raytracing/raytracing_view.py +454 -0
  419. snappy/raytracing/shaders/Eye.png +0 -0
  420. snappy/raytracing/shaders/NonGeometric.png +0 -0
  421. snappy/raytracing/shaders/__init__.py +101 -0
  422. snappy/raytracing/shaders/fragment.glsl +1744 -0
  423. snappy/raytracing/test.py +29 -0
  424. snappy/raytracing/tooltip.py +146 -0
  425. snappy/raytracing/upper_halfspace_utilities.py +98 -0
  426. snappy/raytracing/view_scale_controller.py +98 -0
  427. snappy/raytracing/zoom_slider/__init__.py +263 -0
  428. snappy/raytracing/zoom_slider/inward.png +0 -0
  429. snappy/raytracing/zoom_slider/inward18.png +0 -0
  430. snappy/raytracing/zoom_slider/outward.png +0 -0
  431. snappy/raytracing/zoom_slider/outward18.png +0 -0
  432. snappy/raytracing/zoom_slider/test.py +20 -0
  433. snappy/sage_helper.py +119 -0
  434. snappy/settings.py +407 -0
  435. snappy/shell.py +53 -0
  436. snappy/snap/__init__.py +117 -0
  437. snappy/snap/character_varieties.py +375 -0
  438. snappy/snap/find_field.py +372 -0
  439. snappy/snap/fox_milnor.py +271 -0
  440. snappy/snap/fundamental_polyhedron.py +569 -0
  441. snappy/snap/generators.py +39 -0
  442. snappy/snap/interval_reps.py +81 -0
  443. snappy/snap/kernel_structures.py +128 -0
  444. snappy/snap/mcomplex_base.py +18 -0
  445. snappy/snap/nsagetools.py +716 -0
  446. snappy/snap/peripheral/__init__.py +1 -0
  447. snappy/snap/peripheral/dual_cellulation.py +219 -0
  448. snappy/snap/peripheral/link.py +127 -0
  449. snappy/snap/peripheral/peripheral.py +159 -0
  450. snappy/snap/peripheral/surface.py +522 -0
  451. snappy/snap/peripheral/test.py +35 -0
  452. snappy/snap/polished_reps.py +335 -0
  453. snappy/snap/shapes.py +152 -0
  454. snappy/snap/slice_obs_HKL/__init__.py +194 -0
  455. snappy/snap/slice_obs_HKL/basics.py +236 -0
  456. snappy/snap/slice_obs_HKL/direct.py +217 -0
  457. snappy/snap/slice_obs_HKL/poly_norm.py +212 -0
  458. snappy/snap/slice_obs_HKL/rep_theory.py +424 -0
  459. snappy/snap/t3mlite/__init__.py +2 -0
  460. snappy/snap/t3mlite/arrow.py +243 -0
  461. snappy/snap/t3mlite/corner.py +22 -0
  462. snappy/snap/t3mlite/edge.py +172 -0
  463. snappy/snap/t3mlite/face.py +37 -0
  464. snappy/snap/t3mlite/files.py +211 -0
  465. snappy/snap/t3mlite/homology.py +53 -0
  466. snappy/snap/t3mlite/linalg.py +419 -0
  467. snappy/snap/t3mlite/mcomplex.py +1499 -0
  468. snappy/snap/t3mlite/perm4.py +320 -0
  469. snappy/snap/t3mlite/setup.py +12 -0
  470. snappy/snap/t3mlite/simplex.py +199 -0
  471. snappy/snap/t3mlite/spun.py +297 -0
  472. snappy/snap/t3mlite/surface.py +519 -0
  473. snappy/snap/t3mlite/test.py +20 -0
  474. snappy/snap/t3mlite/test_vs_regina.py +86 -0
  475. snappy/snap/t3mlite/tetrahedron.py +109 -0
  476. snappy/snap/t3mlite/vertex.py +42 -0
  477. snappy/snap/test.py +139 -0
  478. snappy/snap/utilities.py +288 -0
  479. snappy/test.py +213 -0
  480. snappy/test_cases.py +263 -0
  481. snappy/testing.py +131 -0
  482. snappy/tiling/__init__.py +2 -0
  483. snappy/tiling/dict_based_set.py +79 -0
  484. snappy/tiling/floor.py +49 -0
  485. snappy/tiling/hyperboloid_dict.py +54 -0
  486. snappy/tiling/iter_utils.py +78 -0
  487. snappy/tiling/lifted_tetrahedron.py +22 -0
  488. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  489. snappy/tiling/quotient_dict.py +70 -0
  490. snappy/tiling/real_hash_dict.py +164 -0
  491. snappy/tiling/test.py +23 -0
  492. snappy/tiling/tile.py +224 -0
  493. snappy/tiling/triangle.py +33 -0
  494. snappy/tkterminal.py +920 -0
  495. snappy/twister/__init__.py +20 -0
  496. snappy/twister/main.py +646 -0
  497. snappy/twister/surfaces/S_0_1 +3 -0
  498. snappy/twister/surfaces/S_0_2 +3 -0
  499. snappy/twister/surfaces/S_0_4 +7 -0
  500. snappy/twister/surfaces/S_0_4_Lantern +8 -0
  501. snappy/twister/surfaces/S_1 +3 -0
  502. snappy/twister/surfaces/S_1_1 +4 -0
  503. snappy/twister/surfaces/S_1_2 +5 -0
  504. snappy/twister/surfaces/S_1_2_5 +6 -0
  505. snappy/twister/surfaces/S_2 +6 -0
  506. snappy/twister/surfaces/S_2_1 +8 -0
  507. snappy/twister/surfaces/S_2_heeg +10 -0
  508. snappy/twister/surfaces/S_3 +8 -0
  509. snappy/twister/surfaces/S_3_1 +10 -0
  510. snappy/twister/surfaces/S_4_1 +12 -0
  511. snappy/twister/surfaces/S_5_1 +14 -0
  512. snappy/twister/surfaces/heeg_fig8 +9 -0
  513. snappy/twister/twister_core.cpython-310-aarch64-linux-gnu.so +0 -0
  514. snappy/upper_halfspace/__init__.py +146 -0
  515. snappy/upper_halfspace/ideal_point.py +29 -0
  516. snappy/verify/__init__.py +13 -0
  517. snappy/verify/canonical.py +542 -0
  518. snappy/verify/complex_volume/__init__.py +18 -0
  519. snappy/verify/complex_volume/adjust_torsion.py +86 -0
  520. snappy/verify/complex_volume/closed.py +168 -0
  521. snappy/verify/complex_volume/compute_ptolemys.py +90 -0
  522. snappy/verify/complex_volume/cusped.py +56 -0
  523. snappy/verify/complex_volume/extended_bloch.py +201 -0
  524. snappy/verify/cusp_translations.py +85 -0
  525. snappy/verify/edge_equations.py +80 -0
  526. snappy/verify/exceptions.py +254 -0
  527. snappy/verify/hyperbolicity.py +224 -0
  528. snappy/verify/interval_newton_shapes_engine.py +523 -0
  529. snappy/verify/interval_tree.py +400 -0
  530. snappy/verify/krawczyk_shapes_engine.py +518 -0
  531. snappy/verify/real_algebra.py +286 -0
  532. snappy/verify/shapes.py +25 -0
  533. snappy/verify/square_extensions.py +1005 -0
  534. snappy/verify/test.py +72 -0
  535. snappy/verify/volume.py +128 -0
  536. snappy/version.py +2 -0
  537. snappy-3.3.dist-info/METADATA +58 -0
  538. snappy-3.3.dist-info/RECORD +541 -0
  539. snappy-3.3.dist-info/WHEEL +6 -0
  540. snappy-3.3.dist-info/entry_points.txt +2 -0
  541. snappy-3.3.dist-info/top_level.txt +28 -0
@@ -0,0 +1,556 @@
1
+ from .hyperboloid_utilities import *
2
+ from ..matrix import matrix
3
+ import time
4
+ import sys
5
+ import tempfile
6
+ import png
7
+
8
+ __all__ = ['HyperboloidNavigation']
9
+
10
+
11
+ def _move_left(rot_amount, trans_amount):
12
+ RF = trans_amount.parent()
13
+ return unit_3_vector_and_distance_to_O13_hyperbolic_translation(
14
+ [ RF(-1), RF(0), RF(0) ], trans_amount) # a
15
+
16
+
17
+ def _move_right(rot_amount, trans_amount):
18
+ RF = trans_amount.parent()
19
+ return unit_3_vector_and_distance_to_O13_hyperbolic_translation(
20
+ [ RF(+1), RF(0), RF(0) ], trans_amount) # d
21
+
22
+
23
+ def _move_up(rot_amount, trans_amount):
24
+ RF = trans_amount.parent()
25
+ return unit_3_vector_and_distance_to_O13_hyperbolic_translation(
26
+ [ RF(0), RF(+1), RF(0) ], trans_amount) # e
27
+
28
+
29
+ def _move_down(rot_amount, trans_amount):
30
+ RF = trans_amount.parent()
31
+ return unit_3_vector_and_distance_to_O13_hyperbolic_translation(
32
+ [ RF(0), RF(-1), RF(0) ], trans_amount) # c
33
+
34
+
35
+ def _move_forward(rot_amount, trans_amount):
36
+ RF = trans_amount.parent()
37
+ return unit_3_vector_and_distance_to_O13_hyperbolic_translation(
38
+ [ RF(0), RF(0), RF(-1) ], trans_amount) # w
39
+
40
+
41
+ def _move_backward(rot_amount, trans_amount):
42
+ RF = trans_amount.parent()
43
+ return unit_3_vector_and_distance_to_O13_hyperbolic_translation(
44
+ [ RF(0), RF(0), RF(+1) ], trans_amount) # s
45
+
46
+
47
+ def _turn_left(rot_amount, trans_amount):
48
+ return O13_y_rotation(-rot_amount)
49
+
50
+
51
+ def _turn_right(rot_amount, trans_amount):
52
+ return O13_y_rotation(rot_amount)
53
+
54
+
55
+ def _turn_up(rot_amount, trans_amount):
56
+ return O13_x_rotation(-rot_amount)
57
+
58
+
59
+ def _turn_down(rot_amount, trans_amount):
60
+ return O13_x_rotation(rot_amount)
61
+
62
+
63
+ def _turn_cw(rot_amount, trans_amount): # x
64
+ return O13_z_rotation(-rot_amount)
65
+
66
+
67
+ def _turn_ccw(rot_amount, trans_amount): # z
68
+ return O13_z_rotation(rot_amount)
69
+
70
+
71
+ def _add_cursor_keys(d):
72
+ d['left'] = _turn_left
73
+ d['right'] = _turn_right
74
+ d['up'] = _turn_up
75
+ d['down'] = _turn_down
76
+ return d
77
+
78
+
79
+ _keymappings = {
80
+ 'QWERTY' : _add_cursor_keys(
81
+ { 'a' : _move_left,
82
+ 'd' : _move_right,
83
+ 'e' : _move_up,
84
+ 'c' : _move_down,
85
+ 'w' : _move_forward,
86
+ 's' : _move_backward,
87
+ 'x' : _turn_cw,
88
+ 'z' : _turn_ccw }),
89
+ 'AZERTY' : _add_cursor_keys(
90
+ { 'q' : _move_left,
91
+ 'd' : _move_right,
92
+ 'e' : _move_up,
93
+ 'c' : _move_down,
94
+ 'z' : _move_forward,
95
+ 's' : _move_backward,
96
+ 'x' : _turn_cw,
97
+ 'w' : _turn_ccw }),
98
+ 'QWERTZ' : _add_cursor_keys(
99
+ { 'a' : _move_left,
100
+ 'd' : _move_right,
101
+ 'e' : _move_up,
102
+ 'c' : _move_down,
103
+ 'w' : _move_forward,
104
+ 's' : _move_backward,
105
+ 'x' : _turn_cw,
106
+ 'y' : _turn_ccw })
107
+ }
108
+
109
+ if sys.platform == 'linux2' or sys.platform == 'linux':
110
+ _closed_hand_cursor = 'fleur'
111
+ _open_hand_cursor = 'hand1'
112
+ elif sys.platform == 'darwin':
113
+ _closed_hand_cursor = 'closedhand'
114
+ _open_hand_cursor = 'openhand'
115
+ else:
116
+ _closed_hand_cursor = 'hand2'
117
+ _open_hand_cursor = 'hand1'
118
+
119
+ _default_cursor = _open_hand_cursor
120
+ _default_move_cursor = _closed_hand_cursor
121
+
122
+ _cursor_mappings = {
123
+ 'shift_l' : 'exchange',
124
+ 'shift_r' : 'exchange',
125
+ 'alt_l' : 'tcross',
126
+ 'alt_r' : 'tcross',
127
+ 'meta_l' : 'tcross',
128
+ 'meta_r' : 'tcross'
129
+ }
130
+
131
+ _refresh_delay_ms = 10
132
+
133
+ # Some systems report key repeats as key release immediately followed by key press.
134
+ # We ignore such key release events if the time passed since the key press
135
+ # is less than this:
136
+ _ignore_key_release_time_s = 0.005
137
+
138
+ _viewModes = [ 'Weight', 'Distance', 'Tet Num' ]
139
+
140
+
141
+ class HyperboloidNavigation:
142
+ """
143
+ A mixin class for a Tk widget that binds some key and mouse events
144
+ to navigate through the hyperboloid model of hyperbolic 3-space.
145
+
146
+ This is a mixin class and some other class in the class hierarchy
147
+ is expected to provide the following attributes and methods:
148
+
149
+ - self.raytracing_data has to be an instance of, e.g.,
150
+ IdealRaytracingData. This is needed to update data
151
+ such as the view matrix
152
+ using self.raytracing_data.update_view_state(...).
153
+ - self.draw() to redraw.
154
+ - self.read_depth_value(x, y) to return the depth value at a pixel.
155
+ It is used for orbiting about that point.
156
+ - self.compute_translation_and_inverse_from_pick_point(size, xy, depth)
157
+ returning the SO(1,3)-matrices for conjugating to orbit with a certain
158
+ speed about the point with frag coord xy and depth given a viewport of
159
+ size size.
160
+
161
+ The mixin class will provide the attribute self.view_state (e.g.,
162
+ pair of view matrix and tetrahedron we are in).
163
+ """
164
+
165
+ def __init__(self):
166
+ # Mouse position/view state (e.g., view matrix)
167
+ # when mouse button was pressed
168
+ self.mouse_pos_when_pressed = None
169
+ self.view_state_when_pressed = None
170
+ # Mouse position last time a mouse event was processed
171
+ self.last_mouse_pos = None
172
+
173
+ # What mouse movements should do (move, rotate, orbit),
174
+ # recorded when user clicks mouse by looking at modifiers
175
+ # (alt, shift, ...).
176
+ self.mouse_mode = None
177
+
178
+ self.setup_keymapping()
179
+
180
+ # Is a call to process_keys_and_redraw scheduled with
181
+ # Tk's after(...).
182
+ self.process_keys_and_redraw_scheduled = False
183
+
184
+ # The view state (e.g., pair of view matrix and tetrahedron
185
+ # the camera is in).
186
+ self.view_state = self.raytracing_data.initial_view_state()
187
+
188
+ self.cursor = _default_cursor
189
+ self.configure(cursor=self.cursor)
190
+
191
+ # Parameters controlling navigation in the same format that
192
+ # get_uniform_binding returns..
193
+ self.navigation_dict = {
194
+ 'translationVelocity' : ['float', 0.4],
195
+ 'rotationVelocity' : ['float', 0.4]
196
+ }
197
+
198
+ self.bind('<KeyPress>', self.tkKeyPress)
199
+ self.bind('<KeyRelease>', self.tkKeyRelease)
200
+ self.bind_class('inside', '<KeyPress>', self.tkKeyPress)
201
+ self.bind_class('inside', '<KeyRelease>', self.tkKeyRelease)
202
+
203
+ self.bind('<Button-1>', self.tkButton1)
204
+ self.bind('<Shift-Button-1>', self.tkShiftButton1)
205
+ self.bind('<Alt-Button-1>', self.tkAltButton1)
206
+ # According to https://wiki.tcl-lang.org/page/Modifier+Keys,
207
+ # Alt-Click on Mac OS X Aqua causes <Option-...> event.
208
+ if sys.platform == 'darwin':
209
+ self.bind('<Option-Button-1>', self.tkAltButton1)
210
+ # We also provide the command key since native Mac apps tend
211
+ # to use the command key where PC apps use the Alt key.
212
+ self.bind('<Command-Button-1>', self.tkAltButton1)
213
+
214
+ self.bind('<B1-Motion>', self.tkButtonMotion1)
215
+ self.bind('<ButtonRelease-1>', self.tkButtonRelease1)
216
+
217
+ def reset_view_state(self):
218
+ """
219
+ Resets view state.
220
+ """
221
+ self.view_state = self.raytracing_data.initial_view_state()
222
+
223
+ def fix_view_state(self):
224
+ """
225
+ Fixes view state. Implementation resides with self.raytracing_data,
226
+ e.g., if the view matrix takes the camera outside of the current
227
+ tetrahedron, it would change the view matrix and current tetrahedron
228
+ to fix it.
229
+ """
230
+ self.view_state = self.raytracing_data.update_view_state(
231
+ self.view_state)
232
+
233
+ def schedule_process_key_events_and_redraw(self, time_ms):
234
+ """
235
+ Schedule call to process_key_events_and_redraw in given time
236
+ (milliseconds) if not scheduled already.
237
+ """
238
+
239
+ if self.process_keys_and_redraw_scheduled:
240
+ return
241
+ self.process_keys_and_redraw_scheduled = True
242
+ self.after(time_ms, self.process_key_events_and_redraw)
243
+
244
+ def process_key_events_and_redraw(self):
245
+ """
246
+ Go through the recorded time stamps of the key press and release
247
+ events and update the view accordingly.
248
+ """
249
+
250
+ self.process_keys_and_redraw_scheduled = False
251
+
252
+ t = time.time()
253
+
254
+ # Compute the matrix to update the view
255
+ m = matrix.identity(self.raytracing_data.RF, 4)
256
+
257
+ # Is there any key event that needs processing so we need to
258
+ # redraw.
259
+ any_key = False
260
+
261
+ # For each key k we are interested in (wasd, ...), look at the
262
+ # time stamps when key was pressed or released.
263
+ for k, last_and_release in (
264
+ self.key_to_last_accounted_and_release_time.items()):
265
+
266
+ # The amount of key press time we need to account for when
267
+ # updating the view (this is either the amount time passed since
268
+ # the key was or the amount of time since we last processed the
269
+ # key events).
270
+ dT = None
271
+
272
+ if last_and_release[0] is None:
273
+ # If there is no time stamp for a key press, erase time
274
+ # stamp for key release - just for sanity.
275
+ last_and_release[1] = None
276
+ else:
277
+ # Check whether the key was released. Note that we get
278
+ # key repeats on Mac: we get a key release event immediately
279
+ # followed by a key press event. If we happen to be called
280
+ # between these two key events, we pretend the key release
281
+ # never happened.
282
+ if ((not last_and_release[1] is None)
283
+ # Pretend there was no key release if key release
284
+ # was less than _ignore_relase_time_s seconds ago.
285
+ and t - last_and_release[1] > _ignore_key_release_time_s):
286
+
287
+ # Compute amount of time until the key release happened
288
+ dT = last_and_release[1] - last_and_release[0]
289
+
290
+ # Erase record of key press and release event
291
+ last_and_release[0] = None
292
+ last_and_release[1] = None
293
+ else:
294
+ # key is currently pressed.
295
+ # Compute amount of time that passed since the last time
296
+ # we processed key events or the key was pressed originally
297
+ # if not processed yet.
298
+ dT = t - last_and_release[0]
299
+ # Record the current time stamp for the next call
300
+ # to process_key_events_and_redraw.
301
+ last_and_release[0] = t
302
+
303
+ # If there is key press time we need to account for
304
+ if dT is not None:
305
+ RF = m.base_ring()
306
+ # Compute effect on view matrix
307
+ m = m * self.keymapping[k](
308
+ RF(dT * self.navigation_dict['rotationVelocity'][1]),
309
+ RF(dT * self.navigation_dict['translationVelocity'][1]))
310
+ any_key = True
311
+
312
+ if not any_key:
313
+ # No need to update view, bail
314
+ return
315
+
316
+ # Update view
317
+ self.view_state = self.raytracing_data.update_view_state(
318
+ self.view_state, m)
319
+
320
+ # Redraw
321
+ self.draw()
322
+
323
+ # And schedule another call of this function.
324
+ # If we don't leave Tk a couple of milliseconds in between,
325
+ # the system behaves weird.
326
+ self.schedule_process_key_events_and_redraw(_refresh_delay_ms)
327
+
328
+ def tkKeyRelease(self, event):
329
+ # Record key release
330
+ k = event.keysym.lower()
331
+ t = time.time()
332
+
333
+ last_and_release = self.key_to_last_accounted_and_release_time.get(k)
334
+ if last_and_release:
335
+ # This is an interesting key (wasd, ...), record release event.
336
+ last_and_release[1] = t
337
+
338
+ if k in _cursor_mappings:
339
+ self.cursor = _default_cursor
340
+
341
+ if not self.mouse_mode:
342
+ self.configure(cursor=self.cursor)
343
+
344
+ def tkKeyPress(self, event):
345
+ if self.mouse_mode:
346
+ # Ignore key events when user is dragging mouse
347
+ return
348
+ k = event.keysym.lower()
349
+ t = time.time()
350
+
351
+ cursor = _cursor_mappings.get(k)
352
+ if cursor:
353
+ self.configure(cursor=cursor)
354
+
355
+ last_and_release = self.key_to_last_accounted_and_release_time.get(k)
356
+ if last_and_release:
357
+ # This is an interesting key (wasd, ...).
358
+ if last_and_release[0] is None:
359
+ # Only record time stamp if there was no previous time stamp.
360
+ # E.g., on some systems we get key repeats, that is
361
+ # several press events when the key is held and we only want
362
+ # to take the first of these press events.
363
+ last_and_release[0] = t
364
+ # Erase the time stamp marking the erase. If we get a key repeat,
365
+ # that is a release event immediately following a press event,
366
+ # we want to ignore the release event.
367
+ last_and_release[1] = None
368
+
369
+ # Schedule to process the time stamps we just recorded.
370
+ self.schedule_process_key_events_and_redraw(1)
371
+
372
+ if event.keysym == 'u':
373
+ print("View SO(1,3)-matrix and current tetrahedron:",
374
+ self.view_state)
375
+
376
+ # Hack: Hyperboloid_Navigation should not know about
377
+ # the view mode (by weight, by distance, ...)
378
+ #
379
+ # We do not compute weight correctly for now and thus
380
+ # cannot render the "cohomology fractals".
381
+ # We need to revisit this at some point.
382
+ # Leaving it in here for now.
383
+ if event.keysym == 'v':
384
+ self.view = (self.view + 1) % 3
385
+ print("Color for rays that have not hit geometry:",
386
+ _viewModes[self.view])
387
+ self.draw()
388
+
389
+ if event.keysym == 'p':
390
+ from snappy.CyOpenGL import get_gl_string
391
+ self.make_current()
392
+ for k in ['GL_VERSION', 'GL_SHADING_LANGUAGE_VERSION']:
393
+ print("%s: %s" % (k, get_gl_string(k)))
394
+
395
+ if event.keysym == 'm':
396
+ # Saving image
397
+ #
398
+ # Ideally, this would be a menu item and create a dialog
399
+ # allowing the user to specify the resolution and the file path.
400
+ #
401
+ # Hard-coding this for now to fixed resolution and temporary file.
402
+
403
+ width = 1000
404
+ height = 1000
405
+
406
+ f = tempfile.NamedTemporaryFile(
407
+ suffix='.png', delete=False)
408
+
409
+ self.save_image(width, height, f)
410
+
411
+ print("Image saved to: ", f.name)
412
+
413
+ def tkButton1(self, event):
414
+ # Ignore mouse-clicks when user is navigating with keys
415
+ for last, release in (
416
+ self.key_to_last_accounted_and_release_time.values()):
417
+ if last or release:
418
+ return
419
+
420
+ self.configure(cursor=_default_move_cursor)
421
+
422
+ self.mouse_pos_when_pressed = (event.x, event.y)
423
+ self.view_state_when_pressed = self.view_state
424
+ self.mouse_mode = 'move'
425
+
426
+ def tkShiftButton1(self, event):
427
+ # Ignore mouse-clicks when user is navigating with keys
428
+ for last, release in (
429
+ self.key_to_last_accounted_and_release_time.values()):
430
+ if last or release:
431
+ return
432
+
433
+ self.mouse_pos_when_pressed = (event.x, event.y)
434
+ self.view_state_when_pressed = self.view_state
435
+ self.mouse_mode = 'rotate'
436
+
437
+ def tkAltButton1(self, event):
438
+ # Ignore mouse-clicks when user is navigating with keys
439
+ for last, release in (
440
+ self.key_to_last_accounted_and_release_time.values()):
441
+ if last or release:
442
+ return
443
+
444
+ self.make_current()
445
+
446
+ depth, width, height = self.read_depth_value(event.x, event.y)
447
+
448
+ self.orbit_translation, self.orbit_inv_translation, self.orbit_speed = (
449
+ self.compute_translation_and_inverse_from_pick_point(
450
+ (width, height), (event.x, height - event.y), depth))
451
+
452
+ self.last_mouse_pos = (event.x, event.y)
453
+ self.view_state_when_pressed = self.view_state
454
+
455
+ self.orbit_rotation = matrix.identity(self.raytracing_data.RF, 4)
456
+
457
+ self.mouse_mode = 'orbit'
458
+
459
+ def tkButtonMotion1(self, event):
460
+ if self.mouse_mode == 'orbit':
461
+ delta_x = event.x - self.last_mouse_pos[0]
462
+ delta_y = event.y - self.last_mouse_pos[1]
463
+
464
+ RF = self.raytracing_data.RF
465
+
466
+ angle_x = RF(delta_x * self.orbit_speed * 0.01)
467
+ angle_y = RF(delta_y * self.orbit_speed * 0.01)
468
+
469
+ m = O13_y_rotation(angle_x) * O13_x_rotation(angle_y)
470
+ self.orbit_rotation = self.orbit_rotation * m
471
+
472
+ self.view_state = self.raytracing_data.update_view_state(
473
+ self.view_state_when_pressed,
474
+ self.orbit_translation * self.orbit_rotation * self.orbit_inv_translation)
475
+
476
+ self.last_mouse_pos = (event.x, event.y)
477
+ elif self.mouse_mode == 'move':
478
+ RF = self.raytracing_data.RF
479
+
480
+ delta_x = RF(event.x - self.mouse_pos_when_pressed[0])
481
+ delta_y = RF(event.y - self.mouse_pos_when_pressed[1])
482
+
483
+ amt = (delta_x ** 2 + delta_y ** 2).sqrt()
484
+
485
+ if amt == 0:
486
+ self.view_state = self.view_state_when_pressed
487
+ else:
488
+ m = unit_3_vector_and_distance_to_O13_hyperbolic_translation(
489
+ [-delta_x / amt, delta_y / amt, RF(0)], amt * RF(0.01))
490
+
491
+ self.view_state = self.raytracing_data.update_view_state(
492
+ self.view_state_when_pressed, m)
493
+ elif self.mouse_mode == 'rotate':
494
+ RF = self.raytracing_data.RF
495
+
496
+ delta_x = event.x - self.mouse_pos_when_pressed[0]
497
+ delta_y = event.y - self.mouse_pos_when_pressed[1]
498
+
499
+ angle_x = RF(-delta_x * 0.01)
500
+ angle_y = RF(-delta_y * 0.01)
501
+
502
+ m = O13_y_rotation(angle_x) * O13_x_rotation(angle_y)
503
+
504
+ self.view_state = self.raytracing_data.update_view_state(
505
+ self.view_state, m)
506
+
507
+ self.mouse_pos_when_pressed = (event.x, event.y)
508
+ else:
509
+ return
510
+
511
+ self.draw()
512
+
513
+ def tkButtonRelease1(self, event):
514
+ self.mouse_mode = None
515
+ self.configure(cursor=self.cursor)
516
+
517
+ def setup_keymapping(self, keyboard='QWERTY'):
518
+ self.keymapping = _keymappings[keyboard]
519
+
520
+ # Key (e.g., 'w', 'a', ...) to pair of time stamps.
521
+ # The first time stamps records when the key was pressed
522
+ # or the time when we last were processing key events.
523
+ # The second time stamp records when the key was released.
524
+ # Time stamps can be None to indicate that there are no
525
+ # press or release events for this key that need processing.
526
+ self.key_to_last_accounted_and_release_time = {
527
+ k : [ None, None ]
528
+ for k in self.keymapping
529
+ }
530
+
531
+ def apply_settings(self, settings):
532
+ self.setup_keymapping(settings.get('keyboard', 'QWERTY'))
533
+
534
+ def _start_flight_for_debugging_hitch(self):
535
+ """
536
+ On Mac OS, there is a hitch when flying. It is subtle, but when
537
+ keeping, say the w key pressed, every second or so there a brief
538
+ moment where we are not moving.
539
+
540
+ I couldn't figure out whether this is due to how we are processing
541
+ the key events or already a problem with calling self.after from
542
+ within the redraw code.
543
+
544
+ This function initiates a flight to isolate the problem to the
545
+ latter.
546
+
547
+ To use it, do:
548
+ >>> M = Manifold("m004") # doctest: +SKIP
549
+ >>> v = M.inside_view()
550
+ >>> v.view.widget._start_flight_for_debugging_hitch()
551
+
552
+ """
553
+
554
+ self.key_to_last_accounted_and_release_time['w'][0] = time.time()
555
+ self.schedule_process_key_events_and_redraw(1)
556
+