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,29 @@
1
+ from snappy import testing
2
+ import snappy
3
+
4
+ from snappy import raytracing
5
+ import snappy.raytracing.geodesic_tube_info
6
+ import snappy.raytracing.geodesics
7
+ import snappy.raytracing.ideal_raytracing_data
8
+ import snappy.raytracing.upper_halfspace_utilities
9
+
10
+ modules = [
11
+ raytracing.cohomology_fractal,
12
+ raytracing.geodesic_tube_info,
13
+ raytracing.geodesics,
14
+ raytracing.ideal_raytracing_data,
15
+ raytracing.upper_halfspace_utilities
16
+ ]
17
+
18
+ def run_doctests(verbose=False, print_info=True):
19
+ globs = {'Manifold' : snappy.Manifold,
20
+ 'ManifoldHP': snappy.ManifoldHP}
21
+ return testing.doctest_modules(modules,
22
+ verbose=verbose,
23
+ print_info=print_info,
24
+ extraglobs=globs)
25
+
26
+ run_doctests.__name__ = raytracing.__name__
27
+
28
+ if __name__ == '__main__':
29
+ testing.run_doctests_as_main(run_doctests)
@@ -0,0 +1,146 @@
1
+ """
2
+ Module defining the ToolTip widget
3
+
4
+ From https://github.com/gnikit/tkinter-tooltip
5
+ """
6
+
7
+ import time
8
+ import tkinter as tk
9
+ from typing import Callable
10
+
11
+ # This code is based on Tucker Beck's implementation licensed under an MIT License
12
+ # Original code: http://code.activestate.com/recipes/576688-tooltip-for-tkinter/
13
+
14
+
15
+ class ToolTip(tk.Toplevel):
16
+ """
17
+ Creates a ToolTip (pop-up) widget for tkinter
18
+ """
19
+
20
+ def __init__(
21
+ self,
22
+ widget: tk.Widget,
23
+ msg = None, # : str | Callable
24
+ delay: float = 1.0,
25
+ follow: bool = True,
26
+ refresh: float = 1.0,
27
+ x_offset: int = +10,
28
+ y_offset: int = +10,
29
+ parent_kwargs: dict = {"bg": "black", "padx": 1, "pady": 1},
30
+ **message_kwargs,
31
+ ):
32
+ """Create a ToolTip. Allows for `**kwargs` to be passed on both
33
+ the parent frame and the ToolTip message
34
+
35
+ Parameters
36
+ ----------
37
+ widget : tk.Widget
38
+ The widget this ToolTip is assigned to
39
+ msg : `Union[str, Callable]`, optional
40
+ A string message (can be dynamic) assigned to the ToolTip.
41
+ Alternatively, it can be set to a function thatreturns a string,
42
+ by default None
43
+ delay : `float`, optional
44
+ Delay in seconds before the ToolTip appears, by default 0.0
45
+ follow : `bool`, optional
46
+ ToolTip follows motion, otherwise hides, by default True
47
+ refresh : `float`, optional
48
+ Refresh rate in seconds for strings and functions when mouse is
49
+ stationary and inside the widget, by default 1.0
50
+ x_offset : `int`, optional
51
+ x-coordinate offset for the ToolTip, by default +10
52
+ y_offset : `int`, optional
53
+ y-coordinate offset for the ToolTip, by default +10
54
+ parent_kwargs : `dict`, optional
55
+ Optional kwargs to be passed into the parent frame,
56
+ by default `{"bg": "black", "padx": 1, "pady": 1}`
57
+ **message_kwargs : tkinter `**kwargs` passed directly into the ToolTip
58
+ """
59
+ self.widget = widget
60
+ # ToolTip should have the same parent as the widget unless stated
61
+ # otherwise in the `parent_kwargs`
62
+ tk.Toplevel.__init__(self, **parent_kwargs)
63
+ self.withdraw() # Hide initially in case there is a delay
64
+ # Disable ToolTip's title bar
65
+ self.overrideredirect(True)
66
+
67
+ # StringVar instance for msg string|function
68
+ self.msgVar = tk.StringVar()
69
+ # This can be a string or a function
70
+ # Do not bother doing any sort of checks here since it sometimes results
71
+ # into multiple spawn-hide calls being made when swapping between tooltips
72
+ self.msg = msg
73
+ self.delay = delay
74
+ self.follow = follow
75
+ self.refresh = refresh
76
+ self.x_offset = x_offset
77
+ self.y_offset = y_offset
78
+ # visibility status of the ToolTip inside|outside|visible
79
+ self.status = "outside"
80
+ self.last_moved = 0
81
+ # use Message widget to host ToolTip
82
+ tk.Message(self, textvariable=self.msgVar, aspect=1000, **message_kwargs).grid()
83
+ # Add bindings to the widget without overriding the existing ones
84
+ self.widget.bind("<Enter>", self.on_enter, add="+")
85
+ self.widget.bind("<Leave>", self.on_leave, add="+")
86
+ self.widget.bind("<Motion>", self.on_enter, add="+")
87
+ self.widget.bind("<ButtonPress>", self.on_leave, add="+")
88
+
89
+ def on_enter(self, event) -> None:
90
+ """
91
+ Processes motion within the widget including entering and moving.
92
+ """
93
+ self.last_moved = time.time()
94
+
95
+ # Set the status as inside for the very first time
96
+ if self.status == "outside":
97
+ self.status = "inside"
98
+
99
+ # If the follow flag is not set, motion within the widget will
100
+ # make the ToolTip disappear
101
+ if not self.follow:
102
+ self.status = "inside"
103
+ self.withdraw()
104
+
105
+ # Offsets the ToolTip using the coordinates od an event as an origin
106
+ self.geometry(f"+{event.x_root + self.x_offset}+{event.y_root + self.y_offset}")
107
+
108
+ # Time is integer and in milliseconds
109
+ self.after(int(self.delay * 1000), self._show)
110
+
111
+ def on_leave(self, event=None) -> None:
112
+ """
113
+ Hides the ToolTip.
114
+ """
115
+ self.status = "outside"
116
+ self.withdraw()
117
+
118
+ def _show(self) -> None:
119
+ """
120
+ Displays the ToolTip.
121
+
122
+ Recursively queues `_show` in the scheduler every `self.refresh` seconds
123
+ """
124
+ if self.status == "inside" and time.time() - self.last_moved > self.delay:
125
+ self.status = "visible"
126
+
127
+ if self.status == "visible":
128
+ # Update the string with the latest function call
129
+ # Try and call self.msg as a function, if msg is not callable try and
130
+ # set it as a normal string if that fails throw an error
131
+ try:
132
+ self.msgVar.set(self.msg())
133
+ except TypeError:
134
+ # Intentionally do not check if msg is str, can be a list of str
135
+ self.msgVar.set(self.msg)
136
+ except:
137
+ raise (
138
+ "Error: ToolTip `msg` must be a string or string returning "
139
+ + f"function instead `msg` of type {type(self.msg)} was input"
140
+ )
141
+ self.deiconify()
142
+
143
+ # Recursively call _show to update ToolTip with the newest value of msg
144
+ # This is a race condition which only exits when upon a binding change
145
+ # that in turn changes the `status` to outside
146
+ self.after(int(self.refresh * 1000), self._show)
@@ -0,0 +1,98 @@
1
+ from ..matrix import make_matrix
2
+ from ..upper_halfspace.ideal_point import Infinity
3
+ from ..upper_halfspace import pgl2c_to_o13, sl2c_inverse
4
+
5
+ from ..snap.t3mlite import simplex
6
+ from ..snap.t3mlite import Mcomplex
7
+
8
+ def symmetric_vertices_for_tetrahedron(z):
9
+ """
10
+ Given a tetrahedron shape, returns four (ideal) points spanning
11
+ a tetrahedron of that shape.
12
+
13
+ The points are in C subset C union { Infinity } regarded as
14
+ boundary of the upper half space model.
15
+
16
+ Duplicates initial_tetrahedron(... centroid_at_origin = true)
17
+ in choose_generators.c.
18
+ """
19
+
20
+ w = z.sqrt() + (z - 1).sqrt()
21
+ return [ w, 1/w, -1/w, -w ]
22
+
23
+
24
+ def pgl2_matrix_taking_0_1_inf_to_given_points(z0, z1, zinf):
25
+ if z0 == Infinity:
26
+ CF = z1.parent()
27
+ m = zinf - z1
28
+ return make_matrix([[ -zinf, m ],
29
+ [ -1, 0 ]], ring=CF)
30
+
31
+ if z1 == Infinity:
32
+ CF = zinf.parent()
33
+ return make_matrix([[ -zinf, z0 ],
34
+ [ -1, 1 ]], ring=CF)
35
+
36
+ if zinf == Infinity:
37
+ CF = z0.parent()
38
+ l = z0 - z1
39
+ return make_matrix([[ -l, z0 ],
40
+ [ 0, 1 ]], ring=CF)
41
+
42
+ l = z0 - z1
43
+ m = zinf - z1
44
+
45
+ return make_matrix([[ -l * zinf, m * z0 ],
46
+ [ -l, m ]])
47
+
48
+
49
+ def are_sl_matrices_close(m1, m2, epsilon=1e-5):
50
+ """
51
+ Compute whether two matrices are the same up to given epsilon.
52
+ """
53
+
54
+ for i in range(2):
55
+ for j in range(2):
56
+ if abs(m1[i,j] - m2[i,j]) > epsilon:
57
+ return False
58
+ return True
59
+
60
+
61
+ def are_psl_matrices_close(m1, m2, epsilon=1e-5):
62
+ """
63
+ Compute whether two matrices are the same up to given epsilon
64
+ and multiplying by -Identity.
65
+ """
66
+ return (
67
+ are_sl_matrices_close(m1, m2, epsilon) or
68
+ are_sl_matrices_close(m1, -m2, epsilon))
69
+
70
+ def o13_matrix_taking_ideal_vertices_to_ideal_vertices(verts0, verts1):
71
+ m1 = pgl2_matrix_taking_0_1_inf_to_given_points(*verts0)
72
+ m2 = pgl2_matrix_taking_0_1_inf_to_given_points(*verts1)
73
+
74
+ return pgl2c_to_o13(m2 * sl2c_inverse(m1))
75
+
76
+ def add_coordinate_transform_to_mcomplex(mcomplex : Mcomplex):
77
+ """
78
+ Most places in SnapPy/SnapPea kernel develop the tetrahedra
79
+ so that they form a fundamental domain - so that pairing
80
+ matrices are the identity for faces that are internal to the
81
+ fundamental domain.
82
+
83
+ However, for the raytracing shader, we pick the vertices of each
84
+ tetrahedron so that the center is at the origin.
85
+
86
+ Compute the matrix that can take structures in the coordinate
87
+ system native to SnapPy/SnapPea kernel to the coordinate system
88
+ used by the raytracing shader.
89
+
90
+ """
91
+ for tet in mcomplex.Tetrahedra:
92
+ z = tet.ShapeParameters[simplex.E01]
93
+ vert0 = [ tet.ideal_vertices[v]
94
+ for v in simplex.ZeroSubsimplices[:3]]
95
+ vert1 = symmetric_vertices_for_tetrahedron(z)[:3]
96
+ tet.to_coordinates_in_symmetric_tet = (
97
+ o13_matrix_taking_ideal_vertices_to_ideal_vertices(
98
+ vert0, vert1))
@@ -0,0 +1,98 @@
1
+ import math
2
+
3
+ _parameter_interval = [
4
+ (20.0,120.0), # material: field of view
5
+ (-2.5,2.5), # ideal: log of scale
6
+ None ] # hyperideal
7
+
8
+ _scale_function = [
9
+ lambda parameter: math.tan(parameter / 360.0 * math.pi),
10
+ lambda parameter: math.exp(parameter),
11
+ None ]
12
+
13
+ _inverse_scale_function = [
14
+ lambda scale: math.atan(scale) * 360.0 / math.pi,
15
+ lambda scale: math.log(scale),
16
+ None ]
17
+
18
+
19
+ class ViewScaleController:
20
+ def __init__(self,
21
+ uniform_dict,
22
+ scale,
23
+ label0,
24
+ label1,
25
+ update_function):
26
+ self.uniform_dict = uniform_dict
27
+ self.scale = scale
28
+ self.label0 = label0
29
+ self.label1 = label1
30
+ self.update_function = update_function
31
+
32
+ self.update()
33
+
34
+ self.scale.set_callback(self.scale_command)
35
+
36
+ def scale_command(self, value):
37
+ perspective_type = self.uniform_dict['perspectiveType'][1]
38
+ parameter_interval = _parameter_interval[perspective_type]
39
+ if not parameter_interval:
40
+ return
41
+
42
+ parameter = _linear_remap(
43
+ value,
44
+ (self.scale.left_end, self.scale.right_end),
45
+ parameter_interval)
46
+
47
+ self.uniform_dict['viewScale'][1] = float(
48
+ _scale_function[perspective_type](parameter))
49
+ self.update_label()
50
+ self.update_function()
51
+
52
+ def update_label(self):
53
+ perspective_type = self.uniform_dict['perspectiveType'][1]
54
+
55
+ if perspective_type == 0:
56
+ view_scale = self.uniform_dict['viewScale'][1]
57
+ fov = _inverse_scale_function[perspective_type](view_scale)
58
+ self.label0.configure(text='FOV:')
59
+ self.label1.configure(text='%.1f' % fov)
60
+ elif perspective_type == 1:
61
+ view_scale = self.uniform_dict['viewScale'][1]
62
+ self.label0.configure(text='Euclidean length:')
63
+ if view_scale > 1.0:
64
+ self.label1.configure(text='%.1f' % view_scale)
65
+ elif view_scale > 0.1:
66
+ self.label1.configure(text='%.2f' % view_scale)
67
+ else:
68
+ self.label1.configure(text='%.3f' % view_scale)
69
+ else:
70
+ self.label0.configure(text='')
71
+ self.label1.configure(text='')
72
+
73
+ def update_scale(self):
74
+ perspective_type = self.uniform_dict['perspectiveType'][1]
75
+ parameter_interval = _parameter_interval[perspective_type]
76
+ if not parameter_interval:
77
+ self.scale.state(("disabled",))
78
+ return
79
+
80
+ self.scale.state(("!disabled",))
81
+ view_scale = self.uniform_dict['viewScale'][1]
82
+ parameter = _inverse_scale_function[perspective_type](view_scale)
83
+
84
+ self.scale.set_value(
85
+ _linear_remap(
86
+ parameter,
87
+ parameter_interval,
88
+ (self.scale.left_end, self.scale.right_end)))
89
+
90
+ def update(self):
91
+ self.update_label()
92
+ self.update_scale()
93
+
94
+
95
+ def _linear_remap(v, src_interval, dst_interval):
96
+ l0, r0 = src_interval
97
+ l1, r1 = dst_interval
98
+ return l1 + (r1 - l1) / (r0 - l0) * (v - l0)
@@ -0,0 +1,263 @@
1
+ import sys
2
+ import os
3
+ import tkinter as tk
4
+ from tkinter import ttk
5
+
6
+ if sys.platform == 'linux':
7
+ label_pad = (4, 0)
8
+ else:
9
+ label_pad = 0
10
+
11
+
12
+ class Slider(ttk.Scale):
13
+ _slider_left_end = 1.0
14
+ _slider_right_end = 100.0
15
+
16
+ """
17
+ Subclass of ttk.Scale which makes clicking on the track cause the
18
+ knob to move to the click point.
19
+ """
20
+ def __init__(self, container, left_end, right_end,
21
+ orient=tk.HORIZONTAL):
22
+ ttk.Scale.__init__(self,
23
+ master=container,
24
+ from_=self._slider_left_end,
25
+ to=self._slider_right_end,
26
+ value=2.0,
27
+ orient=orient,
28
+ takefocus=0)
29
+ self.left_end = left_end
30
+ self.right_end = right_end
31
+ self.orient = orient
32
+ self.callback = None
33
+ self.configure(command=self._command)
34
+ self.bind('<Button-1>', self._handle_mouse)
35
+
36
+ def set_callback(self, callback):
37
+ self.callback = callback
38
+
39
+ def set_value(self, value):
40
+ length = self.right_end - self.left_end
41
+ slider_length = self._slider_right_end - self._slider_left_end
42
+ v = (value - self.left_end) / length
43
+ slider_value = v * slider_length + self._slider_left_end
44
+ self.configure(value=slider_value)
45
+
46
+ def _command(self, slider_value):
47
+ if self.callback:
48
+ length = self.right_end - self.left_end
49
+ slider_length = self._slider_right_end - self._slider_left_end
50
+ v = (float(slider_value) - self._slider_left_end) / slider_length
51
+ value = v * length + self.left_end
52
+
53
+ self.callback(value)
54
+
55
+ def _handle_mouse(self, event):
56
+ """
57
+ Override the standard mouse event handler which moves the knob
58
+ by 1.0, regardless of the size of the range, when the mouse
59
+ click is in the trough. This implements the standard behavior
60
+ -- moving the knob to the click point.
61
+ """
62
+ part = self.identify(event.x, event.y)
63
+ orientation = str(self.cget('orient'))
64
+ if (part == 'Scale.trough'):
65
+ length = self.right_end - self.left_end
66
+ slider_length = self._slider_right_end - self._slider_left_end
67
+ if orientation == tk.HORIZONTAL:
68
+ fraction = float(event.x) / float(self.winfo_width())
69
+ else:
70
+ fraction = float(event.y) / float(self.winfo_height())
71
+ if self.callback:
72
+ self.callback(length * fraction + self.left_end)
73
+ self.set(slider_length * fraction + self._slider_left_end)
74
+ return 'break'
75
+
76
+
77
+ class ZoomSlider(ttk.Frame):
78
+ """
79
+ A compound widget containing a Slider, labels and two buttons that
80
+ expand or contract the range of values by a factor of 2. The nonneg
81
+ option can be set to ensure that the range remains nonnegative. This
82
+ widget assumes that from < to.
83
+ """
84
+ min_span = 0.05
85
+ max_span = 100
86
+
87
+ def __init__(self, container, left_end, right_end, label_text=None, on_change=None):
88
+ self._build_icons()
89
+ ttk.Frame.__init__(self, container)
90
+ self.left_end = left_end
91
+ self.right_end = right_end
92
+ self.on_change = on_change
93
+ self.slider = Slider(self, left_end, right_end)
94
+ self.slider.set_callback(self._slider_callback)
95
+
96
+ style_args = ( { 'style':'Toolbutton' }
97
+ if (sys.platform == 'darwin')
98
+ else {})
99
+
100
+ self.compresser = ttk.Button(self,
101
+ image=self.compress_icon,
102
+ command=self.zoom_in,
103
+ **style_args)
104
+ self.expander = ttk.Button(self,
105
+ image=self.expand_icon,
106
+ command=self.zoom_out,
107
+ **style_args)
108
+
109
+ padding_cheat = -6 if (sys.platform == 'darwin') else 0
110
+
111
+ if label_text is not None:
112
+ self.title_label = ttk.Label(self, text=label_text, padding=label_pad)
113
+ col_base = 1
114
+ self.columnconfigure(0, weight=0)
115
+ self.title_label.grid(row=0, column=0, sticky=tk.W)
116
+ else:
117
+ self.title_lable = None
118
+ col_base = 0
119
+
120
+ self.min_label = ttk.Label(self, text='min', padding=(0, padding_cheat, 0, 0))
121
+ self.max_label = ttk.Label(self, text='max', padding=(0, padding_cheat, 0, 0))
122
+ self.value_label = ttk.Label(self, width=6, padding=(8, 0))
123
+ self.columnconfigure(col_base + 0, weight=0)
124
+ self.columnconfigure(col_base + 1, weight=0)
125
+ self.columnconfigure(col_base + 2, weight=1)
126
+ self.columnconfigure(col_base + 3, weight=0)
127
+ self.compresser.grid(row=0, column=col_base, sticky=tk.S)
128
+ self.expander.grid(row=0, column=col_base + 1, sticky=tk.S)
129
+ self.slider.grid(row=0, column=col_base + 2, sticky=tk.EW, padx=(6, 0))
130
+ self.value_label.grid(row=0, column=col_base + 3, sticky=tk.W)
131
+ self.min_label.grid(row=1, column=col_base + 2, sticky=tk.NW)
132
+ self.max_label.grid(row=1, column=col_base + 2, sticky=tk.NE)
133
+ self.slider.bind('<MouseWheel>', self._handle_wheel)
134
+ self.slider.bind('<Shift-Button-1>', self._reset)
135
+
136
+ self.current_value = left_end
137
+
138
+ self.callback = None
139
+
140
+ self._update_labels()
141
+
142
+ def set_callback(self, callback):
143
+ self.callback = callback
144
+
145
+ def set_value(self, value):
146
+ frac = 0.8
147
+
148
+ l = self.slider.left_end
149
+ r = self.slider.right_end
150
+
151
+ length = r - l
152
+ l_p = frac * l + (1.0 - frac) * r
153
+ r_p = frac * r + (1.0 - frac) * l
154
+
155
+ if value < l_p:
156
+ self.slider.left_end = value - (1.0 - frac) * length
157
+ self.slider.right_end = value + frac * length
158
+
159
+ if value > r_p:
160
+ self.slider.left_end = value - frac * length
161
+ self.slider.right_end = value + (1.0 - frac) * length
162
+
163
+ self.slider.set_value(value)
164
+ self.current_value = value
165
+ self._update_labels()
166
+
167
+ def _build_icons(self):
168
+ if sys.platform == 'darwin':
169
+ try:
170
+ self.compress_icon = tk.Image('nsimage', source='NSExitFullScreenTemplate',
171
+ width=18, height=18)
172
+ self.expand_icon = tk.Image('nsimage', source='NSEnterFullScreenTemplate',
173
+ width=18, height=18)
174
+ except tk.TclError:
175
+ self.compress_icon = tk.Image('photo', width=18, height=18,
176
+ file=os.path.join(os.path.dirname(__file__), 'inward18.png'))
177
+
178
+ self.expand_icon = tk.Image('photo', width=18, height=18,
179
+ file=os.path.join(os.path.dirname(__file__), 'outward18.png'))
180
+ else:
181
+ suffix = 'gif' if tk.TkVersion < 8.6 else 'png'
182
+ self.compress_icon = tk.Image('photo', width=18, height=18,
183
+ file=os.path.join(os.path.dirname(__file__), 'inward18.' + suffix))
184
+
185
+ self.expand_icon = tk.Image('photo', width=18, height=18,
186
+ file=os.path.join(os.path.dirname(__file__), 'outward18.' + suffix))
187
+
188
+ def _slider_callback(self, value):
189
+ self.current_value = value
190
+ self._update_labels()
191
+ if self.callback:
192
+ self.callback(value)
193
+ if self.on_change:
194
+ self.on_change()
195
+
196
+ def _update_labels(self):
197
+ l = self.slider.left_end
198
+ r = self.slider.right_end
199
+
200
+ num_digits = _num_digits(r - l)
201
+
202
+ format_str1 = '%%.%df' % (num_digits + 1)
203
+ format_str2 = '%%.%df' % num_digits
204
+
205
+ self.value_label.configure(text=format_str1 % self.current_value)
206
+ self.min_label.configure(text=format_str2 % l)
207
+ self.max_label.configure(text=format_str2 % r)
208
+ if self.on_change:
209
+ self.on_change()
210
+
211
+ def _reset(self, event):
212
+
213
+ self.slider.left_end = self.left_end
214
+ self.slider.right_end = self.right_end
215
+ self.set_value(self.current_value)
216
+
217
+ def _handle_wheel(self, event):
218
+ delta = event.delta
219
+ if delta < 0:
220
+ self.compresser.state(['pressed'])
221
+ while(delta < 0):
222
+ self.zoom_in()
223
+ delta += 1
224
+ self.after(200, lambda :self.compresser.state(['!pressed']))
225
+ elif delta > 0:
226
+ self.expander.state(['pressed'])
227
+ while(delta > 0):
228
+ self.zoom_out()
229
+ delta -= 1
230
+ self.after(200, lambda :self.expander.state(['!pressed']))
231
+
232
+ def zoom_in(self):
233
+ l = self.slider.left_end
234
+ r = self.slider.right_end
235
+
236
+ if r - l < self.min_span:
237
+ return
238
+
239
+ self.slider.left_end = 0.25 * (3.0 * l + r)
240
+ self.slider.right_end = 0.25 * (3.0 * r + l)
241
+
242
+ self.set_value(self.current_value)
243
+ self._update_labels()
244
+
245
+ def zoom_out(self):
246
+ l = self.slider.left_end
247
+ r = self.slider.right_end
248
+
249
+ if r - l > self.max_span:
250
+ return
251
+
252
+ self.slider.left_end = 0.5 * (3.0 * l - r)
253
+ self.slider.right_end = 0.5 * (3.0 * r - l)
254
+ self.slider.set_value(self.current_value)
255
+ self._update_labels()
256
+
257
+
258
+ def _num_digits(x):
259
+ r = 1
260
+ while x < 1 and r < 7:
261
+ x *= 10.0
262
+ r += 1
263
+ return r
Binary file
@@ -0,0 +1,20 @@
1
+ from . import tk, Slider, ZoomSlider
2
+
3
+
4
+ def test_widget(window=None):
5
+ if window is None:
6
+ window = tk.Toplevel()
7
+ window.title('ZoomSliders')
8
+ tk.Label(window, text='', width=70).pack()
9
+ slider = Slider(window, from_=0.0, to=1.0)
10
+ slider.pack(expand=True, fill=tk.X, padx=10)
11
+ zoom_slider = ZoomSlider(window, from_=0.0, to=1.0)
12
+ zoom_slider.pack(expand=True, fill=tk.X)
13
+ pos_slider = ZoomSlider(window, from_=0.0, to=1.0, nonneg=True)
14
+ pos_slider.pack(expand=True, fill=tk.X, side='bottom')
15
+
16
+
17
+ if __name__ == '__main__':
18
+ win = tk.Tk()
19
+ test_widget(win)
20
+ win.mainloop()