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,542 @@
1
+ from ..sage_helper import _within_sage, sage_method
2
+
3
+ from ..geometric_structure.cusp_neighborhood.real_cusp_cross_section import RealCuspCrossSection
4
+ from ..snap.t3mlite import simplex
5
+
6
+ from .square_extensions import find_shapes_as_complex_sqrt_lin_combinations
7
+ from . import edge_equations
8
+ from . import hyperbolicity
9
+ from . import exceptions
10
+ from ..exceptions import SnapPeaFatalError
11
+
12
+ if _within_sage:
13
+ from sage.rings.complex_interval_field import ComplexIntervalField
14
+ from ..pari import prec_dec_to_bits, prec_bits_to_dec
15
+
16
+ __all__ = [
17
+ 'FindExactShapesError',
18
+ 'interval_checked_canonical_triangulation',
19
+ 'exactly_checked_canonical_retriangulation',
20
+ 'verified_canonical_retriangulation',
21
+ 'default_interval_bits_precs',
22
+ 'default_exact_bits_prec_and_degrees']
23
+
24
+ default_interval_bits_precs = [53, 212]
25
+ default_exact_bits_prec_and_degrees = [( 212, 10),
26
+ (1000, 20),
27
+ (2000, 20)]
28
+
29
+ _num_tries_kernel_canonize = 3
30
+ _max_tries_verify_penalty = 9
31
+
32
+
33
+ class FindExactShapesError(RuntimeError):
34
+ """
35
+ Raised when snap failed to find the exact shapes using the LLL-algorithm
36
+ for a manifold.
37
+ """
38
+
39
+
40
+ @sage_method
41
+ def interval_checked_canonical_triangulation(M, bits_prec=None):
42
+ """
43
+ Given a canonical triangulation of a cusped (possibly non-orientable)
44
+ manifold M, return this triangulation if it has tetrahedral cells and can
45
+ be verified using interval arithmetics with the optional, given precision.
46
+ Otherwise, raises an Exception.
47
+
48
+ It fails when we call it on something which is not the canonical
49
+ triangulation::
50
+
51
+ sage: from snappy import Manifold
52
+ sage: M = Manifold("m015")
53
+ sage: interval_checked_canonical_triangulation(M) # doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL
54
+ Traceback (most recent call last):
55
+ ...
56
+ TiltProvenPositiveNumericalVerifyError: Numerical verification that tilt is negative has failed, tilt is actually positive. This is provably not the proto-canonical triangulation: 0.164542163...? <= 0
57
+
58
+ It verifies the canonical triangulation::
59
+
60
+ sage: M.canonize()
61
+ sage: K = interval_checked_canonical_triangulation(M)
62
+ sage: K
63
+ m015(0,0)
64
+
65
+ Has a non-tetrahedral canonical cell::
66
+
67
+ sage: M = Manifold("m137")
68
+ sage: M.canonize()
69
+ sage: interval_checked_canonical_triangulation(M) # doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL
70
+ Traceback (most recent call last):
71
+ ...
72
+ TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: 0.?e-1... < 0
73
+
74
+ Has a cubical canonical cell::
75
+
76
+ sage: M = Manifold("m412")
77
+ sage: M.canonize()
78
+ sage: interval_checked_canonical_triangulation(M) # doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL
79
+ Traceback (most recent call last):
80
+ ...
81
+ TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: 0.?e-1... < 0
82
+
83
+ """
84
+
85
+ # Get verified shape intervals
86
+ shapes = M.tetrahedra_shapes('rect', intervals=True,
87
+ bits_prec=bits_prec)
88
+
89
+ # Compute cusp cross sections
90
+ c = RealCuspCrossSection.fromManifoldAndShapes(M, shapes)
91
+
92
+ # Use interval arithmetics to verify hyperbolicity
93
+ hyperbolicity.check_logarithmic_gluing_equations_and_positively_oriented_tets(
94
+ M, shapes)
95
+
96
+ # Normalize cusp area. This is not needed when only 1 cusp
97
+ if M.num_cusps() > 1:
98
+ c.normalize_cusps()
99
+
100
+ # Compute tilts
101
+ c.compute_tilts()
102
+
103
+ # Make sure all tilts are negative
104
+ for face in c.mcomplex.Faces:
105
+ # Raise different exceptions to indicate whether we have proven
106
+ # that there are positive tilt or whether the intervals couldn't
107
+ # prove that they are negative
108
+ if face.Tilt > 0:
109
+ # If we can prove there is a positive tilt, raise this
110
+ # exception. Clients thus know that this is not a proto-canonical
111
+ # triangulations.
112
+ raise exceptions.TiltProvenPositiveNumericalVerifyError(face.Tilt)
113
+
114
+ if not (face.Tilt < 0):
115
+ # We failed to show it is negative. This might be because a tilt
116
+ # is zero or because we lost precision and even though the true
117
+ # value is negative, the interval we have contains positive
118
+ # numbers as well.
119
+ raise exceptions.TiltInequalityNumericalVerifyError(face.Tilt)
120
+
121
+ # Return M
122
+ return M
123
+
124
+
125
+ @sage_method
126
+ def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
127
+ """
128
+ Given a proto-canonical triangulation of a cusped (possibly non-orientable)
129
+ manifold M, return its canonical retriangulation which is computed from
130
+ exact shapes. The exact shapes are computed using snap (which uses the
131
+ LLL-algorithm). The precision (in bits) and the maximal degree need to be
132
+ specified (here 300 bits precision and polynomials of degree less than 4)::
133
+
134
+ sage: from snappy import Manifold
135
+ sage: M = Manifold("m412")
136
+ sage: M.canonize()
137
+ sage: K = exactly_checked_canonical_retriangulation(M, 300, 4)
138
+
139
+ M's canonical cell decomposition has a cube, so non-tetrahedral::
140
+
141
+ sage: K.has_finite_vertices()
142
+ True
143
+
144
+ Has 12 tetrahedra after the retrianglation::
145
+
146
+ sage: K.num_tetrahedra()
147
+ 12
148
+
149
+ Check that it fails on something which is not a proto-canonical
150
+ triangulation::
151
+
152
+ sage: from snappy import Manifold
153
+ sage: M = Manifold("m015")
154
+ sage: exactly_checked_canonical_retriangulation(M, 500, 6) # doctest: +IGNORE_EXCEPTION_DETAIL
155
+ Traceback (most recent call last):
156
+ ...
157
+ TiltProvenPositiveNumericalVerifyError: Numerical verification that tilt is negative has failed, tilt is actually positive. This is provably not the proto-canonical triangulation: 0.1645421638874662848910671879? <= 0
158
+ """
159
+
160
+ # Convert to decimal precision
161
+ dec_prec = prec_bits_to_dec(bits_prec)
162
+
163
+ # Try to find the exact shapes
164
+ shapes = find_shapes_as_complex_sqrt_lin_combinations(M, dec_prec, degree)
165
+ if not shapes:
166
+ raise FindExactShapesError()
167
+
168
+ # Build the cusp cross section
169
+ c = RealCuspCrossSection.fromManifoldAndShapes(M, shapes)
170
+
171
+ # Check that the exact solutions form a complete hyperbolic structure
172
+ # We convert to intervals to check that the shapes are positive and
173
+ # the angles add up to 2pi and not some other multiple of 2pi.
174
+ edge_equations.check_polynomial_edge_equations_exactly(c.mcomplex)
175
+ c.check_cusp_development_exactly()
176
+ CIF = ComplexIntervalField(bits_prec)
177
+ edge_equations.check_logarithmic_edge_equations_and_positivity(c.mcomplex, CIF)
178
+
179
+ # Normalize cusp area. This is not needed when only 1 cusp
180
+ if M.num_cusps() > 1:
181
+ c.normalize_cusps()
182
+
183
+ # Compute tilts
184
+ c.compute_tilts()
185
+
186
+ # Get the opacity of a face in the proto-canonical triangulation
187
+ def get_opacity(tilt):
188
+ # Get the tilt of the sign. The sign method is implemented
189
+ # to use exact arithmetic to certify that the sign is 0 and
190
+ # to use interval arithmetic (of increasing precision until a decision
191
+ # can be made) to certify the sign otherwise.
192
+ sign, interval = tilt.sign_with_interval()
193
+
194
+ # Tilt is negative, return True
195
+ if sign < 0:
196
+ return True
197
+
198
+ # Tilt is zero, return False
199
+ if sign == 0:
200
+ return False
201
+
202
+ # Tilt is positive, raise exception
203
+ if sign > 0:
204
+ raise exceptions.TiltProvenPositiveNumericalVerifyError(interval)
205
+
206
+ def index_of_face_corner(corner):
207
+ face_index = simplex.comp(corner.Subsimplex).bit_length() - 1
208
+ return 4 * corner.Tetrahedron.Index + face_index
209
+
210
+ # Opacities of all four faces of each tetrahedron, initialize with None.
211
+ # The format is opacity of face 0, 1, 2, 3 of the first tetrahedron,
212
+ # ... of second tetrahedron, ...
213
+ opacities = (4 * len(c.mcomplex.Tetrahedra)) * [ None ]
214
+
215
+ # For each face of the triangulation
216
+ for face in c.mcomplex.Faces:
217
+ opacity = get_opacity(face.Tilt)
218
+ for corner in face.Corners:
219
+ opacities[index_of_face_corner(corner)] = opacity
220
+
221
+ if None in opacities:
222
+ raise Exception("Mismatch with opacities")
223
+
224
+ # If there are transparent faces, the given triangulation is just the
225
+ # proto-canonical triangulation. We need to call into the SnapPea
226
+ # kernel to retriangulate (introduces finite vertices)
227
+ if not all(opacities):
228
+ return M._canonical_retriangulation(opacities)
229
+
230
+ # No transparent faces, this triangulation itself is the canonical cell
231
+ # decomposition.
232
+ # Return it without introducing finite vertices.
233
+ return M
234
+
235
+
236
+ def _retrying_canonize(M) -> None:
237
+ """
238
+ Wrapper for SnapPea kernel's function to compute the proto-canonical
239
+ triangulation in place. It will retry the kernel function if it fails.
240
+ Raises an exception if it did not succeed eventually.
241
+ """
242
+ err = ValueError('_num_tries_canonize is not positive.')
243
+
244
+ for i in range(_num_tries_kernel_canonize):
245
+ try:
246
+ M.canonize()
247
+ return
248
+ except (RuntimeError, SnapPeaFatalError) as e:
249
+ err = e
250
+ M.randomize()
251
+ raise err
252
+
253
+ def _retrying_high_precision_canonize(M):
254
+ """
255
+ Wrapper for SnapPea kernel's function to compute the proto-canonical
256
+ triangulation. It will retry the kernel function if it fails, switching
257
+ to the quad-double implementation.
258
+ Returns the proto-canonical triangulation if the kernel function was
259
+ successful eventually. Otherwise, raises an exception.
260
+ The original manifold is unchanged.
261
+ """
262
+
263
+ from .. import ManifoldHP
264
+
265
+ # Make a copy of the manifold
266
+ Mcopy = M.copy()
267
+
268
+ # Try with the given precision first
269
+ try:
270
+ _retrying_canonize(Mcopy)
271
+ return Mcopy
272
+ except (RuntimeError, SnapPeaFatalError) as e:
273
+ if isinstance(M, ManifoldHP):
274
+ # Already using high precision.
275
+ # Give up.
276
+ raise e
277
+ # Then try with high precision.
278
+ Mhp = M.high_precision()
279
+ _retrying_canonize(Mhp)
280
+ return Mhp.low_precision()
281
+
282
+ def _print_exception(e):
283
+ print('%s: %s' % (type(e).__name__, e))
284
+
285
+
286
+ @sage_method
287
+ def verified_canonical_retriangulation(
288
+ M,
289
+ interval_bits_precs=default_interval_bits_precs,
290
+ exact_bits_prec_and_degrees=default_exact_bits_prec_and_degrees,
291
+ verbose=False):
292
+ """
293
+ Given some triangulation of a cusped (possibly non-orientable) manifold ``M``,
294
+ return its canonical retriangulation. Return ``None`` if it could not certify
295
+ the result.
296
+
297
+ To compute the canonical retriangulation, it first prepares the manifold
298
+ (filling all Dehn-filled cusps and trying to find a proto-canonical
299
+ triangulation).
300
+ It then tries to certify the canonical triangulation using interval
301
+ arithmetics. If this fails, it uses snap (using `LLL-algorithm
302
+ <http://en.wikipedia.org/wiki/Lenstra%E2%80%93Lenstra%E2%80%93Lov%C3%A1sz_lattice_basis_reduction_algorithm>`_)
303
+ to guess
304
+ exact representations of the shapes in the shape field and then certifies
305
+ that it found the proto-canonical triangulation and determines the
306
+ transparent faces to construct the canonical retriangulation.
307
+
308
+ The optional arguments are:
309
+
310
+ - ``interval_bits_precs``:
311
+ a list of precisions used to try to
312
+ certify the canonical triangulation using intervals. By default, it
313
+ first tries to certify using 53 bits precision. If it failed, it tries
314
+ 212 bits precision next. If it failed again, it moves on to trying exact
315
+ arithmetics.
316
+
317
+ - ``exact_bits_prec_and_degrees``:
318
+ a list of pairs (precision, maximal degree) used when the LLL-algorithm
319
+ is trying to find the defining polynomial of the shape field.
320
+ Similar to ``interval_bits_precs``, each pair is tried until we succeed.
321
+
322
+ - ``verbose``:
323
+ If ``True``, print out additional information.
324
+
325
+ The exact arithmetics can take a long time. To circumvent it, use
326
+ ``exact_bits_prec_and_degrees = None``.
327
+
328
+
329
+ Canonical cell decomposition of ``m004`` has 2 tetrahedral cells::
330
+
331
+ sage: from snappy import Manifold
332
+ sage: M = Manifold("m004")
333
+ sage: K = verified_canonical_retriangulation(M)
334
+ sage: K.has_finite_vertices()
335
+ False
336
+ sage: K.num_tetrahedra()
337
+ 2
338
+
339
+ Canonical cell decomposition of ``m137`` is not tetrahedral::
340
+
341
+ sage: M = Manifold("m137")
342
+ sage: K = verified_canonical_retriangulation(M)
343
+ sage: K.has_finite_vertices()
344
+ True
345
+ sage: K.num_tetrahedra()
346
+ 18
347
+
348
+ Canonical cell decomposition of ``m412`` is a cube and has exactly 8
349
+ symmetries::
350
+
351
+ sage: M = Manifold("m412")
352
+ sage: K = verified_canonical_retriangulation(M)
353
+ sage: K.has_finite_vertices()
354
+ True
355
+ sage: K.num_tetrahedra()
356
+ 12
357
+ sage: len(K.isomorphisms_to(K))
358
+ 8
359
+
360
+ `Burton's example <http://arxiv.org/abs/1311.7615>`_ of ``x101`` and ``x103`` which are actually isometric but
361
+ SnapPea fails to show so. We certify the canonical retriangulation and
362
+ find them isomorphic::
363
+
364
+ sage: M = Manifold('x101'); K = verified_canonical_retriangulation(M)
365
+ sage: N = Manifold('x103'); L = verified_canonical_retriangulation(N)
366
+ sage: len(K.isomorphisms_to(L)) > 0
367
+ True
368
+
369
+ Avoid potentially expensive exact arithmetics (return ``None`` because it has
370
+ non-tetrahedral cells so interval arithmetics can't certify it)::
371
+
372
+ sage: M = Manifold("m412")
373
+ sage: verified_canonical_retriangulation(M, exact_bits_prec_and_degrees = None) # doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL
374
+ Traceback (most recent call last):
375
+ ...
376
+ snappy.verify.exceptions.TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: ... < 0
377
+
378
+ """
379
+
380
+ # This is the "outer" retry loop: it catches those verification
381
+ # failures that can probably be fixed by taking a different
382
+ # triangulation
383
+
384
+ tries_penalty_left = _max_tries_verify_penalty
385
+
386
+ err = ValueError("_max_tries_verify_penalty is not positive.")
387
+
388
+ while tries_penalty_left > 0:
389
+ try:
390
+ # The "inner" retry loop: it catches those verification
391
+ # failures that can probably be fixed by using higher
392
+ # precision intervals or by switching to exact
393
+ # arithmetics because we have transparent faces in the
394
+ # proto-canonical triangulation (i.e., non-tetrahedral
395
+ # canonical cells)
396
+
397
+ return _verified_canonical_retriangulation(
398
+ M, interval_bits_precs, exact_bits_prec_and_degrees,
399
+ verbose)
400
+
401
+ except (ZeroDivisionError,
402
+ exceptions.TiltProvenPositiveNumericalVerifyError,
403
+ exceptions.EdgeEquationExactVerifyError) as e:
404
+
405
+ err = e
406
+
407
+ # These three exceptions are probably raised due to the
408
+ # SnapPea kernel failures:
409
+ # - flat tetrahedra in the proto-canonical triangulation
410
+ # - this provably not being the proto-canonical triangulation
411
+ # Snap failures:
412
+ # - the wrong number field
413
+
414
+ # These failures can most of the time be fixed by trying
415
+ # a different triangulation of the same manifold
416
+
417
+ if verbose:
418
+ _print_exception(e)
419
+ print("Failure: In verification of result of SnapPea "
420
+ "kernel's proto_canonize", end="")
421
+ if isinstance(e, ZeroDivisionError):
422
+ print(" probably due to flat tetrahedra.")
423
+ if isinstance(
424
+ e, exceptions.TiltProvenPositiveNumericalVerifyError):
425
+ print(" due to provably positive tilts.")
426
+ if isinstance(
427
+ e, exceptions.EdgeEquationExactVerifyError):
428
+ print(" probably due to snap giving wrong number field.")
429
+
430
+ print("Next step: Retrying with randomized triangulation.")
431
+
432
+ M = M.copy()
433
+ M.randomize()
434
+
435
+ if isinstance(e, ZeroDivisionError):
436
+ # If there is a flat-tetrahedron, experience shows that enough
437
+ # randomization will yield a geometric triangulation eventually
438
+ # so keep going longer.
439
+ tries_penalty_left -= 1
440
+ else:
441
+ # But the other cases are more obscure, so give up faster.
442
+ tries_penalty_left -= 3
443
+
444
+ except exceptions.VerifyErrorBase as e:
445
+ # Failures we don't know how to recover from
446
+ if verbose:
447
+ _print_exception(e)
448
+ print("Failure: In verification of result of SnapPea kernel's "
449
+ "proto_canonize.")
450
+ print("Next step: Give up.")
451
+
452
+ raise e
453
+
454
+ raise err
455
+
456
+ def _verified_canonical_retriangulation(
457
+ M, interval_bits_precs, exact_bits_prec_and_degrees,
458
+ verbose):
459
+ """
460
+ Implements the "inner" retry loop of verified_canonical_retriangulation
461
+
462
+ Returns retriangulation or raises exception.
463
+
464
+ Some exceptions are caught by the "outer" loop to retry, using that
465
+ the SnapPea kernel uses a randomized algorithm to fill incomplete cusps
466
+ (if applicable) and perform the flips to find the proto-canonical
467
+ triangulation.
468
+ """
469
+
470
+ if all(M.cusp_info('complete?')):
471
+ Mfilled = M
472
+ else:
473
+ # Dehn-fill manifold first
474
+ Mfilled = M.filled_triangulation()
475
+ if not all(Mfilled.cusp_info('complete?')):
476
+ raise ValueError(
477
+ 'Could not compute filled triangulation. '
478
+ 'Are the filling coefficients co-prime integers?')
479
+
480
+ # Try to compute proto-canonical triangulation
481
+ Mcopy = _retrying_high_precision_canonize(Mfilled)
482
+
483
+ err = ValueError(
484
+ 'Neither interval_bits_precs nor exact_bits_prec_and_degrees was '
485
+ 'non-empty.')
486
+
487
+ # First try interval arithmetics to verify
488
+ if interval_bits_precs:
489
+ for interval_bits_prec in interval_bits_precs:
490
+ if verbose:
491
+ print(("Method: Intervals with "
492
+ "interval_bits_prec = %d") % interval_bits_prec)
493
+ try:
494
+ return interval_checked_canonical_triangulation(
495
+ Mcopy, interval_bits_prec)
496
+ except (RuntimeError,
497
+ ValueError, # Manifold.tetrahedra_shapes,
498
+ # KrawczykShapesEngine.log_gluing_LHSs
499
+ exceptions.NumericalVerifyError) as e:
500
+ err = e
501
+ if verbose:
502
+ _print_exception(e)
503
+ if isinstance(e, exceptions.NumericalVerifyError):
504
+ print("Failure: Could not verify proto-canonical "
505
+ "triangulation.")
506
+ else:
507
+ print("Failure: Could not find verified interval.")
508
+ print("Next step: trying different method/precision.")
509
+
510
+ # Then using exact arithmetics
511
+ if exact_bits_prec_and_degrees:
512
+ for bits_prec, degree in exact_bits_prec_and_degrees:
513
+ if verbose:
514
+ print(("Method: Exact, using LLL with "
515
+ "bits_prec = %d, degree = %d") % (bits_prec, degree))
516
+ try:
517
+ return exactly_checked_canonical_retriangulation(
518
+ Mcopy, bits_prec, degree)
519
+ except FindExactShapesError as e:
520
+ err = e
521
+ if verbose:
522
+ _print_exception(e)
523
+ print("Failure: Could not find exact shapes.")
524
+ print("Next step: trying different method/precision")
525
+
526
+ raise err
527
+
528
+ _known_canonical_retriangulations = [
529
+ ('m004', '\x02\x0e\x01\x01\x01-\x1b\x87'),
530
+ ('m412', '\x0c\x80\xac\xff\x07\x05\x07\t\n\t\x08\t\n\x0b\x0b\n\x0b\xe4\xe4\xe4\xe4\xe4\xe1\xe1\xe1\xe1\xe1\xe1\xe1\xe1'),
531
+ ('m137', '\x12\x00\xb0\xfa\xaf\x0f\x04\t\x0b\x08\x07\x07\n\x0c\x0e\r\n\x0f\x0f\r\x11\x11\x10\x10\x11\xb4\xe4\xe1\xe1\xe1\xb4\xe1\xe1\xb1\xe1\xb4\xe4\xe4\xe1\xb1\xe1\xe1\xb4\xe1') ]
532
+
533
+
534
+ def _test_against_known_canonical_retriangulations():
535
+ from snappy import Manifold
536
+ for name, bytes_ in _known_canonical_retriangulations:
537
+ M = Manifold(name)
538
+ K = verified_canonical_retriangulation(M)
539
+ L = Manifold('empty')
540
+ L._from_bytes(bytes_)
541
+ if not K.isomorphisms_to(L):
542
+ raise Exception('%s failed' % name)
@@ -0,0 +1,18 @@
1
+ from ...sage_helper import sage_method
2
+
3
+ from .cusped import *
4
+ from .closed import *
5
+
6
+ __all__ = ['verified_complex_volume_torsion']
7
+
8
+
9
+ @sage_method
10
+ def verified_complex_volume_torsion(manifold, bits_prec=None):
11
+
12
+ completeness = [
13
+ cusp_info['complete?'] for cusp_info in manifold.cusp_info() ]
14
+
15
+ if False in completeness:
16
+ return verified_complex_volume_closed_torsion(manifold, bits_prec)
17
+ else:
18
+ return verified_complex_volume_cusped_torsion(manifold, bits_prec)
@@ -0,0 +1,86 @@
1
+ from ...sage_helper import _within_sage, sage_method
2
+ if _within_sage:
3
+ from sage.symbolic.constants import pi
4
+
5
+ from .extended_bloch import *
6
+ from ...snap import t3mlite as t3m
7
+
8
+ __all__ = ['verified_complex_volume_from_lifted_ptolemys',
9
+ 'normalize_by_pi_square_over_two']
10
+
11
+ _move_to_three = {
12
+ t3m.F0 : t3m.Perm4((3,0,1,2)),
13
+ t3m.F1 : t3m.Perm4((0,3,1,2)),
14
+ t3m.F2 : t3m.Perm4((0,1,3,2)),
15
+ t3m.F3 : t3m.Perm4((0,1,2,3))
16
+ }
17
+
18
+ _move_from_three = {
19
+ k : ~p for k, p in _move_to_three.items()
20
+ }
21
+
22
+
23
+ def _perm_for_q_tet(F, gluing):
24
+ return _move_to_three[gluing.image(F)] * gluing * _move_from_three[F]
25
+
26
+
27
+ def _compute_adjustment_for_face(face):
28
+ canonical_corner = face.Corners[0]
29
+ tet = canonical_corner.Tetrahedron
30
+ F = canonical_corner.Subsimplex
31
+ gluing = tet.Gluing[F]
32
+ other_F = gluing.image(F)
33
+
34
+ return -2 * _perm_for_q_tet(F, gluing)[0] * (-1) ** t3m.FaceIndex[other_F]
35
+
36
+
37
+ def _compute_adjustment(mcomplex):
38
+ """
39
+ Given an mcomplex, compute the adjustment term to account for the
40
+ triangulation not being ordered.
41
+
42
+ So far, only solves for the 3-torsion but 2-torsion remains
43
+ """
44
+ return sum([ _compute_adjustment_for_face(face)
45
+ for face in mcomplex.Faces ])
46
+
47
+
48
+ @sage_method
49
+ def verified_complex_volume_from_lifted_ptolemys(mcomplex, ptolemys):
50
+ """
51
+ Given lifted Ptolemy coordinates for a triangulation (as dictionary)
52
+ and the number of tetrahedra, compute the complex volume (where
53
+ the real part is the Chern-Simons and the imaginary part is the
54
+ volume).
55
+
56
+ The result is correct modulo pi^2/2.
57
+ """
58
+
59
+ # Simply add Neumann's dilog over all simplicies as if the triangulation
60
+ # was ordered
61
+ result = compute_complex_volume_from_lifted_ptolemys_no_torsion_adjustment(
62
+ len(mcomplex.Tetrahedra), ptolemys)
63
+
64
+ # Add suitable multiple of pi^2/6 to the result to account for the fact
65
+ # that the triangulation was probably not ordered
66
+ CIF = result.parent()
67
+ return result + _compute_adjustment(mcomplex) * CIF(pi ** 2 / 6)
68
+
69
+
70
+ @sage_method
71
+ def normalize_by_pi_square_over_two(z):
72
+ """
73
+ Add multiples of pi^2/2 to the real part to try to bring the
74
+ real part between -pi^2/4 and pi^2/4.
75
+ """
76
+
77
+ CIF = z.parent()
78
+ RIF = CIF.real_field()
79
+
80
+ pi_square_over_two = RIF(pi**2 / 2)
81
+
82
+ # Round to integer
83
+ q = (z.real().center() / pi_square_over_two.center()).round()
84
+
85
+ # Subtract multiple of pi^2/6
86
+ return z - q * pi_square_over_two