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,174 @@
1
+ from ..tiling.iter_utils import IteratorCache
2
+ from ..tiling.tile import Tile
3
+
4
+ from ..hyperboloid.distances import distance_r13_lines
5
+
6
+ from ..geometric_structure.geodesic.geodesic_start_point_info import compute_geodesic_start_point_info
7
+ from ..geometric_structure.geodesic.tiles_for_geodesic import compute_tiles_for_geodesic
8
+
9
+ from ..snap.t3mlite import simplex # type: ignore
10
+
11
+ from typing import Sequence
12
+
13
+ # Do not draw line segments of geodesic that are fully within a tube
14
+ # about a core curve of this radius.
15
+ avoid_core_curve_tube_radius = 0.1
16
+
17
+ def tiles_up_to_core_curve(tiles : Sequence[Tile]) -> Sequence[Tile]:
18
+ """
19
+ Only develop tube until the radius is 98% of the distance to
20
+ a core curve
21
+ """
22
+
23
+ min_dist_to_core_curve = 1e50
24
+
25
+ for tile in tiles:
26
+ if (tile.lower_bound_distance > 0.0001 and
27
+ not tile.lower_bound_distance < min_dist_to_core_curve * 0.98):
28
+ break
29
+
30
+ for v in simplex.ZeroSubsimplices:
31
+ tet = tile.lifted_tetrahedron.tet
32
+ core_curve = tet.core_curves.get(v, None)
33
+ if core_curve is None:
34
+ continue
35
+
36
+ dist_to_core_curve = distance_r13_lines(
37
+ core_curve.r13_line, tile.inverse_lifted_geometric_object)
38
+
39
+ # We already drop the pieces that are too close to a core curve.
40
+ min_dist_to_core_curve = min(
41
+ min_dist_to_core_curve, dist_to_core_curve)
42
+
43
+ tile.dist_to_core_curve = min_dist_to_core_curve
44
+
45
+ yield tile
46
+
47
+ class GeodesicLinePieces:
48
+ def __init__(self,
49
+ tets_and_end_points,
50
+ covered_radius,
51
+ dist_to_core_curve):
52
+ self.tets_and_end_points = tets_and_end_points
53
+ self.covered_radius = covered_radius
54
+ self.dist_to_core_curve = dist_to_core_curve
55
+
56
+ class GeodesicTubeInfo:
57
+ def __init__(self, mcomplex, word, index, is_primitive=None):
58
+ # Compute GeodesicTube
59
+ self.geodesic_start_point_info = compute_geodesic_start_point_info(mcomplex, word)
60
+
61
+ for tet in mcomplex.Tetrahedra:
62
+ for v, core_curve in tet.core_curves.items():
63
+ tet.Class[v].core_curve_tube_radius = mcomplex.RF(avoid_core_curve_tube_radius)
64
+
65
+ if not self.geodesic_start_point_info.core_curve_cusp:
66
+ self.tiles = IteratorCache(
67
+ tiles_up_to_core_curve(
68
+ compute_tiles_for_geodesic(
69
+ mcomplex,
70
+ self.geodesic_start_point_info,
71
+ avoid_core_curves=True,
72
+ for_raytracing=True)))
73
+ self._tiles_to_cover = []
74
+
75
+ # Compute complex length from trace
76
+ t = self.geodesic_start_point_info.trace
77
+ self.complex_length = _normalize_complex_length(2 * (t / 2).arccosh())
78
+
79
+ self.words = [ word ]
80
+ self.index = index
81
+
82
+ RF = t.real().parent()
83
+
84
+ self._is_primitive = is_primitive
85
+
86
+ def compute_line_pieces(self, radius) -> GeodesicLinePieces:
87
+
88
+ tets_and_end_points = []
89
+
90
+ for tile in self.tiles:
91
+ if tile.lower_bound_distance > radius:
92
+ break
93
+ tet = tile.lifted_tetrahedron.tet
94
+ tets_and_end_points.append(
95
+ (tet.Index,
96
+ [ tet.to_coordinates_in_symmetric_tet * pt
97
+ for pt in tile.inverse_lifted_geometric_object.points] ))
98
+
99
+ return GeodesicLinePieces(
100
+ tets_and_end_points,
101
+ tile.lower_bound_distance,
102
+ tile.dist_to_core_curve)
103
+
104
+ def _get_pieces_covering_geodesic(self):
105
+ if not self._tiles_to_cover:
106
+ for tile in self.tiles:
107
+ if tile.lower_bound_distance > 0:
108
+ break
109
+ self._tiles_to_cover.append(tile)
110
+ return self._tiles_to_cover
111
+
112
+ def __eq__(self, other):
113
+ diff = _normalize_complex_length(self.complex_length - other.complex_length)
114
+ if not abs(diff) < 1e-3:
115
+ return False
116
+
117
+ self_cusp = self.geodesic_start_point_info.core_curve_cusp
118
+ other_cusp = other.geodesic_start_point_info.core_curve_cusp
119
+
120
+ if self_cusp or other_cusp:
121
+ if self_cusp and other_cusp:
122
+ return self_cusp.Index == other_cusp.Index
123
+ return False
124
+
125
+ # What if we have a geodesic in the 2-skeleton.
126
+ # We should ask snappy.drilling for the two tetrahedra adjacent to
127
+ # a face.
128
+ piece = self._get_pieces_covering_geodesic()[0]
129
+ point = piece.inverse_lifted_geometric_object.points[0]
130
+ for other_piece in other._get_pieces_covering_geodesic():
131
+ if piece.lifted_tetrahedron.tet == other_piece.lifted_tetrahedron.tet:
132
+ for other_point in other_piece.inverse_lifted_geometric_object.points:
133
+ if _are_parallel_light_vectors(point, other_point, 1e-5):
134
+ return True
135
+ return False
136
+
137
+ def is_primitive(self):
138
+ if self._is_primitive is None:
139
+ self._is_primitive = self._is_primitive_uncached()
140
+ return self._is_primitive
141
+
142
+ def _is_primitive_uncached(self):
143
+ pieces = self._get_pieces_covering_geodesic()
144
+ for i, piece0 in enumerate(pieces):
145
+ for j, piece1 in enumerate(pieces):
146
+ if i < j:
147
+ if piece0.lifted_tetrahedron.tet == piece1.lifted_tetrahedron.tet:
148
+ if _are_parallel_light_vectors(
149
+ piece0.inverse_lifted_geometric_object.points[0],
150
+ piece1.inverse_lifted_geometric_object.points[0],
151
+ 1e-5):
152
+ return False
153
+ return True
154
+
155
+
156
+ def _normalize_complex_length(z):
157
+ imag = z.imag()
158
+
159
+ CF = z.parent()
160
+ RF = imag.parent()
161
+
162
+ two_pi = RF("6.283185307179586476925286766559005768394338798750")
163
+ I = CF("I")
164
+
165
+ n = (imag / two_pi - RF("0.00000001")).round()
166
+
167
+ return z - n * two_pi * I
168
+
169
+
170
+ def _are_parallel_light_vectors(a, b, epsilon):
171
+ for i in range(1, 4):
172
+ if not abs(a[i]/a[0]-b[i]/b[0]) < epsilon:
173
+ return False
174
+ return True
@@ -0,0 +1,246 @@
1
+ from .geodesic_tube_info import (GeodesicTubeInfo,
2
+ GeodesicLinePieces,
3
+ avoid_core_curve_tube_radius)
4
+ from .pack import pack_tet_data
5
+ from .upper_halfspace_utilities import add_coordinate_transform_to_mcomplex
6
+ from .hyperboloid_utilities import O13_orthonormalise
7
+
8
+ from ..geometric_structure import (add_r13_geometry,
9
+ add_filling_information)
10
+ from ..geometric_structure.geodesic.add_core_curves import add_r13_core_curves
11
+ from ..tiling.triangle import add_triangles_to_tetrahedra
12
+ from ..snap.t3mlite import Mcomplex, simplex
13
+ from ..matrix import make_matrix # type: ignore
14
+
15
+ import traceback
16
+
17
+ class LengthSpectrumError(RuntimeError):
18
+ pass
19
+
20
+ class Geodesics:
21
+ def __init__(self, manifold, words):
22
+ """
23
+
24
+ >>> M = Manifold("o9_00000")
25
+ >>> g = Geodesics(M, ["b", "c"])
26
+ >>> g.set_enables_and_radii_and_update([True, True], [0.3, 0.4])
27
+ True
28
+ >>> b = g.get_uniform_bindings()
29
+ >>> len(b['geodesics.geodesicHeads'][1])
30
+ 31
31
+ >>> len(b['geodesics.geodesicOffsets'][1])
32
+ 10
33
+ """
34
+
35
+ self.manifold = manifold
36
+ self.mcomplex = None
37
+
38
+ self.geodesic_tube_infos = [
39
+ GeodesicTubeInfo(
40
+ self.get_mcomplex(),
41
+ word,
42
+ index)
43
+ for index, word in enumerate(words) ]
44
+
45
+ self.num_tetrahedra = manifold.num_tetrahedra()
46
+ self.RF = manifold.tetrahedra_shapes('rect')[0].real().parent()
47
+
48
+ self._uniform_bindings = {}
49
+ self._num = 0
50
+
51
+ def set_enables_and_radii_and_update(self, enables, radii):
52
+
53
+ # Returns false when a tube was so big that it was intersecting
54
+ # a core curve and it had to be shrunk.
55
+
56
+ success = True
57
+
58
+ if not self.geodesic_tube_infos:
59
+ return success
60
+
61
+ tets_to_data = [ [] for i in range(self.num_tetrahedra) ]
62
+
63
+ a_radius = self.RF(avoid_core_curve_tube_radius)
64
+
65
+ for i, (enable, radius, geodesic_tube) in enumerate(
66
+ zip(enables, radii, self.geodesic_tube_infos)):
67
+ if enable:
68
+ radius = self.RF(radius)
69
+
70
+ line_pieces : GeodesicLinePieces = (
71
+ geodesic_tube.compute_line_pieces(radius))
72
+
73
+ if (line_pieces.covered_radius < radius or
74
+ line_pieces.dist_to_core_curve < radius or
75
+ line_pieces.dist_to_core_curve < a_radius):
76
+ success = False
77
+
78
+ # A user can always force the tube to have this radius.
79
+ # Even though it might be incomplete at that point.
80
+ min_user_radius = 0.1
81
+
82
+ effective_radius = min(
83
+ radius,
84
+ max(line_pieces.covered_radius, self.RF(min_user_radius)))
85
+
86
+ radius_param = effective_radius.cosh() ** 2 / 2
87
+
88
+ for tet, (head, tail) in line_pieces.tets_and_end_points:
89
+ tets_to_data[tet].append(
90
+ {'Heads' : ('vec4', head),
91
+ 'Tails' : ('vec4', tail),
92
+ 'Index' : ('int', i),
93
+ 'TubeRadiusParam' : ('float', radius_param)})
94
+
95
+ self._uniform_bindings, self._num = pack_tet_data(
96
+ 'geodesics.geodesic', tets_to_data)
97
+
98
+ return success
99
+
100
+ def get_uniform_bindings(self):
101
+ return self._uniform_bindings
102
+
103
+ def get_compile_time_defs(self):
104
+ if self._num > 0:
105
+ num = max(100, self._num)
106
+ else:
107
+ num = 0
108
+
109
+ return { 'num_geodesic_segments' : num }
110
+
111
+ def add_length_spectrum(self, l):
112
+
113
+ try:
114
+ L = self.manifold.length_spectrum(
115
+ l, grouped=False, include_words=True)
116
+ except RuntimeError as e:
117
+ raise LengthSpectrumError(*e.args) from e
118
+
119
+ exception = None
120
+
121
+ num_original = len(self.geodesic_tube_infos)
122
+
123
+ for g in L:
124
+ try:
125
+ self.add_word(g['word'], is_primitive=True)
126
+ except Exception as e:
127
+ traceback.print_exc()
128
+ print("Geodesic is ", dict(g))
129
+ exception = e
130
+
131
+ if exception:
132
+ raise exception
133
+
134
+ return len(self.geodesic_tube_infos) > num_original
135
+
136
+ def add_word(self, word, is_primitive=None):
137
+ geodesic_tube_info = GeodesicTubeInfo(
138
+ self.get_mcomplex(),
139
+ word,
140
+ index=len(self.geodesic_tube_infos),
141
+ is_primitive=is_primitive)
142
+
143
+ for i, other in enumerate(self.geodesic_tube_infos):
144
+ if other == geodesic_tube_info:
145
+ if word not in other.words:
146
+ other.words.append(word)
147
+ return i
148
+
149
+ self.geodesic_tube_infos.append(geodesic_tube_info)
150
+
151
+ return len(self.geodesic_tube_infos) - 1
152
+
153
+ def geodesics_sorted_by_length(self):
154
+ return sorted(self.geodesic_tube_infos,
155
+ key=compute_geodesic_tube_info_key)
156
+
157
+ def get_mcomplex(self):
158
+ if self.mcomplex is None:
159
+ self.mcomplex = Mcomplex(self.manifold)
160
+ add_r13_geometry(
161
+ self.mcomplex, self.manifold)
162
+ add_filling_information(
163
+ self.mcomplex, self.manifold)
164
+ add_r13_core_curves(
165
+ self.mcomplex, self.manifold)
166
+ add_triangles_to_tetrahedra(self.mcomplex)
167
+ add_coordinate_transform_to_mcomplex(self.mcomplex)
168
+
169
+ return self.mcomplex
170
+
171
+ def view_state_for_geodesic(self, index):
172
+ geodesic_start_point_info = self.geodesic_tube_infos[index].geodesic_start_point_info
173
+ p0, p1 = geodesic_start_point_info.line.r13_line.points
174
+
175
+ ring = p0[0].parent()
176
+
177
+ # Rotate the camera so that it is looking down the x-Axis
178
+ r = make_matrix([[1, 0, 0, 0],
179
+ [0, 0, 0, 1],
180
+ [0, 1, 0, 0],
181
+ [0, 0, 1, 0]],
182
+ ring=ring)
183
+
184
+ # Create a transform that takes the origin to a point on the
185
+ # geodesic and takes the tangent vector at the origin parallel
186
+ # to the x-Axis to a vector tangent to the geodesic.
187
+ #
188
+ # Note that the orthonormalisation processes the columns from left
189
+ # to right. This is exactly what we want.
190
+ #
191
+ g = O13_orthonormalise(
192
+ make_matrix(
193
+ [ p0 + p1, # (Projective) point on the geodesic.
194
+ # Orthonormalisation just normalizes it
195
+ # so that it is on the hyperboloid.
196
+ p0 - p1, # Direction of geodesic.
197
+ # Orthonormalisation just projects it into
198
+ # the tangent space of the hyperboloid
199
+ # at the above point and normalizes it.
200
+ [ 0, 1, 0, 0], # Some other vectors so that
201
+ [ 0, 0, 1, 0]], # orthonormalisation produces a camera frame.
202
+ ring=ring).transpose())
203
+
204
+ # Change coordinate system used for computation of geodesics
205
+ # to the one used by the raytracing code.
206
+ tet_index = 0
207
+ tet = self.get_mcomplex().Tetrahedra[tet_index]
208
+ c = tet.to_coordinates_in_symmetric_tet
209
+
210
+ return c * g * r, tet_index, 0.0
211
+
212
+ def compute_geodesic_tube_info_key(geodesic_tube_info):
213
+ l = geodesic_tube_info.complex_length
214
+
215
+ return (int(l.real() * 1e5),
216
+ int(abs(l.imag() * 1e5)), # Pair complex conjugate lengths
217
+ l.imag() > 1e-5, # Making the one with negative imag part first
218
+ geodesic_tube_info.index)
219
+
220
+
221
+ def _hsv2rgb_helper(hue, saturation, value, x):
222
+ p = abs(((hue + x / 3.0) % 1.0) * 6.0 - 3.0)
223
+ c = min(max(p - 1.0, 0.0), 1.0)
224
+ return value * (1.0 + saturation * (c - 1.0))
225
+
226
+
227
+ def hsv2rgb(hue, saturation, value):
228
+ """
229
+ Reimplementation of hsv2rgb from fragment.glsl.
230
+ """
231
+
232
+ return [ _hsv2rgb_helper(hue, saturation, value, x)
233
+ for x in [ 0.0, 2.0, 1.0 ] ]
234
+
235
+
236
+ def geodesic_index_to_color(i):
237
+ """
238
+ Reimplementation of object_type_geodesic_tube case of
239
+ material_params from fragment.glsl.
240
+ """
241
+
242
+ golden_angle_by_2_pi = 0.3819660112501051
243
+
244
+ return hsv2rgb(golden_angle_by_2_pi * i + 0.1, 1.0, 1.0)
245
+
246
+
@@ -0,0 +1,258 @@
1
+ import sys
2
+ import tkinter
3
+ from tkinter import ttk
4
+
5
+ from .gui_utilities import UniformDictController, ScrollableFrame
6
+ from .tooltip import ToolTip
7
+ from .geodesics import geodesic_index_to_color, LengthSpectrumError
8
+ from ..geometric_structure.geodesic.exceptions import WordAppearsToBeParabolic
9
+ from ..SnapPy import word_as_list # type: ignore
10
+
11
+
12
+ class GeodesicsWindow(tkinter.Toplevel):
13
+ checkbox_column = 0
14
+ color_column = 1
15
+ words_column = 2
16
+ length_column = 3
17
+ radius_column = 5
18
+ view_column = 7
19
+
20
+ headings = (
21
+ # (text, column, weight, span)
22
+ ('Show', checkbox_column, 0, 1),
23
+ ('Color', color_column, 0, 1),
24
+ ('Word(s)', words_column, 0, 1),
25
+ ('Complex length', length_column, 0, 2),
26
+ ('Radius', radius_column, 0, 1),
27
+ (' ', 6, 0, 1),
28
+ ('View', view_column, 0, 1))
29
+
30
+ def __init__(self, inside_viewer, *args, **kwards):
31
+ # Disable the minimize button when we get to use Tk 8.7
32
+ tkinter.Toplevel.__init__(self, class_='snappy')
33
+ if sys.platform == 'darwin' and tkinter.TkVersion > 8.6:
34
+ self.wm_attributes('-stylemask', ('titled', 'closable'))
35
+ self.title('Geodesics in %s' % inside_viewer.widget.manifold)
36
+
37
+ self.inside_viewer = inside_viewer
38
+ self.raytracing_view = inside_viewer.widget
39
+
40
+ self.frame = ttk.Frame(self)
41
+ self.frame.pack(expand=True, fill=tkinter.BOTH)
42
+ self.frame.columnconfigure(0, weight=1)
43
+
44
+ top_frame = ttk.Frame(self.frame)
45
+ top_frame.pack()
46
+
47
+ left_top_frame = ttk.Frame(top_frame)
48
+ left_top_frame.pack(side=tkinter.LEFT, padx=20)
49
+
50
+ self.length_var = tkinter.StringVar(value=1.1)
51
+
52
+ self.length_box = ttk.Spinbox(
53
+ left_top_frame,
54
+ from_=0.2, to=20.0, increment=0.2,
55
+ textvariable=self.length_var,
56
+ width=4)
57
+ self.length_box.grid(row=0, column=0)
58
+ self.length_box.bind('<Return>', self.add_length_spectrum)
59
+ self.length_box.focus_set()
60
+
61
+ self.length_button = ttk.Button(
62
+ left_top_frame,
63
+ text="Add up to length",
64
+ command=self.add_length_spectrum)
65
+ self.length_button.grid(row=0, column=1)
66
+
67
+ right_top_frame = ttk.Frame(top_frame)
68
+ right_top_frame.pack(side=tkinter.LEFT, padx=20)
69
+
70
+ self.word_entry = ttk.Entry(right_top_frame)
71
+ self.word_entry.grid(row=0, column=0)
72
+ self.word_entry.bind('<Return>', self.add_word)
73
+ self.word_button = ttk.Button(
74
+ right_top_frame, text="Add word", command=self.add_word)
75
+ self.word_button.grid(row=0, column=1)
76
+
77
+ self.status_label = ttk.Label(
78
+ self.frame, text=_default_status_msg)
79
+ self.status_label.pack()
80
+
81
+ self.scrollable_frame = ScrollableFrame(self.frame)
82
+ self.scrollable_frame.pack(fill="y", anchor="n", expand=True)
83
+
84
+ self.geodesics_frame = self.scrollable_frame.scrollable_frame
85
+ self.populate_geodesics_frame()
86
+ self.scrollable_frame.headings(self.headings)
87
+
88
+ def _geodesics(self):
89
+ return self.raytracing_view.additional_structures['geodesics']
90
+
91
+ def populate_geodesics_frame(self):
92
+ for widget in self.geodesics_frame.grid_slaves():
93
+ widget.destroy()
94
+
95
+ row = 0
96
+
97
+ for geodesic in self._geodesics().geodesics_sorted_by_length():
98
+ if not geodesic.geodesic_start_point_info.core_curve_cusp:
99
+ UniformDictController.create_checkbox(
100
+ self.geodesics_frame,
101
+ self.raytracing_view.ui_parameter_dict,
102
+ key='geodesicTubeEnables',
103
+ index=geodesic.index,
104
+ row=row,
105
+ column=self.checkbox_column,
106
+ update_function=self.geodesic_checkbox_clicked)
107
+
108
+ text = ', '.join(geodesic.words)
109
+ if not geodesic.is_primitive():
110
+ text += ' (not primitive)'
111
+
112
+ l = ttk.Label(self.geodesics_frame, text=text)
113
+ l.grid(row=row, column=self.words_column)
114
+
115
+ l = ttk.Label(self.geodesics_frame,
116
+ text='%.8f' % geodesic.complex_length.real())
117
+ l.grid(row=row, column=self.length_column)
118
+
119
+ im_length = geodesic.complex_length.imag()
120
+ abs_im_length = im_length.abs()
121
+
122
+ if abs_im_length > 1e-10:
123
+ s = '+' if im_length > 0 else '-'
124
+
125
+ l = ttk.Label(self.geodesics_frame,
126
+ text=s + ' %.8f * I' % abs_im_length)
127
+ l.grid(row=row, column=self.length_column + 1)
128
+
129
+ color = geodesic_index_to_color(geodesic.index)
130
+
131
+ if geodesic.geodesic_start_point_info.core_curve_cusp:
132
+ cusp_index = geodesic.geodesic_start_point_info.core_curve_cusp.Index
133
+ l = tkinter.Label(self.geodesics_frame,
134
+ text="Cusp %d" % cusp_index)
135
+ else:
136
+ l = tkinter.Label(self.geodesics_frame,
137
+ text="Color",
138
+ fg=color_to_tkinter(color),
139
+ bg=color_to_tkinter(color))
140
+ l.grid(row=row, column=self.color_column, padx=5)
141
+
142
+ if geodesic.geodesic_start_point_info.core_curve_cusp:
143
+ l = tkinter.Label(self.geodesics_frame,
144
+ text="Use Cusp areas tab")
145
+ l.grid(row=row, column=self.radius_column, padx=5)
146
+ else:
147
+ scale = UniformDictController.create_horizontal_scale(
148
+ self.geodesics_frame,
149
+ self.raytracing_view.ui_parameter_dict,
150
+ key='geodesicTubeRadii',
151
+ index=geodesic.index,
152
+ row=row,
153
+ column=self.radius_column,
154
+ left_end=0.0,
155
+ right_end=1.0,
156
+ update_function=self.update_geodesic_data,
157
+ format_string='%.3f')
158
+
159
+ # Need to color Scale - but the following code fails.
160
+ # scale.configure(background = color_to_tkinter(color))
161
+
162
+ if not geodesic.geodesic_start_point_info.core_curve_cusp:
163
+ btn = ttk.Button(
164
+ self.geodesics_frame,
165
+ text='View',
166
+ takefocus=0,
167
+ command=lambda i=geodesic.index: self.view_geodesic(i))
168
+ ToolTip(btn,
169
+ msg="Move camera onto geodesic looking down the geodesic")
170
+ btn.grid(row=row, column=self.view_column)
171
+
172
+ row += 1
173
+ self.scrollable_frame.set_widths()
174
+
175
+ def update_geodesic_data(self):
176
+ success = self.raytracing_view.update_geodesic_data_and_redraw()
177
+ if success:
178
+ self.status_label.configure(text=_default_status_msg,
179
+ foreground='')
180
+ else:
181
+ self.status_label.configure(
182
+ text=('Geodesic tube intersects core curve. Dropping '
183
+ 'pieces/limiting size.'),
184
+ foreground='red')
185
+
186
+ def add_length_spectrum(self, *args, **kwargs):
187
+ self.status_label.configure(text=_default_status_msg, foreground='')
188
+
189
+ try:
190
+ if not self._geodesics().add_length_spectrum(
191
+ float(self.length_box.get())):
192
+ self.status_label.configure(text='No new geodesics found.',
193
+ foreground='')
194
+ except LengthSpectrumError as e:
195
+ self.status_label.configure(
196
+ text=' '.join(e.args), foreground='red')
197
+ return
198
+ except Exception as e:
199
+ self.status_label.configure(
200
+ text='An error has occurred. See terminal for details.',
201
+ foreground='red')
202
+
203
+ self.raytracing_view.resize_geodesic_params()
204
+
205
+ self.populate_geodesics_frame()
206
+
207
+ def add_word(self, *args, **kwargs):
208
+ word = self.word_entry.get()
209
+
210
+ if len(word) == 0:
211
+ self.status_label.configure(text="Word is empty",
212
+ foreground='red')
213
+ return
214
+
215
+ try:
216
+ n = self._geodesics().get_mcomplex().num_generators
217
+ word_as_list(word, n)
218
+ except ValueError:
219
+ self.status_label.configure(text=word + " contains non-generators",
220
+ foreground='red')
221
+ return
222
+
223
+ try:
224
+ index = self._geodesics().add_word(word)
225
+ except WordAppearsToBeParabolic:
226
+ self.status_label.configure(text=word + " is parabolic",
227
+ foreground='red')
228
+ return
229
+
230
+ self.status_label.configure(text=_default_status_msg,
231
+ foreground='')
232
+
233
+ self.raytracing_view.resize_geodesic_params()
234
+ self.raytracing_view.enable_geodesic(index)
235
+ if self.raytracing_view.disable_edges_for_geodesics():
236
+ self.inside_viewer.update_edge_and_insphere_controllers()
237
+
238
+ self.update_geodesic_data()
239
+
240
+ self.populate_geodesics_frame()
241
+
242
+ def geodesic_checkbox_clicked(self):
243
+ if self.raytracing_view.disable_edges_for_geodesics():
244
+ self.inside_viewer.update_edge_and_insphere_controllers()
245
+ self.update_geodesic_data()
246
+
247
+ def view_geodesic(self, i):
248
+ self.raytracing_view.view_state = (
249
+ self.raytracing_view.raytracing_data.update_view_state(
250
+ self._geodesics().view_state_for_geodesic(i)))
251
+ self.inside_viewer.set_perspective_type_and_view_scale(1, 1.0)
252
+
253
+ def color_to_tkinter(color):
254
+ return "#%.3x%.3x%.3x" % tuple([min(max(int(x * 4095), 0), 4095)
255
+ for x in color])
256
+
257
+
258
+ _default_status_msg = "Words are in unsimplified fundamental group Manifold.fundamental_group(False)"