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,63 @@
1
+ """
2
+ from snappy import *; from snappy.raytracing.additional_len_spec_choices import *
3
+
4
+ M=Manifold("t10879")
5
+ M=CubicalOrientableCuspedCensus[0]
6
+ v = M.inside_view()
7
+ a=AdditionalLenSpecChoices(M)
8
+ v.view.widget.additional_structures['lenSpec'] = a; v.view.widget._update_shader()
9
+
10
+ """
11
+
12
+ from ..len_spec import mcomplex_for_len_spec
13
+
14
+ from .pack import pack_tet_data
15
+ from .upper_halfspace_utilities import add_coordinate_transform_to_mcomplex
16
+ from ..snap.t3mlite import simplex
17
+
18
+ class AdditionalLenSpecChoices:
19
+ def __init__(self, manifold):
20
+
21
+ self.mcomplex = mcomplex_for_len_spec(
22
+ manifold, bits_prec = 53, verified = False)
23
+ add_coordinate_transform_to_mcomplex(self.mcomplex)
24
+
25
+ self._num = 0
26
+
27
+ self.compute_bindings()
28
+
29
+ def get_compile_time_defs(self):
30
+ if self._num > 0:
31
+ num = max(100, self._num)
32
+ else:
33
+ num = 0
34
+
35
+ return { 'num_additional_horospheres' : num,
36
+ 'has_edge_midpoints' : 1}
37
+
38
+ def get_uniform_bindings(self):
39
+ return self._uniform_bindings
40
+
41
+ def compute_bindings(self):
42
+ self._uniform_bindings, self._num = pack_tet_data(
43
+ 'additionalHorospheres.horosphere',
44
+ self._get_data())
45
+ self._uniform_bindings['edgeMidpoints.edgeMidpointVec'] = (
46
+ 'vec4[]', [ tet.to_coordinates_in_symmetric_tet * tet.spine_points[e]
47
+ for tet in self.mcomplex.Tetrahedra
48
+ for e in simplex.OneSubsimplices ])
49
+ self._uniform_bindings['edgeMidpointRadiusParam'] = (
50
+ 'float', 1.002)
51
+
52
+ def _get_data(self):
53
+ return [ [ _data_for_vert(tet, v) for v in simplex.ZeroSubsimplices ]
54
+ for tet in self.mcomplex.Tetrahedra ]
55
+
56
+ def _data_for_vert(tet, v):
57
+ return {
58
+ 'Vec' :(
59
+ 'vec4',
60
+ tet.to_coordinates_in_symmetric_tet * tet.R13_vertices[v]),
61
+ 'CuspIndex' : (
62
+ 'int',
63
+ tet.Class[v].Index) }
@@ -0,0 +1,197 @@
1
+ from snappy.ptolemy.homology import homology_basis_representatives_with_orders
2
+
3
+ """
4
+ Helpers to compute weights for faces corresponding to a 2-cocycle. Used to
5
+ visualize cohomology fractals.
6
+
7
+ The weights for the faces are stored in the order
8
+ [face 0 tet 0, face 1 tet 0, ... face 3 tet 0, face 0, tet 1, ...].
9
+
10
+ Note that we also use face classes (consisting each of two
11
+ faces). Some helpers convert weights stored per face class to weights
12
+ stored per face per tetrahedron.
13
+ """
14
+
15
+
16
+ def face_var_name_to_index(var_name):
17
+ """
18
+ Convert variable name to index in array of weights.
19
+
20
+ >>> face_var_name_to_index('s_2_5')
21
+ 22
22
+
23
+ """
24
+
25
+ name, face_index, tet_index = var_name.split('_')
26
+ if name != 's':
27
+ raise AssertionError(
28
+ "Variable name '%s' for face class invalid" % var_name)
29
+ return 4 * int(tet_index) + int(face_index)
30
+
31
+
32
+ def value_for_face_class(weights, face_class):
33
+ """
34
+ Given weights per face per tetrahedron and a face_class as encoded
35
+ by the ptolemy module, extract the weight for that face_class and
36
+ perform consistency check.
37
+ """
38
+
39
+ sgn, power, repr0, repr1 = face_class
40
+
41
+ # Weight for one representative of face class
42
+ val0 = weights[face_var_name_to_index(repr0)]
43
+ # Weight for other representative of face class
44
+ val1 = weights[face_var_name_to_index(repr1)]
45
+
46
+ # Check weights match
47
+ if abs(val0 - sgn * val1) > 1e-6:
48
+ raise ValueError("Weights for identified faces do not match")
49
+
50
+ return val0
51
+
52
+
53
+ def check_weights_valid(trig, weights):
54
+ """
55
+ Given a SnapPy triangulation and weights per face per tetrahedron,
56
+ check they are consistent across glued faces and form a 2-cocycle.
57
+
58
+ >>> check_weights_valid(Manifold("m015"), [1, 0, 0, 0, -1, 0, 0, 1, -1, 0, 0, 0])
59
+ >>> check_weights_valid(Manifold("m004"), [0, 1, 0, 1, 0, 0, -1, -2])
60
+ Traceback (most recent call last):
61
+ ...
62
+ ValueError: Weights for identified faces do not match
63
+ >>> check_weights_valid(Manifold("m003"), [1, 0, 0, 2, -1, 0, 0, -2])
64
+ Traceback (most recent call last):
65
+ ...
66
+ ValueError: Weights are not a 2-cocycle.
67
+
68
+ """
69
+
70
+ face_classes = trig._ptolemy_equations_identified_face_classes()
71
+
72
+ check_face_class_weights_valid(
73
+ trig,
74
+ [ value_for_face_class(weights, face_class)
75
+ for face_class in face_classes ])
76
+
77
+
78
+ def check_face_class_weights_valid(trig, weights):
79
+ """
80
+ Given a SnapPy triangulation and weights per face class, check they
81
+ form a 2-cocycle.
82
+ """
83
+ matrix, edge_labels, face_labels = (
84
+ trig._ptolemy_equations_boundary_map_2())
85
+ for row in matrix:
86
+ total = sum(entry * weight for entry, weight in zip(row, weights))
87
+ if abs(total) > 1e-6:
88
+ raise ValueError("Weights are not a 2-cocycle.")
89
+
90
+
91
+ def compute_signs_and_face_class_indices(trig):
92
+ """
93
+ An array helpful to convert weights per face class to weights per
94
+ face per tetrahedron. The entries are per face per tetrahedron and
95
+ are a pair (sign adjustment, face class index).
96
+ """
97
+
98
+ result = (4 * trig.num_tetrahedra()) * [ None ]
99
+ face_classes = trig._ptolemy_equations_identified_face_classes()
100
+ for i, face_class in enumerate(face_classes):
101
+ sgn, power, repr0, repr1 = face_class
102
+ result[face_var_name_to_index(repr0)] = ( +1, i)
103
+ result[face_var_name_to_index(repr1)] = (sgn, i)
104
+ return result
105
+
106
+
107
+ def rational_cohomology_basis(trig):
108
+ """
109
+ Given a SnapPy triangulation, give 2-cocycles encoded as weights
110
+ per face per tetrahedron that generate the second rational cohomology
111
+ group.
112
+
113
+ >>> rational_cohomology_basis(Manifold("m125"))
114
+ [[-1, -4, -2, 0, 1, 0, 0, 0, 0, 4, 1, 2, -1, 0, 0, 0], [0, 5, 2, 0, 0, 0, 0, 1, 0, -5, 0, -2, 0, 0, 0, -1]]
115
+
116
+ """
117
+
118
+ signs_and_face_class_indices = compute_signs_and_face_class_indices(
119
+ trig)
120
+
121
+ matrix2, edge_labels, face_labels = (
122
+ trig._ptolemy_equations_boundary_map_2())
123
+ matrix3, face_labels, tet_labels = (
124
+ trig._ptolemy_equations_boundary_map_3())
125
+
126
+ two_cocycles_and_orders = (
127
+ homology_basis_representatives_with_orders(
128
+ matrix2, matrix3, 0))
129
+
130
+ rational_two_cocycles = [
131
+ two_cocycle
132
+ for two_cocycle, order in two_cocycles_and_orders
133
+ if order == 0 ]
134
+
135
+ # Expand two cocycles which assign a weight to each face class
136
+ # to weights per face per tetrahedron
137
+ return [
138
+ [ sgn * two_cocycle[index]
139
+ for sgn, index in signs_and_face_class_indices ]
140
+ for two_cocycle in rational_two_cocycles ]
141
+
142
+
143
+ def compute_weights_basis_class(trig, cohomology_class):
144
+ """
145
+ Convenience method to quickly access cohomology classes for
146
+ M.inside_view().
147
+
148
+ >>> compute_weights_basis_class(Manifold("m004"), None)
149
+ (None, None, None)
150
+ >>> compute_weights_basis_class(Manifold("m003"), [1, 0, 0, 1, -1, 0, 0, -1])
151
+ ([1, 0, 0, 1, -1, 0, 0, -1], None, None)
152
+ >>> compute_weights_basis_class(Manifold("m003"), 0)
153
+ (None, [[1, 0, 0, 1, -1, 0, 0, -1]], [1.0])
154
+ >>> compute_weights_basis_class(Manifold("m125"), 0)
155
+ (None, [[-1, -4, -2, 0, 1, 0, 0, 0, 0, 4, 1, 2, -1, 0, 0, 0], [0, 5, 2, 0, 0, 0, 0, 1, 0, -5, 0, -2, 0, 0, 0, -1]], [1.0, 0.0])
156
+ >>> compute_weights_basis_class(Manifold("m125"), 1)
157
+ (None, [[-1, -4, -2, 0, 1, 0, 0, 0, 0, 4, 1, 2, -1, 0, 0, 0], [0, 5, 2, 0, 0, 0, 0, 1, 0, -5, 0, -2, 0, 0, 0, -1]], [0.0, 1.0])
158
+ >>> compute_weights_basis_class(Manifold("m125"), [0.5, 0.5])
159
+ (None, [[-1, -4, -2, 0, 1, 0, 0, 0, 0, 4, 1, 2, -1, 0, 0, 0], [0, 5, 2, 0, 0, 0, 0, 1, 0, -5, 0, -2, 0, 0, 0, -1]], [0.5, 0.5])
160
+
161
+ """
162
+
163
+ # If no cohomology_class specified, just return None
164
+ if cohomology_class is None:
165
+ return None, None, None
166
+
167
+ try:
168
+ as_list = list(cohomology_class)
169
+ except TypeError:
170
+ as_list = None
171
+
172
+ if as_list:
173
+ # User can give a weight for each tetrahedron
174
+ if len(as_list) == 4 * trig.num_tetrahedra():
175
+ check_weights_valid(trig, as_list)
176
+ return as_list, None, None
177
+
178
+ # User can specify super position of basis two-cocycles,
179
+ # that is a number for each element in the basis.
180
+ basis = rational_cohomology_basis(trig)
181
+ if len(as_list) == len(basis):
182
+ return None, basis, as_list
183
+
184
+ raise ValueError(
185
+ ("Expected array of length %d or %d either assigning one number "
186
+ "for each basis vector of the second rational cohomology group "
187
+ "or one weight per face "
188
+ "and tetrahedron.") % (len(basis), 4 * trig.num_tetrahedra()))
189
+ else:
190
+ # User can just specify an integer to pick one of the basis
191
+ # two-cocycles generating the cohomology.
192
+ basis = rational_cohomology_basis(trig)
193
+
194
+ c = range(len(basis))[cohomology_class]
195
+
196
+ return None, basis, [ 1.0 if i == c else 0.0
197
+ for i in range(len(basis)) ]
@@ -0,0 +1,124 @@
1
+ from ..hyperboloid import o13_inverse
2
+ from ..hyperboloid.point import R13Point
3
+
4
+ from ..tiling.tile import compute_tiles
5
+ from ..tiling.lifted_tetrahedron import LiftedTetrahedron
6
+ from ..tiling.lifted_tetrahedron_set import (LiftedTetrahedronSet,
7
+ get_lifted_tetrahedron_set)
8
+ from ..tiling.triangle import add_triangles_to_tetrahedra
9
+
10
+ from ..matrix import make_matrix, make_vector
11
+
12
+ from ..matrix import matrix
13
+
14
+ import math
15
+
16
+ eyeball_type_none = 0
17
+ eyeball_type_paper_plane = 1
18
+ eyeball_type_eyeball = 2
19
+
20
+ _max_num_eyeballs = 40
21
+
22
+ class Eyeball:
23
+ def __init__(self, raytracing_view):
24
+ self.raytracing_view = raytracing_view
25
+
26
+ self.mcomplex = self.raytracing_view.raytracing_data.mcomplex
27
+ self.num_tetrahedra = len(self.mcomplex.Tetrahedra)
28
+
29
+ self._added_triangles = False
30
+
31
+ def _enabled(self):
32
+ return (
33
+ self.raytracing_view.ui_parameter_dict['eyeballSize'][1] > 0 and
34
+ self.raytracing_view.ui_parameter_dict['eyeballType'][1] > eyeball_type_none)
35
+
36
+ def get_compile_time_defs(self):
37
+ if not self._enabled():
38
+ return {}
39
+
40
+ d = { 'num_eyeballs' : _max_num_eyeballs,
41
+ 'eyeball_type' : self.raytracing_view.ui_parameter_dict['eyeballType'][1]}
42
+
43
+ return d
44
+
45
+ def get_uniform_bindings(self):
46
+ if not self._enabled():
47
+ return {}
48
+
49
+ if not self._added_triangles:
50
+ add_triangles_to_tetrahedra(self.mcomplex)
51
+ self._added_triangles = True
52
+
53
+ view_state = self.raytracing_view.ui_parameter_dict.get('eyeballViewState')
54
+ if not view_state or (
55
+ not self.raytracing_view.ui_parameter_dict['freezeEyeball'][1]):
56
+ self.raytracing_view.ui_parameter_dict['eyeballViewState'] = (
57
+ 'viewState', self.raytracing_view.view_state)
58
+
59
+ boost, tet_num, current_weight = (
60
+ self.raytracing_view.ui_parameter_dict['eyeballViewState'][1])
61
+
62
+ RF = self.raytracing_view.raytracing_data.RF
63
+
64
+ boost = make_matrix(boost, ring=RF)
65
+
66
+ base_point = make_vector([b[0] for b in boost])
67
+
68
+ eyeballRadius = self.raytracing_view.ui_parameter_dict['eyeballSize'][1]
69
+ if self.raytracing_view.ui_parameter_dict['eyeballType'][1] == eyeball_type_eyeball:
70
+ eyeballRadius = eyeballRadius / 2.0
71
+ tets_to_data = [ [] for i in range(self.num_tetrahedra) ]
72
+
73
+ initial_lifted_tetrahedron = LiftedTetrahedron(
74
+ self.mcomplex.Tetrahedra[tet_num], matrix.identity(RF, 4))
75
+
76
+ cut_off = RF(1.0 + 1e-5)
77
+
78
+ lifted_tetrahedron_set : LiftedTetrahedronSet = (
79
+ get_lifted_tetrahedron_set(
80
+ base_point=base_point,
81
+ act_on_base_point_by_inverse=True,
82
+ max_neg_prod_equal=cut_off,
83
+ min_neg_prod_distinct=cut_off,
84
+ canonical_representatives_function=None,
85
+ verified=False))
86
+
87
+ for i, tile in enumerate(
88
+ compute_tiles(
89
+ geometric_object=R13Point(base_point),
90
+ visited_lifted_tetrahedra=lifted_tetrahedron_set,
91
+ initial_lifted_tetrahedra=[ initial_lifted_tetrahedron ],
92
+ verified=False)):
93
+
94
+ if i == _max_num_eyeballs:
95
+ break
96
+ if tile.lower_bound_distance > eyeballRadius:
97
+ break
98
+
99
+ m = o13_inverse(boost) * tile.lifted_tetrahedron.o13_matrix
100
+
101
+ tets_to_data[tile.lifted_tetrahedron.tet.Index].append((
102
+ tile.inverse_lifted_geometric_object.point,
103
+ m,
104
+ o13_inverse(m)))
105
+
106
+ eyeballPositions = []
107
+ eyeballInvEmbeddings = []
108
+ eyeballEmbeddings = []
109
+ eyeballOffsets = []
110
+
111
+ for data in tets_to_data:
112
+ eyeballOffsets.append(len(eyeballPositions))
113
+ for eyeballPosition, eyeballInvEmbedding, eyeballEmbedding in data:
114
+ eyeballPositions.append(eyeballPosition)
115
+ eyeballInvEmbeddings.append(eyeballInvEmbedding)
116
+ eyeballEmbeddings.append(eyeballEmbedding)
117
+ eyeballOffsets.append(len(eyeballPositions))
118
+
119
+ return {
120
+ 'eyeballRadius' : ('float', eyeballRadius),
121
+ 'eyeballs.eyeballPositions' : ('vec4[]', eyeballPositions),
122
+ 'eyeballs.eyeballInvEmbeddings' : ('mat4[]', eyeballInvEmbeddings),
123
+ 'eyeballs.eyeballEmbeddings' : ('mat4[]', eyeballEmbeddings),
124
+ 'eyeballs.eyeballOffsets' : ('int[]', eyeballOffsets) }
@@ -0,0 +1,237 @@
1
+ from snappy.snap import t3mlite as t3m
2
+ from snappy import Triangulation
3
+
4
+ from ..matrix import make_matrix, make_vector
5
+
6
+ from ..upper_halfspace import pgl2c_to_o13
7
+
8
+ # We could use
9
+ #
10
+ # from ..sage_helper import _within_sage
11
+ #
12
+ # but then dev/GLSLFiniteInsideView.py cannot be used for
13
+ # debugging anymore.
14
+
15
+ try:
16
+ import sage.all
17
+ _within_sage = True
18
+ except ImportError:
19
+ _within_sage = False
20
+ import decorator
21
+
22
+ if _within_sage:
23
+ from snappy.dev.vericlosed import compute_approx_hyperbolic_structure_orb
24
+ from snappy.dev.vericlosed.polishApproxHyperbolicStructure import *
25
+
26
+ from snappy.dev.vericlosed.truncatedComplex import *
27
+
28
+ from .hyperboloid_utilities import *
29
+
30
+ from .raytracing_data import *
31
+
32
+ __all__ = ['FiniteRaytracingData']
33
+
34
+
35
+ class FiniteRaytracingData(RaytracingData):
36
+ @staticmethod
37
+ def from_triangulation(triangulation, weights=None):
38
+
39
+ if not _within_sage:
40
+ raise Exception("Only supported within SageMath :(")
41
+
42
+ hyperbolic_structure = compute_approx_hyperbolic_structure_orb(triangulation)
43
+ hyperbolic_structure.pick_exact_and_var_edges()
44
+ hyperbolic_structure = polish_approx_hyperbolic_structure(
45
+ hyperbolic_structure, bits_prec=212)
46
+
47
+ r = FiniteRaytracingData(hyperbolic_structure)
48
+
49
+ r.RF = hyperbolic_structure.edge_lengths[0].parent()
50
+
51
+ r._compute_matrices(hyperbolic_structure)
52
+
53
+ r._compute_tet_vertices()
54
+ r._compute_edge_ends()
55
+ r._compute_planes()
56
+ r._compute_face_pairings()
57
+
58
+ r.add_weights(weights)
59
+
60
+ return r
61
+
62
+ def __init__(self, hyperbolic_structure):
63
+ super().__init__(
64
+ hyperbolic_structure.mcomplex)
65
+
66
+ def _compute_matrices(self, hyperbolic_structure):
67
+ for tet in self.mcomplex.Tetrahedra:
68
+ tet.permutahedron_matrices = _matrices_for_tet(
69
+ hyperbolic_structure, tet.Index)
70
+
71
+ def _compute_tet_vertices(self):
72
+ c = make_vector([1, 0, 0, 0], ring=self.RF)
73
+
74
+ def _compute_vertex(tet, perm):
75
+ m = tet.permutahedron_matrices[perm]
76
+ return pgl2c_to_o13(_adjoint(m)) * c
77
+
78
+ for tet in self.mcomplex.Tetrahedra:
79
+ tet.R13_vertices = {
80
+ t3m.V0 : _compute_vertex(tet, (0,1,3,2)),
81
+ t3m.V1 : _compute_vertex(tet, (1,0,2,3)),
82
+ t3m.V2 : _compute_vertex(tet, (2,0,3,1)),
83
+ t3m.V3 : _compute_vertex(tet, (3,0,1,2)) }
84
+
85
+ def _compute_edge_ends(self):
86
+ cs = [ make_vector([1, 1, 0, 0], ring=self.RF),
87
+ make_vector([1, -1, 0, 0], ring=self.RF) ]
88
+
89
+ def _compute_edge_ends(tet, perm):
90
+ m = tet.permutahedron_matrices[perm]
91
+ return [ pgl2c_to_o13(_adjoint(m)) * c for c in cs ]
92
+
93
+ for tet in self.mcomplex.Tetrahedra:
94
+ tet.R13_edge_ends = {
95
+ t3m.E01 : _compute_edge_ends(tet, (0,1,2,3)),
96
+ t3m.E02 : _compute_edge_ends(tet, (0,2,1,3)),
97
+ t3m.E12 : _compute_edge_ends(tet, (2,1,0,3)),
98
+ t3m.E03 : _compute_edge_ends(tet, (0,3,1,2)),
99
+ t3m.E13 : _compute_edge_ends(tet, (1,3,0,2)),
100
+ t3m.E23 : _compute_edge_ends(tet, (2,3,0,1)) }
101
+
102
+ def _compute_planes(self):
103
+ c = make_vector([0.0, 0.0, 0.0, -1.0], ring=self.RF)
104
+
105
+ def _compute_plane(tet, perm):
106
+ m = tet.permutahedron_matrices[perm]
107
+ v = c * pgl2c_to_o13(m)
108
+ return make_vector([-v[0], v[1], v[2], v[3]])
109
+
110
+ for tet in self.mcomplex.Tetrahedra:
111
+ tet.R13_planes = {
112
+ t3m.F0 : _compute_plane(tet, (2,3,1,0)),
113
+ t3m.F1 : _compute_plane(tet, (0,3,2,1)),
114
+ t3m.F2 : _compute_plane(tet, (0,1,3,2)),
115
+ t3m.F3 : _compute_plane(tet, (0,2,1,3)) }
116
+
117
+ def _compute_face_pairings(self):
118
+ for tet in self.mcomplex.Tetrahedra:
119
+ tet.O13_matrices = {
120
+ F : _compute_face_pairing(tet, F)
121
+ for F in t3m.TwoSubsimplices }
122
+
123
+ def _check_consistency(self):
124
+ for tet in self.mcomplex.Tetrahedra:
125
+ for F in t3m.TwoSubsimplices:
126
+ for V in t3m.ZeroSubsimplices:
127
+ if V & F:
128
+ v0 = tet.O13_matrices[F] * make_vector(tet.R13_vertices[V])
129
+ v1 = tet.Neighbor[F].R13_vertices[tet.Gluing[F].image(V)]
130
+
131
+ if abs(r13_dot(v0, v1) - (-1.0)) > 1e-6:
132
+ print("Inconsistency ", tet.Index, F)
133
+ print(v0)
134
+ print(v1)
135
+
136
+ def get_uniform_bindings(self):
137
+ # self._check_consistency()
138
+
139
+ d = super().get_uniform_bindings()
140
+ d['TetrahedraEdges.R13EdgeEnds'] = (
141
+ 'vec4[]',
142
+ [ edge_end
143
+ for tet in self.mcomplex.Tetrahedra
144
+ for E in t3m.OneSubsimplices
145
+ for edge_end in tet.R13_edge_ends[E] ])
146
+ d['isNonGeometric'] = (
147
+ 'bool',
148
+ False)
149
+ d['nonGeometricTexture'] = (
150
+ 'int',
151
+ 0)
152
+
153
+ return d
154
+
155
+ def get_compile_time_constants(self):
156
+ d = super().get_compile_time_constants()
157
+ d[b'##finiteTrig##'] = 1
158
+ return d
159
+
160
+ def initial_view_state(self):
161
+ boost = make_matrix([[1.0,0.0,0.0,0.0],
162
+ [0.0,1.0,0.0,0.0],
163
+ [0.0,0.0,1.0,0.0],
164
+ [0.0,0.0,0.0,1.0]])
165
+ tet_num = 0
166
+ weight = 0.0
167
+ return (boost, tet_num, weight)
168
+
169
+ # 3
170
+ #
171
+ # Helpers
172
+ #
173
+
174
+
175
+ _face_to_perm = {
176
+ t3m.F0: t3m.Perm4((1,3,2,0)),
177
+ t3m.F1: t3m.Perm4((0,2,3,1)),
178
+ t3m.F2: t3m.Perm4((0,3,1,2)),
179
+ t3m.F3: t3m.Perm4((0,1,2,3))}
180
+
181
+
182
+ def _compute_face_pairing(tet, F):
183
+ tet_perm = _face_to_perm[F]
184
+ m = tet.permutahedron_matrices[tet_perm.tuple()]
185
+
186
+ other_tet_perm = tet.Gluing[F] * tet_perm
187
+ other_tet = tet.Neighbor[F]
188
+ other_m = other_tet.permutahedron_matrices[other_tet_perm.tuple()]
189
+
190
+ return pgl2c_to_o13(_adjoint(other_m) * m)
191
+
192
+
193
+ def _adjoint(m):
194
+ return make_matrix([[ m[1,1],-m[0,1]],
195
+ [-m[1,0], m[0,0]]])
196
+
197
+
198
+ _new_perm_edge_type_old_perm = [
199
+ ((1, 0, 2, 3), 'alpha', t3m.Perm4((0, 1, 2, 3))),
200
+ ((0, 2, 1, 3), 'beta', t3m.Perm4((0, 1, 2, 3))),
201
+ ((0, 1, 3, 2), 'gamma', t3m.Perm4((0, 1, 2, 3))),
202
+ ((1, 2, 0, 3), 'beta', t3m.Perm4((1, 0, 2, 3))),
203
+ ((1, 0, 3, 2), 'gamma', t3m.Perm4((1, 0, 2, 3))),
204
+ ((2, 0, 1, 3), 'alpha', t3m.Perm4((0, 2, 1, 3))),
205
+ ((0, 2, 3, 1), 'gamma', t3m.Perm4((0, 2, 1, 3))),
206
+ ((0, 3, 1, 2), 'beta', t3m.Perm4((0, 1, 3, 2))),
207
+ ((2, 1, 0, 3), 'alpha', t3m.Perm4((1, 2, 0, 3))),
208
+ ((1, 2, 3, 0), 'gamma', t3m.Perm4((1, 2, 0, 3))),
209
+ ((1, 3, 0, 2), 'beta', t3m.Perm4((1, 0, 3, 2))),
210
+ ((2, 0, 3, 1), 'gamma', t3m.Perm4((2, 0, 1, 3))),
211
+ ((0, 3, 2, 1), 'beta', t3m.Perm4((0, 2, 3, 1))),
212
+ ((3, 0, 1, 2), 'alpha', t3m.Perm4((0, 3, 1, 2))),
213
+ ((2, 1, 3, 0), 'gamma', t3m.Perm4((2, 1, 0, 3))),
214
+ ((1, 3, 2, 0), 'beta', t3m.Perm4((1, 2, 3, 0))),
215
+ ((3, 1, 0, 2), 'alpha', t3m.Perm4((1, 3, 0, 2))),
216
+ ((2, 3, 0, 1), 'beta', t3m.Perm4((2, 0, 3, 1))),
217
+ ((3, 0, 2, 1), 'alpha', t3m.Perm4((0, 3, 2, 1))),
218
+ ((2, 3, 1, 0), 'beta', t3m.Perm4((2, 1, 3, 0))),
219
+ ((3, 1, 2, 0), 'alpha', t3m.Perm4((1, 3, 2, 0))),
220
+ ((3, 2, 0, 1), 'alpha', t3m.Perm4((2, 3, 0, 1))),
221
+ ((3, 2, 1, 0), 'alpha', t3m.Perm4((2, 3, 1, 0))) ]
222
+
223
+
224
+ def _matrices_for_tet(hyperbolic_structure, tet_num):
225
+ RF = hyperbolic_structure.vertex_gram_matrices[0].base_ring()
226
+ CF = RF.complex_field()
227
+
228
+ matrices = { (0, 1, 2, 3) : matrix.identity(CF, 2) }
229
+
230
+ for new_perm, edge_type, old_perm in _new_perm_edge_type_old_perm:
231
+ tet_edge = TruncatedComplex.Edge(edge_type, (tet_num, old_perm))
232
+
233
+ m = hyperbolic_structure.pgl2_matrix_for_edge(tet_edge)
234
+
235
+ matrices[new_perm] = m * matrices[old_perm.tuple()]
236
+
237
+ return matrices