snappy 3.2__cp313-cp313-macosx_11_0_arm64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (503) hide show
  1. snappy/CyOpenGL.cpython-313-darwin.so +0 -0
  2. snappy/SnapPy.cpython-313-darwin.so +0 -0
  3. snappy/SnapPy.ico +0 -0
  4. snappy/SnapPy.png +0 -0
  5. snappy/SnapPyHP.cpython-313-darwin.so +0 -0
  6. snappy/__init__.py +760 -0
  7. snappy/app.py +605 -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 +38 -0
  13. snappy/cusps/cusp_area_matrix.py +101 -0
  14. snappy/cusps/cusp_areas_from_matrix.py +173 -0
  15. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  16. snappy/cusps/test.py +21 -0
  17. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  18. snappy/database.py +454 -0
  19. snappy/db_utilities.py +79 -0
  20. snappy/decorated_isosig.py +710 -0
  21. snappy/dev/__init__.py +0 -0
  22. snappy/dev/extended_ptolemy/__init__.py +8 -0
  23. snappy/dev/extended_ptolemy/closed.py +106 -0
  24. snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
  25. snappy/dev/extended_ptolemy/direct.py +42 -0
  26. snappy/dev/extended_ptolemy/extended.py +406 -0
  27. snappy/dev/extended_ptolemy/giac_helper.py +43 -0
  28. snappy/dev/extended_ptolemy/giac_rur.py +129 -0
  29. snappy/dev/extended_ptolemy/gluing.py +46 -0
  30. snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
  31. snappy/dev/extended_ptolemy/printMatrices.py +70 -0
  32. snappy/dev/vericlosed/__init__.py +1 -0
  33. snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
  34. snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
  35. snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
  36. snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
  37. snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
  38. snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
  39. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
  40. snappy/dev/vericlosed/orb/__init__.py +1 -0
  41. snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
  42. snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
  43. snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
  44. snappy/dev/vericlosed/test.py +54 -0
  45. snappy/dev/vericlosed/truncatedComplex.py +176 -0
  46. snappy/dev/vericlosed/verificationError.py +58 -0
  47. snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
  48. snappy/doc/_images/SnapPy-196.png +0 -0
  49. snappy/doc/_images/geodesics.jpg +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 +51 -0
  61. snappy/doc/_sources/credits.rst.txt +75 -0
  62. snappy/doc/_sources/development.rst.txt +259 -0
  63. snappy/doc/_sources/index.rst.txt +182 -0
  64. snappy/doc/_sources/installing.rst.txt +247 -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 +355 -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 +925 -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 +156 -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 +199 -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 +620 -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 +427 -0
  152. snappy/doc/credits.html +181 -0
  153. snappy/doc/development.html +384 -0
  154. snappy/doc/genindex.html +1331 -0
  155. snappy/doc/index.html +262 -0
  156. snappy/doc/installing.html +346 -0
  157. snappy/doc/manifold.html +3452 -0
  158. snappy/doc/manifoldhp.html +180 -0
  159. snappy/doc/news.html +388 -0
  160. snappy/doc/objects.inv +0 -0
  161. snappy/doc/other.html +161 -0
  162. snappy/doc/platonic_census.html +375 -0
  163. snappy/doc/plink.html +210 -0
  164. snappy/doc/ptolemy.html +254 -0
  165. snappy/doc/ptolemy_classes.html +1144 -0
  166. snappy/doc/ptolemy_examples1.html +409 -0
  167. snappy/doc/ptolemy_examples2.html +471 -0
  168. snappy/doc/ptolemy_examples3.html +414 -0
  169. snappy/doc/ptolemy_examples4.html +195 -0
  170. snappy/doc/ptolemy_prelim.html +248 -0
  171. snappy/doc/py-modindex.html +165 -0
  172. snappy/doc/screenshots.html +141 -0
  173. snappy/doc/search.html +135 -0
  174. snappy/doc/searchindex.js +1 -0
  175. snappy/doc/snap.html +202 -0
  176. snappy/doc/snappy.html +181 -0
  177. snappy/doc/spherogram.html +1211 -0
  178. snappy/doc/todo.html +166 -0
  179. snappy/doc/triangulation.html +1584 -0
  180. snappy/doc/tutorial.html +159 -0
  181. snappy/doc/verify.html +330 -0
  182. snappy/doc/verify_internals.html +1235 -0
  183. snappy/drilling/__init__.py +456 -0
  184. snappy/drilling/barycentric.py +103 -0
  185. snappy/drilling/constants.py +5 -0
  186. snappy/drilling/crush.py +270 -0
  187. snappy/drilling/cusps.py +125 -0
  188. snappy/drilling/debug.py +242 -0
  189. snappy/drilling/epsilons.py +6 -0
  190. snappy/drilling/exceptions.py +55 -0
  191. snappy/drilling/moves.py +620 -0
  192. snappy/drilling/peripheral_curves.py +210 -0
  193. snappy/drilling/perturb.py +188 -0
  194. snappy/drilling/shorten.py +36 -0
  195. snappy/drilling/subdivide.py +274 -0
  196. snappy/drilling/test.py +23 -0
  197. snappy/drilling/test_cases.py +126 -0
  198. snappy/drilling/tracing.py +351 -0
  199. snappy/exceptions.py +26 -0
  200. snappy/export_stl.py +120 -0
  201. snappy/exterior_to_link/__init__.py +2 -0
  202. snappy/exterior_to_link/barycentric_geometry.py +463 -0
  203. snappy/exterior_to_link/exceptions.py +6 -0
  204. snappy/exterior_to_link/geodesic_map.json +14408 -0
  205. snappy/exterior_to_link/hyp_utils.py +112 -0
  206. snappy/exterior_to_link/link_projection.py +323 -0
  207. snappy/exterior_to_link/main.py +197 -0
  208. snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
  209. snappy/exterior_to_link/mcomplex_with_link.py +687 -0
  210. snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
  211. snappy/exterior_to_link/pl_utils.py +491 -0
  212. snappy/exterior_to_link/put_in_S3.py +156 -0
  213. snappy/exterior_to_link/rational_linear_algebra.py +123 -0
  214. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
  215. snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
  216. snappy/exterior_to_link/stored_moves.py +475 -0
  217. snappy/exterior_to_link/test.py +31 -0
  218. snappy/filedialog.py +28 -0
  219. snappy/geometric_structure/__init__.py +212 -0
  220. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  221. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  222. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  223. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  224. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  225. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  226. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  227. snappy/geometric_structure/geodesic/__init__.py +0 -0
  228. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  229. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  230. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  231. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  232. snappy/geometric_structure/geodesic/constants.py +6 -0
  233. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  234. snappy/geometric_structure/geodesic/fixed_points.py +93 -0
  235. snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
  236. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  237. snappy/geometric_structure/geodesic/line.py +30 -0
  238. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  239. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  240. snappy/geometric_structure/test.py +22 -0
  241. snappy/gui.py +121 -0
  242. snappy/horoviewer.py +443 -0
  243. snappy/hyperboloid/__init__.py +212 -0
  244. snappy/hyperboloid/distances.py +245 -0
  245. snappy/hyperboloid/horoball.py +19 -0
  246. snappy/hyperboloid/line.py +35 -0
  247. snappy/hyperboloid/point.py +9 -0
  248. snappy/hyperboloid/triangle.py +29 -0
  249. snappy/info_icon.gif +0 -0
  250. snappy/infowindow.py +65 -0
  251. snappy/isometry_signature.py +382 -0
  252. snappy/len_spec/__init__.py +596 -0
  253. snappy/len_spec/geodesic_info.py +110 -0
  254. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  255. snappy/len_spec/geodesic_piece.py +143 -0
  256. snappy/len_spec/geometric_structure.py +182 -0
  257. snappy/len_spec/geometry.py +80 -0
  258. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  259. snappy/len_spec/spine.py +206 -0
  260. snappy/len_spec/test.py +24 -0
  261. snappy/len_spec/test_cases.py +69 -0
  262. snappy/len_spec/tile.py +275 -0
  263. snappy/len_spec/word.py +86 -0
  264. snappy/manifolds/HTWKnots/alternating.gz +0 -0
  265. snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
  266. snappy/manifolds/__init__.py +3 -0
  267. snappy/math_basics.py +176 -0
  268. snappy/matrix.py +525 -0
  269. snappy/number.py +657 -0
  270. snappy/numeric_output_checker.py +345 -0
  271. snappy/pari.py +41 -0
  272. snappy/phone_home.py +57 -0
  273. snappy/polyviewer.py +259 -0
  274. snappy/ptolemy/__init__.py +17 -0
  275. snappy/ptolemy/component.py +103 -0
  276. snappy/ptolemy/coordinates.py +2290 -0
  277. snappy/ptolemy/fieldExtensions.py +153 -0
  278. snappy/ptolemy/findLoops.py +473 -0
  279. snappy/ptolemy/geometricRep.py +59 -0
  280. snappy/ptolemy/homology.py +165 -0
  281. snappy/ptolemy/magma/default.magma_template +229 -0
  282. snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
  283. snappy/ptolemy/manifoldMethods.py +395 -0
  284. snappy/ptolemy/matrix.py +350 -0
  285. snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
  286. snappy/ptolemy/polynomial.py +857 -0
  287. snappy/ptolemy/processComponents.py +173 -0
  288. snappy/ptolemy/processFileBase.py +247 -0
  289. snappy/ptolemy/processFileDispatch.py +46 -0
  290. snappy/ptolemy/processMagmaFile.py +392 -0
  291. snappy/ptolemy/processRurFile.py +150 -0
  292. snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
  293. snappy/ptolemy/ptolemyObstructionClass.py +64 -0
  294. snappy/ptolemy/ptolemyVariety.py +1029 -0
  295. snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
  296. snappy/ptolemy/reginaWrapper.py +698 -0
  297. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  298. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  299. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  300. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  301. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  302. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  303. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  304. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  305. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  306. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  307. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
  308. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  309. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  310. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
  311. snappy/ptolemy/rur.py +545 -0
  312. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
  313. snappy/ptolemy/test.py +1126 -0
  314. snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
  315. snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
  316. snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
  317. snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
  318. snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
  319. snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
  320. snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
  321. snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
  322. snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
  323. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  324. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  325. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  326. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  327. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  328. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  329. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  330. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  331. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
  332. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
  333. snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
  334. snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
  335. snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
  336. snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
  337. snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
  338. snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
  339. snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
  340. snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
  341. snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
  342. snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
  343. snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
  344. snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
  345. snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
  346. snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
  347. snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
  348. snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
  349. snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
  350. snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
  351. snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
  352. snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  353. snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  354. snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
  355. snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
  356. snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  357. snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  358. snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
  359. snappy/ptolemy/utilities.py +236 -0
  360. snappy/raytracing/__init__.py +64 -0
  361. snappy/raytracing/additional_horospheres.py +64 -0
  362. snappy/raytracing/additional_len_spec_choices.py +63 -0
  363. snappy/raytracing/cohomology_fractal.py +197 -0
  364. snappy/raytracing/eyeball.py +123 -0
  365. snappy/raytracing/finite_raytracing_data.py +237 -0
  366. snappy/raytracing/finite_viewer.py +590 -0
  367. snappy/raytracing/geodesic_tube_info.py +174 -0
  368. snappy/raytracing/geodesics.py +246 -0
  369. snappy/raytracing/geodesics_window.py +258 -0
  370. snappy/raytracing/gui_utilities.py +293 -0
  371. snappy/raytracing/hyperboloid_navigation.py +556 -0
  372. snappy/raytracing/hyperboloid_utilities.py +234 -0
  373. snappy/raytracing/ideal_raytracing_data.py +592 -0
  374. snappy/raytracing/inside_viewer.py +974 -0
  375. snappy/raytracing/pack.py +22 -0
  376. snappy/raytracing/raytracing_data.py +126 -0
  377. snappy/raytracing/raytracing_view.py +454 -0
  378. snappy/raytracing/shaders/Eye.png +0 -0
  379. snappy/raytracing/shaders/NonGeometric.png +0 -0
  380. snappy/raytracing/shaders/__init__.py +101 -0
  381. snappy/raytracing/shaders/fragment.glsl +1744 -0
  382. snappy/raytracing/test.py +29 -0
  383. snappy/raytracing/tooltip.py +146 -0
  384. snappy/raytracing/upper_halfspace_utilities.py +98 -0
  385. snappy/raytracing/view_scale_controller.py +98 -0
  386. snappy/raytracing/zoom_slider/__init__.py +263 -0
  387. snappy/raytracing/zoom_slider/inward.png +0 -0
  388. snappy/raytracing/zoom_slider/inward18.png +0 -0
  389. snappy/raytracing/zoom_slider/outward.png +0 -0
  390. snappy/raytracing/zoom_slider/outward18.png +0 -0
  391. snappy/raytracing/zoom_slider/test.py +20 -0
  392. snappy/sage_helper.py +117 -0
  393. snappy/settings.py +409 -0
  394. snappy/shell.py +53 -0
  395. snappy/snap/__init__.py +114 -0
  396. snappy/snap/character_varieties.py +375 -0
  397. snappy/snap/find_field.py +372 -0
  398. snappy/snap/fundamental_polyhedron.py +569 -0
  399. snappy/snap/generators.py +39 -0
  400. snappy/snap/interval_reps.py +81 -0
  401. snappy/snap/kernel_structures.py +128 -0
  402. snappy/snap/mcomplex_base.py +18 -0
  403. snappy/snap/nsagetools.py +702 -0
  404. snappy/snap/peripheral/__init__.py +1 -0
  405. snappy/snap/peripheral/dual_cellulation.py +219 -0
  406. snappy/snap/peripheral/link.py +127 -0
  407. snappy/snap/peripheral/peripheral.py +159 -0
  408. snappy/snap/peripheral/surface.py +522 -0
  409. snappy/snap/peripheral/test.py +35 -0
  410. snappy/snap/polished_reps.py +335 -0
  411. snappy/snap/shapes.py +152 -0
  412. snappy/snap/slice_obs_HKL.py +668 -0
  413. snappy/snap/t3mlite/__init__.py +2 -0
  414. snappy/snap/t3mlite/arrow.py +243 -0
  415. snappy/snap/t3mlite/corner.py +22 -0
  416. snappy/snap/t3mlite/edge.py +172 -0
  417. snappy/snap/t3mlite/face.py +37 -0
  418. snappy/snap/t3mlite/files.py +211 -0
  419. snappy/snap/t3mlite/homology.py +53 -0
  420. snappy/snap/t3mlite/linalg.py +419 -0
  421. snappy/snap/t3mlite/mcomplex.py +1499 -0
  422. snappy/snap/t3mlite/perm4.py +320 -0
  423. snappy/snap/t3mlite/setup.py +12 -0
  424. snappy/snap/t3mlite/simplex.py +199 -0
  425. snappy/snap/t3mlite/spun.py +297 -0
  426. snappy/snap/t3mlite/surface.py +519 -0
  427. snappy/snap/t3mlite/test.py +20 -0
  428. snappy/snap/t3mlite/test_vs_regina.py +86 -0
  429. snappy/snap/t3mlite/tetrahedron.py +109 -0
  430. snappy/snap/t3mlite/vertex.py +42 -0
  431. snappy/snap/test.py +134 -0
  432. snappy/snap/utilities.py +288 -0
  433. snappy/test.py +209 -0
  434. snappy/test_cases.py +263 -0
  435. snappy/testing.py +131 -0
  436. snappy/tiling/__init__.py +2 -0
  437. snappy/tiling/canonical_key_dict.py +59 -0
  438. snappy/tiling/dict_based_set.py +79 -0
  439. snappy/tiling/floor.py +49 -0
  440. snappy/tiling/hyperboloid_dict.py +54 -0
  441. snappy/tiling/iter_utils.py +78 -0
  442. snappy/tiling/lifted_tetrahedron.py +22 -0
  443. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  444. snappy/tiling/real_hash_dict.py +164 -0
  445. snappy/tiling/test.py +23 -0
  446. snappy/tiling/tile.py +215 -0
  447. snappy/tiling/triangle.py +33 -0
  448. snappy/tkterminal.py +920 -0
  449. snappy/twister/__init__.py +20 -0
  450. snappy/twister/main.py +646 -0
  451. snappy/twister/surfaces/S_0_1 +3 -0
  452. snappy/twister/surfaces/S_0_2 +3 -0
  453. snappy/twister/surfaces/S_0_4 +7 -0
  454. snappy/twister/surfaces/S_0_4_Lantern +8 -0
  455. snappy/twister/surfaces/S_1 +3 -0
  456. snappy/twister/surfaces/S_1_1 +4 -0
  457. snappy/twister/surfaces/S_1_2 +5 -0
  458. snappy/twister/surfaces/S_1_2_5 +6 -0
  459. snappy/twister/surfaces/S_2 +6 -0
  460. snappy/twister/surfaces/S_2_1 +8 -0
  461. snappy/twister/surfaces/S_2_heeg +10 -0
  462. snappy/twister/surfaces/S_3 +8 -0
  463. snappy/twister/surfaces/S_3_1 +10 -0
  464. snappy/twister/surfaces/S_4_1 +12 -0
  465. snappy/twister/surfaces/S_5_1 +14 -0
  466. snappy/twister/surfaces/heeg_fig8 +9 -0
  467. snappy/twister/twister_core.cpython-313-darwin.so +0 -0
  468. snappy/upper_halfspace/__init__.py +146 -0
  469. snappy/upper_halfspace/ideal_point.py +26 -0
  470. snappy/verify/__init__.py +13 -0
  471. snappy/verify/canonical.py +542 -0
  472. snappy/verify/complex_volume/__init__.py +18 -0
  473. snappy/verify/complex_volume/adjust_torsion.py +86 -0
  474. snappy/verify/complex_volume/closed.py +168 -0
  475. snappy/verify/complex_volume/compute_ptolemys.py +90 -0
  476. snappy/verify/complex_volume/cusped.py +56 -0
  477. snappy/verify/complex_volume/extended_bloch.py +201 -0
  478. snappy/verify/cusp_translations.py +85 -0
  479. snappy/verify/edge_equations.py +80 -0
  480. snappy/verify/exceptions.py +254 -0
  481. snappy/verify/hyperbolicity.py +224 -0
  482. snappy/verify/interval_newton_shapes_engine.py +523 -0
  483. snappy/verify/interval_tree.py +400 -0
  484. snappy/verify/krawczyk_shapes_engine.py +518 -0
  485. snappy/verify/maximal_cusp_area_matrix/__init__.py +46 -0
  486. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +419 -0
  487. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +153 -0
  488. snappy/verify/real_algebra.py +286 -0
  489. snappy/verify/shapes.py +25 -0
  490. snappy/verify/short_slopes.py +200 -0
  491. snappy/verify/square_extensions.py +1005 -0
  492. snappy/verify/test.py +78 -0
  493. snappy/verify/upper_halfspace/__init__.py +9 -0
  494. snappy/verify/upper_halfspace/extended_matrix.py +100 -0
  495. snappy/verify/upper_halfspace/finite_point.py +283 -0
  496. snappy/verify/upper_halfspace/ideal_point.py +426 -0
  497. snappy/verify/volume.py +128 -0
  498. snappy/version.py +2 -0
  499. snappy-3.2.dist-info/METADATA +58 -0
  500. snappy-3.2.dist-info/RECORD +503 -0
  501. snappy-3.2.dist-info/WHEEL +5 -0
  502. snappy-3.2.dist-info/entry_points.txt +2 -0
  503. snappy-3.2.dist-info/top_level.txt +28 -0
snappy/__init__.py ADDED
@@ -0,0 +1,760 @@
1
+ # import the SnapPy bindings
2
+ # import logging
3
+ # logging.basicConfig(filename='example.log',level=logging.DEBUG)
4
+ # logging.debug('This message should go to the log file')
5
+ import sys
6
+ from .SnapPy import (AbelianGroup,
7
+ FundamentalGroup,
8
+ SymmetryGroup,
9
+ Isometry,
10
+ AlternatingKnotExteriors,
11
+ NonalternatingKnotExteriors,
12
+ pari)
13
+ from .SnapPy import DirichletDomain
14
+ from .SnapPyHP import DirichletDomain as DirichletDomainHP
15
+ from .SnapPy import CuspNeighborhood
16
+ from .SnapPyHP import CuspNeighborhood as CuspNeighborhoodHP
17
+ from .SnapPy import HolonomyGroup
18
+ from .SnapPyHP import HolonomyGroup as HolonomyGroupHP
19
+
20
+ from .SnapPy import Triangulation as _TriangulationLP
21
+ from .SnapPy import Manifold as _ManifoldLP
22
+ from .SnapPyHP import Triangulation as _TriangulationHP
23
+ from .SnapPyHP import Manifold as _ManifoldHP
24
+
25
+ # seed the kernel's random number generator.
26
+ import time
27
+ from .SnapPy import set_rand_seed
28
+ set_rand_seed(int(time.time()))
29
+
30
+ from .exceptions import (SnapPeaFatalError,
31
+ InsufficientPrecisionError,
32
+ NonorientableManifoldError)
33
+
34
+ from typing import Union, Tuple, List, Optional
35
+
36
+ # Subclass to be able to monkey-patch
37
+ class Triangulation(_TriangulationLP):
38
+ __doc__ = _TriangulationLP.__doc__
39
+
40
+ # Subclass to be able to monkey-patch
41
+ class TriangulationHP(_TriangulationHP):
42
+ __doc__ = _TriangulationHP.__doc__
43
+
44
+ # We want Manifold to be a subclass of Triangulation.
45
+ # Unfortunately, that introduces a diamond pattern here.
46
+ # Luckily, the python resolves methods and bases classes
47
+ # in the presence of a diamond pattern seem to work just
48
+ # fine. In particular, we do not double allocate the underlying
49
+ # C structures.
50
+ class Manifold(_ManifoldLP, Triangulation):
51
+ __doc__ = _ManifoldLP.__doc__
52
+
53
+ def identify(self, extends_to_link=False):
54
+ """
55
+ Looks for the manifold in all of the SnapPy databases.
56
+ For hyperbolic manifolds this is done by searching for isometries:
57
+
58
+ >>> M = Manifold('m125')
59
+ >>> M.identify()
60
+ [m125(0,0)(0,0), L13n5885(0,0)(0,0), ooct01_00000(0,0)(0,0)]
61
+
62
+ By default, there is no restriction on the isometries. One can
63
+ require that the isometry take meridians to meridians. This
64
+ might return fewer results:
65
+
66
+ >>> M.identify(extends_to_link=True)
67
+ [m125(0,0)(0,0), ooct01_00000(0,0)(0,0)]
68
+
69
+ For closed manifolds, extends_to_link doesn't make sense
70
+ because of how the kernel code works:
71
+
72
+ >>> C = Manifold("m015(1,2)")
73
+ >>> C.identify()
74
+ [m006(-5,2)]
75
+ >>> C.identify(True)
76
+ []
77
+ """
78
+ return self._identify(extends_to_link)
79
+
80
+ def high_precision(self):
81
+ """
82
+ Return a high precision version of this manifold.
83
+
84
+ >>> M = Manifold('m004')
85
+ >>> type(M.high_precision())
86
+ <class 'snappy.ManifoldHP'>
87
+ """
88
+ HP = ManifoldHP('empty')
89
+ HP._from_string(self._to_string(), initialize_structure=False)
90
+ fillings = [self.cusp_info(n).filling for n in range(self.num_cusps())]
91
+ filled = self._get_tetrahedra_shapes('filled')
92
+ complete = self._get_tetrahedra_shapes('complete')
93
+ HP.set_tetrahedra_shapes(filled, complete, fillings)
94
+ HP._polish_hyperbolic_structures()
95
+ HP.set_name(self.name())
96
+ DT = self.DT_code(flips=True)
97
+ if DT:
98
+ HP._set_DTcode(DTcodec(*DT))
99
+ return HP
100
+
101
+ def low_precision(self):
102
+ return self.copy()
103
+
104
+ # We want ManifoldHP to be a subclass of TriangulationHP.
105
+ # See comment about Manifold and the diamond pattern.
106
+ class ManifoldHP(_ManifoldHP, TriangulationHP):
107
+ __doc__ = _ManifoldHP.__doc__
108
+
109
+ def low_precision(self):
110
+ """
111
+ Return a low precision version of this high precision manifold.
112
+
113
+ >>> M = ManifoldHP('m004')
114
+ >>> type(M.low_precision())
115
+ <class 'snappy.Manifold'>
116
+
117
+ """
118
+ LP = Manifold('empty')
119
+ LP._from_string(self._to_string(), initialize_structure=False)
120
+ fillings = [self.cusp_info(n).filling for n in range(self.num_cusps())]
121
+ filled = [complex(z) for z in self._get_tetrahedra_shapes('filled')]
122
+ complete = [complex(z) for z in self._get_tetrahedra_shapes('complete')]
123
+ LP.set_tetrahedra_shapes(filled, complete, fillings)
124
+ LP._polish_hyperbolic_structures()
125
+ LP.set_name(self.name())
126
+ DT = self.DT_code(flips=True)
127
+ if DT:
128
+ LP._set_DTcode(DTcodec(*DT))
129
+ return LP
130
+
131
+ def high_precision(self):
132
+ return self.copy()
133
+
134
+ def identify(self, extends_to_link=False):
135
+ """
136
+ Looks for the manifold in all of the SnapPy databases.
137
+ For hyperbolic manifolds this is done by searching for isometries:
138
+
139
+ >>> M = ManifoldHP('m125')
140
+ >>> M.identify()
141
+ [m125(0,0)(0,0), L13n5885(0,0)(0,0), ooct01_00000(0,0)(0,0)]
142
+
143
+ By default, there is no restriction on the isometries. One can require
144
+ that the isometry take meridians to meridians. This might return
145
+ fewer results:
146
+
147
+ >>> M.identify(extends_to_link=True)
148
+ [m125(0,0)(0,0), ooct01_00000(0,0)(0,0)]
149
+
150
+ For closed manifolds, extends_to_link doesn't make sense because
151
+ of how the kernel code works:
152
+
153
+ >>> C = Manifold("m015(1,2)")
154
+ >>> C.identify()
155
+ [m006(-5,2)]
156
+ >>> C.identify(True)
157
+ []
158
+
159
+ """
160
+ return self.low_precision()._identify(extends_to_link)
161
+
162
+
163
+ SnapPy._manifold_class = Manifold
164
+ SnapPy._triangulation_class = Triangulation
165
+ SnapPyHP._triangulation_class = TriangulationHP
166
+ SnapPyHP._manifold_class = ManifoldHP
167
+
168
+ __all__ = ['Triangulation', 'Manifold', 'ManifoldHP', 'AbelianGroup',
169
+ 'FundamentalGroup', 'HolonomyGroup', 'HolonomyGroupHP',
170
+ 'DirichletDomain', 'DirichletDomainHP', 'CuspNeighborhood',
171
+ 'CuspNeighborhoodHP', 'SymmetryGroup', 'AlternatingKnotExteriors',
172
+ 'NonalternatingKnotExteriors', 'SnapPeaFatalError',
173
+ 'InsufficientPrecisionError',
174
+ 'pari', 'twister', ]
175
+
176
+ def _symmetrize_high_precision_manifold(
177
+ mfd1 : Union[Manifold, ManifoldHP],
178
+ mfd2 : Union[Manifold, ManifoldHP]
179
+ ) -> Union[Tuple[Manifold, Manifold],
180
+ Tuple[ManifoldHP, ManifoldHP]]:
181
+ """
182
+ Given a (potential) mix of two Manifold and ManifoldHP,
183
+ promote one to high precision if necessary and return
184
+ the result as pair.
185
+ """
186
+ resolved_mfd1 = mfd1
187
+ resolved_mfd2 = mfd2
188
+ high1 = isinstance(mfd1, ManifoldHP)
189
+ high2 = isinstance(mfd2, ManifoldHP)
190
+ if high1 and not high2:
191
+ resolved_mfd2 = ManifoldHP(mfd2)
192
+ if high2 and not high1:
193
+ resolved_mfd1 = ManifoldHP(mfd1)
194
+ return (resolved_mfd1, resolved_mfd2)
195
+
196
+ def _symmetrize_low_precision_triangulation(
197
+ tri1 : Union[Triangulation, TriangulationHP],
198
+ tri2 : Union[Triangulation, TriangulationHP]
199
+ ) -> Union[Tuple[Triangulation, Triangulation],
200
+ Tuple[TriangulationHP, TriangulationHP]]:
201
+ """
202
+ Given a (potential) mix of two Triangulation and TriangulationHP,
203
+ demote one to low precision if necessary and return
204
+ the result as pair.
205
+ """
206
+ resolved_tri1 = tri1
207
+ resolved_tri2 = tri2
208
+ low1 = isinstance(tri1, Triangulation)
209
+ low2 = isinstance(tri2, Triangulation)
210
+ if low1 and not low2:
211
+ resolved_tri2 = Triangulation(tri2, remove_finite_vertices=False)
212
+ if low2 and not low1:
213
+ resolved_tri1 = Triangulation(tri1, remove_finite_vertices=False)
214
+ return (resolved_tri1, resolved_tri2)
215
+
216
+ def is_isometric_to(self,
217
+ other : Union[Manifold, ManifoldHP],
218
+ return_isometries : bool = False
219
+ ) -> Union[bool, List[Isometry]]:
220
+ resolved_self, resolved_other = (
221
+ _symmetrize_high_precision_manifold(
222
+ self, other))
223
+
224
+ return resolved_self._is_isometric_to(
225
+ resolved_other,
226
+ return_isometries=return_isometries)
227
+
228
+ is_isometric_to.__doc__ = _ManifoldLP._is_isometric_to.__doc__
229
+ Manifold.is_isometric_to = is_isometric_to
230
+ ManifoldHP.is_isometric_to = is_isometric_to
231
+
232
+ def isomorphisms_to(self,
233
+ other : Union[Triangulation, TriangulationHP]
234
+ ) -> List[Isometry]:
235
+ resolved_self, resolved_other = (
236
+ _symmetrize_low_precision_triangulation(
237
+ self, other))
238
+
239
+ return resolved_self._isomorphisms_to(
240
+ resolved_other)
241
+
242
+ isomorphisms_to.__doc__ = _TriangulationLP._isomorphisms_to.__doc__
243
+ Triangulation.isomorphisms_to = isomorphisms_to
244
+ TriangulationHP.isomorphisms_to = isomorphisms_to
245
+
246
+ from . import snap
247
+ snap.add_methods(Manifold)
248
+ snap.add_methods(ManifoldHP)
249
+ snap.add_methods(Triangulation, hyperbolic=False)
250
+ snap.add_methods(TriangulationHP, hyperbolic=False)
251
+
252
+ from . import exterior_to_link
253
+ Triangulation.exterior_to_link = exterior_to_link.exterior_to_link
254
+ TriangulationHP.exterior_to_link = exterior_to_link.exterior_to_link
255
+ Manifold.exterior_to_link = exterior_to_link.exterior_to_link
256
+ ManifoldHP.exterior_to_link = exterior_to_link.exterior_to_link
257
+
258
+ from . import verify
259
+ Manifold.verify_hyperbolicity = verify.verify_hyperbolicity
260
+ ManifoldHP.verify_hyperbolicity = verify.verify_hyperbolicity
261
+
262
+ from . import len_spec
263
+ Manifold.length_spectrum_alt_gen = len_spec.length_spectrum_alt_gen
264
+ ManifoldHP.length_spectrum_alt_gen = len_spec.length_spectrum_alt_gen
265
+ Manifold.length_spectrum_alt = len_spec.length_spectrum_alt
266
+ ManifoldHP.length_spectrum_alt = len_spec.length_spectrum_alt
267
+
268
+ from . import canonical
269
+ Manifold.canonical_retriangulation = canonical.canonical_retriangulation
270
+ ManifoldHP.canonical_retriangulation = canonical.canonical_retriangulation_hp
271
+
272
+ from . import isometry_signature
273
+
274
+ Manifold.isometry_signature = isometry_signature.isometry_signature
275
+ ManifoldHP.isometry_signature = isometry_signature.isometry_signature
276
+
277
+ from .cusps import cusp_area_matrix
278
+
279
+ Manifold.cusp_area_matrix = cusp_area_matrix.cusp_area_matrix
280
+ ManifoldHP.cusp_area_matrix = cusp_area_matrix.cusp_area_matrix
281
+
282
+ from .cusps import cusp_areas_from_matrix
283
+
284
+ def cusp_areas(manifold,
285
+ policy : str = 'unbiased',
286
+ method : str = 'maximal',
287
+ verified : bool = False,
288
+ bits_prec : Optional[int] = None,
289
+ first_cusps : List[int] = []):
290
+ """
291
+ Returns a list of areas, one for each cusp. The cusp neighborhoods
292
+ defined by these areas are embedded and disjoint. Furthermore, these
293
+ neighborhoods are maximal in that they fail to be embedded or
294
+ disjoint if any cusp neighborhood is enlarged (unless :attr:`method`
295
+ is set to a value different from the default).
296
+
297
+ There are different policies how these cusp neighborhoods are found.
298
+
299
+ The default :attr:`policy` is ``unbiased``. This means that the
300
+ cusp neighborhoods are blown up simultaneously and a cusp neighborhood
301
+ stops growing when it touches any cusp neighborhood including itself::
302
+
303
+ >>> M = Manifold("s776")
304
+ >>> M.cusp_areas() # doctest: +NUMERIC9
305
+ [2.64575131106459, 2.64575131106459, 2.64575131106459]
306
+
307
+ Alternatively, :attr:`policy='greedy'` can be specified. This means
308
+ that the first cusp neighborhood is blown up until it touches itself,
309
+ then the second cusp neighborhood is blown up until it touches itself
310
+ or the first cusp neighborhood, and so on::
311
+
312
+ >>> M.cusp_areas(policy='greedy') # doctest: +NUMERIC9
313
+ [5.29150262212918, 1.32287565553230, 1.32287565553229]
314
+
315
+ Use :attr:`first_cusps` to specify the order in which the cusp
316
+ neighborhoods are blown up::
317
+
318
+ >>> M.cusp_areas(policy='greedy', first_cusps=[1,0,2]) # doctest: +NUMERIC9
319
+ [1.32287565553230, 5.29150262212918, 1.32287565553229]
320
+
321
+ An incomplete list can be given to :attr:`first_cusps`. In this case,
322
+ the list is automatically completed by appending the remaining cusps in
323
+ order. Thus, the above call is equivalent to::
324
+
325
+ >>> M.cusp_areas(policy='greedy', first_cusps=[1]) # doctest: +NUMERIC9
326
+ [1.32287565553230, 5.29150262212918, 1.32287565553229]
327
+
328
+ Under the hood, this method is using
329
+ :meth:`~snappy.Manifold.cusp_area_matrix`.
330
+
331
+ **Verified computation**
332
+
333
+ If :attr:`verified = False`, floating-point issues can arise resulting in
334
+ incorrect values. The method can be made
335
+ :ref:`verified <verify-primer>` by passing :attr:`verified = True`::
336
+
337
+ sage: M=Manifold("s776")
338
+ sage: M.cusp_areas(verified=True) # doctest: +NUMERIC9
339
+ [2.64575131107?, 2.64575131107?, 2.64575131107?]
340
+
341
+ :param verified:
342
+ Use :ref:`verified computation <verify-primer>`.
343
+ :param bits_prec:
344
+ Precision used for computation. Increase if computation
345
+ did not succeed or a more precise result is desired.
346
+ :param method:
347
+ Passed to :meth:`~snappy.Manifold.cusp_area_matrix`. If set
348
+ to a value different from the default ``maximal``, the cusp
349
+ neighborhoods stop growing when the corresponding value
350
+ in the computed cusp area matrix is exceeded. At this point,
351
+ the cusp neighborhood might not necessarily touch any other
352
+ cusp neighborhood since we do not use the maximal cusp area
353
+ matrix.
354
+ :param policy:
355
+ Specifies process of choosing cusp neighborhoods.
356
+ Either ``unbiased`` or ``greedy``, see above.
357
+ :param first_cusps:
358
+ Preference order of cusps.
359
+ Only relevant if :attr:`policy='greedy'`, see above.
360
+ :return:
361
+ Areas of maximal embedded and disjoint cusp neighborhoods
362
+ (default). Or areas of some embedded and disjoint cusp
363
+ neighborhoods (if :attr:`method` switches to older algorithm).
364
+ """
365
+ if policy not in ['unbiased', 'greedy']:
366
+ raise ValueError("policy passed to cusp_areas must be 'unbiased' "
367
+ "or 'greedy'.")
368
+
369
+ m = manifold.cusp_area_matrix(
370
+ method=method, verified=verified, bits_prec=bits_prec)
371
+
372
+ if policy == 'unbiased':
373
+ return cusp_areas_from_matrix.unbiased_cusp_areas_from_cusp_area_matrix(m)
374
+ else:
375
+ return cusp_areas_from_matrix.greedy_cusp_areas_from_cusp_area_matrix(m, first_cusps=first_cusps)
376
+
377
+ Manifold.cusp_areas = cusp_areas
378
+ ManifoldHP.cusp_areas = cusp_areas
379
+
380
+ from .verify import short_slopes as verify_short_slopes
381
+
382
+
383
+ def short_slopes(manifold,
384
+ length=6,
385
+ policy : str = 'unbiased',
386
+ method : str = 'maximal',
387
+ verified : bool = False,
388
+ bits_prec : Optional[int] = None,
389
+ first_cusps : List[int] = []):
390
+ """
391
+ Returns a list of short slopes (for Dehn-fillings) for each cusp.
392
+
393
+ That is, the method uses :meth:`~snappy.Manifold.cusp_areas` to find
394
+ (maximal) embedded and disjoint cusp neighborhoods. It uses the boundaries
395
+ of these cusp neighborhoods to measure the length of a peripheral curve.
396
+ For each cusp, it determines all simple peripheral curves shorter than
397
+ the given :attr:`length` (which defaults to 6). The result is a list
398
+ of the corresponding slopes for each cusp::
399
+
400
+ >>> M = Manifold("otet20_00022")
401
+ >>> M.short_slopes()
402
+ [[(1, 0), (-1, 1), (0, 1)], [(1, 0)]]
403
+
404
+ It takes the same arguments as :meth:`~snappy.Manifold.cusp_areas`::
405
+
406
+ >>> M.short_slopes(policy = 'greedy')
407
+ [[(1, 0)], [(1, 0)]]
408
+
409
+ The ten exceptional slopes of the figure-eight knot::
410
+
411
+ >>> M = Manifold("4_1")
412
+ >>> M.short_slopes()
413
+ [[(1, 0), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]
414
+
415
+ Two more slopes appear when increasing length to :math:`2\\pi`::
416
+
417
+ >>> M.short_slopes(length = 6.283185307179586)
418
+ [[(1, 0), (-5, 1), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]]
419
+
420
+ **Verified computation**
421
+
422
+ If :attr:`verified = False`, floating-point issues can arise resulting in
423
+ incorrect values. The method can be made
424
+ :ref:`verified <verify-primer>` by passing :attr:`verified = True`::
425
+
426
+ sage: M = Manifold("4_1")
427
+ sage: M.short_slopes(verified = True)
428
+ [[(1, 0), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]
429
+
430
+ If :attr:`verified = True`, the result is guaranteed to contain all short
431
+ slopes and might contain additional slopes (with lengths slightly longer
432
+ than the given :attr:`length` but this could not be proven using the
433
+ interval estimates).
434
+
435
+ The given :attr:`length` is cast to a SageMath ``RealIntervalField`` of the
436
+ given precision if :attr:`verified = True`::
437
+
438
+ sage: from sage.all import pi
439
+ sage: M.short_slopes(length = 2 * pi, verified = True, bits_prec = 100)
440
+ [[(1, 0), (-5, 1), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]]
441
+
442
+ """
443
+
444
+ return [
445
+ verify_short_slopes.short_slopes_from_cusp_shape_and_area(
446
+ shape, area, length=length)
447
+ for shape, area
448
+ in zip(manifold.cusp_info(
449
+ 'shape', verified=verified, bits_prec=bits_prec),
450
+ manifold.cusp_areas(
451
+ policy=policy, method=method,
452
+ verified=verified, bits_prec=bits_prec, first_cusps=first_cusps)) ]
453
+
454
+
455
+ Manifold.short_slopes = short_slopes
456
+ ManifoldHP.short_slopes = short_slopes
457
+
458
+
459
+ def cusp_translations(manifold,
460
+ policy : str = 'unbiased',
461
+ method : str = 'maximal',
462
+ verified : bool = False,
463
+ bits_prec : Optional[int] = None,
464
+ first_cusps : List[int] = []):
465
+ """
466
+ Returns a list of the (complex) Euclidean translations corresponding to the
467
+ meridian and longitude of each cusp.
468
+
469
+ That is, the method uses :meth:`~snappy.Manifold.cusp_areas` to find
470
+ (maximal) embedded and disjoint cusp neighborhoods. It then uses the
471
+ boundaries of these cusp neighborhoods to measure the meridian and
472
+ longitude of each cusp. The result is a pair for each cusp. The first
473
+ entry of the pair corresponds to the meridian and is complex. The
474
+ second entry corresponds to the longitude and is always real::
475
+
476
+ >>> M = Manifold("s776")
477
+ >>> M.cusp_translations() # doctest: +NUMERIC9
478
+ [(0.500000000000000 + 1.32287565553230*I, 2.00000000000000), (0.500000000000000 + 1.32287565553230*I, 2.00000000000000), (0.499999999999999 + 1.32287565553230*I, 2.00000000000000)]
479
+
480
+ It takes the same arguments as :meth:`~snappy.Manifold.cusp_areas`::
481
+
482
+ >>> M.cusp_translations(policy = 'greedy') # doctest: +NUMERIC9
483
+ [(0.70710678118654752440084436210 + 1.8708286933869706927918743662*I, 2.8284271247461900976033774484), (0.35355339059327376220042218105 + 0.93541434669348534639593718308*I, 1.4142135623730950488016887242), (0.35355339059327376220042218105 + 0.93541434669348534639593718308*I, 1.4142135623730950488016887242)]
484
+
485
+ **Verified computations**
486
+
487
+ If :attr:`verified = False`, floating-point issues can arise resulting in
488
+ incorrect values. The method can be made
489
+ :ref:`verified <verify-primer>` by passing :attr:`verified = True`::
490
+
491
+ sage: M.cusp_translations(verified = True) # doctest: +NUMERIC9
492
+ [(0.50000000000? + 1.32287565553?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?)]
493
+
494
+ Note that the first element of each pair is a SageMath ``ComplexIntervalField`` and
495
+ the second element a ``RealIntervalField``.
496
+ """
497
+
498
+ return [
499
+ verify_short_slopes.translations_from_cusp_shape_and_area(
500
+ shape, area, kernel_convention=True)
501
+ for shape, area
502
+ in zip(manifold.cusp_info(
503
+ 'shape', verified=verified, bits_prec=bits_prec),
504
+ manifold.cusp_areas(
505
+ policy=policy, method=method,
506
+ verified=verified, bits_prec=bits_prec, first_cusps=first_cusps)) ]
507
+
508
+
509
+ Manifold.cusp_translations = cusp_translations
510
+ ManifoldHP.cusp_translations = cusp_translations
511
+
512
+
513
+ def complex_volume(manifold, verified_modulo_2_torsion=False,
514
+ bits_prec=None):
515
+ """
516
+ Returns the complex volume modulo :math:`i \\pi^2` which is given by
517
+
518
+ .. math::
519
+ \\text{vol} + i \\text{CS}
520
+
521
+ where :math:`\\text{CS}` is the (unnormalized) Chern-Simons invariant.
522
+
523
+ >>> M = Manifold('5_2')
524
+ >>> M.complex_volume() # doctest: +NUMERIC6
525
+ 2.82812209 - 3.02412838*I
526
+
527
+ Note that :meth:`chern_simons <snappy.Manifold.chern_simons>`
528
+ normalizes the Chern-Simons invariant by dividing it by
529
+ :math:`2 \\pi^2 = 19.7392...` ::
530
+
531
+ >>> M.chern_simons() # doctest: +NUMERIC6
532
+ -0.153204133297152
533
+
534
+ More examples::
535
+
536
+ >>> M.dehn_fill((1,2))
537
+ >>> M.complex_volume() # doctest: +NUMERIC6
538
+ 2.22671790 + 1.52619361*I
539
+ >>> M = Manifold("3_1") # A non-hyperbolic example.
540
+ >>> cvol = M.complex_volume()
541
+ >>> cvol.real() # doctest: +NUMERIC6
542
+ 0
543
+ >>> cvol.imag() # doctest: +NUMERIC6
544
+ -1.64493407
545
+
546
+ If no cusp is filled or there is only one cusped (filled or
547
+ unfilled), the complex volume can be verified up to multiples
548
+ of :math:`i \\pi^2 /2` by passing ``verified_modulo_2_torsion = True``
549
+ when inside SageMath. Higher precision can be requested
550
+ with ``bits_prec``::
551
+
552
+ sage: M = Manifold("m015")
553
+ sage: M.complex_volume(verified_modulo_2_torsion=True, bits_prec = 93) # doctest: +NUMERIC21
554
+ 2.828122088330783162764? + 1.910673824035377649698?*I
555
+ sage: M = Manifold("m015(3,4)")
556
+ sage: M.complex_volume(verified_modulo_2_torsion=True) # doctest: +NUMERIC6
557
+ 2.625051576? - 0.537092383?*I
558
+
559
+ """
560
+ if verified_modulo_2_torsion:
561
+ return verify.verified_complex_volume_torsion(
562
+ manifold, bits_prec=bits_prec)
563
+
564
+ if bits_prec:
565
+ raise Exception("Arbitrary precision for complex volume only "
566
+ "supported for verified computations and cusped "
567
+ "manifolds.")
568
+
569
+ return manifold._complex_volume()
570
+
571
+ Manifold.complex_volume = complex_volume
572
+ ManifoldHP.complex_volume = complex_volume
573
+
574
+ from . import drilling
575
+ drilling._add_methods(Manifold)
576
+ drilling._add_methods(ManifoldHP, high_precision=True)
577
+
578
+ from . import raytracing
579
+
580
+ Manifold.inside_view = raytracing.inside_view
581
+ ManifoldHP.inside_view = raytracing.inside_view
582
+
583
+
584
+ def all_translations(self, verified=False, bits_prec=None):
585
+ """
586
+ Returns the (complex) Euclidean translations of the meridian
587
+ and longitude for each cusp measured with respect to the cusp neighborhood.
588
+
589
+ The result is a list of pairs, the second entry corresponding to a
590
+ longitude is always real::
591
+
592
+ >>> M = Manifold("v3227")
593
+ >>> N = M.cusp_neighborhood()
594
+ >>> N.all_translations() # doctest: +NUMERIC9
595
+ [(-0.152977162509284 + 0.747697694854404*I, 0.868692062725708), (-0.152977162509284 + 0.747697694854404*I, 0.868692062725708), (0.0961611977895952 + 0.725536253181650*I, 0.895226186134782)]
596
+
597
+ Often, one is interested in making the cusp neighborhoods as large as possible first::
598
+
599
+ >>> N.set_displacement(100,0)
600
+ >>> N.set_displacement(100,1)
601
+ >>> N.set_displacement(100,2)
602
+ >>> N.all_translations() # doctest: +NUMERIC9
603
+ [(-0.477656250512815 + 2.33461303362557*I, 2.71240613125259), (-0.259696455247511 + 1.26930345526993*I, 1.47470541152065), (0.131389112265699 + 0.991330873713731*I, 1.22318540718077)]
604
+
605
+ This can also be achieved by :py:meth:`Manifold.cusp_translations` which
606
+ would have made a different choice of disjoint cusp neighborhoods though::
607
+
608
+ >>> M.cusp_translations() # doctest: +NUMERIC6
609
+ [(-0.315973594129651 + 1.54436599614183*I, 1.79427928161946), (-0.315973594129649 + 1.54436599614182*I, 1.79427928161946), (0.198620491993677 + 1.49859164484929*I, 1.84908538602825)]
610
+
611
+ This method supports arbitrary precision ::
612
+
613
+ >>> from snappy.number import Number
614
+ >>> N.set_displacement(1.125, 0)
615
+ >>> N.set_displacement(0.515625, 1)
616
+ >>> N.set_displacement(0.3125, 2)
617
+ >>> N.all_translations(bits_prec = 120) # doctest: +NUMERIC30
618
+ [(-0.47120283346076781167174343474008914 + 2.3030710375877078211095122873223488*I, 2.6757599281290843845710310925394911), (-0.25618853688042434043044508297577899 + 1.2521580040549576537090841783446072*I, 1.4547854392045669515377748986943560), (0.13143677360753666862808198126761923 + 0.99169047854575721271560179767750893*I, 1.2236291171413362101960100623801910)]
619
+
620
+ and can return verified intervals ::
621
+
622
+ sage: N.all_translations(verified = True) # doctest: +NUMERIC9
623
+ [(-0.47120283346? + 2.30307103759?*I, 2.67575992813?), (-0.256188536881? + 1.252158004055?*I, 1.454785439205?), (0.131436773608? + 0.991690478546?*I, 1.2236291171413?)]
624
+ sage: N.all_translations(verified = True, bits_prec = 120) # doctest: +NUMERIC30
625
+ [(-0.4712028334607678116717434347401? + 2.3030710375877078211095122873224?*I, 2.6757599281290843845710310925395?), (-0.25618853688042434043044508297578? + 1.25215800405495765370908417834461?*I, 1.454785439204566951537774898694356?), (0.131436773607536668628081981267619? + 0.991690478545757212715601797677509?*I, 1.223629117141336210196010062380191?)]
626
+
627
+ that are guaranteed to contain the true translations of disjoint cusp
628
+ neighborhoods (the element corresponding to a longitude is always
629
+ in a ``RealIntervalField``). The verified translations might correspond
630
+ to cusp neighborhoods smaller than the given ones to be able to verify
631
+ that they are disjoint.
632
+
633
+ **Remark:** Since the code is (potentially) non-deterministic, the result of ::
634
+
635
+ [ N.all_translations(verified = True)[i] for i in range(M.num_cusps()) ]
636
+
637
+ is not verified to correspond to disjoint cusp neighborhoods.
638
+ """
639
+
640
+ if verified or bits_prec:
641
+ # Use the implementation in verify.cusp_translations that uses
642
+ # tetrahedra_shapes and ComplexCuspNeighborhood
643
+ return verify.cusp_translations_for_neighborhood(
644
+ self, verified=verified, bits_prec=bits_prec)
645
+
646
+ # Use the implementation in the SnapPea kernel
647
+ return [ self.translations(i) for i in range(self.num_cusps()) ]
648
+
649
+
650
+ CuspNeighborhood.all_translations = all_translations
651
+ CuspNeighborhoodHP.all_translations = all_translations
652
+
653
+ from . import twister
654
+
655
+ # Pass our manifold class down to database and then import the
656
+ # manifold tables themselves from the snappy_manifold package.
657
+
658
+ from . import database
659
+ database.Manifold = Manifold
660
+ database.Triangulation = Triangulation
661
+ snappy_module = sys.modules[__name__]
662
+ database_objects = []
663
+ known_manifold_packages = [('snappy_manifolds', True),
664
+ ('snappy_15_knots', False),
665
+ ('nonexistent_manifolds', False)]
666
+
667
+ for manifold_package, required in known_manifold_packages:
668
+ table_dict = database.add_tables_from_package(manifold_package, required)
669
+ for name, table in table_dict.items():
670
+ setattr(snappy_module, name, table)
671
+ if name not in database_objects:
672
+ database_objects.append(name)
673
+
674
+ __all__ += database_objects
675
+
676
+ # Monkey patch the link_exterior method into Spherogram.
677
+
678
+ from spherogram.codecs import DTcodec
679
+
680
+
681
+ def _link_exterior(self, with_hyperbolic_structure=True,
682
+ remove_finite_vertices=True):
683
+ """
684
+ The exterior or complement of the link L, that is, S^3 minus L.
685
+
686
+ >>> K = Link('4_1')
687
+ >>> M = K.exterior()
688
+ >>> M.volume() # doctest: +NUMERIC6
689
+ 2.02988321
690
+
691
+ By default, SnapPy will try to find a hyperbolic structure on the
692
+ exterior. To return a Triangulation instead of a Manifold, set the
693
+ flag with_hyperbolic_structure to False. If you want to get the
694
+ intermediate triangulation with extra vertices above and below the
695
+ projection plane, set the flag remove_finite_vertices to False.
696
+
697
+ >>> M = K.exterior(False, False)
698
+ >>> (M.num_cusps(), M._num_fake_cusps())
699
+ (1, 2)
700
+
701
+ """
702
+ M = Triangulation('empty')
703
+ M._get_from_link_data(self.KLPProjection(), remove_finite_vertices)
704
+ if with_hyperbolic_structure:
705
+ M = M.with_hyperbolic_structure()
706
+ dt = DTcodec(*self.DT_code(flips=True))
707
+ M._set_DTcode(dt)
708
+ if self.name:
709
+ M.set_name(self.name)
710
+ return M
711
+
712
+
713
+ link_objects = []
714
+
715
+ from spherogram.links import (Crossing, Strand, Link, Tangle,
716
+ RationalTangle, ZeroTangle, InfinityTangle, IdentityBraid, random_link)
717
+
718
+ # Monkey-patch the Link class
719
+ Link.exterior = _link_exterior
720
+ link_objects += [
721
+ 'Crossing', 'Strand', 'Link', 'Tangle', 'RationalTangle', 'ZeroTangle', 'InfinityTangle',
722
+ 'IdentityBraid', 'random_link',
723
+ ]
724
+
725
+ # Monkey-patch the DTcodec class
726
+ DTcodec.exterior = _link_exterior
727
+ link_objects += ['DTcodec']
728
+
729
+ __all__ += link_objects
730
+
731
+ # Add spun-normal surface features via FXrays
732
+ import FXrays
733
+ from .snap.t3mlite import spun as _spun
734
+ for mfld_class in [Triangulation, Manifold, ManifoldHP]:
735
+ for method in ['_normal_surface_equations', 'normal_surfaces',
736
+ 'normal_boundary_slopes']:
737
+ setattr(mfld_class, method, getattr(_spun, method))
738
+
739
+ import textwrap
740
+
741
+ # Documentation for the module:
742
+ __doc__ = """
743
+ SnapPy is a Cython wrapping of Jeff Weeks' SnapPea kernel.
744
+
745
+ The module defines the following classes:
746
+ %s""" % textwrap.fill(
747
+ ', '.join(__all__) + '.',
748
+ width=78,
749
+ initial_indent=' ',
750
+ subsequent_indent=' ')
751
+
752
+ # Add easy way to get the version info
753
+ from .version import version as release_info
754
+
755
+
756
+ def version():
757
+ return release_info
758
+
759
+
760
+ __version__ = version()