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
snappy/horoviewer.py ADDED
@@ -0,0 +1,443 @@
1
+ #!/usr/bin/env python
2
+ from .gui import *
3
+ from .CyOpenGL import (HoroballScene, OpenGLOrthoWidget,
4
+ GetColor, cyglSetStandardLighting)
5
+ from plink.ipython_tools import IPythonTkRoot
6
+ import os
7
+ import sys
8
+
9
+
10
+ class HoroballViewer(ttk.Frame):
11
+ def __init__(self, parent, nbhd=None, which_cusp=0, cutoff=None,
12
+ title='Horoball Viewer',
13
+ settings={'cusp_horoballs' : True,
14
+ 'cusp_triangulation' : True,
15
+ 'cusp_ford_domain' : True,
16
+ 'cusp_labels' : True,
17
+ 'cusp_parallelogram' : True,
18
+ 'cusp_cutoff' : '0.1000'},
19
+ bgcolor=None,
20
+ main_window=None):
21
+ self.settings = settings
22
+ ttk.Frame.__init__(self, parent)
23
+ self.parent = parent
24
+ self.nbhd = nbhd
25
+ self.empty = (self.nbhd is None)
26
+ self.mouse_x = 0
27
+ self.mouse_y = 0
28
+ self.menubar = None
29
+ self.main_window = main_window
30
+ if cutoff is None:
31
+ self.cutoff = float(settings['cusp_cutoff'])
32
+ else:
33
+ self.cutoff = float(cutoff)
34
+ self.which_cusp = which_cusp
35
+ self.moving_cusp = 0
36
+ self.cusp_moving = False
37
+ self.last_slider_value = None
38
+ self.busy_drawing = False
39
+ self.title = title
40
+ self.style = style = SnapPyStyle()
41
+ self.bgcolor = bgcolor if bgcolor else style.groupBG
42
+ self.pgram_var = pgram_var = Tk_.IntVar(self,
43
+ value=settings['cusp_parallelogram'])
44
+ self.Ford_var = Ford_var = Tk_.IntVar(self,
45
+ value=settings['cusp_ford_domain'])
46
+ self.tri_var = tri_var = Tk_.IntVar(self,
47
+ value=settings['cusp_triangulation'])
48
+ self.horo_var = horo_var = Tk_.IntVar(self,
49
+ value=settings['cusp_horoballs'])
50
+ self.label_var = label_var = Tk_.IntVar(self,
51
+ value=settings['cusp_labels'])
52
+ self.flip_var = flip_var = Tk_.BooleanVar(self)
53
+ self.columnconfigure(0, weight=1)
54
+ self.rowconfigure(1, weight=1)
55
+ self.top_frame = top_frame = ttk.Frame(self)
56
+ top_frame.columnconfigure(1, weight=1)
57
+ self.bottomframe = bottomframe = ttk.Frame(self)
58
+ self.widget = widget = OpenGLOrthoWidget(master=bottomframe,
59
+ width=600, height=500, fovy=3.0, depth=1, double=True, swapinterval=0,
60
+ help="""
61
+ Use the mouse to drag the scene relative to the fundamental parallelogram.
62
+
63
+ Use the sliders to adjust the sizes of the horoballs. Color coding indicates who bumps whom.
64
+
65
+ To change the cutoff size, enter a number in the box and hit return.
66
+
67
+ Cusps which are "tied" change size in unison.
68
+
69
+ To view the scene from outside of the upper half-space, check the "Flip" checkbutton.
70
+
71
+ Use the View Options to select which components of the scene are drawn.
72
+ """)
73
+ widget.bind('<ButtonPress-1>', self.click)
74
+ widget.bind('<B1-Motion>', self.translate)
75
+ if self.horo_var.get():
76
+ widget.set_background(0.3, 0.3, 0.4)
77
+ else:
78
+ widget.set_background(1.0,1.0,1.0)
79
+ widget.autospin_allowed = 0
80
+ cyglSetStandardLighting()
81
+ option_frame = ttk.Frame(top_frame)
82
+ view_button = ttk.Menubutton(option_frame, text='View Options')
83
+ self.view_menu = view_menu = Tk_.Menu(view_button, tearoff=0)
84
+ view_menu.add_checkbutton(label='parallelogram', command=self.view_check,
85
+ variable=self.pgram_var)
86
+ view_menu.add_checkbutton(label='Ford edges', command=self.view_check,
87
+ variable=self.Ford_var)
88
+ view_menu.add_checkbutton(label='triangulation', command=self.view_check,
89
+ variable=self.tri_var)
90
+ view_menu.add_checkbutton(label='horoballs', command=self.view_check,
91
+ variable=self.horo_var)
92
+ view_menu.add_checkbutton(label='labels', command=self.view_check,
93
+ variable=self.label_var)
94
+ view_button.config(menu=view_menu)
95
+ view_button.grid(row=0, column=0, columnspan=2, sticky=Tk_.W, padx=0, pady=0)
96
+ flip_button = ttk.Checkbutton(option_frame, text='Flip',
97
+ variable=self.flip_var,
98
+ takefocus=False,
99
+ command=self.flip)
100
+ flip_button.grid(row=1, column=0, sticky=Tk_.W, padx=0, pady=0)
101
+ self.cutoff_label = ttk.Label(option_frame, text='Cutoff: ')
102
+ self.cutoff_var = cutoff_var = Tk_.StringVar(self,
103
+ value='%.4f' % self.cutoff)
104
+ self.cutoff_entry = ttk.Entry(option_frame, width=6, takefocus=False,
105
+ textvariable=cutoff_var)
106
+ self.cutoff_entry.bind('<Return>', self.set_cutoff)
107
+ self.cutoff_label.grid_forget()
108
+ self.cutoff_entry.grid_forget()
109
+ self.cutoff_label.grid(row=2, column=0, sticky=Tk_.EW)
110
+ self.cutoff_entry.grid(row=2, column=1, sticky=Tk_.W, padx=(0,20), pady=2)
111
+ self.slider_frame = slider_frame = ttk.Frame(top_frame)
112
+ self.eye_label = ttk.Label(slider_frame, text='Eye')
113
+ self.tie_label = ttk.Label(slider_frame, text='Tie')
114
+ if self.nbhd and self.nbhd.num_cusps() > 1:
115
+ self.eye_label.grid(row=0, column=0, sticky=Tk_.W, pady=0)
116
+ self.tie_label.grid(row=0, column=1, sticky=Tk_.W, pady=0)
117
+ ttk.Label(slider_frame, text='Cusp Position').grid(
118
+ row=0, column=2, pady=0)
119
+ ttk.Label(slider_frame, text='Volume').grid(
120
+ row=0, column=3, pady=0, padx=0, sticky=Tk_.W)
121
+ self.eye_var = Tk_.IntVar(self, value=self.which_cusp)
122
+ self.cusp_sliders = []
123
+ self.slider_frames = []
124
+ self.tie_vars = []
125
+ self.tie_buttons = []
126
+ self.eye_buttons = []
127
+ self.volume_labels = []
128
+ slider_frame.grid_columnconfigure(0, weight=1)
129
+ slider_frame.grid_columnconfigure(2, minsize=370, weight=0)
130
+ self.build_sliders()
131
+ option_frame.grid(row=0, column=0, padx=(10,5), pady=5)
132
+ slider_frame.grid(row=0, column=1, padx=5, pady=(5,10))
133
+ top_frame.grid(row=0, column=0, sticky=Tk_.NSEW, padx=0, pady=0)
134
+ zoomframe = ttk.Frame(bottomframe)
135
+ self.zoom = zoom = ttk.Scale(zoomframe, from_=0, to=100,
136
+ orient=Tk_.VERTICAL, command=self.set_zoom)
137
+ zoom.set(30)
138
+ zoom.pack(side=Tk_.TOP, expand=Tk_.YES, fill=Tk_.Y)
139
+ bottomframe.columnconfigure(0, weight=1)
140
+ bottomframe.rowconfigure(0, weight=1)
141
+ widget.grid(row=0, column=0, sticky=Tk_.NSEW)
142
+ zoomframe.grid(row=0, column=1, sticky=Tk_.NS)
143
+ bottomframe.grid(row=1, column=0, sticky=Tk_.NSEW)
144
+ self.update_idletasks()
145
+ self.build_menus()
146
+ self.scene = HoroballScene(nbhd, pgram_var, Ford_var, tri_var,
147
+ horo_var, label_var, flipped=self.flip_var.get(), cutoff=self.cutoff,
148
+ which_cusp=self.which_cusp,togl_widget=self.widget)
149
+ self.widget.draw_projection_impl = self.scene.draw
150
+ if isinstance(parent, Tk_.Toplevel):
151
+ parent.config(menu=self.menubar)
152
+ # hacks needed on Sierra
153
+ self.after(20, self.configure_sliders)
154
+ self.after(50, self.rebuild)
155
+ else:
156
+ self.configure_sliders()
157
+
158
+ def apply_settings(self, settings):
159
+ for key in self.settings:
160
+ value = settings.get(key, 'missing')
161
+ if value != 'missing':
162
+ self.settings[key] = value
163
+ self.pgram_var.set(settings['cusp_parallelogram'])
164
+ self.Ford_var.set(settings['cusp_ford_domain'])
165
+ self.tri_var.set(settings['cusp_triangulation'])
166
+ self.horo_var.set(settings['cusp_horoballs'])
167
+ self.label_var.set(settings['cusp_labels'])
168
+ self.cutoff = float(settings['cusp_cutoff'])
169
+ self.cutoff_var.set('%.4f' % self.cutoff)
170
+ self.rebuild()
171
+
172
+ def view_check(self):
173
+ if self.horo_var.get():
174
+ self.widget.set_background(0.3, 0.3, 0.4)
175
+ else:
176
+ self.widget.set_background(1.0, 1.0, 1.0)
177
+ self.widget.redraw()
178
+
179
+ def build_sliders(self):
180
+ nbhd = self.nbhd
181
+ if nbhd is None:
182
+ return
183
+ self.cusp_vars = []
184
+ self.cusp_colors = []
185
+ self.tie_vars = []
186
+ num_cusps = nbhd.num_cusps()
187
+ if num_cusps > 1:
188
+ self.eye_label.grid(row=0, column=0, sticky=Tk_.E, pady=0)
189
+ self.tie_label.grid(row=0, column=1, sticky=Tk_.E, pady=0)
190
+ else:
191
+ self.eye_label.grid_forget()
192
+ self.tie_label.grid_forget()
193
+ for n in range(num_cusps):
194
+ disp = float(nbhd.stopping_displacement(which_cusp=n))
195
+ nbhd.set_displacement(disp, which_cusp=n)
196
+ if nbhd and nbhd.num_cusps() > 1:
197
+ eye_button = ttk.Radiobutton(self.slider_frame, text='',
198
+ variable=self.eye_var, takefocus=False, value=n,
199
+ command=self.set_eye)
200
+ self.eye_buttons.append(eye_button)
201
+ eye_button.grid(row=n+1, column=0)
202
+ tie_var = Tk_.IntVar(self)
203
+ tie_var.set(nbhd.get_tie(n))
204
+ self.tie_vars.append(tie_var)
205
+ tie_button = ttk.Checkbutton(self.slider_frame, variable=tie_var,
206
+ takefocus=False, command=self.rebuild)
207
+ tie_button.index = n
208
+ tie_button.grid(row=n+1, column=1)
209
+ self.tie_buttons.append(tie_button)
210
+ R, G, B, A = GetColor(nbhd.original_index(n))
211
+ self.cusp_colors.append('#%.3x%.3x%.3x' % (
212
+ int(R*4095), int(G*4095), int(B*4095)))
213
+ self.cusp_vars.append(Tk_.IntVar(self))
214
+ self.slider_frames.append(Tk_.Frame(self.slider_frame, borderwidth=0))
215
+ self.slider_frames[n].grid(row=n+1, column=2, sticky=Tk_.EW,
216
+ padx=6, pady=1)
217
+ slider = Tk_.Scale(self.slider_frames[n],
218
+ showvalue=0, from_=0, to=100,
219
+ width=11, length=200, orient=Tk_.HORIZONTAL,
220
+ background=self.cusp_colors[n],
221
+ troughcolor=self.bgcolor, borderwidth=1,
222
+ relief=Tk_.FLAT,
223
+ variable=Tk_.DoubleVar(self))
224
+ slider.index = n
225
+ slider.stamp = 0
226
+ slider.bind('<ButtonPress-1>', self.start_radius)
227
+ slider.bind('<ButtonRelease-1>', self.end_radius)
228
+ slider.grid(padx=(0,20), pady=0, sticky=Tk_.W)
229
+ self.cusp_sliders.append(slider)
230
+ volume_label = ttk.Label(self.slider_frame, width=6)
231
+ volume_label.grid(row=n+1, column=3, sticky=Tk_.W)
232
+ self.volume_labels.append(volume_label)
233
+
234
+ def new_scene(self, new_nbhd):
235
+ self.nbhd = new_nbhd
236
+ self.empty = (self.nbhd is None)
237
+ self.set_ties()
238
+ if new_nbhd and self.which_cusp >= new_nbhd.num_cusps():
239
+ self.which_cusp = 0
240
+ while self.volume_labels:
241
+ label = self.volume_labels.pop()
242
+ label.grid_forget()
243
+ label.destroy()
244
+ while self.cusp_sliders:
245
+ slider = self.cusp_sliders.pop()
246
+ slider.destroy()
247
+ while self.slider_frames:
248
+ frame = self.slider_frames.pop()
249
+ frame.grid_forget()
250
+ frame.destroy()
251
+ while self.tie_buttons:
252
+ button = self.tie_buttons.pop()
253
+ button.grid_forget()
254
+ button.destroy()
255
+ while self.eye_buttons:
256
+ button = self.eye_buttons.pop()
257
+ button.grid_forget()
258
+ button.destroy()
259
+ self.eye_var.set(self.which_cusp)
260
+ self.build_sliders()
261
+ self.widget.tk.call(self.widget._w, 'makecurrent')
262
+ self.scene = HoroballScene(new_nbhd, self.pgram_var,
263
+ self.Ford_var, self.tri_var, self.horo_var, self.label_var,
264
+ flipped=self.flip_var.get(), cutoff=self.cutoff,
265
+ which_cusp=self.which_cusp, togl_widget=self.widget)
266
+ assert(self.scene is not None)
267
+ self.widget.draw_projection_impl = self.scene.draw
268
+ self.configure_sliders()
269
+ self.rebuild()
270
+
271
+ def click(self, event):
272
+ self.mouse_x = event.x
273
+ self.mouse_y = event.y
274
+ # Make sure that the scale is reasonable before dragging.
275
+ self.set_zoom(self.zoom.get())
276
+
277
+ def flip(self):
278
+ flipped = self.flip_var.get()
279
+ self.scene.flip(flipped)
280
+ self.widget.flipped = flipped
281
+ self.widget.redraw()
282
+
283
+ def configure_sliders(self):
284
+ nbhd = self.nbhd
285
+ if self.nbhd is None:
286
+ return
287
+ slider_width = 30
288
+ size = 330 - slider_width
289
+ max_reach = nbhd.max_reach()
290
+ for n in range(nbhd.num_cusps()):
291
+ stopper_color = self.cusp_colors[nbhd.stopper(n)]
292
+ stop = float(nbhd.stopping_displacement(n))
293
+ length = int(stop*size/max_reach) + slider_width
294
+ disp = float(nbhd.get_displacement(n))
295
+ position = 100.0*disp/stop
296
+ # print stop, length, disp position
297
+ self.cusp_sliders[n].set(position)
298
+ self.slider_frames[n].config(background=stopper_color)
299
+ self.volume_labels[n].config(text='%.4f' % nbhd.volume(n))
300
+ self.cusp_sliders[n].config(length=length,
301
+ command=self.update_radius)
302
+ self.update_idletasks()
303
+
304
+ def translate(self, event):
305
+ """
306
+ Translate the HoroballScene.
307
+ """
308
+ X = self.scale*(event.x - self.mouse_x)
309
+ Y = self.scale*(self.mouse_y - event.y)
310
+ self.mouse_x, self.mouse_y = event.x, event.y
311
+ self.scene.translate(X + Y*1j)
312
+ self.widget.tkTranslate(event)
313
+
314
+ # Subclasses may override this, e.g. if they use a help menu.
315
+ def add_help(self):
316
+ help = Button(self.top_frame, text='Help', width=4,
317
+ borderwidth=0, highlightthickness=0,
318
+ background=self.bgcolor, command=self.widget.help)
319
+ help.grid(row=0, column=5, sticky=E, pady=3)
320
+ self.top_frame.columnconfigure(5, weight=1)
321
+
322
+ # Subclasses may override this to provide menus.
323
+ def build_menus(self):
324
+ pass
325
+
326
+ # Subclasses may override this to update menus, e.g. when embedded in a larger window.
327
+ def update_menus(self, menubar):
328
+ pass
329
+
330
+ def close(self, event=None):
331
+ self.destroy()
332
+
333
+ def redraw(self):
334
+ self.widget.redraw()
335
+
336
+ def set_zoom(self, x):
337
+ fovy = 1.0 + (100.0-float(x))/15.0
338
+ self.widget.fovy = fovy
339
+ height = self.widget.winfo_height()
340
+ if height > 0:
341
+ self.scale = fovy / height
342
+ else:
343
+ self.update_idletasks()
344
+ self.after(50, self.set_zoom, x)
345
+ self.widget.redraw()
346
+
347
+ def rebuild(self, full_list=True):
348
+ self.set_ties()
349
+ self.configure_sliders()
350
+ self.widget.make_current()
351
+ self.scene.build_scene(which_cusp=self.which_cusp, full_list=full_list)
352
+ self.widget.redraw()
353
+
354
+ def start_radius(self, event):
355
+ self.cusp_moving = True
356
+ self.moving_cusp = index = event.widget.index
357
+ self.last_slider_value = self.cusp_sliders[index].get()
358
+ self.update_radius()
359
+
360
+ def update_radius(self, event=None):
361
+ index = self.moving_cusp
362
+ value = self.cusp_sliders[index].get()
363
+ if value == self.last_slider_value:
364
+ return
365
+ if self.busy_drawing:
366
+ return
367
+ self.last_slider_value = value
368
+ stop = float(self.nbhd.stopping_displacement(index))
369
+ disp = value*stop/100.0
370
+ self.nbhd.set_displacement(disp, index)
371
+ self.busy_drawing = True
372
+ self.rebuild(full_list=False)
373
+ self.busy_drawing = False
374
+
375
+ def end_radius(self, event):
376
+ self.cusp_moving = False
377
+ self.rebuild()
378
+
379
+ def set_eye(self):
380
+ self.which_cusp = self.eye_var.get()
381
+ self.rebuild()
382
+
383
+ def set_ties(self):
384
+ if self.nbhd is None:
385
+ return
386
+ if len(self.tie_vars) == self.nbhd.num_cusps():
387
+ for n, var in enumerate(self.tie_vars):
388
+ self.nbhd.set_tie(n, var.get())
389
+
390
+ def set_cutoff(self, event=None):
391
+ try:
392
+ self.cutoff = float(self.cutoff_var.get())
393
+ self.scene.set_cutoff(self.cutoff)
394
+ self.rebuild()
395
+ except Exception:
396
+ pass
397
+ self.cutoff_var.set('%.4f' % self.cutoff)
398
+
399
+ def delete_resource(self):
400
+ try:
401
+ self.scene.delete_resource()
402
+ except AttributeError:
403
+ pass
404
+
405
+ def test(self):
406
+ X = 100
407
+ self.widget.event_generate('<Button-1>', x=X, y=300, warp=True)
408
+ self.update_idletasks()
409
+ for n in range(10):
410
+ X += 30
411
+ time.sleep(0.1)
412
+ self.widget.event_generate('<B1-Motion>', x=X, y=300, warp=True)
413
+ self.widget.event_generate('<ButtonRelease-1>', x=X+30, y=300, warp=True)
414
+ self.update_idletasks()
415
+ time.sleep(0.5)
416
+ self.label_var.set(0)
417
+ self.update_idletasks()
418
+ time.sleep(0.5)
419
+ self.cusp_sliders[0].set(50)
420
+ self.update_idletasks()
421
+ time.sleep(1.0)
422
+ self.set_zoom(90)
423
+ self.update_idletasks()
424
+ time.sleep(0.5)
425
+
426
+
427
+ __doc__ = """
428
+ The horoviewer module exports the HoroballViewer class, which is
429
+ a Tkinter / OpenGL window for viewing cusp neighborhoods.
430
+ """
431
+
432
+ __all__ = ['HoroballViewer']
433
+
434
+ if __name__ == '__main__':
435
+ import snappy
436
+ from snappy.gui import ViewerWindow
437
+ if len(sys.argv) > 1:
438
+ mfld = sys.argv[1]
439
+ else:
440
+ mfld = 'm125'
441
+ M = snappy.Manifold(mfld)
442
+ HV = ViewerWindow(HoroballViewer, M.cusp_neighborhood())
443
+ HV.mainloop()
@@ -0,0 +1,212 @@
1
+ from ..matrix import make_vector, make_matrix, mat_solve
2
+
3
+ from ..sage_helper import _within_sage
4
+
5
+ """
6
+ hyperboloid contains methods relating to the hyperboloid model
7
+
8
+ { (t, x, y, z) : -t^2 + x^2 + y^2 + z^2 = -1, t > 0 }
9
+
10
+ in the Minkowski space with signature -+++.
11
+
12
+ Conventions:
13
+
14
+ Points in the space are represented as vectors of 4 real numbers.
15
+ Here vector is a vector as constructed with snappy.matrix.vector(...)
16
+ (that is either snappy's own SimpleVector or a SageMath vector type)
17
+ from a real type (either a SnapPy.Number or one
18
+ of SageMath's real types including RealIntervalField, but not python's
19
+ native float type).
20
+
21
+ Similarly, O13-matrices are represented as matrices as constructed with
22
+ snappy.matrix.matrix(...) from a real type.
23
+
24
+ Note that we mostly follow the SnapPea kernel conventions, except that
25
+ we call the same matrices O13 rather than O31. This reads better given
26
+ that the signature is -+++: O13 reflects that is the first entry in a
27
+ vector or column in matrix that has the special role corresponding to
28
+ the time component or being a time-like vector, respectively.
29
+
30
+ """
31
+
32
+
33
+ def r13_dot(u, v):
34
+ """
35
+ -+++ inner product of two 4-vectors.
36
+ """
37
+ return -u[0]*v[0] + u[1]*v[1] + u[2]*v[2] + u[3]*v[3]
38
+
39
+
40
+ def time_r13_normalise(u):
41
+ """
42
+ Given a time-like vector in Minkowski space, returns the normalised
43
+ vector (with norm -1).
44
+ """
45
+
46
+ return u / (-r13_dot(u,u)).sqrt()
47
+
48
+
49
+ def space_r13_normalise(u):
50
+ """
51
+ Given a space-like vector in Minkowski space, returns the normalised
52
+ vector (with norm 1).
53
+ """
54
+
55
+ return u / r13_dot(u,u).sqrt()
56
+
57
+
58
+ def o13_inverse(m):
59
+ """
60
+ Given a O13 matrix, return its inverse.
61
+ """
62
+
63
+ result = m.transpose()
64
+ result[0,1] = -result[0,1]
65
+ result[0,2] = -result[0,2]
66
+ result[0,3] = -result[0,3]
67
+ result[1,0] = -result[1,0]
68
+ result[2,0] = -result[2,0]
69
+ result[3,0] = -result[3,0]
70
+
71
+ return result
72
+
73
+ def so13_to_pgl2c(B):
74
+ """
75
+ Given an SO13 matrix, returns corresponding complex 2x2-matrix.
76
+ The determinant of the result is not 1 in general.
77
+
78
+ Python implementation of O31_to_Moebius (without normalization).
79
+ """
80
+
81
+ AM0A_00 = B[0,0] + B[1,0]
82
+ AM1A_00 = B[0,1] + B[1,1]
83
+ aa = AM0A_00 + AM1A_00
84
+ bb = AM0A_00 - AM1A_00
85
+
86
+ if aa > bb:
87
+ return _to_complex_matrix(
88
+ aa, 0 ,
89
+ B[0,2] + B[1,2], B[0,3] + B[1,3] ,
90
+
91
+ B[2,0] + B[2,1], -(B[3,0] + B[3,1]),
92
+ B[2,2] + B[3,3], B[2,3] - B[3,2] )
93
+ else:
94
+ return _to_complex_matrix(
95
+ B[0,2] + B[1,2], -(B[0,3] + B[1,3]),
96
+ bb , 0 ,
97
+ B[2,2] - B[3,3], -(B[2,3] + B[3,2]),
98
+ B[2,0] - B[2,1], B[3,1] - B[3,0] )
99
+
100
+ def so13_to_psl2c(m):
101
+ """
102
+ Given an SO13 matrix, returns corresponding complex 2x2-matrix
103
+ with determinant 1.
104
+
105
+ Python implementation of O31_to_Moebius (with normalization).
106
+ """
107
+
108
+ A = so13_to_pgl2c(m)
109
+ return A / A.det().sqrt()
110
+
111
+ def r13_to_klein(v):
112
+ """
113
+ Given a time-like or light-like vector, gives the respective point
114
+ in the Klein model or its boundary, respectively.
115
+ """
116
+
117
+ return make_vector([v[1] / v[0], v[2] / v[0], v[3] / v[0]])
118
+
119
+ def unit_time_vector_to_o13_hyperbolic_translation(v):
120
+ """
121
+ Takes a point (time-like unit vector) in the hyperboloid model and
122
+ returns the O13-matrix corresponding to the hyperbolic translation
123
+ moving the origin to that point (that is, the translation fixing
124
+ the geodesic between the origin and the point and introducing no
125
+ rotation about that geodesic).
126
+ """
127
+
128
+ v1 = [1 + v[0], v[1], v[2], v[3]]
129
+
130
+ m = [ [ x * y / v1[0] for x in v1] for y in v1 ]
131
+ m[0][0] -= 1
132
+ m[1][1] += 1
133
+ m[2][2] += 1
134
+ m[3][3] += 1
135
+
136
+ return make_matrix(m)
137
+
138
+
139
+ def unnormalised_plane_eqn_from_r13_points(pts):
140
+ """
141
+ Given three (finite or ideal) points in the hyperboloid model
142
+ (that is time-like or light-like vectors), compute the space-like
143
+ vector x such that the plane defined by x * y = 0 contains the
144
+ three given points.
145
+ """
146
+
147
+ return make_vector([ _det_shifted_matrix3(pts, 0),
148
+ _det_shifted_matrix3(pts, 1),
149
+ - _det_shifted_matrix3(pts, 2),
150
+ _det_shifted_matrix3(pts, 3)])
151
+
152
+
153
+ def _det_shifted_matrix3(m, i):
154
+ """
155
+ Computes determinant of 3x3 matrix obtained by picking
156
+ 3 rows from the given 3x4 matrix m.
157
+ """
158
+
159
+ i0 = (i+1) % 4
160
+ i1 = (i+2) % 4
161
+ i2 = (i+3) % 4
162
+
163
+ return ( m[0][i0] * m[1][i1] * m[2][i2]
164
+ + m[0][i1] * m[1][i2] * m[2][i0]
165
+ + m[0][i2] * m[1][i0] * m[2][i1]
166
+ - m[0][i2] * m[1][i1] * m[2][i0]
167
+ - m[0][i0] * m[1][i2] * m[2][i1]
168
+ - m[0][i1] * m[1][i0] * m[2][i2])
169
+
170
+ def compute_inradius_and_incenter_from_planes(planes):
171
+ """
172
+ Given outside-facing normals for the four faces of a
173
+ tetrahedron, compute the hyperbolic inradius and the
174
+ incenter (as unit time vector) of the tetrahedron (in the
175
+ hyperboloid model).
176
+ """
177
+
178
+ # We need to c and r such that
179
+ # * r13_dot(c, c) = -1 and
180
+ # * r13_dot(plane, c) = -sinh(r) for every plane
181
+ #
182
+ # We instead solve for the following system of linear equations:
183
+ # * r13_dot(plane, pt) = -1 for every plane
184
+
185
+ RF = planes[0][0].parent()
186
+ m = make_matrix([[-plane[0], plane[1], plane[2], plane[3]]
187
+ for plane in planes])
188
+ v = make_vector([RF(-1), RF(-1), RF(-1), RF(-1)])
189
+
190
+ pt = mat_solve(m, v)
191
+
192
+ # And then use the inverse length of pt to scale pt to be
193
+ # a unit time vector and to compute the r.
194
+ scale = 1 / (-r13_dot(pt, pt)).sqrt()
195
+
196
+ return scale.arcsinh(), scale * pt
197
+
198
+ def _to_complex_matrix(
199
+ a, b, c, d,
200
+ e, f, g, h):
201
+ RF = a.parent()
202
+ if _within_sage:
203
+ CF = RF.complex_field()
204
+ return make_matrix(
205
+ [ [ CF(a,b), CF(c, d) ],
206
+ [ CF(e,f), CF(g, h) ] ],
207
+ ring=CF)
208
+ else:
209
+ I = RF('I')
210
+ return make_matrix(
211
+ [ [ a + b * I, c + d * I ],
212
+ [ e + f * I, g + h * I ] ])