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,592 @@
1
+ from ..snap import t3mlite as t3m
2
+ from ..snap.t3mlite import simplex
3
+ from .. import Triangulation
4
+
5
+ from ..matrix import make_matrix, make_vector
6
+
7
+ from ..snap.mcomplex_base import *
8
+ from ..geometric_structure.cusp_neighborhood.complex_cusp_cross_section import ComplexCuspCrossSection
9
+ from ..geometric_structure import add_r13_planes_to_tetrahedra
10
+ from ..upper_halfspace import pgl2c_to_o13, sl2c_inverse
11
+ from ..upper_halfspace.ideal_point import ideal_point_to_r13
12
+
13
+ from .hyperboloid_utilities import *
14
+ from .upper_halfspace_utilities import *
15
+
16
+ from .raytracing_data import *
17
+
18
+ __all__ = ['IdealRaytracingData']
19
+
20
+
21
+ class IdealRaytracingData(RaytracingData):
22
+ """
23
+ Given a SnapPy manifold, computes data for the shader fragment.glsl
24
+ to raytrace the inside view::
25
+
26
+ >>> data = IdealRaytracingData.from_manifold(Manifold("m004"))
27
+ >>> data = IdealRaytracingData.from_manifold(ManifoldHP("m004"))
28
+
29
+ The values that need to be pushed into the shader's uniforms can
30
+ be obtained as dictionary::
31
+
32
+ >>> data.get_uniform_bindings() # doctest: +ELLIPSIS
33
+ {...}
34
+
35
+ The compile time constants can similarly be obtained as dictionary::
36
+
37
+ >>> data.get_compile_time_constants() # doctest: +ELLIPSIS
38
+ {...}
39
+
40
+ The shader needs to know in what tetrahedron and where in the tetrahedron
41
+ the camera is. This is encoded as pair matrix and tetrahedron index::
42
+
43
+ >>> view_state = (make_matrix([[ 1.0, 0.0, 0.0, 0.0],
44
+ ... [ 0.0, 1.0, 0.0, 0.0],
45
+ ... [ 0.0, 0.0, 0.0,-1.0],
46
+ ... [ 0.0, 0.0, 1.0, 0.0]]), 0, 0.0)
47
+
48
+ To move/rotate the camera which might potentially put the camera
49
+ into a different tetrahedron, the new pair can be computed as
50
+ follows::
51
+
52
+ >>> m = make_matrix([[ 3.0 , 0.0 , 2.82, 0.0 ],
53
+ ... [ 0.0 , 1.0 , 0.0 , 0.0 ],
54
+ ... [ 2.82, 0.0 , 3.0 , 0.0 ],
55
+ ... [ 0.0 , 0.0 , 0.0 , 1.0 ]])
56
+ >>> view_state = data.update_view_state(view_state, m)
57
+ >>> view_state # doctest: +NUMERIC6
58
+ ([ 1.08997684 1e-16 0.43364676 1e-16 ]
59
+ [ 1e-16 -1.00000000 1e-16 1e-16 ]
60
+ [ -0.43364676 1e-16 -1.08997684 1e-16 ]
61
+ [ 1e-16 1e-16 1e-16 1.00000000 ], 1, 0.0)
62
+
63
+ """
64
+
65
+ @staticmethod
66
+ def from_manifold(manifold,
67
+ areas=None, insphere_scale=0.05, weights=None):
68
+
69
+ if manifold.solution_type() != 'all tetrahedra positively oriented':
70
+ return NonGeometricRaytracingData.from_manifold(manifold)
71
+
72
+ num_cusps = manifold.num_cusps()
73
+
74
+ # Make a copy of the manifold. On the copy, we can set all
75
+ # the Dehn-fillings to (0,0) so that gluing_equations gives
76
+ # us both the meridian and longitude.
77
+ snappy_trig = Triangulation(manifold)
78
+ snappy_trig.dehn_fill(num_cusps * [(0,0)])
79
+
80
+ # Develops the cusps of the manifold. This is needed to
81
+ # compute the data for the horospheres (complete cusps)
82
+ # or "Margulis tubes" (incomplete cusps).
83
+ c = ComplexCuspCrossSection.fromManifoldAndShapes(
84
+ manifold,
85
+ manifold.tetrahedra_shapes('rect'),
86
+ one_cocycle='develop')
87
+ c.normalize_cusps()
88
+ c.compute_translations()
89
+ c.add_vertex_positions_to_horotriangles()
90
+ c.lift_vertex_positions_of_horotriangles()
91
+ c.move_lifted_vertex_positions_to_zero_first()
92
+
93
+ # c.mcomplex is the same triangulation encoded as
94
+ # t3m.Mcomplex triangulation
95
+ r = IdealRaytracingData(c.mcomplex, manifold)
96
+
97
+ z = c.mcomplex.Tetrahedra[0].ShapeParameters[t3m.E01]
98
+ r.RF = z.real().parent()
99
+ r.insphere_scale = r.RF(insphere_scale)
100
+ resolved_areas = num_cusps * [ 1.0 ] if areas is None else areas
101
+ r.areas = [ r.RF(area) for area in resolved_areas ]
102
+
103
+ r.peripheral_gluing_equations = snappy_trig.gluing_equations()[
104
+ snappy_trig.num_tetrahedra():]
105
+
106
+ r.log_shapes = [
107
+ tet.ShapeParameters[e].log()
108
+ for tet in c.mcomplex.Tetrahedra
109
+ for e in [ t3m.E01, t3m.E02, t3m.E03 ] ]
110
+
111
+ r._add_complex_vertices()
112
+ r._add_R13_vertices()
113
+ r._add_O13_matrices_to_faces()
114
+ add_r13_planes_to_tetrahedra(c.mcomplex)
115
+ r._add_R13_horosphere_scales_to_vertices()
116
+ r._add_cusp_to_tet_matrices()
117
+ r._add_margulis_tube_ends()
118
+ r._add_inspheres()
119
+ r._add_to_standard_torus_matrices()
120
+
121
+ r._add_cusp_triangle_vertex_positions()
122
+
123
+ r.add_weights(weights)
124
+ return r
125
+
126
+ def __init__(self, mcomplex, snappy_manifold):
127
+ super().__init__(mcomplex)
128
+ self.snappy_manifold = snappy_manifold
129
+
130
+ def _add_O13_matrices_to_faces(self):
131
+ for tet in self.mcomplex.Tetrahedra:
132
+ tet.O13_matrices = {
133
+ F: _o13_matrix_for_face(tet, F)
134
+ for F in t3m.TwoSubsimplices }
135
+
136
+ def _add_complex_vertices(self):
137
+ for tet in self.mcomplex.Tetrahedra:
138
+ tet.complex_vertices = dict(zip(
139
+ t3m.ZeroSubsimplices,
140
+ symmetric_vertices_for_tetrahedron(
141
+ tet.ShapeParameters[t3m.E01])))
142
+
143
+ def _add_R13_vertices(self):
144
+ for tet in self.mcomplex.Tetrahedra:
145
+ tet.R13_vertices = {
146
+ V: ideal_point_to_r13(z, self.RF)
147
+ for V, z in tet.complex_vertices.items() }
148
+ tet.R13_vertex_products = {
149
+ e: r13_dot(tet.R13_vertices[simplex.Head[e]],
150
+ tet.R13_vertices[simplex.Tail[e]])
151
+ for e in simplex.OneSubsimplices }
152
+
153
+ def _compute_R13_horosphere_scale_for_vertex(self, tet, V0):
154
+ vertex = tet.Class[V0]
155
+ if not vertex.is_complete:
156
+ return 0.0
157
+ area = self.areas[vertex.Index]
158
+ if area < 1e-6:
159
+ return 0.0
160
+
161
+ V1, V2, _ = t3m.VerticesOfFaceCounterclockwise[t3m.comp(V0)]
162
+
163
+ cusp_length = tet.horotriangles[V0].get_real_lengths()[V0 | V1 | V2]
164
+
165
+ scale_for_unit_length = (
166
+ -2 * tet.R13_vertex_products[V1 | V2] / (
167
+ tet.R13_vertex_products[V0 | V1] *
168
+ tet.R13_vertex_products[V0 | V2])).sqrt()
169
+
170
+ return scale_for_unit_length / (cusp_length * area.sqrt())
171
+
172
+ def _add_R13_horosphere_scales_to_vertices(self):
173
+ for tet in self.mcomplex.Tetrahedra:
174
+ tet.R13_horosphere_scales = {
175
+ V : self._compute_R13_horosphere_scale_for_vertex(tet, V)
176
+ for V in t3m.ZeroSubsimplices }
177
+
178
+ def _add_cusp_triangle_vertex_positions(self):
179
+ for tet in self.mcomplex.Tetrahedra:
180
+ tet.cusp_triangle_vertex_positions = {
181
+ V : _compute_cusp_triangle_vertex_positions(tet, V, i)
182
+ for i, V in enumerate(t3m.ZeroSubsimplices) }
183
+
184
+ def _add_cusp_to_tet_matrices(self):
185
+ for tet in self.mcomplex.Tetrahedra:
186
+ m = [ (V, _compute_cusp_to_tet_and_inverse_matrices(tet, V, i))
187
+ for i, V in enumerate(t3m.ZeroSubsimplices) ]
188
+ tet.cusp_to_tet_matrices = {
189
+ V : m1 for V, (m1, m2) in m }
190
+ tet.tet_to_cusp_matrices = {
191
+ V : m2 for V, (m1, m2) in m }
192
+
193
+ def _add_margulis_tube_ends(self):
194
+ for tet in self.mcomplex.Tetrahedra:
195
+ tet.margulisTubeEnds = {
196
+ vertex : _compute_margulis_tube_ends(tet, vertex)
197
+ for vertex in t3m.ZeroSubsimplices }
198
+
199
+ def _add_inspheres(self):
200
+ for tet in self.mcomplex.Tetrahedra:
201
+ tet.inradius = tet.R13_planes[t3m.F0][0].arcsinh()
202
+
203
+ tmp = tet.inradius * self.insphere_scale
204
+
205
+ tet.cosh_sqr_inradius = tmp.cosh() ** 2
206
+
207
+ def _add_to_standard_torus_matrix(self, cusp):
208
+ i = cusp.Index
209
+
210
+ if cusp.is_complete:
211
+ m_param, l_param = cusp.Translations
212
+ else:
213
+ m_param, l_param = (
214
+ sum(log_shape * expo
215
+ for log_shape, expo
216
+ in zip(self.log_shapes, self.peripheral_gluing_equations[2 * i + j]))
217
+ for j in range(2) )
218
+
219
+ a, c = m_param.real(), m_param.imag()
220
+ b, d = l_param.real(), l_param.imag()
221
+
222
+ det = a*d - b * c
223
+ cusp.to_standard_torus_matrix = make_matrix([[d,-b], [-c, a]]) / det
224
+
225
+ if cusp.is_complete:
226
+ cusp.margulisTubeRadiusParam = 0.0
227
+ else:
228
+ area_ratio = self.areas[i] / abs(det)
229
+
230
+ # Imagine a cone above 0 in the upper half space model with slope s
231
+ # that is, it intersects the plane at Euclidean height 1 in a circle
232
+ # of Euclidean radius s.
233
+ #
234
+ # Let C be the boundary of the upper half space without infinity.
235
+ # Consider a small rectangle with lengths dtheta and dr in C using
236
+ # polar coordinates.
237
+ # The intersection of extrusion of this rectangle with the
238
+ # boundary of the cone is spanned by two tangent vectors with
239
+ # Euclidean lengths
240
+ #
241
+ # r * dtheta and sqrt(1 + 1/s^2) * dr.
242
+ #
243
+ # The corresponding hyperbolic lengths are
244
+ #
245
+ # r / (r/s) * dtheta and sqrt(1 + 1/s^2) / (r/s) * dr
246
+ #
247
+ # Thus, the area of the intersection is
248
+ #
249
+ # dA = s * sqrt(1 + s^2) * dtheta * dr/r
250
+ #
251
+ # If m and l are the log lifts of the the holonomies of the
252
+ # meridian and longitudes in C^*, then we get for the area
253
+ #
254
+ # A = s * sqrt(1 + s^2) * (m wedge l)
255
+ #
256
+ # Recall that s = sinh R where R is the hyperbolic radius of the
257
+ # tube. The tube parameter we need to compute the intersection with
258
+ # a geodesic (in the shader) is given by T = cosh(R)^2/2.
259
+ #
260
+ # Letting A_0 = A / (m wedge l), we have
261
+ # A_0 = sinh R * cosh R = 1/2 sinh(2 * R)
262
+ # R = 1/2 arcsinh(A_0)
263
+ # T = 1/4 (1 + sqrt(1 + 4 * A_0^2))
264
+
265
+ a = 1 + 4 * area_ratio ** 2
266
+ cusp.margulisTubeRadiusParam = (1 + a.sqrt()) / 4
267
+
268
+ def _add_to_standard_torus_matrices(self):
269
+ for cusp in self.mcomplex.Vertices:
270
+ self._add_to_standard_torus_matrix(cusp)
271
+
272
+ def get_uniform_bindings(self):
273
+ # _check_consistency(self.mcomplex)
274
+
275
+ d = super().get_uniform_bindings()
276
+
277
+ orientations = [
278
+ +1 if tet.ShapeParameters[t3m.E01].imag() > 0 else -1
279
+ for tet in self.mcomplex.Tetrahedra ]
280
+
281
+ horosphere_scales = [
282
+ tet.R13_horosphere_scales[V]
283
+ for tet in self.mcomplex.Tetrahedra
284
+ for V in t3m.ZeroSubsimplices ]
285
+
286
+ margulisTubeTails = [
287
+ tet.margulisTubeEnds[V][0]
288
+ for tet in self.mcomplex.Tetrahedra
289
+ for V in t3m.ZeroSubsimplices ]
290
+
291
+ margulisTubeHeads = [
292
+ tet.margulisTubeEnds[V][1]
293
+ for tet in self.mcomplex.Tetrahedra
294
+ for V in t3m.ZeroSubsimplices ]
295
+
296
+ margulisTubeRadiusParams = [
297
+ tet.Class[V].margulisTubeRadiusParam
298
+ for tet in self.mcomplex.Tetrahedra
299
+ for V in t3m.ZeroSubsimplices ]
300
+
301
+ cusp_to_tet_matrices = [
302
+ tet.cusp_to_tet_matrices[V]
303
+ for tet in self.mcomplex.Tetrahedra
304
+ for V in t3m.ZeroSubsimplices ]
305
+
306
+ tet_to_cusp_matrices = [
307
+ tet.tet_to_cusp_matrices[V]
308
+ for tet in self.mcomplex.Tetrahedra
309
+ for V in t3m.ZeroSubsimplices ]
310
+
311
+ cusp_translations = [
312
+ [ [ z.real(), z.imag() ]
313
+ for z in tet.Class[V].Translations ]
314
+ for tet in self.mcomplex.Tetrahedra
315
+ for V in t3m.ZeroSubsimplices ]
316
+
317
+ logAdjustments = [
318
+ complex_to_pair(tet.cusp_triangle_vertex_positions[V][0])
319
+ for tet in self.mcomplex.Tetrahedra
320
+ for V in t3m.ZeroSubsimplices ]
321
+
322
+ cuspTriangleVertexPositions = [
323
+ tet.cusp_triangle_vertex_positions[V][1]
324
+ for tet in self.mcomplex.Tetrahedra
325
+ for V in t3m.ZeroSubsimplices
326
+ ]
327
+
328
+ toStandardTorusMatrices = [
329
+ tet.Class[V].to_standard_torus_matrix
330
+ for tet in self.mcomplex.Tetrahedra
331
+ for V in t3m.ZeroSubsimplices ]
332
+
333
+ insphereRadiusParams = [
334
+ tet.cosh_sqr_inradius
335
+ for tet in self.mcomplex.Tetrahedra ]
336
+
337
+ isNonGeometric = (
338
+ self.snappy_manifold.solution_type() != 'all tetrahedra positively oriented')
339
+
340
+ d['orientations'] = ('int[]', orientations)
341
+ d['horosphereScales'] = ('float[]', horosphere_scales)
342
+ d['MargulisTubes.margulisTubeTails'] = ('vec4[]', margulisTubeTails)
343
+ d['MargulisTubes.margulisTubeHeads'] = ('vec4[]', margulisTubeHeads)
344
+ d['margulisTubeRadiusParams'] = ('float[]', margulisTubeRadiusParams)
345
+ d['TetCuspMatrices.cuspToTetMatrices'] = ('mat4[]', cusp_to_tet_matrices)
346
+ d['TetCuspMatrices.tetToCuspMatrices'] = ('mat4[]', tet_to_cusp_matrices)
347
+ d['cuspTranslations'] = ('mat2[]', cusp_translations)
348
+ d['logAdjustments'] = ('vec2[]', logAdjustments)
349
+ d['cuspTriangleVertexPositions'] = ('mat3x2[]', cuspTriangleVertexPositions)
350
+ d['toStandardTorusMatrices'] = ('mat2[]', toStandardTorusMatrices)
351
+ d['insphereRadiusParams'] = ('float[]', insphereRadiusParams)
352
+ d['isNonGeometric'] = ('bool', isNonGeometric)
353
+ d['nonGeometricTexture'] = ('int', 0)
354
+ d['eyeTexture'] = ('int', 1)
355
+
356
+ return d
357
+
358
+ def get_compile_time_constants(self):
359
+ d = super().get_compile_time_constants()
360
+ d[b'##finiteTrig##'] = 0
361
+ return d
362
+
363
+ def initial_view_state(self):
364
+ boost = make_matrix([[1.0,0.0,0.0,0.0],
365
+ [0.0,1.0,0.0,0.0],
366
+ [0.0,0.0,1.0,0.0],
367
+ [0.0,0.0,0.0,1.0]])
368
+ tet_num = 0
369
+ weight = 0.0
370
+ return (boost, tet_num, weight)
371
+
372
+ def cusp_view_state_and_scale(self, which_cusp):
373
+ vert = self.mcomplex.Vertices[which_cusp]
374
+ corner = vert.Corners[0]
375
+ tet = corner.Tetrahedron
376
+ subsimplex = corner.Subsimplex
377
+ area = self.areas[which_cusp]
378
+
379
+ return (
380
+ self.update_view_state(
381
+ (_cusp_view_matrix(tet, subsimplex, area),
382
+ corner.Tetrahedron.Index,
383
+ 0.0)),
384
+ _cusp_view_scale(tet, subsimplex, area))
385
+
386
+ class NonGeometricRaytracingData(McomplexEngine):
387
+ @staticmethod
388
+ def from_manifold(manifold):
389
+ mcomplex = t3m.Mcomplex(manifold)
390
+ r = NonGeometricRaytracingData(mcomplex, manifold)
391
+ z = manifold.tetrahedra_shapes('rect')[0]
392
+ r.RF = z.real().parent()
393
+ return r
394
+
395
+ def __init__(self, mcomplex, manifold):
396
+ super().__init__(mcomplex)
397
+ self.manifold = manifold
398
+
399
+ def is_valid(self):
400
+ return False
401
+
402
+ def get_compile_time_constants(self):
403
+ return {
404
+ b'##num_tets##' : len(self.mcomplex.Tetrahedra),
405
+ b'##num_cusps##' : len(self.mcomplex.Vertices),
406
+ b'##num_edges##' : len(self.mcomplex.Edges),
407
+ b'##finiteTrig##' : 0,
408
+ }
409
+
410
+ def get_uniform_bindings(self):
411
+ return {
412
+ 'isNonGeometric' :
413
+ ('bool', True),
414
+ 'nonGeometricTexture' :
415
+ ('int', 0)}
416
+
417
+ def initial_view_state(self):
418
+ boost = make_matrix([[1.0,0.0,0.0,0.0],
419
+ [0.0,1.0,0.0,0.0],
420
+ [0.0,0.0,1.0,0.0],
421
+ [0.0,0.0,0.0,1.0]])
422
+ tet_num = 0
423
+ weight = 0.0
424
+ return (boost, tet_num, weight)
425
+
426
+ def update_view_state(self, boost_tet_num_and_weight,
427
+ m=make_matrix([[1.0, 0.0, 0.0, 0.0],
428
+ [0.0, 1.0, 0.0, 0.0],
429
+ [0.0, 0.0, 1.0, 0.0],
430
+ [0.0, 0.0, 0.0, 1.0]])):
431
+ boost, tet_num, weight = boost_tet_num_and_weight
432
+ boost = boost * m
433
+ return boost, tet_num, weight
434
+
435
+ def _pgl2_matrix_for_face(tet, F):
436
+ gluing = tet.Gluing[F]
437
+ other_tet = tet.Neighbor[F]
438
+ verts = [
439
+ tet.complex_vertices[V]
440
+ for V in t3m.ZeroSubsimplices
441
+ if V & F ]
442
+ other_verts = [
443
+ other_tet.complex_vertices[gluing.image(V)]
444
+ for V in t3m.ZeroSubsimplices
445
+ if V & F ]
446
+
447
+ m1 = pgl2_matrix_taking_0_1_inf_to_given_points(*verts)
448
+ m2 = pgl2_matrix_taking_0_1_inf_to_given_points(*other_verts)
449
+
450
+ return m2 * sl2c_inverse(m1)
451
+
452
+
453
+ def _o13_matrix_for_face(tet, F):
454
+ return pgl2c_to_o13(_pgl2_matrix_for_face(tet, F))
455
+
456
+
457
+ def _compute_cusp_triangle_vertex_positions(tet, V, i):
458
+
459
+ z = tet.ShapeParameters[t3m.E01]
460
+ CF = z.parent()
461
+
462
+ triangle = tet.horotriangles[V]
463
+ otherVerts = [ t3m.ZeroSubsimplices[(i + j) % 4] for j in range(1, 4) ]
464
+ vertex_positions = [ triangle.vertex_positions[V | otherVert ]
465
+ for otherVert in otherVerts ]
466
+
467
+ if tet.Class[V].is_complete:
468
+ m_translation, l_translation = tet.Class[V].Translations
469
+
470
+ a, c = m_translation.real(), m_translation.imag()
471
+ b, d = l_translation.real(), l_translation.imag()
472
+
473
+ log_z0 = CF(0)
474
+
475
+ # Inverting matrix here since SageMath screws up :(
476
+ translations_to_ml = make_matrix([[d,-b], [-c, a]]) / (a*d - b * c)
477
+
478
+ vertex_positions = [ translations_to_ml * complex_to_pair(z)
479
+ for z in vertex_positions ]
480
+
481
+ else:
482
+ log_z0 = triangle.lifted_vertex_positions[V | otherVerts[0]]
483
+ z0 = vertex_positions[0]
484
+ vertex_positions = [ complex_to_pair(z / z0)
485
+ for z in vertex_positions ]
486
+
487
+ return log_z0, vertex_positions
488
+
489
+
490
+ def _compute_cusp_to_tet_and_inverse_matrices(tet, vertex, i):
491
+ trig = tet.horotriangles[vertex]
492
+
493
+ otherVerts = [ t3m.ZeroSubsimplices[(i + j) % 4] for j in range(1, 4) ]
494
+
495
+ tet_vertices = [ tet.complex_vertices[v] for v in otherVerts ]
496
+
497
+ cusp_vertices = [ trig.vertex_positions[vertex | v]
498
+ for v in otherVerts ]
499
+
500
+ if not tet.Class[vertex].is_complete:
501
+ z0 = cusp_vertices[0]
502
+ cusp_vertices = [ z / z0 for z in cusp_vertices ]
503
+
504
+ std_to_tet = pgl2_matrix_taking_0_1_inf_to_given_points(*tet_vertices)
505
+ cusp_to_std = sl2c_inverse(
506
+ pgl2_matrix_taking_0_1_inf_to_given_points(*cusp_vertices))
507
+
508
+ return (
509
+ pgl2c_to_o13( std_to_tet * cusp_to_std),
510
+ pgl2c_to_o13(sl2c_inverse(std_to_tet * cusp_to_std)))
511
+
512
+
513
+ def _compute_margulis_tube_ends(tet, vertex):
514
+
515
+ if tet.Class[vertex].is_complete:
516
+ return [(0.0, 0.0, 0.0, 0.0), (0.0, 0.0, 0.0, 0.0)]
517
+
518
+ return [ tet.cusp_to_tet_matrices[vertex] * make_vector([1.0, x, 0.0, 0.0])
519
+ for x in [-1.0, 1.0] ]
520
+
521
+
522
+ def _cusp_view_matrix(tet, subsimplex, area):
523
+ # Complex numbers encoding translation of horosphere corresponding
524
+ # to meridian and longitude. Here, the horosphere maps to the
525
+ # boundary of a cusp neighborhood with area one.
526
+ m_translation, l_translation = tet.Class[subsimplex].Translations
527
+
528
+ CF = m_translation.parent()
529
+ RF = m_translation.real().parent()
530
+
531
+ # Let us work in the upper halfspace model
532
+ # H^3 = { z + tj : z in C, t > 0 }
533
+ # and with coordinates such that:
534
+ # 1. The camera we start with is at jand looking down.
535
+ # 2. The above horosphere is horizontal.
536
+ # 3. The meridian and longitude act by the PSL(2,Z)-matrix
537
+ # [[1, z], [0, 1]] where z = m_translation or z = l_translation,
538
+ # respectively.
539
+
540
+ translation = (m_translation + l_translation) / 2
541
+
542
+ # A small factor to move the camera a little bit into the cusp neighborhood
543
+ # to avoid z-Fighting.
544
+ factor_to_move_inside = 1.0001
545
+ rotation = l_translation / abs(l_translation)
546
+ scale = factor_to_move_inside/area.sqrt()
547
+ borel_transform = make_matrix([[ scale*rotation, translation ],
548
+ [ 0, 1 ]],
549
+ ring=CF)
550
+
551
+ base_camera_matrix = make_matrix(
552
+ [[ 1, 0, 0, 0],
553
+ [ 0, 0, 0, 1],
554
+ [ 0, 1, 0, 0],
555
+ [ 0, 0, 1, 0]], ring=RF)
556
+
557
+ # Apply necessary pre and post O13-transforms to the transform
558
+ # in the upper halfspace we computed above.
559
+ o13_matrix = (
560
+ tet.cusp_to_tet_matrices[subsimplex] *
561
+ pgl2c_to_o13(borel_transform) *
562
+ base_camera_matrix)
563
+
564
+ return o13_matrix
565
+
566
+
567
+ def _cusp_view_scale(tet, subsimplex, area):
568
+ # Complex numbers encoding translation of horosphere corresponding
569
+ # to meridian and longitude. Here, the horosphere maps to the
570
+ # boundary of a cusp neighborhood with area one.
571
+ m_translation, l_translation = tet.Class[subsimplex].Translations
572
+
573
+ real_l_translation = abs(l_translation)
574
+ m_translation = m_translation * abs(l_translation) / l_translation
575
+
576
+ t = max(real_l_translation + m_translation.real(),
577
+ real_l_translation - m_translation.real(),
578
+ m_translation.imag())
579
+
580
+ return area.sqrt() * t
581
+
582
+
583
+ def _check_consistency(mcomplex):
584
+ for tet in mcomplex.Tetrahedra:
585
+ for F in t3m.TwoSubsimplices:
586
+ for V in t3m.ZeroSubsimplices:
587
+ if V & F:
588
+ v0 = tet.O13_matrices[F] * make_vector(tet.R13_vertices[V])
589
+ v1 = tet.Neighbor[F].R13_vertices[tet.Gluing[F].image(V)]
590
+ err = r13_dot(v0, v1)
591
+ if err > 1e-10 or err < -1e-10:
592
+ print("PROBLEM", v0, v1)