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,22 @@
1
+ def pack_tet_data(prefix, tets_to_data):
2
+ result = {}
3
+
4
+ offset = 0
5
+ offsets = [ offset ]
6
+
7
+ for data in tets_to_data:
8
+ for datum in data:
9
+ if result:
10
+ for k, (t, v) in datum.items():
11
+ result[prefix + k][1].append(v)
12
+ else:
13
+ for k, (t, v) in datum.items():
14
+ result[prefix + k] = (t + '[]', [ v ])
15
+ offset += len(data)
16
+ offsets.append(offset)
17
+
18
+ result[prefix + 'Offsets'] = ('int[]', offsets)
19
+
20
+ return result, offset
21
+
22
+
@@ -0,0 +1,126 @@
1
+ from snappy.snap import t3mlite as t3m
2
+ from snappy.snap.mcomplex_base import *
3
+
4
+ from .hyperboloid_utilities import *
5
+
6
+ from ..matrix import make_matrix
7
+
8
+ __all__ = ['RaytracingData']
9
+
10
+
11
+ class RaytracingData(McomplexEngine):
12
+ def is_valid(self):
13
+ return True
14
+
15
+ def add_weights(self, weights):
16
+ for tet in self.mcomplex.Tetrahedra:
17
+ tet.Weights = {
18
+ F : weights[4 * tet.Index + f] if weights else 0.0
19
+ for f, F in enumerate(t3m.TwoSubsimplices)}
20
+
21
+ def get_uniform_bindings(self):
22
+ d = {}
23
+ d['TetrahedraCombinatorics.otherTetNums'] = (
24
+ 'int[]',
25
+ [ tet.Neighbor[F].Index
26
+ for tet in self.mcomplex.Tetrahedra
27
+ for F in t3m.TwoSubsimplices ])
28
+
29
+ d['TetrahedraCombinatorics.otherFaceNums'] = (
30
+ 'int[]',
31
+ [ tet.Gluing[F][f]
32
+ for tet in self.mcomplex.Tetrahedra
33
+ for f, F in enumerate(t3m.TwoSubsimplices) ])
34
+
35
+ d['TetrahedraBasics.SO13tsfms'] = (
36
+ 'mat4[]',
37
+ [ tet.O13_matrices[F]
38
+ for tet in self.mcomplex.Tetrahedra
39
+ for F in t3m.TwoSubsimplices ])
40
+
41
+ d['TetrahedraBasics.planes'] = (
42
+ 'vec4[]',
43
+ [ tet.R13_planes[F]
44
+ for tet in self.mcomplex.Tetrahedra
45
+ for F in t3m.TwoSubsimplices ])
46
+
47
+ d['TetrahedraBasics.R13Vertices'] = (
48
+ 'vec4[]',
49
+ [ tet.R13_vertices[V]
50
+ for tet in self.mcomplex.Tetrahedra
51
+ for V in t3m.ZeroSubsimplices ])
52
+
53
+ d['Colors.face_color_indices'] = (
54
+ 'int[]',
55
+ [ tet.Class[F].Index
56
+ for tet in self.mcomplex.Tetrahedra
57
+ for F in t3m.TwoSubsimplices ])
58
+
59
+ d['Colors.edge_color_indices'] = (
60
+ 'int[]',
61
+ [ tet.Class[E].Index
62
+ for tet in self.mcomplex.Tetrahedra
63
+ for E in t3m.OneSubsimplices ])
64
+
65
+ d['Colors.vertex_color_indices'] = (
66
+ 'int[]',
67
+ [ tet.Class[V].Index
68
+ for tet in self.mcomplex.Tetrahedra
69
+ for V in t3m.ZeroSubsimplices ])
70
+
71
+ d['weights'] = (
72
+ 'float[]',
73
+ [ tet.Weights[F]
74
+ for tet in self.mcomplex.Tetrahedra
75
+ for F in t3m.TwoSubsimplices ])
76
+
77
+ return d
78
+
79
+ def get_compile_time_constants(self):
80
+ d = {}
81
+ d[b'##num_tets##'] = len(self.mcomplex.Tetrahedra)
82
+ d[b'##num_cusps##'] = len(self.mcomplex.Vertices)
83
+ d[b'##num_edges##'] = len(self.mcomplex.Edges)
84
+ return d
85
+
86
+ def update_view_state(self,
87
+ boost_tet_num_and_weight,
88
+ m=make_matrix([[1.0, 0.0, 0.0, 0.0],
89
+ [0.0, 1.0, 0.0, 0.0],
90
+ [0.0, 0.0, 1.0, 0.0],
91
+ [0.0, 0.0, 0.0, 1.0]])):
92
+ boost, tet_num, weight = boost_tet_num_and_weight
93
+
94
+ boost = make_matrix(boost, ring=self.RF)
95
+ m = make_matrix(m, ring=self.RF)
96
+
97
+ boost, tet, weight = _graph_trace(
98
+ boost * m, self.mcomplex.Tetrahedra[tet_num], weight)
99
+
100
+ return boost, tet.Index, weight
101
+
102
+ def _graph_trace(boost, tet, weight):
103
+
104
+ boost = O13_orthonormalise(boost)
105
+
106
+ entry_face = 0
107
+
108
+ for i in range(100):
109
+ pos = boost.transpose()[0]
110
+
111
+ signed_dist, face = max(
112
+ [ (r13_dot(pos, tet.R13_planes[face]), face)
113
+ for face in t3m.TwoSubsimplices ])
114
+
115
+ if face == entry_face:
116
+ break
117
+ if signed_dist < 0.0000001:
118
+ break
119
+
120
+ boost = O13_orthonormalise(tet.O13_matrices[face] * boost)
121
+ weight += tet.Weights[face]
122
+ entry_face = tet.Gluing[face].image(face)
123
+ tet = tet.Neighbor[face]
124
+
125
+ return boost, tet, weight
126
+
@@ -0,0 +1,454 @@
1
+ from .hyperboloid_utilities import *
2
+ from .ideal_raytracing_data import *
3
+ from .finite_raytracing_data import *
4
+ from .hyperboloid_navigation import *
5
+ from .geodesics import Geodesics
6
+ from .eyeball import Eyeball
7
+ from .eyeball import eyeball_type_none, eyeball_type_paper_plane
8
+ from . import shaders
9
+
10
+ from ..CyOpenGL import SimpleImageShaderWidget
11
+
12
+ from ..matrix import make_vector, make_matrix
13
+
14
+ import math
15
+ __all__ = ['RaytracingView']
16
+
17
+ _constant_uniform_bindings = {
18
+ 'multiScreenShot' : ('int', 0),
19
+ 'tile' : ('vec2', [0.0, 0.0]),
20
+ 'numTiles' : ('vec2', [1.0, 1.0]),
21
+
22
+ 'gradientThresholds' : ('float[]', [0.0, 0.25, 0.45, 0.75, 1.0]),
23
+ 'gradientColours' : ('vec3[]', [[1.0, 1.0, 1.0],
24
+ [0.86, 0.92, 0.78],
25
+ [0.25, 0.70, 0.83],
26
+ [0.10, 0.13, 0.49],
27
+ [0.0, 0.0, 0.0]]),
28
+ }
29
+
30
+ # Alt-clicking initiates orbiting about the object under the mouse.
31
+ #
32
+ # For nearby objects, it is desirable that equal mouse movements result
33
+ # in an equal amount of orbiting about the object, i.e., it always takes
34
+ # the same amount of mouse movement to orbit once around an object
35
+ # independent on how far the object is from the camera.
36
+ #
37
+ # However, this results in violent movements for far away camera, so
38
+ # we limit the distance the camera can move in response to a mouse
39
+ # movement.
40
+ #
41
+ # This behavior is controlled by the following two constants:
42
+ # Maximal speed of orbiting (applies to nearby objects)
43
+ _max_orbit_speed = 1.0
44
+
45
+ # Maximal linear speed of camera (applies to far objects)
46
+ _max_linear_camera_speed = 2.0
47
+
48
+ # If the user clicks on ab object very far from the camera, we run
49
+ # into numerical issues, thus, we limit the depth to certain value
50
+ # (corresponding to hyperbolic distance atanh(0.9998)~4.6).
51
+ #
52
+ # Note that a parabolic transformation about an ideal point is
53
+ # indistinguishable from a rotation about a point far away and a
54
+ # proportionally small angle. So the user can't even tell we have a limit
55
+ # here.
56
+ _max_depth_for_orbiting = 0.9998
57
+
58
+
59
+ class RaytracingView(SimpleImageShaderWidget, HyperboloidNavigation):
60
+ def __init__(self,
61
+ trig_type,
62
+ manifold,
63
+ weights, # Weights for tet faces
64
+ cohomology_basis, # Each entry are weights for the tet faces
65
+ cohomology_class, # Number for each entry in basis specifying superposition
66
+ geodesics,
67
+ container,
68
+ *args,
69
+ **kwargs):
70
+
71
+ SimpleImageShaderWidget.__init__(
72
+ self, container,
73
+ *args, **kwargs)
74
+
75
+ self.set_textures(shaders.get_texture_paths())
76
+
77
+ self.trig_type = trig_type
78
+
79
+ # The view can be driven in two modes:
80
+ # The face weights can be explicitly specified with weights.
81
+ # Or both a cohomology_basis and cohomology_class can be given.
82
+ # The weights are then computed by multipliying (the transpose)
83
+ # cohomology_basis matrix with the cohomology_class vector.
84
+ # In the latter case, the GUI will provide a slider for each
85
+ # element in the cohomology_class.
86
+
87
+ self.weights = weights
88
+ self.cohomology_basis = cohomology_basis
89
+
90
+ has_weights = bool(weights or cohomology_class)
91
+
92
+ self.ui_uniform_dict = {
93
+ 'maxSteps' : ['int', 99 if has_weights else 40],
94
+ 'maxDist' : ['float', 6.5 if has_weights else 17.0],
95
+ 'subpixelCount': ['int', 1],
96
+
97
+ 'contrast' : ['float', 0.1 if has_weights else 0.5],
98
+ 'noGradient' : ['bool', False],
99
+
100
+ 'lightBias' : ['float', 2.0],
101
+ 'lightFalloff' : ['float', 1.65],
102
+ 'brightness' : ['float', 1.9],
103
+
104
+ 'showElevation' : ['bool', False],
105
+ 'desaturate_edges' : ['bool', False],
106
+ 'viewScale' : ['float', 1.0],
107
+ 'perspectiveType' : ['int', 0],
108
+ 'crosshairs' : ['bool', False]
109
+ }
110
+
111
+ self.ui_parameter_dict = {
112
+ 'insphere_scale' : ['float', 0.0 ],
113
+ 'cuspAreas' : ['float[]', manifold.num_cusps() * [ 0.0 if has_weights else 1.0 ]],
114
+ 'edgeThickness' : ['float', 0.0],
115
+ 'edgeTubeRadius' : ['float', 0.0 if has_weights else
116
+ (0.025 if trig_type == 'finite' else 0.0)],
117
+ 'vertexRadius' : ['float', 0.0 if has_weights else 0.25],
118
+ 'geodesicTubeRadii' : ['float[]', []],
119
+ 'geodesicTubeEnables' : ['bool[]', []],
120
+ 'eyeballSize' : ['float', 0.5],
121
+ 'freezeEyeball' : ['bool', False],
122
+ 'eyeballType' : ['int', eyeball_type_none if has_weights else eyeball_type_paper_plane]
123
+ }
124
+
125
+ if cohomology_class:
126
+ self.ui_parameter_dict['cohomology_class'] = [
127
+ 'float[]', cohomology_class ]
128
+ if not self.cohomology_basis:
129
+ raise Exception(
130
+ "Expected cohomology_basis when given cohomology_class")
131
+ if self.cohomology_basis:
132
+ if not cohomology_class:
133
+ raise Exception(
134
+ "Expected cohomology_class when given cohomology_basis")
135
+
136
+ self.compile_time_constants = {}
137
+ self.compile_time_defs = {}
138
+
139
+ self.manifold = manifold
140
+
141
+ self.additional_structures = {}
142
+
143
+ self._unguarded_initialize_raytracing_data()
144
+
145
+ if self.trig_type == 'ideal':
146
+ self.additional_structures['geodesics'] = (
147
+ Geodesics(manifold, geodesics))
148
+ self.resize_geodesic_params(enable=True)
149
+ self._update_geodesic_data()
150
+
151
+ self.geodesics_disabled_edges = False
152
+ if geodesics:
153
+ self.disable_edges_for_geodesics()
154
+
155
+ self._update_shader()
156
+
157
+ # Use distance view for now
158
+ self.view = 1
159
+ if has_weights:
160
+ self.view = 0
161
+
162
+ HyperboloidNavigation.__init__(self)
163
+
164
+ def reset_geodesics(self):
165
+ self.geodesics = Geodesics(self.manifold, [])
166
+ self.ui_parameter_dict['geodesicTubeRadii'][1] = []
167
+ self.ui_parameter_dict['geodesicTubeEnables'][1] = []
168
+ self._update_geodesic_data()
169
+
170
+ def get_uniform_bindings(self, width, height):
171
+ boost, tet_num, current_weight = self.view_state
172
+
173
+ result = _merge_dicts(
174
+ _constant_uniform_bindings,
175
+ self.manifold_uniform_bindings,
176
+ _merge_dicts(
177
+ *(additional_structure.get_uniform_bindings()
178
+ for additional_structure
179
+ in self.additional_structures.values())),
180
+ {
181
+ 'currentWeight' : ('float', current_weight),
182
+ 'screenResolution' : ('vec2', [width, height]),
183
+ 'currentBoost' : ('mat4', boost),
184
+ 'currentTetIndex' : ('int', tet_num),
185
+ 'viewMode' : ('int', self.view),
186
+ 'edgeTubeRadiusParam' :
187
+ ('float', math.cosh(self.ui_parameter_dict['edgeTubeRadius'][1]) ** 2 / 2.0),
188
+ 'edgeThicknessParam' :
189
+ ('float', math.sinh(self.ui_parameter_dict['edgeThickness'][1]) ** 2),
190
+ 'vertexSphereRadiusParam' :
191
+ ('float', math.cosh(self.ui_parameter_dict['vertexRadius'][1]) ** 2)
192
+ },
193
+ self.ui_uniform_dict
194
+ )
195
+
196
+ # _check_consistency(result)
197
+
198
+ return result
199
+
200
+ def _initialize_raytracing_data(self):
201
+ self._unguarded_initialize_raytracing_data()
202
+
203
+ def _unguarded_initialize_raytracing_data(self):
204
+ weights = self.weights
205
+ if self.cohomology_basis:
206
+ weights = [ 0.0 for c in self.cohomology_basis[0] ]
207
+
208
+ for f, basis in zip(self.ui_parameter_dict['cohomology_class'][1],
209
+ self.cohomology_basis):
210
+ for i, b in enumerate(basis):
211
+ weights[i] += f * b
212
+
213
+ if self.trig_type == 'finite':
214
+ self.raytracing_data = FiniteRaytracingData.from_triangulation(
215
+ self.manifold,
216
+ weights=weights)
217
+ else:
218
+ self.raytracing_data = IdealRaytracingData.from_manifold(
219
+ self.manifold,
220
+ areas=self.ui_parameter_dict['cuspAreas'][1],
221
+ insphere_scale=self.ui_parameter_dict['insphere_scale'][1],
222
+ weights=weights)
223
+ if self.raytracing_data.is_valid():
224
+ self.additional_structures['eyeball'] = (
225
+ Eyeball(self))
226
+ else:
227
+ if 'eyeball' in self.additional_structures:
228
+ del self.additional_structures['eyeball']
229
+
230
+ self.manifold_uniform_bindings = (
231
+ self.raytracing_data.get_uniform_bindings())
232
+
233
+ def update_shader_and_redraw(self):
234
+ self._update_shader()
235
+ self.draw()
236
+
237
+ def recompute_raytracing_data_and_redraw(self):
238
+ self._initialize_raytracing_data()
239
+ self.fix_view_state()
240
+ self.draw()
241
+
242
+ def recompute_raytracing_data_update_shader_and_redraw(self):
243
+ self._initialize_raytracing_data()
244
+ self._update_shader()
245
+ self.fix_view_state()
246
+ self.draw()
247
+
248
+ def compute_translation_and_inverse_from_pick_point(
249
+ self, size, frag_coord, depth):
250
+
251
+ RF = self.raytracing_data.RF
252
+
253
+ # Depth value emitted by shader is tanh(distance from camera)
254
+
255
+ # Limit the maximal depth for orbiting to avoid numeric issues
256
+ depth = min(depth, _max_depth_for_orbiting)
257
+
258
+ view_scale = self.ui_uniform_dict['viewScale'][1]
259
+ perspective_type = self.ui_uniform_dict['perspectiveType'][1]
260
+
261
+ # Reimplement functionality from fragment shader
262
+
263
+ # Reimplement computation of xy from fragment coordinate
264
+ x = (frag_coord[0] - 0.5 * size[0]) / min(size[0], size[1])
265
+ y = (frag_coord[1] - 0.5 * size[1]) / min(size[0], size[1])
266
+
267
+ # Reimplement get_ray_eye_space to determine end point of
268
+ # ray. The end point is encoded as pair distance to origin
269
+ # direction to origin.
270
+ if perspective_type == 0:
271
+ scaled_x = 2.0 * view_scale * x
272
+ scaled_y = 2.0 * view_scale * y
273
+
274
+ # Camera is assumed to be at origin.
275
+ dist = RF(depth).arctanh()
276
+ # Reimplemented from get_ray_eye_space
277
+ dir = make_vector([RF(scaled_x), RF(scaled_y), RF(-1)])
278
+
279
+ else:
280
+ if perspective_type == 1:
281
+ scaled_x = view_scale * x
282
+ scaled_y = view_scale * y
283
+
284
+ # Use "parabolic transformation magic by Saul"
285
+ # to determine the start point and direction of ray.
286
+ # Then compute end point using depth value.
287
+ r2 = 0.5 * (scaled_x * scaled_x + scaled_y * scaled_y)
288
+ ray_end = make_vector(
289
+ [RF((r2 + 1.0) + depth * r2),
290
+ RF( scaled_x + depth * scaled_x),
291
+ RF( scaled_y + depth * scaled_y),
292
+ RF( r2 + depth * (r2 - 1.0))])
293
+ else:
294
+ pt = R13_normalise(
295
+ make_vector([RF(1.0), RF(2.0 * x), RF(2.0 * y), RF(0.0)]))
296
+ ray_end = make_vector([pt[0],pt[1],pt[2],RF(-depth)])
297
+
298
+ ray_end = R13_normalise(ray_end)
299
+
300
+ # Distance of ray_end from origin
301
+ dist = ray_end[0].arccosh()
302
+ # Direction from origin to ray_end
303
+ dir = make_vector([ray_end[1], ray_end[2], ray_end[3]])
304
+
305
+ # Normalize direction
306
+ dir = dir.normalized()
307
+
308
+ # Compute the circumference of a circle of radius dist
309
+ #
310
+ # Do this by using a concentric circle in the Poincare disk
311
+ # model
312
+ poincare_dist = (dist / 2).tanh()
313
+ hyp_circumference_up_to_constant = (
314
+ poincare_dist / (1.0 - poincare_dist * poincare_dist))
315
+
316
+ speed = min(
317
+ _max_orbit_speed,
318
+ _max_linear_camera_speed / max(1e-10, hyp_circumference_up_to_constant))
319
+
320
+ # Compute translation along direction by distance.
321
+ # And inverse.
322
+ return (
323
+ unit_3_vector_and_distance_to_O13_hyperbolic_translation(
324
+ dir, dist),
325
+ unit_3_vector_and_distance_to_O13_hyperbolic_translation(
326
+ dir, -dist),
327
+ speed)
328
+
329
+ def resize_geodesic_params(self, enable=False):
330
+ num = (len(self.additional_structures['geodesics'].geodesic_tube_infos) -
331
+ len(self.ui_parameter_dict['geodesicTubeRadii'][1]))
332
+ self.ui_parameter_dict['geodesicTubeRadii'][1] += num * [ 0.02 ]
333
+ self.ui_parameter_dict['geodesicTubeEnables'][1] += num * [ enable ]
334
+
335
+ def enable_geodesic(self, index):
336
+ self.ui_parameter_dict['geodesicTubeEnables'][1][index] = True
337
+
338
+ def _update_geodesic_data(self):
339
+ return self.additional_structures['geodesics'].set_enables_and_radii_and_update(
340
+ self.ui_parameter_dict['geodesicTubeEnables'][1],
341
+ self.ui_parameter_dict['geodesicTubeRadii'][1])
342
+
343
+ def update_geodesic_data_and_redraw(self):
344
+ success = self._update_geodesic_data()
345
+ self._update_shader()
346
+ self.draw()
347
+ return success
348
+
349
+ def disable_edges_for_geodesics(self):
350
+ # Only do once
351
+ if self.geodesics_disabled_edges:
352
+ return False
353
+
354
+ self.geodesics_disabled_edges = True
355
+
356
+ self.ui_uniform_dict['desaturate_edges'][1] = True
357
+ self.ui_parameter_dict['edgeTubeRadius'][1] = 0.0
358
+ self.ui_parameter_dict['insphere_scale'][1] = 0.0
359
+
360
+ self._initialize_raytracing_data()
361
+
362
+ return True
363
+
364
+ def _update_shader(self):
365
+ compile_time_defs = _merge_dicts(
366
+ *(additional_structure.get_compile_time_defs()
367
+ for additional_structure
368
+ in self.additional_structures.values()))
369
+
370
+ compile_time_constants = (
371
+ self.raytracing_data.get_compile_time_constants())
372
+
373
+ if (compile_time_constants == self.compile_time_constants and
374
+ compile_time_defs == self.compile_time_defs):
375
+ return
376
+
377
+ self.compile_time_constants = compile_time_constants
378
+ self.compile_time_defs = compile_time_defs
379
+
380
+ shader_source, uniform_block_names_sizes_and_offsets = (
381
+ shaders.get_triangulation_shader_source_and_ubo_descriptors(
382
+ compile_time_constants,
383
+ compile_time_defs))
384
+
385
+ self.set_fragment_shader_source(
386
+ shader_source,
387
+ uniform_block_names_sizes_and_offsets)
388
+
389
+ def _merge_dicts(*dicts):
390
+ return { k : v for d in dicts for k, v in d.items() }
391
+
392
+ ##########################################################################
393
+ # Consistency checks
394
+
395
+
396
+ def _check_matrices_equal(m1, m2):
397
+ for i in range(4):
398
+ for j in range(4):
399
+ if abs(m1[i][j] - m2[i][j]) > 1e-10:
400
+ print(m1, m2)
401
+ print("Matrix not zero as expected")
402
+ return
403
+
404
+
405
+ def _check_matrix_o13(m):
406
+ s = make_matrix([[-1, 0,0,0],
407
+ [0, 1, 0, 0],
408
+ [0, 0, 1, 0],
409
+ [0, 0, 0, 1]])
410
+
411
+ _check_matrices_equal(s, m * s * m.transpose())
412
+
413
+
414
+ def _matrix4_vec(m, p):
415
+ return [sum([ m[i][j] * p[j] for j in range(4)])
416
+ for i in range(4) ]
417
+
418
+
419
+ def _diff(v1, v2, label=''):
420
+ a = sum([(x - y)**2 for x, y in zip(v1, v2) ])
421
+
422
+ if a > 1e-10:
423
+ print("DIFF!!!", label, v1, v2)
424
+
425
+
426
+ def _check_consistency(d):
427
+ planes = d['TetrahedraBasics.planes'][1]
428
+ otherTetNums = d['otherTetNums'][1]
429
+ entering_face_nums = d['enteringFaceNums'][1]
430
+ SO13tsfms = d['TetrahedraBasics.SO13tsfms'][1]
431
+
432
+ # verts = d['verts'][1]
433
+
434
+ # for i in range(len(planes)/4):
435
+ # for j in range(4):
436
+ # for k in range(4):
437
+ # if j != k:
438
+ # if abs(R31_dot(planes[4 * i + j], verts[4 * i + k])) > 1e-10:
439
+ # print("Bad plane equation")
440
+
441
+ for i in range(len(planes)):
442
+ if abs(r13_dot(planes[i], planes[i]) - 1) > 1e-10:
443
+ print("Plane vec not normalized")
444
+
445
+ plane = [-x for x in planes[i]]
446
+ t = SO13tsfms[i]
447
+
448
+ other_tet = otherTetNums[i]
449
+ entering_face_num = entering_face_nums[i]
450
+ other_plane = planes[4 * other_tet + entering_face_num]
451
+
452
+ _diff(other_plane, _matrix4_vec(t, plane))
453
+
454
+ _check_matrix_o13(t)
Binary file