snappy 3.2__cp310-cp310-macosx_10_12_x86_64.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-310-darwin.so +0 -0
  2. snappy/SnapPy.cpython-310-darwin.so +0 -0
  3. snappy/SnapPy.ico +0 -0
  4. snappy/SnapPy.png +0 -0
  5. snappy/SnapPyHP.cpython-310-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-310-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
@@ -0,0 +1,3452 @@
1
+
2
+
3
+ <!DOCTYPE html>
4
+ <html class="writer-html5" lang="en" data-content_root="./">
5
+ <head>
6
+ <meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
7
+
8
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
9
+ <title>Manifold: the main class &mdash; SnapPy 3.2 documentation</title>
10
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
11
+ <link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
12
+ <link rel="stylesheet" type="text/css" href="_static/snappy_sphinx_rtd_theme.css?v=1b8ec2a8" />
13
+
14
+
15
+ <link rel="shortcut icon" href="_static/SnapPy.ico"/>
16
+ <script src="_static/jquery.js?v=5d32c60e"></script>
17
+ <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
18
+ <script src="_static/documentation_options.js?v=828ea960"></script>
19
+ <script src="_static/doctools.js?v=9a2dae69"></script>
20
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
21
+ <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
22
+ <script src="_static/js/theme.js"></script>
23
+ <link rel="index" title="Index" href="genindex.html" />
24
+ <link rel="search" title="Search" href="search.html" />
25
+ <link rel="next" title="ManifoldHP: High-precision variant" href="manifoldhp.html" />
26
+ <link rel="prev" title="The snappy module and its classes" href="snappy.html" />
27
+ </head>
28
+
29
+ <body class="wy-body-for-nav">
30
+ <div class="wy-grid-for-nav">
31
+ <nav data-toggle="wy-nav-shift" class="wy-nav-side">
32
+ <div class="wy-side-scroll">
33
+ <div class="wy-side-nav-search" >
34
+
35
+
36
+
37
+ <a href="index.html" class="icon icon-home">
38
+ SnapPy
39
+ <img src="_static/SnapPy-horizontal-128.png" class="logo" alt="Logo"/>
40
+ </a>
41
+ <div role="search">
42
+ <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
43
+ <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
44
+ <input type="hidden" name="check_keywords" value="yes" />
45
+ <input type="hidden" name="area" value="default" />
46
+ </form>
47
+ </div>
48
+ </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
49
+ <ul class="current">
50
+ <li class="toctree-l1"><a class="reference internal" href="installing.html">Installing SnapPy</a></li>
51
+ <li class="toctree-l1"><a class="reference internal" href="screenshots.html">Screenshots: SnapPy in action</a></li>
52
+ <li class="toctree-l1"><a class="reference internal" href="tutorial.html">Tutorial</a></li>
53
+ <li class="toctree-l1 current"><a class="reference internal" href="snappy.html">The snappy module and its classes</a><ul class="current">
54
+ <li class="toctree-l2 current"><a class="current reference internal" href="#">Manifold: the main class</a><ul>
55
+ <li class="toctree-l3"><a class="reference internal" href="#snappy.Manifold"><code class="docutils literal notranslate"><span class="pre">Manifold</span></code></a><ul>
56
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.DT_code"><code class="docutils literal notranslate"><span class="pre">Manifold.DT_code()</span></code></a></li>
57
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.alexander_polynomial"><code class="docutils literal notranslate"><span class="pre">Manifold.alexander_polynomial()</span></code></a></li>
58
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.browse"><code class="docutils literal notranslate"><span class="pre">Manifold.browse()</span></code></a></li>
59
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.canonical_retriangulation"><code class="docutils literal notranslate"><span class="pre">Manifold.canonical_retriangulation()</span></code></a></li>
60
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.canonize"><code class="docutils literal notranslate"><span class="pre">Manifold.canonize()</span></code></a></li>
61
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.chern_simons"><code class="docutils literal notranslate"><span class="pre">Manifold.chern_simons()</span></code></a></li>
62
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.complex_volume"><code class="docutils literal notranslate"><span class="pre">Manifold.complex_volume()</span></code></a></li>
63
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.copy"><code class="docutils literal notranslate"><span class="pre">Manifold.copy()</span></code></a></li>
64
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cover"><code class="docutils literal notranslate"><span class="pre">Manifold.cover()</span></code></a></li>
65
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cover_info"><code class="docutils literal notranslate"><span class="pre">Manifold.cover_info()</span></code></a></li>
66
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.covers"><code class="docutils literal notranslate"><span class="pre">Manifold.covers()</span></code></a></li>
67
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cusp_area_matrix"><code class="docutils literal notranslate"><span class="pre">Manifold.cusp_area_matrix()</span></code></a></li>
68
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cusp_areas"><code class="docutils literal notranslate"><span class="pre">Manifold.cusp_areas()</span></code></a></li>
69
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cusp_info"><code class="docutils literal notranslate"><span class="pre">Manifold.cusp_info()</span></code></a></li>
70
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cusp_neighborhood"><code class="docutils literal notranslate"><span class="pre">Manifold.cusp_neighborhood()</span></code></a></li>
71
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.cusp_translations"><code class="docutils literal notranslate"><span class="pre">Manifold.cusp_translations()</span></code></a></li>
72
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.dehn_fill"><code class="docutils literal notranslate"><span class="pre">Manifold.dehn_fill()</span></code></a></li>
73
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.dirichlet_domain"><code class="docutils literal notranslate"><span class="pre">Manifold.dirichlet_domain()</span></code></a></li>
74
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.drill"><code class="docutils literal notranslate"><span class="pre">Manifold.drill()</span></code></a></li>
75
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.drill_word"><code class="docutils literal notranslate"><span class="pre">Manifold.drill_word()</span></code></a></li>
76
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.drill_words"><code class="docutils literal notranslate"><span class="pre">Manifold.drill_words()</span></code></a></li>
77
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.dual_curves"><code class="docutils literal notranslate"><span class="pre">Manifold.dual_curves()</span></code></a></li>
78
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.edge_valences"><code class="docutils literal notranslate"><span class="pre">Manifold.edge_valences()</span></code></a></li>
79
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.exterior_to_link"><code class="docutils literal notranslate"><span class="pre">Manifold.exterior_to_link()</span></code></a></li>
80
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.filled_triangulation"><code class="docutils literal notranslate"><span class="pre">Manifold.filled_triangulation()</span></code></a></li>
81
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.fundamental_group"><code class="docutils literal notranslate"><span class="pre">Manifold.fundamental_group()</span></code></a></li>
82
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.gluing_equations"><code class="docutils literal notranslate"><span class="pre">Manifold.gluing_equations()</span></code></a></li>
83
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.gluing_equations_pgl"><code class="docutils literal notranslate"><span class="pre">Manifold.gluing_equations_pgl()</span></code></a></li>
84
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.has_finite_vertices"><code class="docutils literal notranslate"><span class="pre">Manifold.has_finite_vertices()</span></code></a></li>
85
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.high_precision"><code class="docutils literal notranslate"><span class="pre">Manifold.high_precision()</span></code></a></li>
86
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.holonomy_matrix_entries"><code class="docutils literal notranslate"><span class="pre">Manifold.holonomy_matrix_entries()</span></code></a></li>
87
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.homological_longitude"><code class="docutils literal notranslate"><span class="pre">Manifold.homological_longitude()</span></code></a></li>
88
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.homology"><code class="docutils literal notranslate"><span class="pre">Manifold.homology()</span></code></a></li>
89
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.hyperbolic_SLN_torsion"><code class="docutils literal notranslate"><span class="pre">Manifold.hyperbolic_SLN_torsion()</span></code></a></li>
90
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.hyperbolic_adjoint_torsion"><code class="docutils literal notranslate"><span class="pre">Manifold.hyperbolic_adjoint_torsion()</span></code></a></li>
91
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.hyperbolic_torsion"><code class="docutils literal notranslate"><span class="pre">Manifold.hyperbolic_torsion()</span></code></a></li>
92
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.identify"><code class="docutils literal notranslate"><span class="pre">Manifold.identify()</span></code></a></li>
93
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.inside_view"><code class="docutils literal notranslate"><span class="pre">Manifold.inside_view()</span></code></a></li>
94
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.invariant_trace_field_gens"><code class="docutils literal notranslate"><span class="pre">Manifold.invariant_trace_field_gens()</span></code></a></li>
95
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.is_isometric_to"><code class="docutils literal notranslate"><span class="pre">Manifold.is_isometric_to()</span></code></a></li>
96
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.is_orientable"><code class="docutils literal notranslate"><span class="pre">Manifold.is_orientable()</span></code></a></li>
97
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.is_two_bridge"><code class="docutils literal notranslate"><span class="pre">Manifold.is_two_bridge()</span></code></a></li>
98
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.isometry_signature"><code class="docutils literal notranslate"><span class="pre">Manifold.isometry_signature()</span></code></a></li>
99
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.isomorphisms_to"><code class="docutils literal notranslate"><span class="pre">Manifold.isomorphisms_to()</span></code></a></li>
100
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.length_spectrum"><code class="docutils literal notranslate"><span class="pre">Manifold.length_spectrum()</span></code></a></li>
101
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.length_spectrum_alt"><code class="docutils literal notranslate"><span class="pre">Manifold.length_spectrum_alt()</span></code></a></li>
102
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.length_spectrum_alt_gen"><code class="docutils literal notranslate"><span class="pre">Manifold.length_spectrum_alt_gen()</span></code></a></li>
103
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.link"><code class="docutils literal notranslate"><span class="pre">Manifold.link()</span></code></a></li>
104
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.name"><code class="docutils literal notranslate"><span class="pre">Manifold.name()</span></code></a></li>
105
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.normal_boundary_slopes"><code class="docutils literal notranslate"><span class="pre">Manifold.normal_boundary_slopes()</span></code></a></li>
106
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.normal_surfaces"><code class="docutils literal notranslate"><span class="pre">Manifold.normal_surfaces()</span></code></a></li>
107
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.num_cusps"><code class="docutils literal notranslate"><span class="pre">Manifold.num_cusps()</span></code></a></li>
108
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.num_tetrahedra"><code class="docutils literal notranslate"><span class="pre">Manifold.num_tetrahedra()</span></code></a></li>
109
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.orientation_cover"><code class="docutils literal notranslate"><span class="pre">Manifold.orientation_cover()</span></code></a></li>
110
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.plink"><code class="docutils literal notranslate"><span class="pre">Manifold.plink()</span></code></a></li>
111
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.polished_holonomy"><code class="docutils literal notranslate"><span class="pre">Manifold.polished_holonomy()</span></code></a></li>
112
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.ptolemy_generalized_obstruction_classes"><code class="docutils literal notranslate"><span class="pre">Manifold.ptolemy_generalized_obstruction_classes()</span></code></a></li>
113
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.ptolemy_obstruction_classes"><code class="docutils literal notranslate"><span class="pre">Manifold.ptolemy_obstruction_classes()</span></code></a></li>
114
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.ptolemy_variety"><code class="docutils literal notranslate"><span class="pre">Manifold.ptolemy_variety()</span></code></a></li>
115
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.randomize"><code class="docutils literal notranslate"><span class="pre">Manifold.randomize()</span></code></a></li>
116
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.reverse_orientation"><code class="docutils literal notranslate"><span class="pre">Manifold.reverse_orientation()</span></code></a></li>
117
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.save"><code class="docutils literal notranslate"><span class="pre">Manifold.save()</span></code></a></li>
118
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.set_name"><code class="docutils literal notranslate"><span class="pre">Manifold.set_name()</span></code></a></li>
119
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.set_peripheral_curves"><code class="docutils literal notranslate"><span class="pre">Manifold.set_peripheral_curves()</span></code></a></li>
120
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.set_target_holonomy"><code class="docutils literal notranslate"><span class="pre">Manifold.set_target_holonomy()</span></code></a></li>
121
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.set_tetrahedra_shapes"><code class="docutils literal notranslate"><span class="pre">Manifold.set_tetrahedra_shapes()</span></code></a></li>
122
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.short_slopes"><code class="docutils literal notranslate"><span class="pre">Manifold.short_slopes()</span></code></a></li>
123
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.simplify"><code class="docutils literal notranslate"><span class="pre">Manifold.simplify()</span></code></a></li>
124
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.slice_obstruction_HKL"><code class="docutils literal notranslate"><span class="pre">Manifold.slice_obstruction_HKL()</span></code></a></li>
125
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.solution_type"><code class="docutils literal notranslate"><span class="pre">Manifold.solution_type()</span></code></a></li>
126
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.split"><code class="docutils literal notranslate"><span class="pre">Manifold.split()</span></code></a></li>
127
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.splitting_surfaces"><code class="docutils literal notranslate"><span class="pre">Manifold.splitting_surfaces()</span></code></a></li>
128
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.symmetric_triangulation"><code class="docutils literal notranslate"><span class="pre">Manifold.symmetric_triangulation()</span></code></a></li>
129
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.symmetry_group"><code class="docutils literal notranslate"><span class="pre">Manifold.symmetry_group()</span></code></a></li>
130
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.symplectic_basis"><code class="docutils literal notranslate"><span class="pre">Manifold.symplectic_basis()</span></code></a></li>
131
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.tetrahedra_field_gens"><code class="docutils literal notranslate"><span class="pre">Manifold.tetrahedra_field_gens()</span></code></a></li>
132
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.tetrahedra_shapes"><code class="docutils literal notranslate"><span class="pre">Manifold.tetrahedra_shapes()</span></code></a></li>
133
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.trace_field_gens"><code class="docutils literal notranslate"><span class="pre">Manifold.trace_field_gens()</span></code></a></li>
134
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.triangulation_isosig"><code class="docutils literal notranslate"><span class="pre">Manifold.triangulation_isosig()</span></code></a></li>
135
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.use_field_conversion"><code class="docutils literal notranslate"><span class="pre">Manifold.use_field_conversion()</span></code></a></li>
136
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.verify_hyperbolicity"><code class="docutils literal notranslate"><span class="pre">Manifold.verify_hyperbolicity()</span></code></a></li>
137
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.volume"><code class="docutils literal notranslate"><span class="pre">Manifold.volume()</span></code></a></li>
138
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.with_hyperbolic_structure"><code class="docutils literal notranslate"><span class="pre">Manifold.with_hyperbolic_structure()</span></code></a></li>
139
+ <li class="toctree-l4"><a class="reference internal" href="#snappy.Manifold.without_hyperbolic_structure"><code class="docutils literal notranslate"><span class="pre">Manifold.without_hyperbolic_structure()</span></code></a></li>
140
+ </ul>
141
+ </li>
142
+ </ul>
143
+ </li>
144
+ <li class="toctree-l2"><a class="reference internal" href="manifoldhp.html">ManifoldHP: High-precision variant</a></li>
145
+ <li class="toctree-l2"><a class="reference internal" href="triangulation.html">Triangulation</a></li>
146
+ <li class="toctree-l2"><a class="reference internal" href="additional_classes.html">Additional Classes</a></li>
147
+ <li class="toctree-l2"><a class="reference internal" href="censuses.html">Census manifolds</a></li>
148
+ </ul>
149
+ </li>
150
+ <li class="toctree-l1"><a class="reference internal" href="plink.html">Using SnapPy’s link editor</a></li>
151
+ <li class="toctree-l1"><a class="reference internal" href="spherogram.html">Links: planar diagrams and invariants</a></li>
152
+ <li class="toctree-l1"><a class="reference internal" href="snap.html">Number theory of hyperbolic 3-manifolds</a></li>
153
+ <li class="toctree-l1"><a class="reference internal" href="verify.html">Verified computations</a></li>
154
+ <li class="toctree-l1"><a class="reference internal" href="other.html">Other components</a></li>
155
+ <li class="toctree-l1"><a class="reference internal" href="news.html">News</a></li>
156
+ <li class="toctree-l1"><a class="reference internal" href="credits.html">Credits</a></li>
157
+ <li class="toctree-l1"><a class="reference internal" href="bugs.html">Reporting bugs and other problems</a></li>
158
+ <li class="toctree-l1"><a class="reference internal" href="todo.html">To Do List</a></li>
159
+ <li class="toctree-l1"><a class="reference internal" href="development.html">Development Basics</a></li>
160
+ </ul>
161
+
162
+ </div>
163
+ </div>
164
+ </nav>
165
+
166
+ <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
167
+ <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
168
+ <a href="index.html">SnapPy</a>
169
+ </nav>
170
+
171
+ <div class="wy-nav-content">
172
+ <div class="rst-content">
173
+ <div role="navigation" aria-label="Page navigation">
174
+ <ul class="wy-breadcrumbs">
175
+ <li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
176
+ <li class="breadcrumb-item"><a href="snappy.html">The snappy module and its classes</a></li>
177
+ <li class="breadcrumb-item active">Manifold: the main class</li>
178
+ <li class="wy-breadcrumbs-aside">
179
+ </li>
180
+ </ul>
181
+ <hr/>
182
+ </div>
183
+ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
184
+ <div itemprop="articleBody">
185
+
186
+ <section id="manifold-the-main-class">
187
+ <h1>Manifold: the main class<a class="headerlink" href="#manifold-the-main-class" title="Link to this heading"></a></h1>
188
+ <dl class="py class">
189
+ <dt class="sig sig-object py" id="snappy.Manifold">
190
+ <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">snappy.</span></span><span class="sig-name descname"><span class="pre">Manifold</span></span><a class="headerlink" href="#snappy.Manifold" title="Link to this definition"></a></dt>
191
+ <dd><p>A Manifold is a <a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><code class="xref py py-class docutils literal notranslate"><span class="pre">Triangulation</span></code></a> together with a geometric structure.
192
+ That is, a Manifold is an ideal triangulation of the interior of a
193
+ compact 3-manifold with torus and Klein-bottle boundary components, where
194
+ each tetrahedron has been assigned the geometry of an ideal tetrahedron
195
+ in hyperbolic 3-space. A Dehn-filling can be specified for each
196
+ boundary component, allowing the description of closed 3-manifolds,
197
+ some orbifolds and cone 3-manifolds. Here’s a quick example:</p>
198
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;9_42&#39;</span><span class="p">)</span>
199
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
200
+ <span class="go">4.05686022</span>
201
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="s1">&#39;shape&#39;</span><span class="p">)</span>
202
+ <span class="go">[-4.278936315 + 1.95728679*I]</span>
203
+ </pre></div>
204
+ </div>
205
+ <p>This is an example for running SnapPy inside Sage:</p>
206
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">snappy</span>
207
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">snappy</span><span class="o">.</span><span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m125(1,2)(4,5)&#39;</span><span class="p">)</span>
208
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">is_orientable</span><span class="p">()</span>
209
+ <span class="kc">True</span>
210
+ </pre></div>
211
+ </div>
212
+ <p>An alternative way of running SnapPy inside Sage:</p>
213
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">snappy</span> <span class="kn">import</span> <span class="o">*</span>
214
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m123&#39;</span><span class="p">)</span>
215
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">()</span>
216
+ <span class="mi">1</span>
217
+ </pre></div>
218
+ </div>
219
+ <p>A Manifold can be specified in a number of ways, e.g.</p>
220
+ <ul class="simple">
221
+ <li><p>Manifold(‘9_42’) : The complement of the knot 9_42 in S^3.</p></li>
222
+ <li><p>Manifold(‘m125(1,2)(4,5)’) : The SnapPea census manifold m125
223
+ where the first cusp has Dehn filling (1,2) and the second cusp has
224
+ filling (4,5).</p></li>
225
+ <li><p>Manifold() : Opens a link editor window where can you
226
+ specify a link complement.</p></li>
227
+ </ul>
228
+ <p>In general, the specification can be from among the below, with
229
+ information on Dehn fillings added.</p>
230
+ <ul>
231
+ <li><p>SnapPea cusped census manifolds: e.g. ‘m123’, ‘s123’, ‘v123’.</p></li>
232
+ <li><p>Link complements:</p>
233
+ <blockquote>
234
+ <div><ul class="simple">
235
+ <li><p>Rolfsen’s table: e.g. ‘4_1’, ‘04_1’, ‘5^2_6’, ‘6_4^7’, ‘L20935’, ‘l104001’.</p></li>
236
+ <li><p>Hoste-Thistlethwaite Knotscape table: e.g. ‘11a17’ or ‘12n345’</p></li>
237
+ <li><p>Callahan-Dean-Weeks-Champanerkar-Kofman-Patterson knots: e.g. ‘K6_21’.</p></li>
238
+ <li><p>Dowker-Thistlethwaite code: e.g. ‘DT:[(6,8,2,4)]’</p></li>
239
+ </ul>
240
+ </div></blockquote>
241
+ </li>
242
+ <li><p>Once-punctured torus bundles: e.g. ‘b++LLR’, ‘b+-llR’, ‘bo-RRL’, ‘bn+LRLR’</p></li>
243
+ <li><p>Fibered manifold associated to a braid: ‘Braid[1,2,-3,4]’</p>
244
+ <p>Here, the braid is thought of as a mapping class of the
245
+ punctured disc, and this manifold is the corresponding
246
+ mapping torus. If you want the braid closure, do (1,0) filling
247
+ of the last cusp.</p>
248
+ </li>
249
+ <li><p>From mapping class group data using Twister:</p>
250
+ <p>‘Bundle(S_{1,1}, [a0, B1])’ or ‘Splitting(S_{1,0}, [b1, A0], [a0,B1])’</p>
251
+ <p>See the help for the ‘twister’ module for more.</p>
252
+ </li>
253
+ <li><p>A SnapPea triangulation or link projection file: ‘filename’</p>
254
+ <p>The file will be loaded if found in the current directory or the
255
+ path given by the shell variable <code class="docutils literal notranslate"><span class="pre">SNAPPEA_MANIFOLD_DIRECTORY</span></code>.
256
+ See <a class="reference internal" href="#snappy.Manifold.save" title="snappy.Manifold.save"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Manifold.save()</span></code></a> for details.</p>
257
+ </li>
258
+ <li><p>A string containing the contents of a SnapPea triangulation or link
259
+ projection file.</p></li>
260
+ </ul>
261
+ <dl class="py method">
262
+ <dt class="sig sig-object py" id="snappy.Manifold.DT_code">
263
+ <span class="sig-name descname"><span class="pre">DT_code</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">alpha</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">flips</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.DT_code" title="Link to this definition"></a></dt>
264
+ <dd><p>Return the Dowker-Thistlethwaite code of this link complement,
265
+ if it is a link complement. The DT code is intended to be an
266
+ immutable attribute, for use with knot and link exteriors
267
+ only, which is set only when the manifold was created.</p>
268
+ <p>Here is the Whitehead link:</p>
269
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;L5a1&#39;</span><span class="p">)</span>
270
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">DT_code</span><span class="p">()</span>
271
+ <span class="go">[(6, 8), (2, 10, 4)]</span>
272
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">DT_code</span><span class="p">(</span><span class="n">alpha</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
273
+ <span class="go">&#39;ebbccdaeb&#39;</span>
274
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">DT_code</span><span class="p">(</span><span class="n">alpha</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">flips</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
275
+ <span class="go">&#39;ebbccdaeb.01110&#39;</span>
276
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">DT_code</span><span class="p">(</span><span class="n">flips</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
277
+ <span class="go">([(6, 8), (2, 10, 4)], [0, 1, 1, 1, 0])</span>
278
+ </pre></div>
279
+ </div>
280
+ </dd></dl>
281
+
282
+ <dl class="py method">
283
+ <dt class="sig sig-object py" id="snappy.Manifold.alexander_polynomial">
284
+ <span class="sig-name descname"><span class="pre">alexander_polynomial</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.alexander_polynomial" title="Link to this definition"></a></dt>
285
+ <dd><p>Computes the multivariable Alexander polynomial of the manifold:</p>
286
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;K12n123&#39;</span><span class="p">)</span>
287
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">alexander_polynomial</span><span class="p">()</span>
288
+ <span class="mi">2</span><span class="o">*</span><span class="n">a</span><span class="o">^</span><span class="mi">6</span> <span class="o">-</span> <span class="mi">14</span><span class="o">*</span><span class="n">a</span><span class="o">^</span><span class="mi">5</span> <span class="o">+</span> <span class="mi">34</span><span class="o">*</span><span class="n">a</span><span class="o">^</span><span class="mi">4</span> <span class="o">-</span> <span class="mi">45</span><span class="o">*</span><span class="n">a</span><span class="o">^</span><span class="mi">3</span> <span class="o">+</span> <span class="mi">34</span><span class="o">*</span><span class="n">a</span><span class="o">^</span><span class="mi">2</span> <span class="o">-</span> <span class="mi">14</span><span class="o">*</span><span class="n">a</span> <span class="o">+</span> <span class="mi">2</span>
289
+
290
+ <span class="n">sage</span><span class="p">:</span> <span class="n">N</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;v1539(5,1)&#39;</span><span class="p">)</span>
291
+ <span class="n">sage</span><span class="p">:</span> <span class="n">N</span><span class="o">.</span><span class="n">alexander_polynomial</span><span class="p">()</span>
292
+ <span class="n">a</span><span class="o">^</span><span class="mi">2</span><span class="o">*</span><span class="n">b</span> <span class="o">+</span> <span class="n">a</span><span class="o">*</span><span class="n">b</span><span class="o">^</span><span class="mi">2</span> <span class="o">+</span> <span class="n">a</span><span class="o">*</span><span class="n">b</span> <span class="o">+</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
293
+ </pre></div>
294
+ </div>
295
+ <p>Any provided keyword arguments are passed to
296
+ <a class="reference internal" href="triangulation.html#snappy.Triangulation.fundamental_group" title="snappy.Triangulation.fundamental_group"><code class="xref py py-meth docutils literal notranslate"><span class="pre">fundamental_group</span></code></a> and
297
+ so affect the group presentation used in the computation.</p>
298
+ </dd></dl>
299
+
300
+ <dl class="py method">
301
+ <dt class="sig sig-object py" id="snappy.Manifold.browse">
302
+ <span class="sig-name descname"><span class="pre">browse</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.browse" title="Link to this definition"></a></dt>
303
+ <dd><p>Opens browser window with a graphical interface, which allows to
304
+ explore the manifold and interact with it.
305
+ This includes: invariants, Dirichlet domain, cusp neighborhoods,
306
+ inside view, symmetry, Dehn filling, drilling, etc.</p>
307
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m125&#39;</span><span class="p">)</span>
308
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">browse</span><span class="p">()</span>
309
+ </pre></div>
310
+ </div>
311
+ <p>This does not work when using SnapPy in a Docker container.</p>
312
+ </dd></dl>
313
+
314
+ <dl class="py method">
315
+ <dt class="sig sig-object py" id="snappy.Manifold.canonical_retriangulation">
316
+ <span class="sig-name descname"><span class="pre">canonical_retriangulation</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">interval_bits_precs</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Sequence</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">[53,</span> <span class="pre">212]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exact_bits_prec_and_degrees</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Sequence</span><span class="p"><span class="pre">[</span></span><span class="pre">Tuple</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">int</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">[(212,</span> <span class="pre">10),</span> <span class="pre">(1000,</span> <span class="pre">20),</span> <span class="pre">(2000,</span> <span class="pre">20)]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><span class="pre">Triangulation</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">Manifold</span></a></span></span><a class="headerlink" href="#snappy.Manifold.canonical_retriangulation" title="Link to this definition"></a></dt>
317
+ <dd><p>Returns a triangulation canonically associated to the hyperbolic manifold.
318
+ That is, the triangulation is (up to combinatorial isomorphism relabeling
319
+ the tetrahedra and vertices) completely determined by the isometry type of
320
+ the hyperbolic manifold.</p>
321
+ <p>Manifolds with incomplete cusps are rejected (unlike in the case of
322
+ <a class="reference internal" href="#snappy.Manifold.isometry_signature" title="snappy.Manifold.isometry_signature"><code class="xref py py-meth docutils literal notranslate"><span class="pre">isometry_signature</span></code></a>).</p>
323
+ <p>We now describe the canonical retriangulation. If all cells of
324
+ the canonical cell decomposition (defined by <a class="reference external" href="https://projecteuclid.org/euclid.jdg/1214441650">Epstein and Penner ‘88</a>) are tetrahedral,
325
+ <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation</span></code></a>
326
+ simply returns that ideal triangulation as a
327
+ <a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><code class="xref py py-class docutils literal notranslate"><span class="pre">Manifold</span></code></a>. Here is an example:</p>
328
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m015&quot;</span><span class="p">)</span>
329
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
330
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">K</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span>
331
+ <span class="go">False</span>
332
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">K</span><span class="o">.</span><span class="n">solution_type</span><span class="p">()</span>
333
+ <span class="go">&#39;all tetrahedra positively oriented&#39;</span>
334
+ </pre></div>
335
+ </div>
336
+ <p>If there are non-tetrahedral cells,
337
+ <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation</span></code></a>
338
+ subdivides the canonical cell decomposition. It introduces a finite vertex
339
+ for each canonical cell resulting in a
340
+ <a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><code class="xref py py-class docutils literal notranslate"><span class="pre">Triangulation</span></code></a>. Here is an example where the
341
+ canonical cell is a cube:</p>
342
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m412&quot;</span><span class="p">)</span>
343
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
344
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">K</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span>
345
+ <span class="go">True</span>
346
+ </pre></div>
347
+ </div>
348
+ <p>The canonical retriangulation can be used to find the symmetries of a
349
+ single manifold. It also can compute the isometries between two
350
+ manifolds. We do this using
351
+ <a class="reference internal" href="triangulation.html#snappy.Triangulation.isomorphisms_to" title="snappy.Triangulation.isomorphisms_to"><code class="xref py py-meth docutils literal notranslate"><span class="pre">isomorphisms_to</span></code></a>:</p>
352
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;5_2&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
353
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m015&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
354
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">isomorphisms_to</span><span class="p">(</span><span class="n">M</span><span class="p">)</span>
355
+ <span class="go">[0 -&gt; 0</span>
356
+ <span class="go">[1 0]</span>
357
+ <span class="go">[0 1]</span>
358
+ <span class="go">...</span>
359
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">isomorphisms_to</span><span class="p">(</span><span class="n">N</span><span class="p">)</span>
360
+ <span class="go">[0 -&gt; 0</span>
361
+ <span class="go">[-1 2]</span>
362
+ <span class="go">[ 0 -1]</span>
363
+ <span class="go">...</span>
364
+ </pre></div>
365
+ </div>
366
+ <p>The canonical retriangulation is also the basis for the
367
+ <a class="reference internal" href="#snappy.Manifold.isometry_signature" title="snappy.Manifold.isometry_signature"><code class="xref py py-meth docutils literal notranslate"><span class="pre">isometry_signature</span></code></a>.</p>
368
+ <p><strong>Subdivision</strong></p>
369
+ <p>If the canonical cell decomposition has a non-tetrahedral cell, the method
370
+ subdivides. You can think of the subdivision in either of the following
371
+ (equivalent) ways:</p>
372
+ <ul class="simple">
373
+ <li><p>A coarsening of the barycentric subdivision with only a quarter of the
374
+ number of tetrahedra. That is, take the barycentric subdivision and
375
+ merge the four tetrahedra adjacent to a barycentric edge connecting
376
+ an edge midpoint to a face midpoint.</p></li>
377
+ <li><p>Taking the double suspension of each face (which is an ideal n-gon)
378
+ about the centers of the two neighboring 3-cells. Then split each
379
+ such topological “lens” into n tetrahedra along its central axis.</p></li>
380
+ </ul>
381
+ <p><strong>Verified computations</strong></p>
382
+ <p>While the canonical retriangulation is combinatorial, some intermediate
383
+ computations are numerical. Thus, if <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>,
384
+ floating-point issues can arise.
385
+ (Arguably this gave rise to a mistake in the
386
+ non-orientable census. <code class="docutils literal notranslate"><span class="pre">x101</span></code> and <code class="docutils literal notranslate"><span class="pre">x103</span></code> were later identified as
387
+ the same by <a class="reference external" href="http://arxiv.org/abs/1311.7615">Burton ‘14</a>.)</p>
388
+ <p>The method can be made <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing
389
+ <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
390
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;v2986&quot;</span><span class="p">)</span>
391
+ <span class="n">sage</span><span class="p">:</span> <span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">(</span><span class="n">verified</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
392
+ <span class="n">sage</span><span class="p">:</span> <span class="n">K</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span> <span class="c1"># Cell decomposition verified to be tetrahedral</span>
393
+ <span class="kc">False</span>
394
+ <span class="n">sage</span><span class="p">:</span> <span class="n">K</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="c1"># Verified isometry signature.</span>
395
+ <span class="s1">&#39;jvLALQQdeefgihihiokcmmwwswg&#39;</span>
396
+ <span class="n">sage</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">K</span><span class="o">.</span><span class="n">isomorphisms_to</span><span class="p">(</span><span class="n">K</span><span class="p">))</span> <span class="c1"># Verified to have no (non-trivial) symmetries.</span>
397
+ <span class="mi">1</span>
398
+ </pre></div>
399
+ </div>
400
+ <p>Interval arithmetic can only be used to verify the canonical cell decomposition
401
+ if all cells are tetrahedral. For non-tetrahedral cells, the method
402
+ automatically switches to
403
+ exact methods to verify the canonical cell decomposition. That is, it uses
404
+ snap-like methods
405
+ (<a class="reference external" href="http://en.wikipedia.org/wiki/Lenstra%E2%80%93Lenstra%E2%80%93Lov%C3%A1sz_lattice_basis_reduction_algorithm">LLL-algorithm</a>)
406
+ to guess a representation of the
407
+ shapes in the shape field. It then uses exact arithmetic to verify the
408
+ shapes form a valid geometric structure and compute the necessary tilts
409
+ to verify the canonical cell decomposition. Note that this can take a
410
+ long time!</p>
411
+ <p>Here is an example where exact methods are used:</p>
412
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m412&quot;</span><span class="p">)</span>
413
+ <span class="n">sage</span><span class="p">:</span> <span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">(</span><span class="n">verified</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
414
+ <span class="n">sage</span><span class="p">:</span> <span class="n">K</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span> <span class="c1"># Has non-tetrahedral cell</span>
415
+ <span class="kc">True</span>
416
+ </pre></div>
417
+ </div>
418
+ <p>If the canonical retriangulation cannot be verified, an exception will be
419
+ raised. (Note that this is new (and safer) in Version 3.2. Prior to that
420
+ version, <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Manifold.canonical_retriangulation()</span></code></a> could return <code class="docutils literal notranslate"><span class="pre">None</span></code>
421
+ instead.)</p>
422
+ <p>Here is an example where we skip the (potentially lengthy) exact methods
423
+ needed to verify a non-tetrahedral cell. The method fails (early
424
+ and with an exception) since the cells are actually tetrahedral:</p>
425
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m412&quot;</span><span class="p">)</span>
426
+ <span class="n">sage</span><span class="p">:</span> <span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">(</span><span class="n">verified</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">exact_bits_prec_and_degrees</span> <span class="o">=</span> <span class="p">[])</span> <span class="c1"># doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL</span>
427
+ <span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
428
+ <span class="o">...</span>
429
+ <span class="n">snappy</span><span class="o">.</span><span class="n">verify</span><span class="o">.</span><span class="n">exceptions</span><span class="o">.</span><span class="n">TiltInequalityNumericalVerifyError</span><span class="p">:</span> <span class="n">Numerical</span> <span class="n">verification</span> <span class="n">that</span> <span class="n">tilt</span> <span class="ow">is</span> <span class="n">negative</span> <span class="n">has</span> <span class="n">failed</span><span class="p">:</span> <span class="o">...</span> <span class="o">&lt;</span> <span class="mi">0</span>
430
+ </pre></div>
431
+ </div>
432
+ <dl class="field-list simple">
433
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
434
+ <dd class="field-odd"><ul class="simple">
435
+ <li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
436
+ <li><p><strong>interval_bits_precs</strong> – Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>.
437
+ A list of (increasing) precisions used to try to
438
+ certify the canonical cell decomposition using intervals. Each
439
+ precision is tried until we succeed. If none succeeded, we move on
440
+ to exact methods.</p></li>
441
+ <li><p><strong>exact_bits_prec_and_degrees</strong> – Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>.
442
+ A list of pairs (precision, max degree) used when the
443
+ LLL-algorithm is trying to find the defining
444
+ polynomial of the shape field with
445
+ <code class="docutils literal notranslate"><span class="pre">ListOfApproximateAlgebraicNumbers.find_field</span></code>.
446
+ Each pair is tried until we succeed.</p></li>
447
+ <li><p><strong>verbose</strong> – Print information about the methods tried to compute and verify the
448
+ canonical retriangulation.</p></li>
449
+ </ul>
450
+ </dd>
451
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
452
+ <dd class="field-even"><p>If the canonical cell decomposition exists entirely of
453
+ (hyperbolic ideal) tetrahedra, a <a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><code class="xref py py-class docutils literal notranslate"><span class="pre">Manifold</span></code></a> with those
454
+ tetrahedra.
455
+ Otherwise, a <a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><code class="xref py py-class docutils literal notranslate"><span class="pre">Triangulation</span></code></a> that is a subdivision of the
456
+ canonical cell decomposition.</p>
457
+ </dd>
458
+ </dl>
459
+ </dd></dl>
460
+
461
+ <dl class="py method">
462
+ <dt class="sig sig-object py" id="snappy.Manifold.canonize">
463
+ <span class="sig-name descname"><span class="pre">canonize</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#snappy.Manifold.canonize" title="Link to this definition"></a></dt>
464
+ <dd><p>Change the triangulation to an arbitrary retriangulation of
465
+ the canonical cell decomposition. See
466
+ <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation</span></code></a>
467
+ to get the actual canonical cell decomposition.</p>
468
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m007&#39;</span><span class="p">)</span>
469
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">num_tetrahedra</span><span class="p">()</span>
470
+ <span class="go">3</span>
471
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">canonize</span><span class="p">()</span>
472
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">num_tetrahedra</span><span class="p">()</span>
473
+ <span class="go">4</span>
474
+ </pre></div>
475
+ </div>
476
+ <p>Note: Due to rounding error, it is possible that this is actually
477
+ not a retriangulation of the canonical cell decomposition.</p>
478
+ </dd></dl>
479
+
480
+ <dl class="py method">
481
+ <dt class="sig sig-object py" id="snappy.Manifold.chern_simons">
482
+ <span class="sig-name descname"><span class="pre">chern_simons</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">accuracy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.chern_simons" title="Link to this definition"></a></dt>
483
+ <dd><p>Returns the Chern-Simons invariant of the manifold (normalized by
484
+ dividing it by <span class="math notranslate nohighlight">\(2 \pi^2\)</span>), if it is known.</p>
485
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m015&#39;</span><span class="p">)</span>
486
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">()</span>
487
+ <span class="go">-0.15320413</span>
488
+ </pre></div>
489
+ </div>
490
+ <p>The return value has an extra attribute, accuracy, which
491
+ is the number of digits of accuracy as <em>estimated</em> by SnapPea.</p>
492
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">cs</span><span class="p">,</span> <span class="n">accuracy</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">(</span><span class="n">accuracy</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
493
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">accuracy</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">56</span><span class="p">)</span> <span class="c1"># Low and High precision</span>
494
+ <span class="go">True</span>
495
+ </pre></div>
496
+ </div>
497
+ <p>By default, when the manifold has at least one cusp, Zickert’s
498
+ algorithm is used; when the manifold is closed we use SnapPea’s
499
+ original algorithm, which is based on Meyerhoff-Hodgson-Neumann.</p>
500
+ <p>Note: When computing the Chern-Simons invariant of a closed
501
+ manifold, one must sometimes compute it first for the unfilled
502
+ manifold so as to initialize SnapPea’s internals. For instance,</p>
503
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;5_2&#39;</span><span class="p">)</span>
504
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">()</span>
505
+ <span class="go">-0.15320413</span>
506
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">(</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span> <span class="p">)</span>
507
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">()</span>
508
+ <span class="go">0.07731787</span>
509
+ </pre></div>
510
+ </div>
511
+ <p>works, but will fail with
512
+ <code class="docutils literal notranslate"><span class="pre">ValueError:</span> <span class="pre">The</span> <span class="pre">Chern-Simons</span> <span class="pre">invariant</span> <span class="pre">isn't</span> <span class="pre">currently</span> <span class="pre">known.</span></code>
513
+ if the first call to chern_simons is not made.</p>
514
+ </dd></dl>
515
+
516
+ <dl class="py method">
517
+ <dt class="sig sig-object py" id="snappy.Manifold.complex_volume">
518
+ <span class="sig-name descname"><span class="pre">complex_volume</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">verified_modulo_2_torsion</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.complex_volume" title="Link to this definition"></a></dt>
519
+ <dd><p>Returns the complex volume modulo <span class="math notranslate nohighlight">\(i \pi^2\)</span> which is given by</p>
520
+ <div class="math notranslate nohighlight">
521
+ \[\text{vol} + i \text{CS}\]</div>
522
+ <p>where <span class="math notranslate nohighlight">\(\text{CS}\)</span> is the (unnormalized) Chern-Simons invariant.</p>
523
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;5_2&#39;</span><span class="p">)</span>
524
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">complex_volume</span><span class="p">()</span>
525
+ <span class="go">2.82812209 - 3.02412838*I</span>
526
+ </pre></div>
527
+ </div>
528
+ <p>Note that <a class="reference internal" href="#snappy.Manifold.chern_simons" title="snappy.Manifold.chern_simons"><code class="xref py py-meth docutils literal notranslate"><span class="pre">chern_simons</span></code></a>
529
+ normalizes the Chern-Simons invariant by dividing it by
530
+ <span class="math notranslate nohighlight">\(2 \pi^2 = 19.7392...\)</span></p>
531
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">()</span>
532
+ <span class="go">-0.153204133297152</span>
533
+ </pre></div>
534
+ </div>
535
+ <p>More examples:</p>
536
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span>
537
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">complex_volume</span><span class="p">()</span>
538
+ <span class="go">2.22671790 + 1.52619361*I</span>
539
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;3_1&quot;</span><span class="p">)</span> <span class="c1"># A non-hyperbolic example.</span>
540
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">cvol</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">complex_volume</span><span class="p">()</span>
541
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">cvol</span><span class="o">.</span><span class="n">real</span><span class="p">()</span>
542
+ <span class="go">0</span>
543
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">cvol</span><span class="o">.</span><span class="n">imag</span><span class="p">()</span>
544
+ <span class="go">-1.64493407</span>
545
+ </pre></div>
546
+ </div>
547
+ <p>If no cusp is filled or there is only one cusped (filled or
548
+ unfilled), the complex volume can be verified up to multiples
549
+ of <span class="math notranslate nohighlight">\(i \pi^2 /2\)</span> by passing <code class="docutils literal notranslate"><span class="pre">verified_modulo_2_torsion</span> <span class="pre">=</span> <span class="pre">True</span></code>
550
+ when inside SageMath. Higher precision can be requested
551
+ with <code class="docutils literal notranslate"><span class="pre">bits_prec</span></code>:</p>
552
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M = Manifold(&quot;m015&quot;)
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(&quot;m015(3,4)&quot;)
556
+ sage: M.complex_volume(verified_modulo_2_torsion=True) # doctest: +NUMERIC6
557
+ 2.625051576? - 0.537092383?*I
558
+ </pre></div>
559
+ </div>
560
+ </dd></dl>
561
+
562
+ <dl class="py method">
563
+ <dt class="sig sig-object py" id="snappy.Manifold.copy">
564
+ <span class="sig-name descname"><span class="pre">copy</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.copy" title="Link to this definition"></a></dt>
565
+ <dd><p>Returns a copy of the manifold</p>
566
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m015&#39;</span><span class="p">)</span>
567
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
568
+ </pre></div>
569
+ </div>
570
+ </dd></dl>
571
+
572
+ <dl class="py method">
573
+ <dt class="sig sig-object py" id="snappy.Manifold.cover">
574
+ <span class="sig-name descname"><span class="pre">cover</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">permutation_rep</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">snappy.Manifold</span></a></span></span><a class="headerlink" href="#snappy.Manifold.cover" title="Link to this definition"></a></dt>
575
+ <dd><p>Returns a <a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><code class="xref py py-class docutils literal notranslate"><span class="pre">Manifold</span></code></a> representing the finite cover specified by a
576
+ transitive permutation representation. The representation is
577
+ specified by a list of permutations, one for each generator of the
578
+ simplified presentation of the fundamental group. Each permutation is
579
+ specified as a list <code class="docutils literal notranslate"><span class="pre">P</span></code> such such that <code class="docutils literal notranslate"><span class="pre">set(P)</span> <span class="pre">==</span> <span class="pre">set(range(d))</span></code>
580
+ where <code class="docutils literal notranslate"><span class="pre">d</span></code> is the degree of the cover.</p>
581
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
582
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N0</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">3</span><span class="p">]])</span>
583
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">abs</span><span class="p">(</span><span class="n">N0</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span><span class="o">/</span><span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span> <span class="o">-</span> <span class="mi">5</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mf">0.0000000001</span>
584
+ <span class="go">True</span>
585
+ </pre></div>
586
+ </div>
587
+ <p>If within SageMath, the permutations can also be of type
588
+ <code class="docutils literal notranslate"><span class="pre">PermutationGroupElement</span></code>, in which case they act on the set
589
+ <code class="docutils literal notranslate"><span class="pre">range(1,</span> <span class="pre">d</span> <span class="pre">+</span> <span class="pre">1)</span></code>. Or, you can specify a GAP or Magma subgroup
590
+ of the fundamental group. Some examples:</p>
591
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
592
+ </pre></div>
593
+ </div>
594
+ <p>The basic method:</p>
595
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">N0</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">3</span><span class="p">]])</span>
596
+ </pre></div>
597
+ </div>
598
+ <p>From a Gap subgroup:</p>
599
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">G</span> <span class="o">=</span> <span class="n">gap</span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">())</span>
600
+ <span class="n">sage</span><span class="p">:</span> <span class="n">H</span> <span class="o">=</span> <span class="n">G</span><span class="o">.</span><span class="n">LowIndexSubgroupsFpGroup</span><span class="p">(</span><span class="mi">5</span><span class="p">)[</span><span class="mi">9</span><span class="p">]</span>
601
+ <span class="n">sage</span><span class="p">:</span> <span class="n">N1</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">(</span><span class="n">H</span><span class="p">)</span>
602
+ <span class="n">sage</span><span class="p">:</span> <span class="n">N0</span> <span class="o">==</span> <span class="n">N1</span>
603
+ <span class="kc">True</span>
604
+ </pre></div>
605
+ </div>
606
+ <p>Or a homomorphism to a permutation group:</p>
607
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">f</span> <span class="o">=</span> <span class="n">G</span><span class="o">.</span><span class="n">GQuotients</span><span class="p">(</span><span class="n">PSL</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">7</span><span class="p">))[</span><span class="mi">1</span><span class="p">]</span>
608
+ <span class="n">sage</span><span class="p">:</span> <span class="n">N2</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
609
+ <span class="n">sage</span><span class="p">:</span> <span class="n">N2</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span><span class="o">/</span><span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span> <span class="c1"># doctest: +NUMERIC9</span>
610
+ <span class="mf">8.00000000</span>
611
+ </pre></div>
612
+ </div>
613
+ <p>Or maybe we want larger cover coming from the kernel of this:</p>
614
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">N3</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">Kernel</span><span class="p">())</span>
615
+ <span class="n">sage</span><span class="p">:</span> <span class="n">N3</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span><span class="o">/</span><span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span> <span class="c1"># doctest: +NUMERIC9</span>
616
+ <span class="mf">168.00000000</span>
617
+ </pre></div>
618
+ </div>
619
+ <p>Check the homology against what Gap computes directly:</p>
620
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">N3</span><span class="o">.</span><span class="n">homology</span><span class="p">()</span><span class="o">.</span><span class="n">betti_number</span><span class="p">()</span>
621
+ <span class="mi">32</span>
622
+ <span class="n">sage</span><span class="p">:</span> <span class="nb">len</span><span class="p">([</span> <span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">f</span><span class="o">.</span><span class="n">Kernel</span><span class="p">()</span><span class="o">.</span><span class="n">AbelianInvariants</span><span class="p">()</span><span class="o">.</span><span class="n">sage</span><span class="p">()</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">0</span><span class="p">])</span>
623
+ <span class="mi">32</span>
624
+ </pre></div>
625
+ </div>
626
+ <p>We can do the same for Magma:</p>
627
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">G</span> <span class="o">=</span> <span class="n">magma</span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">())</span> <span class="c1">#doctest: +SKIP</span>
628
+ <span class="n">sage</span><span class="p">:</span> <span class="n">Q</span><span class="p">,</span> <span class="n">f</span> <span class="o">=</span> <span class="n">G</span><span class="o">.</span><span class="n">pQuotient</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">nvals</span> <span class="o">=</span> <span class="mi">2</span><span class="p">)</span> <span class="c1">#doctest: +SKIP</span>
629
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">Kernel</span><span class="p">())</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span> <span class="c1">#doctest: +SKIP</span>
630
+ <span class="mf">10.14941606</span>
631
+ <span class="n">sage</span><span class="p">:</span> <span class="n">h</span> <span class="o">=</span> <span class="n">G</span><span class="o">.</span><span class="n">SimpleQuotients</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)[</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">]</span> <span class="c1">#doctest: +SKIP</span>
632
+ <span class="n">sage</span><span class="p">:</span> <span class="n">N4</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cover</span><span class="p">(</span><span class="n">h</span><span class="p">)</span> <span class="c1">#doctest: +SKIP</span>
633
+ <span class="n">sage</span><span class="p">:</span> <span class="n">N2</span> <span class="o">==</span> <span class="n">N4</span> <span class="c1">#doctest: +SKIP</span>
634
+ <span class="kc">True</span>
635
+ </pre></div>
636
+ </div>
637
+ </dd></dl>
638
+
639
+ <dl class="py method">
640
+ <dt class="sig sig-object py" id="snappy.Manifold.cover_info">
641
+ <span class="sig-name descname"><span class="pre">cover_info</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.cover_info" title="Link to this definition"></a></dt>
642
+ <dd><p>If this is a manifold or triangulation which was constructed as
643
+ a covering space, return a dictionary describing the cover. Otherwise
644
+ return 0. The dictionary keys are ‘base’, ‘type’ and ‘degree’.</p>
645
+ </dd></dl>
646
+
647
+ <dl class="py method">
648
+ <dt class="sig sig-object py" id="snappy.Manifold.covers">
649
+ <span class="sig-name descname"><span class="pre">covers</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">degree</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">method</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cover_type</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'all'</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">list</span><span class="p"><span class="pre">[</span></span><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">snappy.Manifold</span></a><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#snappy.Manifold.covers" title="Link to this definition"></a></dt>
650
+ <dd><p>Returns a list of <a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><code class="xref py py-class docutils literal notranslate"><span class="pre">Manifold</span></code></a>s corresponding to all of the
651
+ finite covers of the given degree. The default method is
652
+ ‘low_index’ for general covers and ‘snappea’ for cyclic
653
+ covers. The former uses Sim’s algorithm while the latter
654
+ uses the original Snappea algorithm.</p>
655
+ <p>WARNING: If the degree is large this might take a very, very,
656
+ very long time.</p>
657
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m003&#39;</span><span class="p">)</span>
658
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">covers</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">covers</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
659
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">sorted</span><span class="p">(</span><span class="n">N</span><span class="o">.</span><span class="n">homology</span><span class="p">()</span> <span class="k">for</span> <span class="n">N</span> <span class="ow">in</span> <span class="n">covers</span><span class="p">)</span>
660
+ <span class="go">[Z/3 + Z/15 + Z, Z/5 + Z + Z]</span>
661
+ </pre></div>
662
+ </div>
663
+ <p>It is faster to look just at cyclic covers.</p>
664
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">covers</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">covers</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="n">cover_type</span><span class="o">=</span><span class="s1">&#39;cyclic&#39;</span><span class="p">)</span>
665
+ <span class="gp">&gt;&gt;&gt; </span><span class="p">[(</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="o">.</span><span class="n">homology</span><span class="p">())</span> <span class="k">for</span> <span class="n">N</span> <span class="ow">in</span> <span class="n">covers</span><span class="p">]</span>
666
+ <span class="go">[(m003~cyc~0(0,0), Z/3 + Z/15 + Z)]</span>
667
+ </pre></div>
668
+ </div>
669
+ <p>Here we check that we get the same number of covers with the
670
+ ‘snappea’ and ‘low_index’ methods.</p>
671
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m125&#39;</span><span class="p">)</span>
672
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">len</span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">covers</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span>
673
+ <span class="go">19</span>
674
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">len</span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">covers</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">&#39;snappea&#39;</span><span class="p">))</span>
675
+ <span class="go">19</span>
676
+ </pre></div>
677
+ </div>
678
+ <p>If you are using Sage, you can use GAP to find the subgroups,
679
+ which is often much faster, by specifying the optional
680
+ argument method = ‘gap’ If you have Magma installed, you can
681
+ used it to do the heavy lifting by specifying method=’magma’.</p>
682
+ </dd></dl>
683
+
684
+ <dl class="py method">
685
+ <dt class="sig sig-object py" id="snappy.Manifold.cusp_area_matrix">
686
+ <span class="sig-name descname"><span class="pre">cusp_area_matrix</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">method</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'maximal'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.cusp_area_matrix" title="Link to this definition"></a></dt>
687
+ <dd><p>Returns the maximal cusp area matrix <span class="math notranslate nohighlight">\((A_{ij})\)</span> where
688
+ <span class="math notranslate nohighlight">\(A_{ij}\)</span> is defined as follows.
689
+ Let <span class="math notranslate nohighlight">\(C_i\)</span> and <span class="math notranslate nohighlight">\(C_j\)</span> be the (open) cusp neighborhoods about cusp
690
+ <span class="math notranslate nohighlight">\(i\)</span> and <span class="math notranslate nohighlight">\(j\)</span>. Let <span class="math notranslate nohighlight">\(A(C_i)\)</span> and <span class="math notranslate nohighlight">\(A(C_j)\)</span> be the
691
+ areas of <span class="math notranslate nohighlight">\(C_i\)</span> and <span class="math notranslate nohighlight">\(C_j\)</span>, respectively. Then, <span class="math notranslate nohighlight">\(C_i\)</span>
692
+ and <span class="math notranslate nohighlight">\(C_j\)</span> are embedded (if <span class="math notranslate nohighlight">\(i = j\)</span>) or disjoint (otherwise)
693
+ if and only if <span class="math notranslate nohighlight">\(A(C_i)A(C_j) \leq A_{ij}\)</span>.</p>
694
+ <p>Here is an example:</p>
695
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;L6a5&quot;</span><span class="p">)</span>
696
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_area_matrix</span><span class="p">()</span>
697
+ <span class="go">[27.9999999999996 7.00000000000000 7.00000000000000]</span>
698
+ <span class="go">[7.00000000000000 27.9999999999999 7.00000000000000]</span>
699
+ <span class="go">[7.00000000000000 7.00000000000000 28.0000000000001]</span>
700
+ </pre></div>
701
+ </div>
702
+ <p><strong>Faster lower bounds</strong></p>
703
+ <p>This section can be skipped by most users!</p>
704
+ <p>Prior to SnapPy version 3.2, the algorithm to compute the maximal cusp
705
+ area matrix was much slower and required <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code> and
706
+ SageMath. Thus, in prior versions, <code class="xref py py-attr docutils literal notranslate"><span class="pre">method</span></code> defaulted to
707
+ <code class="docutils literal notranslate"><span class="pre">trigDependentTryCanonize</span></code>. This meant, that, by default,
708
+ <a class="reference internal" href="#snappy.Manifold.cusp_area_matrix" title="snappy.Manifold.cusp_area_matrix"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_area_matrix()</span></code></a> only returned
709
+ (some) lower bounds for the maximal cusp area matrix entries.</p>
710
+ <p>These lower bounds can still be accessed:</p>
711
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_area_matrix</span><span class="p">(</span><span class="n">method</span> <span class="o">=</span> <span class="s1">&#39;trigDependentTryCanonize&#39;</span><span class="p">)</span>
712
+ <span class="go">[21.4375000000000 7.00000000000000 7.00000000000000]</span>
713
+ <span class="go">[7.00000000000000 28.0000000000000 7.00000000000000]</span>
714
+ <span class="go">[7.00000000000000 7.00000000000000 28.0000000000000]</span>
715
+ </pre></div>
716
+ </div>
717
+ <p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">method</span> <span class="pre">=</span> <span class="pre">'trigDependent'</span></code> or
718
+ <code class="xref py py-attr docutils literal notranslate"><span class="pre">method</span> <span class="pre">=</span> <span class="pre">'trigDependenyTryCanonize'</span></code>, the result is triangulation
719
+ dependent or not even deterministic, respectively.
720
+ Furthermore, if <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code> is also set, while the left
721
+ endpoints of the intervals are lower bounds for the maximal cusp area
722
+ matrix entries, the right endpoints are meaningless and could be smaller
723
+ or larger than the maximal cusp area matrix entries.</p>
724
+ <p><strong>Verified computation</strong></p>
725
+ <p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>, floating-point issues can arise resulting in
726
+ incorrect values. The method can be made
727
+ <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
728
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M.cusp_area_matrix(verified=True) # doctest: +NUMERIC3
729
+ [ 28.0000? 7.000000000000? 7.00000000000?]
730
+ [7.000000000000? 28.000000? 7.00000000000?]
731
+ [ 7.00000000000? 7.00000000000? 28.00000?]
732
+ </pre></div>
733
+ </div>
734
+ <dl class="field-list simple">
735
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
736
+ <dd class="field-odd"><ul class="simple">
737
+ <li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
738
+ <li><p><strong>bits_prec</strong> – Precision used for computation. Increase if computation
739
+ did not succeed or a more precise result is desired.</p></li>
740
+ <li><p><strong>method</strong> – Switches to older algorithms giving lower bounds when
741
+ <code class="docutils literal notranslate"><span class="pre">trigDependentTryCanonize</span></code> and <code class="docutils literal notranslate"><span class="pre">trigDependent</span></code>.</p></li>
742
+ </ul>
743
+ </dd>
744
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
745
+ <dd class="field-even"><p>Maximal cusp area matrix (default) or lower bounds
746
+ (if <code class="xref py py-attr docutils literal notranslate"><span class="pre">method</span></code> switches to older algorithm).</p>
747
+ </dd>
748
+ </dl>
749
+ </dd></dl>
750
+
751
+ <dl class="py method">
752
+ <dt class="sig sig-object py" id="snappy.Manifold.cusp_areas">
753
+ <span class="sig-name descname"><span class="pre">cusp_areas</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">policy</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'unbiased'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">method</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'maximal'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">first_cusps</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">[]</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.cusp_areas" title="Link to this definition"></a></dt>
754
+ <dd><p>Returns a list of areas, one for each cusp. The cusp neighborhoods
755
+ defined by these areas are embedded and disjoint. Furthermore, these
756
+ neighborhoods are maximal in that they fail to be embedded or
757
+ disjoint if any cusp neighborhood is enlarged (unless <code class="xref py py-attr docutils literal notranslate"><span class="pre">method</span></code>
758
+ is set to a value different from the default).</p>
759
+ <p>There are different policies how these cusp neighborhoods are found.</p>
760
+ <p>The default <code class="xref py py-attr docutils literal notranslate"><span class="pre">policy</span></code> is <code class="docutils literal notranslate"><span class="pre">unbiased</span></code>. This means that the
761
+ cusp neighborhoods are blown up simultaneously and a cusp neighborhood
762
+ stops growing when it touches any cusp neighborhood including itself:</p>
763
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;s776&quot;</span><span class="p">)</span>
764
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_areas</span><span class="p">()</span>
765
+ <span class="go">[2.64575131106459, 2.64575131106459, 2.64575131106459]</span>
766
+ </pre></div>
767
+ </div>
768
+ <p>Alternatively, <code class="xref py py-attr docutils literal notranslate"><span class="pre">policy='greedy'</span></code> can be specified. This means
769
+ that the first cusp neighborhood is blown up until it touches itself,
770
+ then the second cusp neighborhood is blown up until it touches itself
771
+ or the first cusp neighborhood, and so on:</p>
772
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_areas</span><span class="p">(</span><span class="n">policy</span><span class="o">=</span><span class="s1">&#39;greedy&#39;</span><span class="p">)</span>
773
+ <span class="go">[5.29150262212918, 1.32287565553230, 1.32287565553229]</span>
774
+ </pre></div>
775
+ </div>
776
+ <p>Use <code class="xref py py-attr docutils literal notranslate"><span class="pre">first_cusps</span></code> to specify the order in which the cusp
777
+ neighborhoods are blown up:</p>
778
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_areas</span><span class="p">(</span><span class="n">policy</span><span class="o">=</span><span class="s1">&#39;greedy&#39;</span><span class="p">,</span> <span class="n">first_cusps</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">])</span>
779
+ <span class="go">[1.32287565553230, 5.29150262212918, 1.32287565553229]</span>
780
+ </pre></div>
781
+ </div>
782
+ <p>An incomplete list can be given to <code class="xref py py-attr docutils literal notranslate"><span class="pre">first_cusps</span></code>. In this case,
783
+ the list is automatically completed by appending the remaining cusps in
784
+ order. Thus, the above call is equivalent to:</p>
785
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_areas</span><span class="p">(</span><span class="n">policy</span><span class="o">=</span><span class="s1">&#39;greedy&#39;</span><span class="p">,</span> <span class="n">first_cusps</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
786
+ <span class="go">[1.32287565553230, 5.29150262212918, 1.32287565553229]</span>
787
+ </pre></div>
788
+ </div>
789
+ <p>Under the hood, this method is using
790
+ <a class="reference internal" href="#snappy.Manifold.cusp_area_matrix" title="snappy.Manifold.cusp_area_matrix"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_area_matrix()</span></code></a>.</p>
791
+ <p><strong>Verified computation</strong></p>
792
+ <p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>, floating-point issues can arise resulting in
793
+ incorrect values. The method can be made
794
+ <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
795
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M=Manifold(&quot;s776&quot;)
796
+ sage: M.cusp_areas(verified=True) # doctest: +NUMERIC9
797
+ [2.64575131107?, 2.64575131107?, 2.64575131107?]
798
+ </pre></div>
799
+ </div>
800
+ <dl class="field-list simple">
801
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
802
+ <dd class="field-odd"><ul class="simple">
803
+ <li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
804
+ <li><p><strong>bits_prec</strong> – Precision used for computation. Increase if computation
805
+ did not succeed or a more precise result is desired.</p></li>
806
+ <li><p><strong>method</strong> – Passed to <a class="reference internal" href="#snappy.Manifold.cusp_area_matrix" title="snappy.Manifold.cusp_area_matrix"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_area_matrix()</span></code></a>. If set
807
+ to a value different from the default <code class="docutils literal notranslate"><span class="pre">maximal</span></code>, the cusp
808
+ neighborhoods stop growing when the corresponding value
809
+ in the computed cusp area matrix is exceeded. At this point,
810
+ the cusp neighborhood might not necessarily touch any other
811
+ cusp neighborhood since we do not use the maximal cusp area
812
+ matrix.</p></li>
813
+ <li><p><strong>policy</strong> – Specifies process of choosing cusp neighborhoods.
814
+ Either <code class="docutils literal notranslate"><span class="pre">unbiased</span></code> or <code class="docutils literal notranslate"><span class="pre">greedy</span></code>, see above.</p></li>
815
+ <li><p><strong>first_cusps</strong> – Preference order of cusps.
816
+ Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">policy='greedy'</span></code>, see above.</p></li>
817
+ </ul>
818
+ </dd>
819
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
820
+ <dd class="field-even"><p>Areas of maximal embedded and disjoint cusp neighborhoods
821
+ (default). Or areas of some embedded and disjoint cusp
822
+ neighborhoods (if <code class="xref py py-attr docutils literal notranslate"><span class="pre">method</span></code> switches to older algorithm).</p>
823
+ </dd>
824
+ </dl>
825
+ </dd></dl>
826
+
827
+ <dl class="py method">
828
+ <dt class="sig sig-object py" id="snappy.Manifold.cusp_info">
829
+ <span class="sig-name descname"><span class="pre">cusp_info</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data_spec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.cusp_info" title="Link to this definition"></a></dt>
830
+ <dd><p>Returns an info object containing information about the given
831
+ cusp. Usage:</p>
832
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;v3227(0,0)(1,2)(3,2)&#39;</span><span class="p">)</span>
833
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
834
+ <span class="go">Cusp 1 : torus cusp with Dehn filling coefficients (M, L) = (1.0, 2.0)</span>
835
+ </pre></div>
836
+ </div>
837
+ <p>To get more detailed information about the cusp, we do</p>
838
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">c</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
839
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">c</span><span class="o">.</span><span class="n">shape</span>
840
+ <span class="go">0.11044502 + 0.94677098*I</span>
841
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">c</span><span class="o">.</span><span class="n">modulus</span>
842
+ <span class="go">-0.12155872 + 1.04204128*I</span>
843
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">sorted</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
844
+ <span class="go">[&#39;filling&#39;, &#39;holonomies&#39;, &#39;holonomy_accuracy&#39;, &#39;index&#39;, &#39;is_complete&#39;, &#39;modulus&#39;, &#39;shape&#39;, &#39;shape_accuracy&#39;, &#39;topology&#39;]</span>
845
+ </pre></div>
846
+ </div>
847
+ <p>Here ‘shape’ is the shape of the cusp, i.e.
848
+ (longitude/meridian)
849
+ and ‘modulus’ is its shape in the geometrically preferred
850
+ basis, i.e.
851
+ ( (second shortest translation)/(shortest translation)).
852
+ For cusps that are filled, one instead cares about the
853
+ holonomies:</p>
854
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)[</span><span class="s1">&#39;holonomies&#39;</span><span class="p">]</span>
855
+ <span class="go">(-0.59883089 + 1.09812548*I, 0.89824633 + 1.49440443*I)</span>
856
+ </pre></div>
857
+ </div>
858
+ <p>The complex numbers returned for the shape and for the two
859
+ holonomies have an extra attribute, accuracy, which is
860
+ SnapPea’s <em>estimate</em> of their accuracy.</p>
861
+ <p>You can also get information about multiple cusps at once:</p>
862
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">()</span>
863
+ <span class="go">[Cusp 0 : complete torus cusp of shape 0.11044502 + 0.94677098*I,</span>
864
+ <span class="go"> Cusp 1 : torus cusp with Dehn filling coefficients (M, L) = (1.0, 2.0),</span>
865
+ <span class="go"> Cusp 2 : torus cusp with Dehn filling coefficients (M, L) = (3.0, 2.0)]</span>
866
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="s1">&#39;is_complete&#39;</span><span class="p">)</span>
867
+ <span class="go">[True, False, False]</span>
868
+ </pre></div>
869
+ </div>
870
+ <p>The cusp shapes can be verified:</p>
871
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M = Manifold(&#39;m292&#39;)
872
+ sage: M.cusp_info(&#39;shape&#39;, verified = True, bits_prec = 60) # doctest: +NUMERIC12
873
+ [-0.1766049820997? + 1.2028208192855?*I,
874
+ -0.1766049820997? + 1.2028208192855?*I]
875
+ </pre></div>
876
+ </div>
877
+ </dd></dl>
878
+
879
+ <dl class="py method">
880
+ <dt class="sig sig-object py" id="snappy.Manifold.cusp_neighborhood">
881
+ <span class="sig-name descname"><span class="pre">cusp_neighborhood</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="additional_classes.html#snappy.CuspNeighborhood" title="SnapPy.CuspNeighborhood"><span class="pre">CuspNeighborhood</span></a></span></span><a class="headerlink" href="#snappy.Manifold.cusp_neighborhood" title="Link to this definition"></a></dt>
882
+ <dd><p>Returns information about the cusp neighborhoods of the
883
+ manifold, in the form of data about the corresponding horoball
884
+ diagrams in hyperbolic 3-space.</p>
885
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;s000&#39;</span><span class="p">)</span>
886
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">CN</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">cusp_neighborhood</span><span class="p">()</span>
887
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">CN</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
888
+ <span class="go">0.32475953</span>
889
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">len</span><span class="p">(</span><span class="n">CN</span><span class="o">.</span><span class="n">horoballs</span><span class="p">(</span><span class="mf">0.01</span><span class="p">))</span>
890
+ <span class="go">178</span>
891
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">CN</span><span class="o">.</span><span class="n">view</span><span class="p">()</span> <span class="c1"># Opens picture of the horoballs </span>
892
+ </pre></div>
893
+ </div>
894
+ </dd></dl>
895
+
896
+ <dl class="py method">
897
+ <dt class="sig sig-object py" id="snappy.Manifold.cusp_translations">
898
+ <span class="sig-name descname"><span class="pre">cusp_translations</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">policy</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'unbiased'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">method</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'maximal'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">first_cusps</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">[]</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.cusp_translations" title="Link to this definition"></a></dt>
899
+ <dd><p>Returns a list of the (complex) Euclidean translations corresponding to the
900
+ meridian and longitude of each cusp.</p>
901
+ <p>That is, the method uses <a class="reference internal" href="#snappy.Manifold.cusp_areas" title="snappy.Manifold.cusp_areas"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_areas()</span></code></a> to find
902
+ (maximal) embedded and disjoint cusp neighborhoods. It then uses the
903
+ boundaries of these cusp neighborhoods to measure the meridian and
904
+ longitude of each cusp. The result is a pair for each cusp. The first
905
+ entry of the pair corresponds to the meridian and is complex. The
906
+ second entry corresponds to the longitude and is always real:</p>
907
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;s776&quot;</span><span class="p">)</span>
908
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_translations</span><span class="p">()</span>
909
+ <span class="go">[(0.500000000000000 + 1.32287565553230*I, 2.00000000000000), (0.500000000000000 + 1.32287565553230*I, 2.00000000000000), (0.499999999999999 + 1.32287565553230*I, 2.00000000000000)]</span>
910
+ </pre></div>
911
+ </div>
912
+ <p>It takes the same arguments as <a class="reference internal" href="#snappy.Manifold.cusp_areas" title="snappy.Manifold.cusp_areas"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_areas()</span></code></a>:</p>
913
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_translations</span><span class="p">(</span><span class="n">policy</span> <span class="o">=</span> <span class="s1">&#39;greedy&#39;</span><span class="p">)</span>
914
+ <span class="go">[(0.70710678118654752440084436210 + 1.8708286933869706927918743662*I, 2.8284271247461900976033774484), (0.35355339059327376220042218105 + 0.93541434669348534639593718308*I, 1.4142135623730950488016887242), (0.35355339059327376220042218105 + 0.93541434669348534639593718308*I, 1.4142135623730950488016887242)]</span>
915
+ </pre></div>
916
+ </div>
917
+ <p><strong>Verified computations</strong></p>
918
+ <p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>, floating-point issues can arise resulting in
919
+ incorrect values. The method can be made
920
+ <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
921
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M.cusp_translations(verified = True) # doctest: +NUMERIC9
922
+ [(0.50000000000? + 1.32287565553?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?)]
923
+ </pre></div>
924
+ </div>
925
+ <p>Note that the first element of each pair is a SageMath <code class="docutils literal notranslate"><span class="pre">ComplexIntervalField</span></code> and
926
+ the second element a <code class="docutils literal notranslate"><span class="pre">RealIntervalField</span></code>.</p>
927
+ </dd></dl>
928
+
929
+ <dl class="py method">
930
+ <dt class="sig sig-object py" id="snappy.Manifold.dehn_fill">
931
+ <span class="sig-name descname"><span class="pre">dehn_fill</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filling_data</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">which_cusp</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#snappy.Manifold.dehn_fill" title="Link to this definition"></a></dt>
932
+ <dd><p>Set the Dehn filling coefficients of the cusps. This can be
933
+ specified in the following ways, where the cusps are numbered
934
+ by 0,1,…,(num_cusps - 1).</p>
935
+ <ul>
936
+ <li><p>Fill cusp 2:</p>
937
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;8^4_1&#39;</span><span class="p">)</span>
938
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span> <span class="mi">2</span><span class="p">)</span>
939
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span>
940
+ <span class="go">8^4_1(0,0)(0,0)(2,3)(0,0)</span>
941
+ </pre></div>
942
+ </div>
943
+ </li>
944
+ <li><p>Fill the last cusp:</p>
945
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">5</span><span class="p">),</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
946
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span>
947
+ <span class="go">8^4_1(0,0)(0,0)(2,3)(1,5)</span>
948
+ </pre></div>
949
+ </div>
950
+ </li>
951
+ <li><p>Fill the first two cusps:</p>
952
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">(</span> <span class="p">[</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">4</span><span class="p">)</span> <span class="p">])</span>
953
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span>
954
+ <span class="go">8^4_1(3,0)(1,-4)(2,3)(1,5)</span>
955
+ </pre></div>
956
+ </div>
957
+ </li>
958
+ <li><p>When there is only one cusp, there’s a shortcut</p>
959
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
960
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">(</span> <span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">)</span> <span class="p">)</span>
961
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span>
962
+ <span class="go">m004(-3,4)</span>
963
+ </pre></div>
964
+ </div>
965
+ </li>
966
+ </ul>
967
+ <p>Does not return a new Manifold.</p>
968
+ </dd></dl>
969
+
970
+ <dl class="py method">
971
+ <dt class="sig sig-object py" id="snappy.Manifold.dirichlet_domain">
972
+ <span class="sig-name descname"><span class="pre">dirichlet_domain</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">vertex_epsilon</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1e-08</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">displacement</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">(0.0,</span> <span class="pre">0.0,</span> <span class="pre">0.0)</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">centroid_at_origin</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">maximize_injectivity_radius</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">include_words</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="additional_classes.html#snappy.DirichletDomain" title="SnapPy.DirichletDomain"><span class="pre">DirichletDomain</span></a></span></span><a class="headerlink" href="#snappy.Manifold.dirichlet_domain" title="Link to this definition"></a></dt>
973
+ <dd><p>Returns a <a class="reference internal" href="additional_classes.html#snappy.DirichletDomain" title="snappy.DirichletDomain"><code class="xref py py-class docutils literal notranslate"><span class="pre">DirichletDomain</span></code></a> object representing a Dirichlet
974
+ domain of the hyperbolic manifold, typically centered at a
975
+ point which is a local maximum of injectivity radius. It will
976
+ have ideal vertices if the manifold is not closed.</p>
977
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m015&#39;</span><span class="p">)</span>
978
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">D</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">dirichlet_domain</span><span class="p">()</span>
979
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">D</span>
980
+ <span class="go">32 finite vertices, 2 ideal vertices; 54 edges; 22 faces</span>
981
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">D</span><span class="o">.</span><span class="n">view</span><span class="p">()</span> <span class="c1">#Shows 3d-graphical view. </span>
982
+ </pre></div>
983
+ </div>
984
+ <p>The group elements for the face-pairings of the Dirichlet domain
985
+ can be given as words in the original generators of the
986
+ (unsimplified) fundamental group by setting <code class="xref py py-attr docutils literal notranslate"><span class="pre">include_words</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
987
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="nb">sorted</span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">dirichlet_domain</span><span class="p">(</span><span class="n">include_words</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span><span class="o">.</span><span class="n">pairing_words</span><span class="p">())</span>
988
+ <span class="go">[&#39;A&#39;, ...]</span>
989
+ </pre></div>
990
+ </div>
991
+ <p>Other options can be provided to customize the computation;
992
+ the default choices are shown below:</p>
993
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">dirichlet_domain</span><span class="p">(</span><span class="n">vertex_epsilon</span><span class="o">=</span><span class="mf">10.0</span><span class="o">**-</span><span class="mi">8</span><span class="p">,</span>
994
+ <span class="gp">... </span> <span class="n">displacement</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">],</span>
995
+ <span class="gp">... </span> <span class="n">centroid_at_origin</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">maximize_injectivity_radius</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
996
+ <span class="go">32 finite vertices, 2 ideal vertices; 54 edges; 22 faces</span>
997
+ </pre></div>
998
+ </div>
999
+ <p>Here’s one with different combinatorics:</p>
1000
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">E</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">dirichlet_domain</span><span class="p">(</span><span class="n">displacement</span><span class="o">=</span><span class="p">[</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.3</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.2</span><span class="p">],</span>
1001
+ <span class="gp">... </span> <span class="n">maximize_injectivity_radius</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
1002
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">E</span>
1003
+ <span class="go">44 finite vertices, 1 ideal vertices; 69 edges; 26 faces</span>
1004
+ </pre></div>
1005
+ </div>
1006
+ </dd></dl>
1007
+
1008
+ <dl class="py method">
1009
+ <dt class="sig sig-object py" id="snappy.Manifold.drill">
1010
+ <span class="sig-name descname"><span class="pre">drill</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">which_curve</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_segments</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">6</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.drill" title="Link to this definition"></a></dt>
1011
+ <dd><p>Drills out the specified dual curve from among all dual curves
1012
+ with at most max_segments, which defaults to 6. The method
1013
+ dual_curve allows one to see the properties of curves before
1014
+ choosing which one to drill out.</p>
1015
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;v3000&#39;</span><span class="p">)</span>
1016
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">max_segments</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
1017
+ <span class="gp">&gt;&gt;&gt; </span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">(),</span> <span class="n">N</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">())</span>
1018
+ <span class="go">(1, 2)</span>
1019
+ </pre></div>
1020
+ </div>
1021
+ </dd></dl>
1022
+
1023
+ <dl class="py method">
1024
+ <dt class="sig sig-object py" id="snappy.Manifold.drill_word">
1025
+ <span class="sig-name descname"><span class="pre">drill_word</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">word</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">Manifold</span></a></span></span><a class="headerlink" href="#snappy.Manifold.drill_word" title="Link to this definition"></a></dt>
1026
+ <dd><p>Drills the geodesic corresponding to the given word in the unsimplified
1027
+ fundamental group. Here is an example:</p>
1028
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m004&quot;</span><span class="p">)</span>
1029
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt</span><span class="p">(</span><span class="n">max_len</span><span class="o">=</span><span class="mf">1.2</span><span class="p">)</span>
1030
+ <span class="go">[Length Core curve Word</span>
1031
+ <span class="go"> 1.08707014499574 + 1.72276844987009*I - bC,</span>
1032
+ <span class="go"> 1.08707014499574 - 1.72276844987009*I - a]</span>
1033
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_word</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">)</span>
1034
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">identify</span><span class="p">()</span>
1035
+ <span class="go">[m129(0,0)(0,0), 5^2_1(0,0)(0,0), L5a1(0,0)(0,0), ooct01_00001(0,0)(0,0)]</span>
1036
+ </pre></div>
1037
+ </div>
1038
+ <p>The last cusp of the resulting manifold corresponds to the drilled
1039
+ geodesic. The longitude and meridian for that cusp are chosen such that
1040
+ <code class="docutils literal notranslate"><span class="pre">(1,0)</span></code>-filling the last cusp results in the given (undrilled) manifold:</p>
1041
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
1042
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">N</span><span class="p">)</span>
1043
+ <span class="go">True</span>
1044
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="mi">1</span><span class="p">)[</span><span class="s1">&#39;core_length&#39;</span><span class="p">]</span>
1045
+ <span class="go">1.08707014499574 - 1.72276844987009*I</span>
1046
+ </pre></div>
1047
+ </div>
1048
+ <p>The orientation of the new longitude is chosen so that it is parallel to
1049
+ the closed geodesic. That is, the new longitude is homotopic to the closed
1050
+ geodesic when embedding the drilled manifold into the given manifold.</p>
1051
+ <p>If the given geodesic coincides with a core curve of a filled cusp, the
1052
+ cusp is unfilled instead:</p>
1053
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m004(2,3)&quot;</span><span class="p">)</span>
1054
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
1055
+ <span class="go">1.73712388065</span>
1056
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="mi">0</span><span class="p">)[</span><span class="s1">&#39;core_length&#39;</span><span class="p">]</span>
1057
+ <span class="go">0.178792491242577 - 2.11983007979743*I</span>
1058
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">(</span><span class="n">simplify_presentation</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span><span class="o">.</span><span class="n">complex_length</span><span class="p">(</span><span class="s1">&#39;aBAbbABab&#39;</span><span class="p">)</span>
1059
+ <span class="go">0.178792491242577 - 2.11983007979743*I</span>
1060
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_word</span><span class="p">(</span><span class="s1">&#39;aBAbbABab&#39;</span><span class="p">)</span>
1061
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span>
1062
+ <span class="go">m004_drilled(0,0)</span>
1063
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">()</span>
1064
+ <span class="go">1</span>
1065
+ </pre></div>
1066
+ </div>
1067
+ <p>In this case, the peripheral information is also
1068
+ updated such that the above remark about <code class="docutils literal notranslate"><span class="pre">(1,0)</span></code>-filling applies again:</p>
1069
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
1070
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
1071
+ <span class="go">1.73712388065</span>
1072
+ </pre></div>
1073
+ </div>
1074
+ <p>That is, the longitude and meridian of the unfilled cusps are reinstalled
1075
+ and the cusps reindexed so that the unfilled cusp becomes the last cusp.</p>
1076
+ <p>Here is another example where we drill the core geodesic:</p>
1077
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;v2986(3,4)&quot;</span><span class="p">)</span>
1078
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_word</span><span class="p">(</span><span class="s1">&#39;EdFgabcGEdFgaDcc&#39;</span><span class="p">)</span>
1079
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;v2986&quot;</span><span class="p">),</span> <span class="n">return_isometries</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
1080
+ <span class="go">[0 -&gt; 0</span>
1081
+ <span class="go"> [3 -1]</span>
1082
+ <span class="go"> [4 -1]</span>
1083
+ <span class="go"> Does not extend to link]</span>
1084
+ </pre></div>
1085
+ </div>
1086
+ <p>While the result of drilling a geodesic is a triangulation and thus
1087
+ combinatorial in nature, some intermediate computations (for example,
1088
+ to compute the intersections of the geodesic with the faces of the
1089
+ tetrahedra) are numerical. Sometimes, it is necessary to increase the
1090
+ precision with <code class="xref py py-attr docutils literal notranslate"><span class="pre">bits_prec</span></code> to make the method succeed and produce
1091
+ the correct result.</p>
1092
+ <p><strong>Verified computation</strong></p>
1093
+ <p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>, floating-point issues can arise resulting
1094
+ in drilling the wrong loop. The method can be made
1095
+ <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
1096
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m004(2,3)&quot;</span><span class="p">)</span>
1097
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_word</span><span class="p">(</span><span class="s1">&#39;caa&#39;</span><span class="p">,</span> <span class="n">verified</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">bits_prec</span> <span class="o">=</span> <span class="mi">100</span><span class="p">)</span>
1098
+ <span class="n">m004_drilled</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">)(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
1099
+ </pre></div>
1100
+ </div>
1101
+ <p>That is, if the precision is insufficient to prove the result is correct,
1102
+ the algorithm fails with an exception (most likely
1103
+ <code class="docutils literal notranslate"><span class="pre">InsufficientPrecisionError</span></code>).</p>
1104
+ <dl class="field-list simple">
1105
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
1106
+ <dd class="field-odd"><ul class="simple">
1107
+ <li><p><strong>word</strong> – The word in the unsimplified fundamental group specifying the
1108
+ geodesic to be drilled.</p></li>
1109
+ <li><p><strong>bits_prec</strong> – The precision used in the intermediate computation. Increase
1110
+ if the computation failed.</p></li>
1111
+ <li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
1112
+ <li><p><strong>verbose</strong> – Print intermediate results and statistics.</p></li>
1113
+ </ul>
1114
+ </dd>
1115
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
1116
+ <dd class="field-even"><p>Manifold obtained by drilling geodesic. <code class="docutils literal notranslate"><span class="pre">(1,0)</span></code>-filling the
1117
+ last cusp gives the given (undrilled) manifold.</p>
1118
+ </dd>
1119
+ </dl>
1120
+ </dd></dl>
1121
+
1122
+ <dl class="py method">
1123
+ <dt class="sig sig-object py" id="snappy.Manifold.drill_words">
1124
+ <span class="sig-name descname"><span class="pre">drill_words</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">words</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Sequence</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">Manifold</span></a></span></span><a class="headerlink" href="#snappy.Manifold.drill_words" title="Link to this definition"></a></dt>
1125
+ <dd><p>A generalization of <a class="reference internal" href="#snappy.Manifold.drill_word" title="snappy.Manifold.drill_word"><code class="xref py py-meth docutils literal notranslate"><span class="pre">drill_word</span></code></a> to drill
1126
+ several geodesics simultaneously. It takes a list of words in the
1127
+ unsimplified fundamental group.</p>
1128
+ <p>Here is an example where we drill two geodesics. One of the geodesics is
1129
+ the core curve corresponding to the third cusp. The other geodesic is not
1130
+ a core curve:</p>
1131
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">=</span><span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;t12047(0,0)(1,3)(1,4)(1,5)&quot;</span><span class="p">)</span>
1132
+ <span class="gp">&gt;&gt;&gt; </span><span class="p">[</span> <span class="n">info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;core_length&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">info</span> <span class="ow">in</span> <span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">()</span> <span class="p">]</span>
1133
+ <span class="go">[None,</span>
1134
+ <span class="go"> 0.510804267610103 + 1.92397456664239*I,</span>
1135
+ <span class="go"> 0.317363079597924 + 1.48157893409218*I,</span>
1136
+ <span class="go"> 0.223574975263386 + 1.26933288854145*I]</span>
1137
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">G</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">(</span><span class="n">simplify_presentation</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span>
1138
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">complex_length</span><span class="p">(</span><span class="s1">&#39;c&#39;</span><span class="p">)</span>
1139
+ <span class="go">0.317363079597924 + 1.48157893409218*I</span>
1140
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">complex_length</span><span class="p">(</span><span class="s1">&#39;fA&#39;</span><span class="p">)</span>
1141
+ <span class="go">1.43914411734250 + 2.66246879992795*I</span>
1142
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_words</span><span class="p">([</span><span class="s1">&#39;c&#39;</span><span class="p">,</span><span class="s1">&#39;fA&#39;</span><span class="p">])</span>
1143
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span>
1144
+ <span class="go">t12047_drilled(0,0)(1,3)(1,5)(0,0)(0,0)</span>
1145
+ </pre></div>
1146
+ </div>
1147
+ <p>Let n be the number of geodesics that were drilled. Then the last n
1148
+ cusps correspond to the drilled geodesics and appear in the same order than
1149
+ the geodesics were given as words. Note that in the above example, we expect
1150
+ six cusps since we started with four cusps and drilled two geodesics. However,
1151
+ we only obtain five cusps because one geodesic was a core curve. The
1152
+ corresponding cusp was unfilled (from <code class="docutils literal notranslate"><span class="pre">(1,4)</span></code>) and grouped with the other
1153
+ cusps coming from drilling.</p>
1154
+ <p>We obtain the given (undrilled) manifold by <code class="docutils literal notranslate"><span class="pre">(1,0)</span></code>-filling the last n
1155
+ cusps.</p>
1156
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="o">-</span><span class="mi">2</span><span class="p">)</span>
1157
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
1158
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">N</span><span class="p">)</span>
1159
+ <span class="go">True</span>
1160
+ <span class="gp">&gt;&gt;&gt; </span><span class="p">[</span> <span class="n">info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;core_length&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">info</span> <span class="ow">in</span> <span class="n">N</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">()</span> <span class="p">]</span>
1161
+ <span class="go">[None,</span>
1162
+ <span class="go"> 0.510804267610103 + 1.92397456664239*I,</span>
1163
+ <span class="go"> 0.223574975263386 + 1.26933288854145*I,</span>
1164
+ <span class="go"> 0.317363079597924 + 1.48157893409218*I,</span>
1165
+ <span class="go"> 1.43914411734251 + 2.66246879992796*I]</span>
1166
+ </pre></div>
1167
+ </div>
1168
+ <dl class="field-list simple">
1169
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
1170
+ <dd class="field-odd"><ul class="simple">
1171
+ <li><p><strong>word</strong> – The words in the unsimplified fundamental group specifying the
1172
+ geodesics to be drilled.</p></li>
1173
+ <li><p><strong>bits_prec</strong> – The precision used in the intermediate computation. Increase
1174
+ if the computation failed.</p></li>
1175
+ <li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
1176
+ <li><p><strong>verbose</strong> – Print intermediate results and statistics.</p></li>
1177
+ </ul>
1178
+ </dd>
1179
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
1180
+ <dd class="field-even"><p>Manifold obtained by drilling geodesics. <code class="docutils literal notranslate"><span class="pre">(1,0)</span></code>-filling the
1181
+ last n cusps gives the given (undrilled) manifold where n is the
1182
+ number of given words.</p>
1183
+ </dd>
1184
+ </dl>
1185
+ </dd></dl>
1186
+
1187
+ <dl class="py method">
1188
+ <dt class="sig sig-object py" id="snappy.Manifold.dual_curves">
1189
+ <span class="sig-name descname"><span class="pre">dual_curves</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">max_segments</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">6</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.dual_curves" title="Link to this definition"></a></dt>
1190
+ <dd><p>Constructs a <em>reasonable</em> selection of simple closed curves in
1191
+ a manifold’s dual 1-skeleton. In particular, it returns those
1192
+ that appear to represent geodesics. The resulting curves can
1193
+ be drilled out.</p>
1194
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m015&#39;</span><span class="p">)</span>
1195
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">curves</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">dual_curves</span><span class="p">()</span>
1196
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">curves</span>
1197
+ <span class="go">[ 0: orientation-preserving curve of length 0.56239915 - 2.81543089*I,</span>
1198
+ <span class="go"> 1: orientation-preserving curve of length 1.12479830 + 0.65232354*I,</span>
1199
+ <span class="go"> 2: orientation-preserving curve of length 1.26080402 + 1.97804689*I,</span>
1200
+ <span class="go"> 3: orientation-preserving curve of length 1.58826933 + 1.67347167*I,</span>
1201
+ <span class="go"> 4: orientation-preserving curve of length 1.68719745 + 2.81543089*I]</span>
1202
+ </pre></div>
1203
+ </div>
1204
+ <p>Each curve is returned as an info object with these keys</p>
1205
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="nb">sorted</span><span class="p">(</span><span class="n">curves</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
1206
+ <span class="go">[&#39;complete_length&#39;, &#39;filled_length&#39;, &#39;index&#39;, &#39;max_segments&#39;, &#39;parity&#39;]</span>
1207
+ </pre></div>
1208
+ </div>
1209
+ <p>We can drill out any of these curves to get a new manifold
1210
+ with one more cusp.</p>
1211
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill</span><span class="p">(</span><span class="n">curves</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
1212
+ <span class="gp">&gt;&gt;&gt; </span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">(),</span> <span class="n">N</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">())</span>
1213
+ <span class="go">(1, 2)</span>
1214
+ </pre></div>
1215
+ </div>
1216
+ <p>By default, this function only finds curves of length 6; this
1217
+ can be changed by specifying the optional argument
1218
+ max_segments</p>
1219
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">dual_curves</span><span class="p">(</span><span class="n">max_segments</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
1220
+ <span class="go">[ 0: orientation-preserving curve of length 0.56239915 - 2.81543089*I]</span>
1221
+ </pre></div>
1222
+ </div>
1223
+ </dd></dl>
1224
+
1225
+ <dl class="py method">
1226
+ <dt class="sig sig-object py" id="snappy.Manifold.edge_valences">
1227
+ <span class="sig-name descname"><span class="pre">edge_valences</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.edge_valences" title="Link to this definition"></a></dt>
1228
+ <dd><p>Returns a dictionary whose keys are the valences of the edges
1229
+ in the triangulation, and the value associated to a key is the
1230
+ number of edges of that valence.</p>
1231
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;v3227&#39;</span><span class="p">)</span>
1232
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">edge_valences</span><span class="p">()</span>
1233
+ <span class="go">{10: 1, 4: 1, 5: 2, 6: 3}</span>
1234
+ </pre></div>
1235
+ </div>
1236
+ </dd></dl>
1237
+
1238
+ <dl class="py method">
1239
+ <dt class="sig sig-object py" id="snappy.Manifold.exterior_to_link">
1240
+ <span class="sig-name descname"><span class="pre">exterior_to_link</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">check_input</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">check_answer</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">careful_perturbation</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">simplify_link</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pachner_search_tries</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">10</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">seed</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="spherogram.html#spherogram.Link" title="spherogram.Link"><span class="pre">Link</span></a></span></span><a class="headerlink" href="#snappy.Manifold.exterior_to_link" title="Link to this definition"></a></dt>
1241
+ <dd><p>For a triangulation of the exterior of a link in the 3-sphere,
1242
+ return a planar diagram for the link. The peripheral curves whose
1243
+ Dehn filling is the 3-sphere are <strong>part of the input</strong>, specified
1244
+ by either:</p>
1245
+ <ol class="loweralpha simple">
1246
+ <li><p>If no cusp is filled, then they are the meridians of the
1247
+ current peripheral curves.</p></li>
1248
+ <li><p>If every cusp is filled, then they are the current Dehn filling
1249
+ curves.</p></li>
1250
+ </ol>
1251
+ <p>In particular, it does <strong>not</strong> try to determine whether there exist
1252
+ fillings on the input which give the 3-sphere. Example usage:</p>
1253
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m016&#39;</span><span class="p">)</span>
1254
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">L</span> <span class="o">=</span> <span class="n">exterior_to_link</span><span class="p">(</span><span class="n">M</span><span class="p">)</span>
1255
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">L</span><span class="o">.</span><span class="n">exterior</span><span class="p">()</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">M</span><span class="p">)</span>
1256
+ <span class="go">True</span>
1257
+ </pre></div>
1258
+ </div>
1259
+ <p>The algorithm used is that of <a class="reference external" href="https://arxiv.org/abs/2112.03251">Dunfield, Obeidin, and Rudd</a>. The optional arguments are
1260
+ as follows.</p>
1261
+ <ul class="simple">
1262
+ <li><p><code class="docutils literal notranslate"><span class="pre">verbose</span></code>: When <code class="docutils literal notranslate"><span class="pre">True</span></code>, prints progress updates as the algorithm
1263
+ goes along.</p></li>
1264
+ <li><p><code class="docutils literal notranslate"><span class="pre">check_input</span></code>: When <code class="docutils literal notranslate"><span class="pre">True</span></code> (the default), first checks that the
1265
+ fundamental group of the specified Dehn filling is trivial. As
1266
+ it doesn’t try too hard to simplify the group presentation, it
1267
+ can happen that this check fails but the algorithm still finds a
1268
+ diagram if you pass <code class="docutils literal notranslate"><span class="pre">check_input=False</span></code>.</p></li>
1269
+ <li><p><code class="docutils literal notranslate"><span class="pre">check_answer</span></code>: When <code class="docutils literal notranslate"><span class="pre">True</span></code> (the default), take the exterior of
1270
+ the final link diagram and use <code class="docutils literal notranslate"><span class="pre">Manifold.is_isometric_to</span></code> to
1271
+ confirm that it is homeomorphic to the input. If the input is
1272
+ not hyperbolic or is very large, this check may fail even though
1273
+ the diagram is correct.</p></li>
1274
+ <li><p><code class="docutils literal notranslate"><span class="pre">careful_perturbation</span></code>: The rational coordinates of the
1275
+ intermediate PL links are periodically rounded to control the
1276
+ size of their denominators. When <code class="docutils literal notranslate"><span class="pre">careful_perturbation=True</span></code>
1277
+ (the default), computations are performed to ensure this
1278
+ rounding does not change the isotopy class of the link.</p></li>
1279
+ <li><p><code class="docutils literal notranslate"><span class="pre">simplify_link</span></code>: When <code class="docutils literal notranslate"><span class="pre">True</span></code> (the default), uses
1280
+ <code class="docutils literal notranslate"><span class="pre">Link.simplify('global')</span></code> to minimize the size of the final
1281
+ diagram; otherwise, it just does <code class="docutils literal notranslate"><span class="pre">basic</span></code> simplifications, which
1282
+ can be much faster if the initial link is complicated.</p></li>
1283
+ <li><p><code class="docutils literal notranslate"><span class="pre">pachner_search_tries</span></code>: Controls how hard to search for a
1284
+ suitable sequence of Pachner moves from the filled input
1285
+ triangulation to a standard triangulation of the 3-sphere.</p></li>
1286
+ <li><p><code class="docutils literal notranslate"><span class="pre">seed</span></code>: The algorithm involves many random choices, and hence
1287
+ each run typically produces a different diagram of the
1288
+ underlying link. If you need the same output each time, you can
1289
+ specify a fixed seed for the various pseudo-random number
1290
+ generators.</p></li>
1291
+ </ul>
1292
+ <p>Note on rigor: Provided at least one of <code class="docutils literal notranslate"><span class="pre">check_answer</span></code> and
1293
+ <code class="docutils literal notranslate"><span class="pre">careful_perturbation</span></code> is <code class="docutils literal notranslate"><span class="pre">True</span></code>, the exterior of the output
1294
+ link is guaranteed to match the input (including the choice of
1295
+ meridians).</p>
1296
+ <p><strong>Warning:</strong> The order of the link components and the cusps of the
1297
+ input manifold is only guaranteed to match when
1298
+ <code class="docutils literal notranslate"><span class="pre">check_answer=True</span></code>. Even then, the implicit orientation along
1299
+ each component of the link may not be preserved.</p>
1300
+ </dd></dl>
1301
+
1302
+ <dl class="py method">
1303
+ <dt class="sig sig-object py" id="snappy.Manifold.filled_triangulation">
1304
+ <span class="sig-name descname"><span class="pre">filled_triangulation</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cusps_to_fill</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'all'</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">snappy.Manifold</span></a></span></span><a class="headerlink" href="#snappy.Manifold.filled_triangulation" title="Link to this definition"></a></dt>
1305
+ <dd><p>Return a new Manifold where the specified cusps have been
1306
+ permanently filled in.</p>
1307
+ <p>Filling all the cusps results in a Triangulation rather
1308
+ than a Manifold, since SnapPea can’t deal with hyperbolic
1309
+ structures when there are no cusps.</p>
1310
+ <p>Examples:</p>
1311
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m125(1,2)(3,4)&#39;</span><span class="p">)</span>
1312
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">filled_triangulation</span><span class="p">()</span>
1313
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">()</span>
1314
+ <span class="go">0</span>
1315
+ </pre></div>
1316
+ </div>
1317
+ <p>Filling cusps 0 and 2 :</p>
1318
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;v3227(1,2)(3,4)(5,6)&#39;</span><span class="p">)</span>
1319
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">filled_triangulation</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">])</span>
1320
+ <span class="go">v3227_filled(3,4)</span>
1321
+ </pre></div>
1322
+ </div>
1323
+ </dd></dl>
1324
+
1325
+ <dl class="py method">
1326
+ <dt class="sig sig-object py" id="snappy.Manifold.fundamental_group">
1327
+ <span class="sig-name descname"><span class="pre">fundamental_group</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">simplify_presentation</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fillings_may_affect_generators</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">minimize_number_of_generators</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">try_hard_to_shorten_relators</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="additional_classes.html#snappy.HolonomyGroup" title="SnapPy.HolonomyGroup"><span class="pre">HolonomyGroup</span></a></span></span><a class="headerlink" href="#snappy.Manifold.fundamental_group" title="Link to this definition"></a></dt>
1328
+ <dd><p>Return a <a class="reference internal" href="additional_classes.html#snappy.HolonomyGroup" title="snappy.HolonomyGroup"><code class="xref py py-class docutils literal notranslate"><span class="pre">HolonomyGroup</span></code></a> representing the fundamental group of
1329
+ the manifold, together with its holonomy representation. If
1330
+ integer Dehn surgery parameters have been set, then the
1331
+ corresponding peripheral elements are killed.</p>
1332
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
1333
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">G</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">()</span>
1334
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">G</span>
1335
+ <span class="go">Generators:</span>
1336
+ <span class="go"> a,b</span>
1337
+ <span class="go">Relators:</span>
1338
+ <span class="go"> aaabABBAb</span>
1339
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">peripheral_curves</span><span class="p">()</span>
1340
+ <span class="go">[(&#39;ab&#39;, &#39;aBAbABab&#39;)]</span>
1341
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">SL2C</span><span class="p">(</span><span class="s1">&#39;baaBA&#39;</span><span class="p">)</span>
1342
+ <span class="go">[ 2.50000000 - 2.59807621*I -6.06217783 - 0.50000000*I]</span>
1343
+ <span class="go">[ 0.86602540 - 2.50000000*I -4.00000000 + 1.73205081*I]</span>
1344
+ </pre></div>
1345
+ </div>
1346
+ <p>There are three optional arguments all of which default to True:</p>
1347
+ <ul class="simple">
1348
+ <li><p>simplify_presentation</p></li>
1349
+ <li><p>fillings_may_affect_generators</p></li>
1350
+ <li><p>minimize_number_of_generators</p></li>
1351
+ </ul>
1352
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">(</span><span class="kc">False</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
1353
+ <span class="go">Generators:</span>
1354
+ <span class="go"> a,b,c</span>
1355
+ <span class="go">Relators:</span>
1356
+ <span class="go"> CbAcB</span>
1357
+ <span class="go"> BacA</span>
1358
+ </pre></div>
1359
+ </div>
1360
+ </dd></dl>
1361
+
1362
+ <dl class="py method">
1363
+ <dt class="sig sig-object py" id="snappy.Manifold.gluing_equations">
1364
+ <span class="sig-name descname"><span class="pre">gluing_equations</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">form</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'log'</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.gluing_equations" title="Link to this definition"></a></dt>
1365
+ <dd><p>In the default mode, this function returns a matrix with rows
1366
+ of the form</p>
1367
+ <blockquote>
1368
+ <div><p>a b c d e f …</p>
1369
+ </div></blockquote>
1370
+ <p>which means</p>
1371
+ <blockquote>
1372
+ <div><p>a*log(z0) + b*log(1/(1-z0)) + c*log((z0-1)/z0) + d*log(z1) +… = 2 pi i</p>
1373
+ </div></blockquote>
1374
+ <p>for an edge equation, and (same) = 0 for a cusp equation.
1375
+ Here, the cusp equations come at the bottom of the matrix, and
1376
+ are listed in the form: meridian of cusp 0, longitude of cusp
1377
+ 0, meridian of cusp 1, longitude of cusp 1,…</p>
1378
+ <p>In terms of the tetrahedra, a is the invariant of the edge
1379
+ (2,3), b the invariant of the edge (0,2) and c is the
1380
+ invariant of the edge (1,2). See kernel_code/edge_classes.c
1381
+ for a detailed account of the convention used.</p>
1382
+ <p>If the optional argument form=’rect’ is given, then this
1383
+ function returns a list of tuples of the form:</p>
1384
+ <blockquote>
1385
+ <div><p>( [a0, a1,..,a_n], [b_0, b_1,…,b_n], c)</p>
1386
+ </div></blockquote>
1387
+ <p>where this corresponds to the equation</p>
1388
+ <blockquote>
1389
+ <div><p>z0^a0 (1 - z0)^b0 z1^a1(1 - z1)^b1 … = c</p>
1390
+ </div></blockquote>
1391
+ <p>where c = 1 or -1.</p>
1392
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;m004(2,3)&#39;</span><span class="p">)</span>
1393
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">gluing_equations</span><span class="p">()</span>
1394
+ <span class="go">[ 2 1 0 1 0 2]</span>
1395
+ <span class="go">[ 0 1 2 1 2 0]</span>
1396
+ <span class="go">[ 2 0 0 0 -8 6]</span>
1397
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">gluing_equations</span><span class="p">(</span><span class="n">form</span><span class="o">=</span><span class="s1">&#39;rect&#39;</span><span class="p">)</span>
1398
+ <span class="go">[([2, -1], [-1, 2], 1), ([-2, 1], [1, -2], 1), ([2, -6], [0, 14], 1)]</span>
1399
+ </pre></div>
1400
+ </div>
1401
+ </dd></dl>
1402
+
1403
+ <dl class="py method">
1404
+ <dt class="sig sig-object py" id="snappy.Manifold.gluing_equations_pgl">
1405
+ <span class="sig-name descname"><span class="pre">gluing_equations_pgl</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">N</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">equation_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'all'</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.gluing_equations_pgl" title="Link to this definition"></a></dt>
1406
+ <dd><p>Returns a NeumannZagierTypeEquations object that contains a matrix
1407
+ encoding the gluing equations for boundary-parabolic PGL(N,C)
1408
+ representations together with explanations of the meaning
1409
+ of the rows and the columns of the matrix.</p>
1410
+ <p>This method generalizes gluing_equations() to PGL(N,C)-representations
1411
+ as described in
1412
+ Stavros Garoufalidis, Matthias Goerner, Christian K. Zickert:
1413
+ “Gluing Equations for PGL(n,C)-Representations of 3-Manifolds”
1414
+ (<a class="reference external" href="http://arxiv.org/abs/1207.6711">http://arxiv.org/abs/1207.6711</a>).</p>
1415
+ <p>The result of the <a class="reference internal" href="#snappy.Manifold.gluing_equations" title="snappy.Manifold.gluing_equations"><code class="xref py py-meth docutils literal notranslate"><span class="pre">gluing_equations()</span></code></a> can be obtained from
1416
+ the general method by:</p>
1417
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
1418
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">gluing_equations_pgl</span><span class="p">()</span><span class="o">.</span><span class="n">matrix</span>
1419
+ <span class="go">[ 2 1 0 1 0 2]</span>
1420
+ <span class="go">[ 0 1 2 1 2 0]</span>
1421
+ <span class="go">[ 1 0 0 0 -1 0]</span>
1422
+ <span class="go">[ 0 0 0 0 -2 2]</span>
1423
+ </pre></div>
1424
+ </div>
1425
+ <p>But besides the matrix, the method also returns explanations of
1426
+ the columns and rows:</p>
1427
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s2">&quot;m004&quot;</span><span class="p">)</span>
1428
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">gluing_equations_pgl</span><span class="p">()</span>
1429
+ <span class="go">NeumannZagierTypeEquations(</span>
1430
+ <span class="go"> [ 2 1 0 1 0 2]</span>
1431
+ <span class="go"> [ 0 1 2 1 2 0]</span>
1432
+ <span class="go"> [ 1 0 0 0 -1 0]</span>
1433
+ <span class="go"> [ 0 0 0 0 -2 2],</span>
1434
+ <span class="go"> explain_columns = [&#39;z_0000_0&#39;, &#39;zp_0000_0&#39;, &#39;zpp_0000_0&#39;, &#39;z_0000_1&#39;, &#39;zp_0000_1&#39;, &#39;zpp_0000_1&#39;],</span>
1435
+ <span class="go"> explain_rows = [&#39;edge_0_0&#39;, &#39;edge_0_1&#39;, &#39;meridian_0_0&#39;, &#39;longitude_0_0&#39;])</span>
1436
+ </pre></div>
1437
+ </div>
1438
+ <p>The first row of the matrix means that the edge equation for
1439
+ edge 0 is</p>
1440
+ <div class="math notranslate nohighlight">
1441
+ \[{z_{0000,0}}^2 * z'_{0000,0} * z_{0000,1} * {z''_{0000,1}}^2 = 1.\]</div>
1442
+ <p>Similarly, the next row encodes the edge equation for the other edge
1443
+ and the next two rows encode peripheral equations.</p>
1444
+ <p>Following the SnapPy convention, a <code class="docutils literal notranslate"><span class="pre">z</span></code> denotes the cross ratio
1445
+ <span class="math notranslate nohighlight">\(z\)</span> at the edge (0,1), a <code class="docutils literal notranslate"><span class="pre">zp</span></code> the cross ratio <span class="math notranslate nohighlight">\(z'\)</span> at
1446
+ the edge (0,2) and a <code class="docutils literal notranslate"><span class="pre">zpp</span></code> the cross
1447
+ ratio <span class="math notranslate nohighlight">\(z''\)</span> at the edge (1,2). The entire symbol <code class="docutils literal notranslate"><span class="pre">z_xxxx_y</span></code> then
1448
+ denotes the cross ratio belonging to the subsimplex at integral
1449
+ point <code class="docutils literal notranslate"><span class="pre">xxxx</span></code> (always <code class="docutils literal notranslate"><span class="pre">0000</span></code> for <code class="docutils literal notranslate"><span class="pre">N</span> <span class="pre">=</span> <span class="pre">2</span></code>) of the simplex <code class="docutils literal notranslate"><span class="pre">y</span></code>.</p>
1450
+ <p>Note: the SnapPy convention is different from the paper
1451
+ mentioned above, e.g., compare
1452
+ kernel_code/edge_classes.c with Figure 3. We follow the SnapPy
1453
+ convention here so that all computations done in SnapPy are
1454
+ consistent.</p>
1455
+ <p>The explanations of the rows and columns can be obtained explicitly by:</p>
1456
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">gluing_equations_pgl</span><span class="p">(</span><span class="n">N</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">equation_type</span> <span class="o">=</span> <span class="s1">&#39;peripheral&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">explain_rows</span>
1457
+ <span class="go">[&#39;meridian_0_0&#39;, &#39;meridian_1_0&#39;, &#39;longitude_0_0&#39;, &#39;longitude_1_0&#39;]</span>
1458
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">gluing_equations_pgl</span><span class="p">(</span><span class="n">N</span> <span class="o">=</span> <span class="mi">2</span><span class="p">)</span><span class="o">.</span><span class="n">explain_columns</span>
1459
+ <span class="go">[&#39;z_0000_0&#39;, &#39;zp_0000_0&#39;, &#39;zpp_0000_0&#39;, &#39;z_0000_1&#39;, &#39;zp_0000_1&#39;, &#39;zpp_0000_1&#39;]</span>
1460
+ </pre></div>
1461
+ </div>
1462
+ <p>A subset of all gluing equations can be obtained by setting the
1463
+ <code class="docutils literal notranslate"><span class="pre">equation_type</span></code>:</p>
1464
+ <ul class="simple">
1465
+ <li><p>all gluing equations: <code class="docutils literal notranslate"><span class="pre">all</span></code></p></li>
1466
+ <li><p>non-peripheral equations: <code class="docutils literal notranslate"><span class="pre">non_peripheral</span></code></p>
1467
+ <ul>
1468
+ <li><p>edge gluing equations: <code class="docutils literal notranslate"><span class="pre">edge</span></code></p></li>
1469
+ <li><p>face gluing equations: <code class="docutils literal notranslate"><span class="pre">face</span></code></p></li>
1470
+ <li><p>internal gluing equations: <code class="docutils literal notranslate"><span class="pre">internal</span></code></p></li>
1471
+ </ul>
1472
+ </li>
1473
+ <li><p>cusp gluing equations: <code class="docutils literal notranslate"><span class="pre">peripheral</span></code></p>
1474
+ <ul>
1475
+ <li><p>cusp gluing equations for meridians: <code class="docutils literal notranslate"><span class="pre">meridian</span></code></p></li>
1476
+ <li><p>cusp gluing equations for longitudes: <code class="docutils literal notranslate"><span class="pre">longitude</span></code></p></li>
1477
+ </ul>
1478
+ </li>
1479
+ </ul>
1480
+ </dd></dl>
1481
+
1482
+ <dl class="py method">
1483
+ <dt class="sig sig-object py" id="snappy.Manifold.has_finite_vertices">
1484
+ <span class="sig-name descname"><span class="pre">has_finite_vertices</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#snappy.Manifold.has_finite_vertices" title="Link to this definition"></a></dt>
1485
+ <dd><p>Returns <code class="docutils literal notranslate"><span class="pre">True</span></code> if and only if the triangulation has finite (non-ideal)
1486
+ vertices.</p>
1487
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">T</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s2">&quot;m004&quot;</span><span class="p">)</span>
1488
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">T</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span>
1489
+ <span class="go">False</span>
1490
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">T</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">12</span><span class="p">,</span><span class="mi">13</span><span class="p">))</span>
1491
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">S</span> <span class="o">=</span> <span class="n">T</span><span class="o">.</span><span class="n">filled_triangulation</span><span class="p">()</span>
1492
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">S</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span>
1493
+ <span class="go">True</span>
1494
+ </pre></div>
1495
+ </div>
1496
+ <p>When trying to find a hyperbolic structure, SnapPea will eliminate
1497
+ finite vertices:</p>
1498
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">S</span><span class="o">.</span><span class="n">with_hyperbolic_structure</span><span class="p">()</span>
1499
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">has_finite_vertices</span><span class="p">()</span>
1500
+ <span class="go">False</span>
1501
+ </pre></div>
1502
+ </div>
1503
+ </dd></dl>
1504
+
1505
+ <dl class="py method">
1506
+ <dt class="sig sig-object py" id="snappy.Manifold.high_precision">
1507
+ <span class="sig-name descname"><span class="pre">high_precision</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.high_precision" title="Link to this definition"></a></dt>
1508
+ <dd><p>Return a high precision version of this manifold.</p>
1509
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
1510
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">type</span><span class="p">(</span><span class="n">M</span><span class="o">.</span><span class="n">high_precision</span><span class="p">())</span>
1511
+ <span class="go">&lt;class &#39;snappy.ManifoldHP&#39;&gt;</span>
1512
+ </pre></div>
1513
+ </div>
1514
+ </dd></dl>
1515
+
1516
+ <dl class="py method">
1517
+ <dt class="sig sig-object py" id="snappy.Manifold.holonomy_matrix_entries">
1518
+ <span class="sig-name descname"><span class="pre">holonomy_matrix_entries</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">fundamental_group_args</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">match_kernel</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.holonomy_matrix_entries" title="Link to this definition"></a></dt>
1519
+ <dd><p>The entries of the matrices of the holonomy as list of ApproximateAlgebraicNumbers
1520
+ (four consecutive numbers per matrix). The numbers are guaranteed to lie in the
1521
+ trace field only if match_kernel = False:</p>
1522
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m004&quot;</span><span class="p">)</span>
1523
+ <span class="n">sage</span><span class="p">:</span> <span class="n">mat_entries</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">holonomy_matrix_entries</span><span class="p">(</span><span class="n">match_kernel</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="c1"># doctest: +NORMALIZE_WHITESPACE +NUMERIC9</span>
1524
+ <span class="n">sage</span><span class="p">:</span> <span class="n">mat_entries</span>
1525
+ <span class="o">&lt;</span><span class="n">SetOfAAN</span><span class="p">:</span> <span class="p">[</span><span class="mf">0.5</span> <span class="o">+</span> <span class="mf">0.8660254037844386</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="mf">0.5</span> <span class="o">-</span> <span class="mf">0.8660254037844386</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="mf">0.5</span> <span class="o">+</span> <span class="mf">0.8660254037844386</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="mf">1.7320508075688772</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="mf">3.4641016151377544</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="o">-</span><span class="mf">2.0</span> <span class="o">+</span> <span class="mf">1.7320508075688772</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="o">-</span><span class="mf">1.0</span> <span class="o">-</span> <span class="mf">1.7320508075688772</span><span class="o">*</span><span class="n">I</span><span class="p">,</span> <span class="mf">1.7320508075688772</span><span class="o">*</span><span class="n">I</span><span class="p">]</span><span class="o">&gt;</span>
1526
+ <span class="n">sage</span><span class="p">:</span> <span class="n">K</span> <span class="o">=</span> <span class="n">mat_entries</span><span class="o">.</span><span class="n">find_field</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">optimize</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
1527
+ <span class="n">sage</span><span class="p">:</span> <span class="n">K</span><span class="o">.</span><span class="n">polynomial</span><span class="p">()</span>
1528
+ <span class="n">x</span><span class="o">^</span><span class="mi">2</span> <span class="o">-</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span>
1529
+ </pre></div>
1530
+ </div>
1531
+ </dd></dl>
1532
+
1533
+ <dl class="py method">
1534
+ <dt class="sig sig-object py" id="snappy.Manifold.homological_longitude">
1535
+ <span class="sig-name descname"><span class="pre">homological_longitude</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cusp</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.homological_longitude" title="Link to this definition"></a></dt>
1536
+ <dd><p>Returns the peripheral curve in the given cusp, if any, which is
1537
+ homologically trivial (with rational coefficients) in the manifold:</p>
1538
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m015&#39;</span><span class="p">)</span>
1539
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">homological_longitude</span><span class="p">()</span>
1540
+ <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
1541
+ </pre></div>
1542
+ </div>
1543
+ <p>If no cusp is specified, the default is the first unfilled cusp;
1544
+ if all cusps are filled, the default is the first cusp:</p>
1545
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;L5a1(3,4)(0,0)&#39;</span><span class="p">)</span>
1546
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">homological_longitude</span><span class="p">()</span>
1547
+ <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
1548
+ </pre></div>
1549
+ </div>
1550
+ <p>The components of the next link have nontrivial linking number
1551
+ so there is no such curve:</p>
1552
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">W</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;L7a2&#39;</span><span class="p">)</span>
1553
+ <span class="n">sage</span><span class="p">:</span> <span class="n">W</span><span class="o">.</span><span class="n">homological_longitude</span><span class="p">(</span><span class="n">cusp</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span>
1554
+ <span class="kc">True</span>
1555
+ </pre></div>
1556
+ </div>
1557
+ <p>If every curve in the given cusp is trivial in the rational homology of
1558
+ the manifold, an exception is raised:</p>
1559
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;4_1(1,0)&#39;</span><span class="p">)</span>
1560
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">homological_longitude</span><span class="p">()</span>
1561
+ <span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
1562
+ <span class="o">...</span>
1563
+ <span class="ne">ValueError</span><span class="p">:</span> <span class="n">Every</span> <span class="n">curve</span> <span class="n">on</span> <span class="n">cusp</span> <span class="ow">is</span> <span class="n">homologically</span> <span class="n">trivial</span>
1564
+ </pre></div>
1565
+ </div>
1566
+ </dd></dl>
1567
+
1568
+ <dl class="py method">
1569
+ <dt class="sig sig-object py" id="snappy.Manifold.homology">
1570
+ <span class="sig-name descname"><span class="pre">homology</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="additional_classes.html#snappy.AbelianGroup" title="SnapPy.AbelianGroup"><span class="pre">AbelianGroup</span></a></span></span><a class="headerlink" href="#snappy.Manifold.homology" title="Link to this definition"></a></dt>
1571
+ <dd><p>Returns an <a class="reference internal" href="additional_classes.html#snappy.AbelianGroup" title="snappy.AbelianGroup"><code class="xref py py-class docutils literal notranslate"><span class="pre">AbelianGroup</span></code></a> representing the first integral
1572
+ homology group of the underlying (Dehn filled) manifold.</p>
1573
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;m003&#39;</span><span class="p">)</span>
1574
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">homology</span><span class="p">()</span>
1575
+ <span class="go">Z/5 + Z</span>
1576
+ </pre></div>
1577
+ </div>
1578
+ </dd></dl>
1579
+
1580
+ <dl class="py method">
1581
+ <dt class="sig sig-object py" id="snappy.Manifold.hyperbolic_SLN_torsion">
1582
+ <span class="sig-name descname"><span class="pre">hyperbolic_SLN_torsion</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">N</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">100</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.hyperbolic_SLN_torsion" title="Link to this definition"></a></dt>
1583
+ <dd><p>Compute the torsion polynomial of the holonomy representation lifted
1584
+ to SL(2, C) and then followed by the irreducible representation
1585
+ from SL(2, C) -&gt; SL(N, C):</p>
1586
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m016&#39;</span><span class="p">)</span>
1587
+ <span class="n">sage</span><span class="p">:</span> <span class="p">[</span><span class="n">M</span><span class="o">.</span><span class="n">hyperbolic_SLN_torsion</span><span class="p">(</span><span class="n">N</span><span class="p">)</span><span class="o">.</span><span class="n">degree</span><span class="p">()</span> <span class="k">for</span> <span class="n">N</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]]</span>
1588
+ <span class="p">[</span><span class="mi">18</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">36</span><span class="p">]</span>
1589
+ </pre></div>
1590
+ </div>
1591
+ </dd></dl>
1592
+
1593
+ <dl class="py method">
1594
+ <dt class="sig sig-object py" id="snappy.Manifold.hyperbolic_adjoint_torsion">
1595
+ <span class="sig-name descname"><span class="pre">hyperbolic_adjoint_torsion</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">100</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.hyperbolic_adjoint_torsion" title="Link to this definition"></a></dt>
1596
+ <dd><p>Computes the torsion polynomial of the adjoint representation
1597
+ a la Dubois-Yamaguichi. This is not a sign-refined computation
1598
+ so the result is only defined up to sign, not to mention a power
1599
+ of the variable ‘a’:</p>
1600
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;K11n42&#39;</span><span class="p">)</span>
1601
+ <span class="n">sage</span><span class="p">:</span> <span class="n">tau</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">hyperbolic_adjoint_torsion</span><span class="p">()</span>
1602
+ <span class="n">sage</span><span class="p">:</span> <span class="n">tau</span><span class="o">.</span><span class="n">parent</span><span class="p">()</span>
1603
+ <span class="n">Univariate</span> <span class="n">Polynomial</span> <span class="n">Ring</span> <span class="ow">in</span> <span class="n">a</span> <span class="n">over</span> <span class="n">Complex</span> <span class="n">Field</span> <span class="k">with</span> <span class="mi">100</span> <span class="n">bits</span> <span class="n">of</span> <span class="n">precision</span>
1604
+ <span class="n">sage</span><span class="p">:</span> <span class="n">tau</span><span class="o">.</span><span class="n">degree</span><span class="p">()</span>
1605
+ <span class="mi">7</span>
1606
+ </pre></div>
1607
+ </div>
1608
+ </dd></dl>
1609
+
1610
+ <dl class="py method">
1611
+ <dt class="sig sig-object py" id="snappy.Manifold.hyperbolic_torsion">
1612
+ <span class="sig-name descname"><span class="pre">hyperbolic_torsion</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">100</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">all_lifts</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">wada_conventions</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">phi</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.hyperbolic_torsion" title="Link to this definition"></a></dt>
1613
+ <dd><p>Computes the hyperbolic torsion polynomial as defined in
1614
+ <a class="reference external" href="http://arxiv.org/abs/1108.3045">[DFJ]</a>:</p>
1615
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;K11n42&#39;</span><span class="p">)</span>
1616
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">alexander_polynomial</span><span class="p">()</span>
1617
+ <span class="mi">1</span>
1618
+ <span class="n">sage</span><span class="p">:</span> <span class="n">tau</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">hyperbolic_torsion</span><span class="p">(</span><span class="n">bits_prec</span><span class="o">=</span><span class="mi">200</span><span class="p">)</span>
1619
+ <span class="n">sage</span><span class="p">:</span> <span class="n">tau</span><span class="o">.</span><span class="n">degree</span><span class="p">()</span>
1620
+ <span class="mi">6</span>
1621
+ </pre></div>
1622
+ </div>
1623
+ </dd></dl>
1624
+
1625
+ <dl class="py method">
1626
+ <dt class="sig sig-object py" id="snappy.Manifold.identify">
1627
+ <span class="sig-name descname"><span class="pre">identify</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">extends_to_link</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.identify" title="Link to this definition"></a></dt>
1628
+ <dd><p>Looks for the manifold in all of the SnapPy databases.
1629
+ For hyperbolic manifolds this is done by searching for isometries:</p>
1630
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m125&#39;</span><span class="p">)</span>
1631
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">identify</span><span class="p">()</span>
1632
+ <span class="go">[m125(0,0)(0,0), L13n5885(0,0)(0,0), ooct01_00000(0,0)(0,0)]</span>
1633
+ </pre></div>
1634
+ </div>
1635
+ <p>By default, there is no restriction on the isometries. One can
1636
+ require that the isometry take meridians to meridians. This
1637
+ might return fewer results:</p>
1638
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">identify</span><span class="p">(</span><span class="n">extends_to_link</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
1639
+ <span class="go">[m125(0,0)(0,0), ooct01_00000(0,0)(0,0)]</span>
1640
+ </pre></div>
1641
+ </div>
1642
+ <p>For closed manifolds, extends_to_link doesn’t make sense
1643
+ because of how the kernel code works:</p>
1644
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">C</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m015(1,2)&quot;</span><span class="p">)</span>
1645
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">C</span><span class="o">.</span><span class="n">identify</span><span class="p">()</span>
1646
+ <span class="go">[m006(-5,2)]</span>
1647
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">C</span><span class="o">.</span><span class="n">identify</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
1648
+ <span class="go">[]</span>
1649
+ </pre></div>
1650
+ </div>
1651
+ </dd></dl>
1652
+
1653
+ <dl class="py method">
1654
+ <dt class="sig sig-object py" id="snappy.Manifold.inside_view">
1655
+ <span class="sig-name descname"><span class="pre">inside_view</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cohomology_class</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">geodesics</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Sequence</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">[]</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.inside_view" title="Link to this definition"></a></dt>
1656
+ <dd><p>Show raytraced inside view of hyperbolic manifold. See
1657
+ <a class="reference external" href="https://im.icerm.brown.edu/portfolio/snappy-views/">images</a>
1658
+ and <a class="reference external" href="https://youtu.be/CAERhmUCkRs">demo video</a>.</p>
1659
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m004&quot;</span><span class="p">)</span>
1660
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">inside_view</span><span class="p">()</span>
1661
+ </pre></div>
1662
+ </div>
1663
+ <p>Or show the cohomology fractal:</p>
1664
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m004&quot;</span><span class="p">)</span>
1665
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">inside_view</span><span class="p">(</span><span class="n">cohomology_class</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
1666
+ </pre></div>
1667
+ </div>
1668
+ <p>The cohomology class in <span class="math notranslate nohighlight">\(H^2(M, \partial M; \mathbb{R})\)</span> producing the
1669
+ cohomology fractal can be specified as a cocycle or using an automatically
1670
+ computed basis (of, say, length <code class="docutils literal notranslate"><span class="pre">n</span></code>). Thus, <code class="docutils literal notranslate"><span class="pre">cohomology_class</span></code> can be
1671
+ one of the following.</p>
1672
+ <ul class="simple">
1673
+ <li><p>An integer <code class="docutils literal notranslate"><span class="pre">i</span></code> between 0 and <code class="docutils literal notranslate"><span class="pre">n</span></code> - 1 to pick the <code class="docutils literal notranslate"><span class="pre">i</span></code>-th basis
1674
+ vector.</p></li>
1675
+ <li><p>An array of length <code class="docutils literal notranslate"><span class="pre">n</span></code> specifying the cohomology class as linear
1676
+ combination of basis vectors.</p></li>
1677
+ <li><p>A weight for each face of each tetrahedron.</p></li>
1678
+ </ul>
1679
+ <p>Geodesics can be specified as words in the unsimplified fundamental group:</p>
1680
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m004&quot;</span><span class="p">)</span>
1681
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">inside_view</span><span class="p">(</span><span class="n">geodesics</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;bC&#39;</span><span class="p">])</span>
1682
+ </pre></div>
1683
+ </div>
1684
+ </dd></dl>
1685
+
1686
+ <dl class="py method">
1687
+ <dt class="sig sig-object py" id="snappy.Manifold.invariant_trace_field_gens">
1688
+ <span class="sig-name descname"><span class="pre">invariant_trace_field_gens</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">fundamental_group_args</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[]</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.invariant_trace_field_gens" title="Link to this definition"></a></dt>
1689
+ <dd><p>The generators of the trace field as ApproximateAlgebraicNumbers. Can be
1690
+ used to compute the tetrahedra field, where the first two parameters
1691
+ are bits of precision and maximum degree of the field:</p>
1692
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m007(3,1)&#39;</span><span class="p">)</span>
1693
+ <span class="n">sage</span><span class="p">:</span> <span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">invariant_trace_field_gens</span><span class="p">()</span><span class="o">.</span><span class="n">find_field</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">optimize</span><span class="o">=</span><span class="kc">True</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
1694
+ <span class="n">sage</span><span class="p">:</span> <span class="n">L</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">trace_field_gens</span><span class="p">()</span><span class="o">.</span><span class="n">find_field</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">optimize</span><span class="o">=</span><span class="kc">True</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
1695
+ <span class="n">sage</span><span class="p">:</span> <span class="n">K</span><span class="o">.</span><span class="n">polynomial</span><span class="p">(),</span> <span class="n">L</span><span class="o">.</span><span class="n">polynomial</span><span class="p">()</span>
1696
+ <span class="p">(</span><span class="n">x</span><span class="o">^</span><span class="mi">2</span> <span class="o">-</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">x</span><span class="o">^</span><span class="mi">4</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">x</span><span class="o">^</span><span class="mi">3</span> <span class="o">+</span> <span class="n">x</span><span class="o">^</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">6</span><span class="o">*</span><span class="n">x</span> <span class="o">+</span> <span class="mi">3</span><span class="p">)</span>
1697
+ </pre></div>
1698
+ </div>
1699
+ </dd></dl>
1700
+
1701
+ <dl class="py method">
1702
+ <dt class="sig sig-object py" id="snappy.Manifold.is_isometric_to">
1703
+ <span class="sig-name descname"><span class="pre">is_isometric_to</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">other</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><span class="pre">Manifold</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">ManifoldHP</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">return_isometries</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">Isometry</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#snappy.Manifold.is_isometric_to" title="Link to this definition"></a></dt>
1704
+ <dd><p>Returns <code class="docutils literal notranslate"><span class="pre">True</span></code> if M and N are isometric, <code class="docutils literal notranslate"><span class="pre">False</span></code> if they not.
1705
+ A <code class="docutils literal notranslate"><span class="pre">RuntimeError</span></code> is raised in cases where the SnapPea kernel fails
1706
+ to determine either answer. (This is fairly common for closed
1707
+ manifolds.)</p>
1708
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
1709
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;4_1&#39;</span><span class="p">)</span>
1710
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">K</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;5_2&#39;</span><span class="p">)</span>
1711
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">N</span><span class="p">)</span>
1712
+ <span class="go">True</span>
1713
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">K</span><span class="p">)</span>
1714
+ <span class="go">False</span>
1715
+ </pre></div>
1716
+ </div>
1717
+ <p>We can also get a complete list of isometries between the two
1718
+ manifolds:</p>
1719
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;5^2_1&#39;</span><span class="p">)</span> <span class="c1"># The Whitehead link</span>
1720
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m129&#39;</span><span class="p">)</span>
1721
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">isoms</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">is_isometric_to</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">return_isometries</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
1722
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">isoms</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="c1"># Includes action on cusps</span>
1723
+ <span class="go">0 -&gt; 1 1 -&gt; 0</span>
1724
+ <span class="go">[1 2] [-1 -2]</span>
1725
+ <span class="go">[0 -1] [ 0 1]</span>
1726
+ <span class="go">Extends to link</span>
1727
+ </pre></div>
1728
+ </div>
1729
+ <p>Each transformation between cusps is given by a matrix which
1730
+ acts on the left. That is, the two <em>columns</em> of the matrix
1731
+ give the image of the meridian and longitude respectively. In
1732
+ the above example, the meridian of cusp 0 is sent to the
1733
+ meridian of cusp 1.</p>
1734
+ <p>Note: The answer <code class="docutils literal notranslate"><span class="pre">True</span></code> is rigorous, but the answer <code class="docutils literal notranslate"><span class="pre">False</span></code> may
1735
+ not be as there could be numerical errors resulting in finding
1736
+ an incorrect canonical triangulation.</p>
1737
+ </dd></dl>
1738
+
1739
+ <dl class="py method">
1740
+ <dt class="sig sig-object py" id="snappy.Manifold.is_orientable">
1741
+ <span class="sig-name descname"><span class="pre">is_orientable</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#snappy.Manifold.is_orientable" title="Link to this definition"></a></dt>
1742
+ <dd><p>Return whether the underlying 3-manifold is orientable.</p>
1743
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;x124&#39;</span><span class="p">)</span>
1744
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">is_orientable</span><span class="p">()</span>
1745
+ <span class="go">False</span>
1746
+ </pre></div>
1747
+ </div>
1748
+ </dd></dl>
1749
+
1750
+ <dl class="py method">
1751
+ <dt class="sig sig-object py" id="snappy.Manifold.is_two_bridge">
1752
+ <span class="sig-name descname"><span class="pre">is_two_bridge</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bool</span></span></span><a class="headerlink" href="#snappy.Manifold.is_two_bridge" title="Link to this definition"></a></dt>
1753
+ <dd><p>If the manifold is the complement of a two-bridge knot or link
1754
+ in <span class="math notranslate nohighlight">\(S^3\)</span>, then this method returns <span class="math notranslate nohighlight">\((p,q)\)</span> where
1755
+ <span class="math notranslate nohighlight">\(p/q\)</span> is the fraction describing the link.
1756
+ Otherwise, returns <code class="docutils literal notranslate"><span class="pre">False</span></code>.</p>
1757
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
1758
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">is_two_bridge</span><span class="p">()</span>
1759
+ <span class="go">(2, 5)</span>
1760
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m016&#39;</span><span class="p">)</span>
1761
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">is_two_bridge</span><span class="p">()</span>
1762
+ <span class="go">False</span>
1763
+ </pre></div>
1764
+ </div>
1765
+ <p>Note: An answer of <code class="docutils literal notranslate"><span class="pre">True</span></code> is rigorous, but not the answer
1766
+ <code class="docutils literal notranslate"><span class="pre">False</span></code>, as there could be numerical errors resulting in
1767
+ finding an incorrect canonical triangulation.</p>
1768
+ </dd></dl>
1769
+
1770
+ <dl class="py method">
1771
+ <dt class="sig sig-object py" id="snappy.Manifold.isometry_signature">
1772
+ <span class="sig-name descname"><span class="pre">isometry_signature</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">of_link</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_orientation</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">interval_bits_precs</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[53,</span> <span class="pre">212]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exact_bits_prec_and_degrees</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[(212,</span> <span class="pre">10),</span> <span class="pre">(1000,</span> <span class="pre">20),</span> <span class="pre">(2000,</span> <span class="pre">20)]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">str</span></span></span><a class="headerlink" href="#snappy.Manifold.isometry_signature" title="Link to this definition"></a></dt>
1773
+ <dd><p>Returns the “isometry signature”, a complete invariant of the hyperbolic
1774
+ 3-manifold obtained by applying the Dehn-fillings.
1775
+ The isometry signature is always a (decorated) isomorphism signature, see
1776
+ <a class="reference internal" href="#snappy.Manifold.triangulation_isosig" title="snappy.Manifold.triangulation_isosig"><code class="xref py py-meth docutils literal notranslate"><span class="pre">triangulation_isosig()</span></code></a>, and was introduced in
1777
+ <a class="reference external" href="http://arxiv.org/abs/1502.00383">Goerner ‘16</a>.</p>
1778
+ <p>Depending on <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_orientation</span></code>, it is a complete invariant of
1779
+ either the oriented (if orientable) or unoriented hyperbolic 3-manifold.
1780
+ If <code class="xref py py-attr docutils literal notranslate"><span class="pre">of_link</span> <span class="pre">=</span> <span class="pre">True</span></code> is specified, the signature is decorated by the
1781
+ unoriented peripheral curves (aka meridian and longitude, up to homotopy).
1782
+ If the 3-manifold arises as a link complement, the decorated isometry
1783
+ signature obtained with <code class="xref py py-attr docutils literal notranslate"><span class="pre">of_link</span> <span class="pre">=</span> <span class="pre">True</span></code> is a complete invariant of
1784
+ the link.</p>
1785
+ <p>The isometry signature is computed differently based on whether there
1786
+ is at least one unfilled cusp.</p>
1787
+ <p><strong>Cusped manifolds</strong></p>
1788
+ <p>If there is at least one unfilled cusped, we are in the cusped case.</p>
1789
+ <p>Here is an example of two links having isometric (hyperbolic) complements:</p>
1790
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;L5a1&quot;</span><span class="p">)</span>
1791
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;L7n2&quot;</span><span class="p">)</span>
1792
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">()</span>
1793
+ <span class="go">&#39;eLPkbdcddhgggb&#39;</span>
1794
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">()</span>
1795
+ <span class="go">&#39;eLPkbdcddhgggb&#39;</span>
1796
+ </pre></div>
1797
+ </div>
1798
+ <p>The complements do have opposite handedness though:</p>
1799
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">ignore_orientation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
1800
+ <span class="go">&#39;eLPkbdcddxvvcv&#39;</span>
1801
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">ignore_orientation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
1802
+ <span class="go">&#39;eLPkbdcddhgggb&#39;</span>
1803
+ </pre></div>
1804
+ </div>
1805
+ <p>We can show that the two links are distinct:</p>
1806
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">of_link</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
1807
+ <span class="go">&#39;eLPkbdcddhgggb_baCbbaCb&#39;</span>
1808
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">of_link</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
1809
+ <span class="go">&#39;eLPkbdcddhgggb_bBcBbaCb&#39;</span>
1810
+ </pre></div>
1811
+ </div>
1812
+ <p>If we Dehn-fill some cusps, the method uses the filled triangulation.
1813
+ Here, we Dehn-fill the Whitehead link to get the figure-eight knot:</p>
1814
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span> <span class="mi">0</span><span class="p">)</span>
1815
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">of_link</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
1816
+ <span class="go">&#39;cPcbbbiht_bacb&#39;</span>
1817
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;4_1&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">of_link</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
1818
+ <span class="go">&#39;cPcbbbiht_bacb&#39;</span>
1819
+ </pre></div>
1820
+ </div>
1821
+ <p>In general, the isometry signature is the isomorphism signature (see
1822
+ <a class="reference internal" href="#snappy.Manifold.triangulation_isosig" title="snappy.Manifold.triangulation_isosig"><code class="xref py py-meth docutils literal notranslate"><span class="pre">triangulation_isosig()</span></code></a>) of the
1823
+ <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation()</span></code></a> of the
1824
+ <a class="reference internal" href="#snappy.Manifold.filled_triangulation" title="snappy.Manifold.filled_triangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">filled_triangulation()</span></code></a>:</p>
1825
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">T</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">filled_triangulation</span><span class="p">()</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
1826
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_cusp_ordering</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
1827
+ <span class="gp">... </span> <span class="n">ignore_curve_orientations</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
1828
+ <span class="go">&#39;cPcbbbiht_bacb&#39;</span>
1829
+ </pre></div>
1830
+ </div>
1831
+ <p><strong>Closed manifolds</strong></p>
1832
+ <p>If all cusps are filled, we are in the closed case. In this case, the
1833
+ isometry signature gives the resulting closed hyperbolic 3-manifold as
1834
+ canonical surgery on a hyperbolic 1-cusped manifold (which is encoded by
1835
+ its isometry signature). Only orientable manifolds are supported in the
1836
+ closed case.</p>
1837
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;v2000(1,3)&quot;</span><span class="p">)</span>
1838
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">()</span>
1839
+ <span class="go">&#39;fLLQcacdedenbxxrr(-7,12)&#39;</span>
1840
+ </pre></div>
1841
+ </div>
1842
+ <p>The following code illustrates how the isometry signature is computed:</p>
1843
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
1844
+ <span class="go">[Length Core curve Word</span>
1845
+ <span class="go"> 0.06491027903143 - 2.63765810995071*I - d,</span>
1846
+ <span class="go"> 0.49405010583448 + 2.38451103485706*I - a]</span>
1847
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">K</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_word</span><span class="p">(</span><span class="s1">&#39;d&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">filled_triangulation</span><span class="p">()</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
1848
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">K</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="mi">0</span><span class="p">)</span>
1849
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">K</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">ignore_curves</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
1850
+ <span class="go">&#39;fLLQcacdedenbxxrr(-7,12)&#39;</span>
1851
+ </pre></div>
1852
+ </div>
1853
+ <p>Note that there is clearly a unique shortest geodesic in this example.
1854
+ In general, the method first considers a canonical set of geodesics.
1855
+ For each such geodesic, it computes a candidate signature as above. It
1856
+ then picks a canonical signature among the candidates. Further details
1857
+ can be found in an upcoming paper.</p>
1858
+ <p><strong>Verified computations</strong></p>
1859
+ <p>While the isometry signature is purely combinatorial, some intermediate
1860
+ computations are numerical. Thus, if <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>,
1861
+ floating-point issues can arise.</p>
1862
+ <p>The method can be made <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing
1863
+ <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
1864
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">=</span><span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m007(4,1)&quot;</span><span class="p">)</span>
1865
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">isometry_signature</span><span class="p">(</span><span class="n">verified</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
1866
+ <span class="s1">&#39;eLPkbcdddhggsj(3,1)&#39;</span>
1867
+ </pre></div>
1868
+ </div>
1869
+ <p>This method always needs to compute at least one canonical retriangulation.
1870
+ It can take the same arguments as <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation()</span></code></a> and
1871
+ passes them to <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation()</span></code></a> when computing the
1872
+ verified canonical retriangulation. If the manifold is closed, interval
1873
+ arithmetic is used when finding and drilling the short geodesics.</p>
1874
+ <dl class="field-list simple">
1875
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
1876
+ <dd class="field-odd"><ul class="simple">
1877
+ <li><p><strong>of_link</strong> – Also encode the unoriented peripheral curves.
1878
+ Note that it is not necessary for the manifold to be a link
1879
+ complement to invoke this flag.
1880
+ Only relevant in the cusped case.</p></li>
1881
+ <li><p><strong>ignore_orientation</strong> – Do not encode the orientation of the 3-manifold.</p></li>
1882
+ <li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
1883
+ <li><p><strong>interval_bits_precs</strong> – Passed to <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation()</span></code></a> and (in the closed
1884
+ case) also used when calling <a class="reference internal" href="#snappy.Manifold.length_spectrum_alt_gen" title="snappy.Manifold.length_spectrum_alt_gen"><code class="xref py py-meth docutils literal notranslate"><span class="pre">length_spectrum_alt_gen()</span></code></a> and
1885
+ <a class="reference internal" href="#snappy.Manifold.drill_word" title="snappy.Manifold.drill_word"><code class="xref py py-meth docutils literal notranslate"><span class="pre">drill_word()</span></code></a> to find and drill the short geodesics.</p></li>
1886
+ <li><p><strong>exact_bits_prec_and_degrees</strong> – Passed to <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation()</span></code></a>.</p></li>
1887
+ <li><p><strong>verbose</strong> – Print information about finding and drilling the short geodesics.
1888
+ Also passed to <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation()</span></code></a>.</p></li>
1889
+ </ul>
1890
+ </dd>
1891
+ </dl>
1892
+ </dd></dl>
1893
+
1894
+ <dl class="py method">
1895
+ <dt class="sig sig-object py" id="snappy.Manifold.isomorphisms_to">
1896
+ <span class="sig-name descname"><span class="pre">isomorphisms_to</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">other</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><span class="pre">Triangulation</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">TriangulationHP</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">Isometry</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#snappy.Manifold.isomorphisms_to" title="Link to this definition"></a></dt>
1897
+ <dd><p>Returns a complete list of combinatorial isomorphisms between
1898
+ the two triangulations:</p>
1899
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;5^2_1&#39;</span><span class="p">)</span>
1900
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;5^2_1&#39;</span><span class="p">)</span>
1901
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">set_peripheral_curves</span><span class="p">([[[</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">],[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">]],[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">]]])</span>
1902
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">isoms</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">isomorphisms_to</span><span class="p">(</span><span class="n">N</span><span class="p">)</span>
1903
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">isoms</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span>
1904
+ <span class="go">0 -&gt; 1 1 -&gt; 0</span>
1905
+ <span class="go">[ 1 0] [-1 1]</span>
1906
+ <span class="go">[-1 1] [-3 2]</span>
1907
+ <span class="go">Does not extend to link</span>
1908
+ </pre></div>
1909
+ </div>
1910
+ <p>Each transformation between cusps is given by a matrix which
1911
+ acts on the left. That is, the two <em>columns</em> of the matrix
1912
+ give the image of the meridian and longitude respectively. In
1913
+ the above example, the meridian of cusp 0 is sent to the
1914
+ meridian of cusp 1.</p>
1915
+ </dd></dl>
1916
+
1917
+ <dl class="py method">
1918
+ <dt class="sig sig-object py" id="snappy.Manifold.length_spectrum">
1919
+ <span class="sig-name descname"><span class="pre">length_spectrum</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cutoff</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">full_rigor</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">grouped</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">include_words</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.length_spectrum" title="Link to this definition"></a></dt>
1920
+ <dd><p>Returns a list of geodesics (with multiplicities) of length
1921
+ up to the specified cutoff value. (The default cutoff is 1.0.)</p>
1922
+ <p>Here’s a quick example:</p>
1923
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">L</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m016&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">length_spectrum</span><span class="p">(</span><span class="mf">0.75</span><span class="p">,</span> <span class="n">include_words</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
1924
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">L</span>
1925
+ <span class="go">mult length topology parity word</span>
1926
+ <span class="go">1 0.58460368501799 + 2.49537045556047*I circle + a</span>
1927
+ <span class="go">1 0.72978937305180 + 3.02669828218116*I circle + Bc</span>
1928
+ </pre></div>
1929
+ </div>
1930
+ <p>Access just the length:</p>
1931
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">L</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">length</span>
1932
+ <span class="go">0.584603685017987 + 2.495370455560469*I</span>
1933
+ </pre></div>
1934
+ </div>
1935
+ </dd></dl>
1936
+
1937
+ <dl class="py method">
1938
+ <dt class="sig sig-object py" id="snappy.Manifold.length_spectrum_alt">
1939
+ <span class="sig-name descname"><span class="pre">length_spectrum_alt</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">count</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_len</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Any</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">LengthSpectrumGeodesicInfo</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#snappy.Manifold.length_spectrum_alt" title="Link to this definition"></a></dt>
1940
+ <dd><p>Returns a list of geodesics. How far this list goes can be specified
1941
+ by either a cut-off length or a count. The method only supports
1942
+ orientable manifolds. It is a convenience method for
1943
+ <a class="reference internal" href="#snappy.Manifold.length_spectrum_alt_gen" title="snappy.Manifold.length_spectrum_alt_gen"><code class="xref py py-meth docutils literal notranslate"><span class="pre">length_spectrum_alt_gen()</span></code></a>.
1944
+ We refer the reader to
1945
+ <a class="reference internal" href="#snappy.Manifold.length_spectrum_alt_gen" title="snappy.Manifold.length_spectrum_alt_gen"><code class="xref py py-meth docutils literal notranslate"><span class="pre">length_spectrum_alt_gen()</span></code></a>
1946
+ for further details not covered here.</p>
1947
+ <p><strong>Cut-off length</strong></p>
1948
+ <p>Here is an example where a cut-off length for the geodesics is specified:</p>
1949
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m202(3,4)(3,4)&quot;</span><span class="p">)</span>
1950
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt</span><span class="p">(</span><span class="n">max_len</span> <span class="o">=</span> <span class="mf">0.5</span><span class="p">)</span>
1951
+ <span class="go">[Length Core curve Word</span>
1952
+ <span class="go"> 0.14820741547094 - 1.76955170166922*I Cusp 1 bcDc,</span>
1953
+ <span class="go"> 0.14820741547097 - 1.76955170166923*I Cusp 0 aabcDabcB]</span>
1954
+ </pre></div>
1955
+ </div>
1956
+ <p>It also supports <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> computations:</p>
1957
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M.length_spectrum_alt(max_len = 0.5, verified = True, bits_prec = 100) # doctest: +SKIP
1958
+ [Length Core curve Word
1959
+ 0.148207415470948? - 1.76955170166924? *I Cusp 0 aabcDabcB,
1960
+ 0.14820741547094... - 1.76955170166923...*I Cusp 1 bcDc]
1961
+ </pre></div>
1962
+ </div>
1963
+ <p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified=True</span></code>, the returned list is guaranteed to include all
1964
+ geodesics up to the given cut-off length and might include additional
1965
+ geodesics.</p>
1966
+ <p><strong>Count</strong></p>
1967
+ <p>Here is an example where a count is specified:</p>
1968
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m202(3,4)(3,4)&quot;</span><span class="p">)</span>
1969
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt</span><span class="p">(</span><span class="n">count</span> <span class="o">=</span> <span class="mi">3</span><span class="p">)</span>
1970
+ <span class="go">[Length Core curve Word</span>
1971
+ <span class="go"> 0.14820741547094 - 1.76955170166922*I Cusp 1 bcDc,</span>
1972
+ <span class="go"> 0.14820741547097 - 1.76955170166923*I Cusp 0 aabcDabcB,</span>
1973
+ <span class="go"> 0.79356651781096 + 2.65902431489655*I - aB,</span>
1974
+ <span class="go"> 0.79356651781096 + 2.65902431489655*I - b]</span>
1975
+ </pre></div>
1976
+ </div>
1977
+ <p>Note that the number of geodesics listed might be larger than the given
1978
+ count. In particular, this happens when the same (real) length appears
1979
+ multiple times. If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified=True</span></code>, the returned list is guaranteed
1980
+ to include the <code class="xref py py-attr docutils literal notranslate"><span class="pre">count</span></code> shortest geodesics and might include additional
1981
+ geodesics.</p>
1982
+ <p><strong>Verified systole</strong></p>
1983
+ <p>Even though, the first reported geodesic might not be the shortest, we
1984
+ obtain an interval containing the systole as follows, also see
1985
+ <a class="reference internal" href="#snappy.Manifold.length_spectrum_alt_gen" title="snappy.Manifold.length_spectrum_alt_gen"><code class="xref py py-meth docutils literal notranslate"><span class="pre">length_spectrum_alt_gen()</span></code></a>:</p>
1986
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M = Manifold(&quot;m004&quot;)
1987
+ sage: M.length_spectrum_alt(count=1, verified=True, bits_prec=100)[0].length.real() # doctest: +NUMERIC21
1988
+ 1.0870701449957390997853?
1989
+ </pre></div>
1990
+ </div>
1991
+ <dl class="field-list simple">
1992
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
1993
+ <dd class="field-odd"><ul class="simple">
1994
+ <li><p><strong>count</strong> – Number of shortest geodesics to list. The actual result might
1995
+ contain additional geodesics. Exactly one of <code class="xref py py-attr docutils literal notranslate"><span class="pre">count</span></code> and
1996
+ <code class="xref py py-attr docutils literal notranslate"><span class="pre">max_len</span></code> has to be specified.</p></li>
1997
+ <li><p><strong>max_len</strong> – Cut-off length for geodesics. The actual result includes all
1998
+ geodesics up to the given length and might include additional
1999
+ geodesics. Exactly one of <code class="xref py py-attr docutils literal notranslate"><span class="pre">count</span></code> and <code class="xref py py-attr docutils literal notranslate"><span class="pre">max_len</span></code> has
2000
+ to be specified.</p></li>
2001
+ <li><p><strong>bits_prec</strong> – Precision used for the computation. Increase if computation did
2002
+ not succeed.</p></li>
2003
+ <li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
2004
+ </ul>
2005
+ </dd>
2006
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
2007
+ <dd class="field-even"><p>A list of geodesics such that the (lower bound of) the real
2008
+ length is non-decreasing.</p>
2009
+ </dd>
2010
+ </dl>
2011
+ </dd></dl>
2012
+
2013
+ <dl class="py method">
2014
+ <dt class="sig sig-object py" id="snappy.Manifold.length_spectrum_alt_gen">
2015
+ <span class="sig-name descname"><span class="pre">length_spectrum_alt_gen</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Sequence</span><span class="p"><span class="pre">[</span></span><span class="pre">LengthSpectrumGeodesicInfo</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#snappy.Manifold.length_spectrum_alt_gen" title="Link to this definition"></a></dt>
2016
+ <dd><p>Returns a generator for the geodesics sorted by real length. The method
2017
+ only supports orientable manifolds.</p>
2018
+ <p>Here is an example:</p>
2019
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m202(3,4)(0,0)&quot;</span><span class="p">)</span>
2020
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">spec</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt_gen</span><span class="p">()</span>
2021
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
2022
+ <span class="go">Length Core curve Word</span>
2023
+ <span class="go">0.14742465268512 - 1.78287093565202*I Cusp 0 aabcDabcB</span>
2024
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
2025
+ <span class="go">0.81161414965958 + 2.72911699294426*I - b</span>
2026
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
2027
+ <span class="go">0.84163270359334 + 2.61245944742151*I - aB</span>
2028
+ </pre></div>
2029
+ </div>
2030
+ <p>Note that the shortest geodesic in the above example happens to be the
2031
+ core curve of the filled cusp (Cusp 0).</p>
2032
+ <p>Access just the length or word:</p>
2033
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">g</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
2034
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">g</span><span class="o">.</span><span class="n">length</span>
2035
+ <span class="go">0.93461379591349 + 2.70060614107722*I</span>
2036
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">g</span><span class="o">.</span><span class="n">word</span>
2037
+ <span class="go">&#39;a&#39;</span>
2038
+ </pre></div>
2039
+ </div>
2040
+ <p>The word is given with respect to the unsimplified fundamental group:</p>
2041
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">G</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">(</span><span class="n">simplify_presentation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
2042
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">G</span><span class="o">.</span><span class="n">complex_length</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">)</span>
2043
+ <span class="go">0.93461379591349 + 2.70060614107722*I</span>
2044
+ </pre></div>
2045
+ </div>
2046
+ <p>The method also supports higher precision:</p>
2047
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m003(-3,1)&quot;</span><span class="p">)</span>
2048
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">spec</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt_gen</span><span class="p">(</span><span class="n">bits_prec</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
2049
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span><span class="o">.</span><span class="n">length</span>
2050
+ <span class="go">0.58460368501798696932015666264 + 2.4953704555604684110903962008*I</span>
2051
+ </pre></div>
2052
+ </div>
2053
+ <p><strong>Performance</strong></p>
2054
+ <p>This method uses a different algorithm than
2055
+ <a class="reference internal" href="#snappy.Manifold.length_spectrum" title="snappy.Manifold.length_spectrum"><code class="xref py py-meth docutils literal notranslate"><span class="pre">length_spectrum</span></code></a>. In particular,
2056
+ it does not compute the Dirichlet domain. It also allows for
2057
+ <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computations</span></a>.
2058
+ It is implemented in python and thus
2059
+ typically slower than <a class="reference internal" href="#snappy.Manifold.length_spectrum" title="snappy.Manifold.length_spectrum"><code class="xref py py-meth docutils literal notranslate"><span class="pre">length_spectrum</span></code></a>.
2060
+ But there are also some cases where it is significantly faster. In
2061
+ particular, this applies to spun triangulations such as <code class="docutils literal notranslate"><span class="pre">m004(21,10)</span></code>.</p>
2062
+ <p>Here is example where we can help the algorithm by guessing and drilling
2063
+ and filling a short geodesic:</p>
2064
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;o9_00639&quot;</span><span class="p">)</span>
2065
+ </pre></div>
2066
+ </div>
2067
+ <p>Over an hour to compute:</p>
2068
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">high_precision</span><span class="p">()</span><span class="o">.</span><span class="n">length_spectrum</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span>
2069
+ <span class="go">mult length topology parity</span>
2070
+ <span class="go">1 0.00150226276052 - 2.39996262244127*I circle +</span>
2071
+ </pre></div>
2072
+ </div>
2073
+ <p>A couple of minutes to compute:</p>
2074
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">spec</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt_gen</span><span class="p">(</span><span class="n">bits_prec</span> <span class="o">=</span> <span class="mi">150</span><span class="p">)</span>
2075
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
2076
+ <span class="go">Length Word Core curve</span>
2077
+ <span class="go">0.00150226276052 - 2.39996262244127*I a -</span>
2078
+ </pre></div>
2079
+ </div>
2080
+ <p>After drilling and filling, less than a second to compute:</p>
2081
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">drill_word</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">)</span>
2082
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># N is now isometric to o9_00639 but as a surgery m125(0,0)(34,55)</span>
2083
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">spec</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">length_spectrum_alt_gen</span><span class="p">()</span>
2084
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
2085
+ <span class="go">Length Core curve Word</span>
2086
+ <span class="go">0.00150226276073 - 2.39996262244128*I Cusp 1 cDcDDcDcDDcDDcDcDDcDcDDcDDcDcDDcDD</span>
2087
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span><span class="o">.</span><span class="n">length</span><span class="o">.</span><span class="n">real</span><span class="p">()</span>
2088
+ <span class="go">0.96218768626877</span>
2089
+ </pre></div>
2090
+ </div>
2091
+ <p><strong>Verified computations</strong></p>
2092
+ <p>The method also supports <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computations</span></a>:</p>
2093
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m019&quot;</span><span class="p">)</span>
2094
+ <span class="n">sage</span><span class="p">:</span> <span class="n">spec</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">length_spectrum_alt_gen</span><span class="p">(</span><span class="n">verified</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">bits_prec</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
2095
+ <span class="n">sage</span><span class="p">:</span> <span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
2096
+ <span class="n">Length</span> <span class="n">Core</span> <span class="n">curve</span> <span class="n">Word</span>
2097
+ <span class="mf">0.43153441294719</span><span class="o">...</span> <span class="o">+</span> <span class="mf">2.35105908147863</span><span class="o">...*</span><span class="n">I</span> <span class="o">-</span> <span class="n">a</span>
2098
+ <span class="n">sage</span><span class="p">:</span> <span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
2099
+ <span class="mf">0.88944299721255</span><span class="o">...</span> <span class="o">-</span> <span class="mf">2.94185904702273</span><span class="o">...*</span><span class="n">I</span> <span class="o">-</span> <span class="n">bD</span>
2100
+ </pre></div>
2101
+ </div>
2102
+ <p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code> is passed, the algorithm guarantees that the lower
2103
+ bound of the real length is (non-strictly) increasing. In particular, we know
2104
+ that we have found all geodesics less than the following length:</p>
2105
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="nb">next</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span><span class="o">.</span><span class="n">length</span><span class="o">.</span><span class="n">real</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="c1"># doctest: +NUMERIC12</span>
2106
+ <span class="mf">0.94135129037387168886341739832</span>
2107
+ </pre></div>
2108
+ </div>
2109
+ <p>To illustrate some pitfalls, here is an example of a potential a result
2110
+ of the method:</p>
2111
+ <table class="docutils align-default">
2112
+ <thead>
2113
+ <tr class="row-odd"><th class="head"><p>Real length interval</p></th>
2114
+ <th class="head"><p>Word</p></th>
2115
+ </tr>
2116
+ </thead>
2117
+ <tbody>
2118
+ <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">[1.0,</span> <span class="pre">2.0]</span></code></p></td>
2119
+ <td><p><code class="docutils literal notranslate"><span class="pre">a</span></code></p></td>
2120
+ </tr>
2121
+ <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">[1.2,</span> <span class="pre">1.3]</span></code></p></td>
2122
+ <td><p><code class="docutils literal notranslate"><span class="pre">b</span></code></p></td>
2123
+ </tr>
2124
+ <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">[1.7,</span> <span class="pre">1.8]</span></code></p></td>
2125
+ <td><p><code class="docutils literal notranslate"><span class="pre">c</span></code></p></td>
2126
+ </tr>
2127
+ <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">[3.0,</span> <span class="pre">4.0]</span></code></p></td>
2128
+ <td><p><code class="docutils literal notranslate"><span class="pre">d</span></code></p></td>
2129
+ </tr>
2130
+ </tbody>
2131
+ </table>
2132
+ <p>Note that we cannot say whether geodesic <code class="docutils literal notranslate"><span class="pre">a</span></code> is actually the first,
2133
+ second or third shortest geodesic or tied with <code class="docutils literal notranslate"><span class="pre">b</span></code> or <code class="docutils literal notranslate"><span class="pre">c</span></code>. Increasing
2134
+ precision can change (representative words and) the order in which the
2135
+ geodesics are emitted.</p>
2136
+ <p>We can say that together <code class="docutils literal notranslate"><span class="pre">a</span></code>, <code class="docutils literal notranslate"><span class="pre">b</span></code> and <code class="docutils literal notranslate"><span class="pre">c</span></code> are the three shortest
2137
+ geodesics. Furthermore, we can also say that the systole
2138
+ of the manifold is in <code class="docutils literal notranslate"><span class="pre">[1.0,</span> <span class="pre">2.0]</span></code> even though <code class="docutils literal notranslate"><span class="pre">a</span></code> itself might not be
2139
+ the shortest geodesic. The latter is true in general:</p>
2140
+ <p><strong>Verified systole</strong></p>
2141
+ <p>It is not necessarily true that the first geodesic returned
2142
+ by the method is the shortest geodesic. Despite this, the interval for
2143
+ the real length of the first geodesic always contains the systole of
2144
+ the manifold:</p>
2145
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M = Manifold(&quot;m004&quot;)
2146
+ sage: spec = M.length_spectrum_alt_gen(verified=True)
2147
+ sage: g = next(spec) # g might or might not be shortest geodesic
2148
+ sage: systole = g.length.real() # But interval is large enough to contain systole
2149
+ sage: systole # doctest: +NUMERIC6
2150
+ 1.08707015?
2151
+ </pre></div>
2152
+ </div>
2153
+ <dl class="field-list simple">
2154
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
2155
+ <dd class="field-odd"><ul class="simple">
2156
+ <li><p><strong>bits_prec</strong> – Precision used for the computation. Increase if computation did
2157
+ not succeed.</p></li>
2158
+ <li><p><strong>verified</strong> – Use <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified computation</span></a>.</p></li>
2159
+ </ul>
2160
+ </dd>
2161
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
2162
+ <dd class="field-even"><p>A generator to enumerate the geodesics such that the (lower bound
2163
+ of the) real length is non-decreasing.</p>
2164
+ </dd>
2165
+ </dl>
2166
+ </dd></dl>
2167
+
2168
+ <dl class="py method">
2169
+ <dt class="sig sig-object py" id="snappy.Manifold.link">
2170
+ <span class="sig-name descname"><span class="pre">link</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.link" title="Link to this definition"></a></dt>
2171
+ <dd><p>If the manifold is stored as a link complement in your
2172
+ current session then it returns the number of components
2173
+ and crossing of the link. To view and interact with the
2174
+ link see <a class="reference internal" href="spherogram.html#spherogram.Link.view" title="spherogram.Link.view"><code class="xref py py-meth docutils literal notranslate"><span class="pre">spherogram.Link.view()</span></code></a>
2175
+ and <a class="reference internal" href="triangulation.html#snappy.Triangulation.plink" title="snappy.Triangulation.plink"><code class="xref py py-meth docutils literal notranslate"><span class="pre">plink</span></code></a>.</p>
2176
+ </dd></dl>
2177
+
2178
+ <dl class="py method">
2179
+ <dt class="sig sig-object py" id="snappy.Manifold.name">
2180
+ <span class="sig-name descname"><span class="pre">name</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">str</span></span></span><a class="headerlink" href="#snappy.Manifold.name" title="Link to this definition"></a></dt>
2181
+ <dd><p>Return the name of the triangulation.</p>
2182
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;4_1&#39;</span><span class="p">)</span>
2183
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">name</span><span class="p">()</span>
2184
+ <span class="go">&#39;4_1&#39;</span>
2185
+ </pre></div>
2186
+ </div>
2187
+ </dd></dl>
2188
+
2189
+ <dl class="py method">
2190
+ <dt class="sig sig-object py" id="snappy.Manifold.normal_boundary_slopes">
2191
+ <span class="sig-name descname"><span class="pre">normal_boundary_slopes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">subset</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'all'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">algorithm</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'FXrays'</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.normal_boundary_slopes" title="Link to this definition"></a></dt>
2192
+ <dd><p>For a one-cusped manifold, returns all the nonempty boundary slopes of
2193
+ spun normal surfaces. Provided the triangulation supports a
2194
+ genuine hyperbolic structure, then by <a class="reference external" href="http://arxiv.org/abs/math/0503027">Thurston and Walsh</a> any strict boundary slope
2195
+ (the boundary of an essential surface which is not a fiber or
2196
+ semifiber) must be listed here.</p>
2197
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;K3_1&#39;</span><span class="p">)</span>
2198
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">normal_boundary_slopes</span><span class="p">()</span>
2199
+ <span class="go">[(16, -1), (20, -1), (37, -2)]</span>
2200
+ </pre></div>
2201
+ </div>
2202
+ <p>If the <code class="docutils literal notranslate"><span class="pre">subset</span></code> flag is set to <code class="docutils literal notranslate"><span class="pre">'kabaya'</span></code>, then it only
2203
+ returns boundary slopes associated to vertex surfaces with a quad
2204
+ in every tetrahedron; by Theorem 1.1. of
2205
+ <a class="reference external" href="http://arxiv.org/abs/1102.4588">Dunfield and Garoufalidis ‘12</a>
2206
+ these are all strict boundary slopes.</p>
2207
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m113&#39;</span><span class="p">)</span>
2208
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">normal_boundary_slopes</span><span class="p">()</span>
2209
+ <span class="go">[(1, 1), (1, 2), (2, -1), (2, 3), (8, 11)]</span>
2210
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">normal_boundary_slopes</span><span class="p">(</span><span class="s1">&#39;kabaya&#39;</span><span class="p">)</span>
2211
+ <span class="go">[(8, 11)]</span>
2212
+ </pre></div>
2213
+ </div>
2214
+ <p>If the <code class="docutils literal notranslate"><span class="pre">subset</span></code> flag is set to <code class="docutils literal notranslate"><span class="pre">'brasile'</span></code> then it returns
2215
+ only the boundary slopes that are associated to vertex surfaces
2216
+ giving isolated rays in the space of embedded normal surfaces.</p>
2217
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">normal_boundary_slopes</span><span class="p">(</span><span class="s1">&#39;brasile&#39;</span><span class="p">)</span>
2218
+ <span class="go">[(1, 2), (8, 11)]</span>
2219
+ </pre></div>
2220
+ </div>
2221
+ </dd></dl>
2222
+
2223
+ <dl class="py method">
2224
+ <dt class="sig sig-object py" id="snappy.Manifold.normal_surfaces">
2225
+ <span class="sig-name descname"><span class="pre">normal_surfaces</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">algorithm</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'FXrays'</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.normal_surfaces" title="Link to this definition"></a></dt>
2226
+ <dd><p>All the vertex spun-normal surfaces in the current triangulation.</p>
2227
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
2228
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">normal_surfaces</span><span class="p">()</span>
2229
+ <span class="go">[&lt;Surface 0: [0, 0] [1, 2] (4, 1)&gt;,</span>
2230
+ <span class="go"> &lt;Surface 1: [0, 1] [1, 2] (4, -1)&gt;,</span>
2231
+ <span class="go"> &lt;Surface 2: [1, 2] [2, 1] (-4, -1)&gt;,</span>
2232
+ <span class="go"> &lt;Surface 3: [2, 2] [2, 1] (-4, 1)&gt;]</span>
2233
+ </pre></div>
2234
+ </div>
2235
+ </dd></dl>
2236
+
2237
+ <dl class="py method">
2238
+ <dt class="sig sig-object py" id="snappy.Manifold.num_cusps">
2239
+ <span class="sig-name descname"><span class="pre">num_cusps</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cusp_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'all'</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">int</span></span></span><a class="headerlink" href="#snappy.Manifold.num_cusps" title="Link to this definition"></a></dt>
2240
+ <dd><p>Return the total number of cusps. By giving the optional argument
2241
+ ‘orientable’ or ‘nonorientable’ it will only count cusps of that type.</p>
2242
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;m125&#39;</span><span class="p">)</span>
2243
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">num_cusps</span><span class="p">()</span>
2244
+ <span class="go">2</span>
2245
+ </pre></div>
2246
+ </div>
2247
+ </dd></dl>
2248
+
2249
+ <dl class="py method">
2250
+ <dt class="sig sig-object py" id="snappy.Manifold.num_tetrahedra">
2251
+ <span class="sig-name descname"><span class="pre">num_tetrahedra</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">int</span></span></span><a class="headerlink" href="#snappy.Manifold.num_tetrahedra" title="Link to this definition"></a></dt>
2252
+ <dd><p>Return the number of tetrahedra in the triangulation.</p>
2253
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
2254
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">num_tetrahedra</span><span class="p">()</span>
2255
+ <span class="go">2</span>
2256
+ </pre></div>
2257
+ </div>
2258
+ </dd></dl>
2259
+
2260
+ <dl class="py method">
2261
+ <dt class="sig sig-object py" id="snappy.Manifold.orientation_cover">
2262
+ <span class="sig-name descname"><span class="pre">orientation_cover</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.orientation_cover" title="Link to this definition"></a></dt>
2263
+ <dd><p>For a non-orientable Triangulation, returns the 2-fold cover which
2264
+ is orientable.</p>
2265
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">X</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;x123&#39;</span><span class="p">)</span>
2266
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">Y</span> <span class="o">=</span> <span class="n">X</span><span class="o">.</span><span class="n">orientation_cover</span><span class="p">()</span>
2267
+ <span class="gp">&gt;&gt;&gt; </span><span class="p">(</span><span class="n">X</span><span class="o">.</span><span class="n">is_orientable</span><span class="p">(),</span> <span class="n">Y</span><span class="o">.</span><span class="n">is_orientable</span><span class="p">())</span>
2268
+ <span class="go">(False, True)</span>
2269
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">Y</span>
2270
+ <span class="go">x123~(0,0)(0,0)</span>
2271
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">Y</span><span class="o">.</span><span class="n">cover_info</span><span class="p">()[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span>
2272
+ <span class="go">&#39;cyclic&#39;</span>
2273
+ </pre></div>
2274
+ </div>
2275
+ </dd></dl>
2276
+
2277
+ <dl class="py method">
2278
+ <dt class="sig sig-object py" id="snappy.Manifold.plink">
2279
+ <span class="sig-name descname"><span class="pre">plink</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.plink" title="Link to this definition"></a></dt>
2280
+ <dd><p>Brings up a link editor window if the manifold is stored
2281
+ as a link complement in your current session.</p>
2282
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;4_1&#39;</span><span class="p">)</span> <span class="c1"># stored as a triangulation with a link</span>
2283
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">link</span><span class="p">()</span>
2284
+ <span class="go">&lt;Link: 1 comp; 4 cross&gt;</span>
2285
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span> <span class="c1"># stored as a triangulation without a link</span>
2286
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">link</span><span class="p">()</span>
2287
+ <span class="gt">Traceback (most recent call last):</span>
2288
+ <span class="c">...</span>
2289
+ <span class="gr">ValueError</span>: <span class="n">No associated link known.</span>
2290
+ </pre></div>
2291
+ </div>
2292
+ </dd></dl>
2293
+
2294
+ <dl class="py method">
2295
+ <dt class="sig sig-object py" id="snappy.Manifold.polished_holonomy">
2296
+ <span class="sig-name descname"><span class="pre">polished_holonomy</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">100</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fundamental_group_args</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lift_to_SL2</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_solution_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dec_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">match_kernel</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.polished_holonomy" title="Link to this definition"></a></dt>
2297
+ <dd><p>Return the fundamental group of M equipped with a high-precision version of
2298
+ the holonomy representation:</p>
2299
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
2300
+ <span class="n">sage</span><span class="p">:</span> <span class="n">G</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">polished_holonomy</span><span class="p">()</span>
2301
+ <span class="n">sage</span><span class="p">:</span> <span class="n">G</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">trace</span><span class="p">()</span>
2302
+ <span class="mf">1.5000000000000000000000000000</span> <span class="o">-</span> <span class="mf">0.86602540378443864676372317075</span><span class="o">*</span><span class="n">I</span>
2303
+ <span class="n">sage</span><span class="p">:</span> <span class="n">G</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">polished_holonomy</span><span class="p">(</span><span class="n">bits_prec</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</span>
2304
+ <span class="n">sage</span><span class="p">:</span> <span class="n">G</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">trace</span><span class="p">()</span><span class="o">.</span><span class="n">parent</span><span class="p">()</span>
2305
+ <span class="n">Complex</span> <span class="n">Field</span> <span class="k">with</span> <span class="mi">1000</span> <span class="n">bits</span> <span class="n">of</span> <span class="n">precision</span>
2306
+ </pre></div>
2307
+ </div>
2308
+ </dd></dl>
2309
+
2310
+ <dl class="py method">
2311
+ <dt class="sig sig-object py" id="snappy.Manifold.ptolemy_generalized_obstruction_classes">
2312
+ <span class="sig-name descname"><span class="pre">ptolemy_generalized_obstruction_classes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">N</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.ptolemy_generalized_obstruction_classes" title="Link to this definition"></a></dt>
2313
+ <dd><p>Returns the obstruction classes needed to compute
2314
+ PGL(N,C)-representations for any N, i.e., it returns a list with
2315
+ a representative cocycle for each element in
2316
+ H^2(M, boundary M; Z/N) / (Z/N)^* where (Z/N)^* are the units in Z/N.
2317
+ The first element in the list always corresponds to the trivial
2318
+ obstruction class.
2319
+ The generalized ptolemy obstruction classes are thus a generalization
2320
+ of the ptolemy obstruction classes that allow to find all
2321
+ boundary-unipotent
2322
+ PGL(N,C)-representations including those that do not lift to
2323
+ boundary-unipotent SL(N,C)-representations for N odd or
2324
+ SL(N,C)/{+1,-1}-representations for N even.</p>
2325
+ <p>For example, 4_1 has three obstruction classes up to equivalence:</p>
2326
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;4_1&quot;</span><span class="p">)</span>
2327
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">c</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_generalized_obstruction_classes</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
2328
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">len</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
2329
+ <span class="go">3</span>
2330
+ </pre></div>
2331
+ </div>
2332
+ <p>For 4_1, we only get three obstruction classes even though we have
2333
+ H^2(M, boundary M; Z/4) = Z/4 because the two obstruction classes
2334
+ 1 in Z/4 and -1 in Z/4 are related by a unit and thus give
2335
+ isomorphic Ptolemy varieties.</p>
2336
+ <p>The primary use of an obstruction class sigma is to construct the
2337
+ Ptolemy variety of sigma. This variety computes boundary-unipotent
2338
+ PGL(N,C)-representations whose obstruction class to a
2339
+ boundary-unipotent lift to SL(N,C) is sigma.</p>
2340
+ <p>For example for 4_1, there are 2 obstruction classes for N = 3:</p>
2341
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;4_1&quot;</span><span class="p">)</span>
2342
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">c</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_generalized_obstruction_classes</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
2343
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">len</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
2344
+ <span class="go">2</span>
2345
+ </pre></div>
2346
+ </div>
2347
+ <p>The Ptolemy variety parametrizing boundary-unipotent
2348
+ SL(3,C)-representations of 4_1 is obtained by</p>
2349
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="n">N</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
2350
+ </pre></div>
2351
+ </div>
2352
+ <p>and the Ptolemy variety parametrizing boundary-unipotent
2353
+ PSL(3,C)-representations of 4_1 that do not lift to
2354
+ boundary-unipotent SL(3,C)-representations is obtained by</p>
2355
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="n">N</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
2356
+ </pre></div>
2357
+ </div>
2358
+ <p>The cocycle representing the non-trivial obstruction class looks as
2359
+ follows:</p>
2360
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
2361
+ <span class="go">PtolemyGeneralizedObstructionClass([2, 0, 0, 1])</span>
2362
+ </pre></div>
2363
+ </div>
2364
+ <p>This means that the cocycle takes the value -1 in Z/3 on the first face
2365
+ class and 1 on the fourth face class but zero on every other of the
2366
+ four face classes.</p>
2367
+ </dd></dl>
2368
+
2369
+ <dl class="py method">
2370
+ <dt class="sig sig-object py" id="snappy.Manifold.ptolemy_obstruction_classes">
2371
+ <span class="sig-name descname"><span class="pre">ptolemy_obstruction_classes</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.ptolemy_obstruction_classes" title="Link to this definition"></a></dt>
2372
+ <dd><p>Returns the obstruction classes needed to compute
2373
+ pSL(N,C) = SL(N,C)/{+1,-1} representations for even N, i.e., it
2374
+ returns a list with a representative cocycle for each class in
2375
+ H^2(M, boundary M; Z/2). The first element in the list is always
2376
+ representing the trivial obstruction class.</p>
2377
+ <p>For example, 4_1 has two obstruction classes:</p>
2378
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;4_1&quot;</span><span class="p">)</span>
2379
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">c</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_obstruction_classes</span><span class="p">()</span>
2380
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">len</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
2381
+ <span class="go">2</span>
2382
+ </pre></div>
2383
+ </div>
2384
+ <p>The primary use of these obstruction classes is to construct
2385
+ the Ptolemy variety as described in Definition 1.7 of
2386
+ Stavros Garoufalidis, Dylan Thurston, Christian K. Zickert:
2387
+ “The Complex Volume of SL(n,C)-Representations of 3-Manifolds”
2388
+ (<a class="reference external" href="http://arxiv.org/abs/1111.2828">http://arxiv.org/abs/1111.2828</a>).</p>
2389
+ <p>For example, to construct the Ptolemy variety for
2390
+ PSL(2,C)-representations of 4_1 that do not lift to boundary-parabolic
2391
+ SL(2,C)-representations, use:</p>
2392
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="n">N</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
2393
+ </pre></div>
2394
+ </div>
2395
+ <p>Or the following short-cut:</p>
2396
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="mi">1</span><span class="p">)</span>
2397
+ </pre></div>
2398
+ </div>
2399
+ <p>Note that this obstruction class only makes sense for even N:</p>
2400
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
2401
+ <span class="gt">Traceback (most recent call last):</span>
2402
+ <span class="c">...</span>
2403
+ <span class="gr">AssertionError</span>: <span class="n">PtolemyObstructionClass only makes sense for even N, try PtolemyGeneralizedObstructionClass</span>
2404
+ </pre></div>
2405
+ </div>
2406
+ <p>To obtain PGL(N,C)-representations for N &gt; 2, use the generalized
2407
+ obstruction class:</p>
2408
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">c</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_generalized_obstruction_classes</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
2409
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
2410
+ </pre></div>
2411
+ </div>
2412
+ <p>The original obstruction class encodes a representing cocycle in Z/2 as follows:</p>
2413
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">c</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_obstruction_classes</span><span class="p">()</span>
2414
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
2415
+ <span class="go">PtolemyObstructionClass(s_0_0 + 1, s_1_0 - 1, s_2_0 - 1, s_3_0 + 1, s_0_0 - s_0_1, s_1_0 - s_3_1, s_2_0 - s_2_1, s_3_0 - s_1_1)</span>
2416
+ </pre></div>
2417
+ </div>
2418
+ <p>This means that the cocycle to represent this obstruction class in Z/2
2419
+ takes value 1 in Z/2 on face 0 of tetrahedra 0 (because s_0_0 = -1)
2420
+ and value 0 in Z/2 on face 1 of tetrahedra 0 (because s_1_0 = +1).</p>
2421
+ <p>Face 3 of tetrahedra 0 and face 1 of tetrahedra 1 are identified,
2422
+ hence the cocycle takes the same value on those two faces (s_3_0 = s_1_1).</p>
2423
+ </dd></dl>
2424
+
2425
+ <dl class="py method">
2426
+ <dt class="sig sig-object py" id="snappy.Manifold.ptolemy_variety">
2427
+ <span class="sig-name descname"><span class="pre">ptolemy_variety</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">N</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">obstruction_class</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">simplify</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">eliminate_fixed_ptolemys</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.ptolemy_variety" title="Link to this definition"></a></dt>
2428
+ <dd><p>Returns a Ptolemy variety as described in</p>
2429
+ <ul class="simple">
2430
+ <li><p>Stavros Garoufalidis, Dyland Thurston, Christian K. Zickert:
2431
+ “The Complex Volume of SL(n,C)-Representations of 3-Manifolds”
2432
+ (<a class="reference external" href="http://arxiv.org/abs/1111.2828">http://arxiv.org/abs/1111.2828</a>)</p></li>
2433
+ <li><p>Stavros Garoufalidis, Matthias Goerner, Christian K. Zickert:
2434
+ “Gluing Equations for PGL(n,C)-Representations of 3-Manifolds ”
2435
+ (<a class="reference external" href="http://arxiv.org/abs/1207.6711">http://arxiv.org/abs/1207.6711</a>)</p></li>
2436
+ </ul>
2437
+ <p>The variety can be exported to magma or sage and solved there. The
2438
+ solutions can be processed to compute invariants. The method can also
2439
+ be used to automatically look up precomputed solutions from the
2440
+ database at <a class="reference external" href="http://ptolemy.unhyperbolic.org/data">http://ptolemy.unhyperbolic.org/data</a> .</p>
2441
+ <p>Example for m011 and PSL(2,C)-representations:</p>
2442
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;m011&quot;</span><span class="p">)</span>
2443
+ </pre></div>
2444
+ </div>
2445
+ <p>Obtain all Ptolemy varieties for PSL(2,C)-representations:</p>
2446
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="s1">&#39;all&#39;</span><span class="p">)</span>
2447
+ </pre></div>
2448
+ </div>
2449
+ <p>There are two Ptolemy varieties for the two obstruction classes:</p>
2450
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="nb">len</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
2451
+ <span class="go">2</span>
2452
+ </pre></div>
2453
+ </div>
2454
+ <p>Retrieve the solutions from the database</p>
2455
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">sols</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">retrieve_solutions</span><span class="p">()</span>
2456
+ </pre></div>
2457
+ </div>
2458
+ <p>Compute the solutions using magma (default in SnapPy)</p>
2459
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">sols</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">compute_solutions</span><span class="p">(</span><span class="n">engine</span> <span class="o">=</span> <span class="s1">&#39;magma&#39;</span><span class="p">)</span>
2460
+ </pre></div>
2461
+ </div>
2462
+ <p>Compute the solutions using singular (default in sage)</p>
2463
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">sols</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">compute_solutions</span><span class="p">(</span><span class="n">engine</span> <span class="o">=</span> <span class="s1">&#39;sage&#39;</span><span class="p">)</span>
2464
+ </pre></div>
2465
+ </div>
2466
+ <p>Note that magma is significantly faster.</p>
2467
+ <p>Compute all resulting complex volumes</p>
2468
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">cvols</span> <span class="o">=</span> <span class="n">sols</span><span class="o">.</span><span class="n">complex_volume_numerical</span><span class="p">()</span>
2469
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">cvols</span>
2470
+ <span class="go">[[[-4.29405713186238 E-16 + 0.725471193740844*I,</span>
2471
+ <span class="go"> -0.942707362776931 + 0.459731436553693*I,</span>
2472
+ <span class="go"> 0.942707362776931 + 0.459731436553693*I]],</span>
2473
+ <span class="go"> [[3.94159248086745 E-15 + 0.312682687518267*I,</span>
2474
+ <span class="go"> 4.64549527022581 E-15 + 0.680993020093457*I,</span>
2475
+ <span class="go"> -2.78183391239608 - 0.496837853805869*I,</span>
2476
+ <span class="go"> 2.78183391239608 - 0.496837853805869*I]]]</span>
2477
+ </pre></div>
2478
+ </div>
2479
+ <p>Show complex volumes as a non-nested list:</p>
2480
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">cvols</span><span class="o">.</span><span class="n">flatten</span><span class="p">(</span><span class="n">depth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
2481
+ <span class="go">[-4.29405713186238 E-16 + 0.725471193740844*I,</span>
2482
+ <span class="go"> -0.942707362776931 + 0.459731436553693*I,</span>
2483
+ <span class="go"> 0.942707362776931 + 0.459731436553693*I,</span>
2484
+ <span class="go"> 3.94159248086745 E-15 + 0.312682687518267*I,</span>
2485
+ <span class="go"> 4.64549527022581 E-15 + 0.680993020093457*I,</span>
2486
+ <span class="go"> -2.78183391239608 - 0.496837853805869*I,</span>
2487
+ <span class="go"> 2.78183391239608 - 0.496837853805869*I]</span>
2488
+ </pre></div>
2489
+ </div>
2490
+ <p>For more examples, go to <a class="reference external" href="http://ptolemy.unhyperbolic.org/">http://ptolemy.unhyperbolic.org/</a></p>
2491
+ <p>=== Optional Arguments ===</p>
2492
+ <p>obstruction_class — class from Definition 1.7 of (1).
2493
+ None for trivial class or a value returned from ptolemy_obstruction_classes.
2494
+ Short cuts: obstruction_class = ‘all’ returns a list of Ptolemy varieties
2495
+ for each obstruction. For easier iteration, can set obstruction_class to
2496
+ an integer.</p>
2497
+ <p>simplify — boolean to indicate whether to simplify the equations which
2498
+ significantly reduces the number of variables.
2499
+ Simplifying means that several identified Ptolemy coordinates x = y = z = …
2500
+ are eliminated instead of adding relations x - y = 0, y - z = 0, …</p>
2501
+ <p>eliminate_fixed_ptolemys — boolean to indicate whether to eliminate
2502
+ the Ptolemy coordinates that are set to 1 for fixing the decoration.
2503
+ Even though this simplifies the resulting representation, setting it to
2504
+ True can cause magma to run longer when finding a Groebner basis.</p>
2505
+ <p>=== Examples for 4_1 ===</p>
2506
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;4_1&quot;</span><span class="p">)</span>
2507
+ </pre></div>
2508
+ </div>
2509
+ <p>Get the varieties for all obstruction classes at once (use
2510
+ help(varieties[0]) for more information):</p>
2511
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">varieties</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="s2">&quot;all&quot;</span><span class="p">)</span>
2512
+ </pre></div>
2513
+ </div>
2514
+ <p>Print the variety as an ideal (sage object) for the non-trivial class:</p>
2515
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">varieties</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">ideal</span>
2516
+ <span class="go">Ideal (-c_0011_0^2 + c_0011_0*c_0101_0 + c_0101_0^2, -c_0011_0^2 - c_0011_0*c_0101_0 + c_0101_0^2, c_0011_0 - 1) of Multivariate Polynomial Ring in c_0011_0, c_0101_0 over Rational Field</span>
2517
+ </pre></div>
2518
+ </div>
2519
+ <p>Print the equations of the variety for the non-trivial class:</p>
2520
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="k">for</span> <span class="n">eqn</span> <span class="ow">in</span> <span class="n">varieties</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">equations</span><span class="p">:</span>
2521
+ <span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">eqn</span><span class="p">)</span>
2522
+ <span class="go"> - c_0011_0 * c_0101_0 + c_0011_0^2 + c_0101_0^2</span>
2523
+ <span class="go"> c_0011_0 * c_0101_0 - c_0011_0^2 - c_0101_0^2</span>
2524
+ <span class="go"> - 1 + c_0011_0</span>
2525
+ </pre></div>
2526
+ </div>
2527
+ <p>Generate a magma file to compute Primary Decomposition for N = 3:</p>
2528
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">p</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
2529
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">s</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">to_magma</span><span class="p">()</span>
2530
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;ring and ideal&quot;</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
2531
+ <span class="go">R&lt;c_0012_0, c_0012_1, c_0102_0, c_0111_0, c_0201_0, c_1011_0, c_1011_1, c_1101_0&gt; := PolynomialRing(RationalField(), 8, &quot;grevlex&quot;);</span>
2532
+ <span class="go">MyIdeal := ideal&lt;R |</span>
2533
+ <span class="go"> c_0012_0 * c_1101_0 + c_0102_0 * c_0111_0 - c_0102_0 * c_1011_0,</span>
2534
+ <span class="go"> ...</span>
2535
+ </pre></div>
2536
+ </div>
2537
+ <p>=== If you have a magma installation ===</p>
2538
+ <p>Call p.compute_solutions() to automatically call magma on the above output
2539
+ and produce exact solutions!!!</p>
2540
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="k">try</span><span class="p">:</span>
2541
+ <span class="gp">... </span> <span class="n">sols</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">compute_solutions</span><span class="p">()</span>
2542
+ <span class="gp">... </span><span class="k">except</span><span class="p">:</span>
2543
+ <span class="gp">... </span> <span class="c1"># magma failed, use precomputed_solutions</span>
2544
+ <span class="gp">... </span> <span class="n">sols</span> <span class="o">=</span> <span class="kc">None</span>
2545
+ </pre></div>
2546
+ </div>
2547
+ <p>Check solutions against manifold
2548
+ &gt;&gt;&gt; if sols:
2549
+ … dummy = sols.check_against_manifold()</p>
2550
+ <p>=== If you do not have a magma installation ===</p>
2551
+ <p>Load a precomputed example from magma which is provided with the package:</p>
2552
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">snappy.ptolemy.processMagmaFile</span> <span class="kn">import</span> <span class="n">_magma_output_for_4_1__sl3</span><span class="p">,</span> <span class="n">solutions_from_magma</span>
2553
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">_magma_output_for_4_1__sl3</span><span class="p">)</span>
2554
+
2555
+ <span class="go">==TRIANGULATION=BEGINS==</span>
2556
+ <span class="go">% Triangulation</span>
2557
+ <span class="go">4_1</span>
2558
+ <span class="go">...</span>
2559
+ </pre></div>
2560
+ </div>
2561
+ <p>Parse the file and produce solutions:</p>
2562
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">sols</span> <span class="o">=</span> <span class="n">solutions_from_magma</span><span class="p">(</span><span class="n">_magma_output_for_4_1__sl3</span><span class="p">)</span>
2563
+ </pre></div>
2564
+ </div>
2565
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">dummy</span> <span class="o">=</span> <span class="n">sols</span><span class="o">.</span><span class="n">check_against_manifold</span><span class="p">()</span>
2566
+ </pre></div>
2567
+ </div>
2568
+ <p>=== Continue here whether you have or do not have magma ===</p>
2569
+ <p>Pick the first solution of the three different solutions (up to Galois
2570
+ conjugates):</p>
2571
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="nb">len</span><span class="p">(</span><span class="n">sols</span><span class="p">)</span>
2572
+ <span class="go">3</span>
2573
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">solution</span> <span class="o">=</span> <span class="n">sols</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
2574
+ </pre></div>
2575
+ </div>
2576
+ <p>Read the exact value for c_1020_0 (help(solution) for more information
2577
+ on how to compute cross ratios, volumes and other invariants):</p>
2578
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">solution</span><span class="p">[</span><span class="s1">&#39;c_1020_0&#39;</span><span class="p">]</span>
2579
+ <span class="go">Mod(-1/2*x - 3/2, x^2 + 3*x + 4)</span>
2580
+ </pre></div>
2581
+ </div>
2582
+ <p>Example of simplified vs non-simplified variety for N = 4:</p>
2583
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">simplified</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="mi">1</span><span class="p">)</span>
2584
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">full</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">ptolemy_variety</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="n">obstruction_class</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">simplify</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span>
2585
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">len</span><span class="p">(</span><span class="n">simplified</span><span class="o">.</span><span class="n">variables</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">full</span><span class="o">.</span><span class="n">variables</span><span class="p">)</span>
2586
+ <span class="go">(21, 63)</span>
2587
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">len</span><span class="p">(</span><span class="n">simplified</span><span class="o">.</span><span class="n">equations</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">full</span><span class="o">.</span><span class="n">equations</span><span class="p">)</span>
2588
+ <span class="go">(24, 72)</span>
2589
+ </pre></div>
2590
+ </div>
2591
+ </dd></dl>
2592
+
2593
+ <dl class="py method">
2594
+ <dt class="sig sig-object py" id="snappy.Manifold.randomize">
2595
+ <span class="sig-name descname"><span class="pre">randomize</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">blowup_multiple</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">4</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">passes_at_fours</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">6</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.randomize" title="Link to this definition"></a></dt>
2596
+ <dd><p>Perform random Pachner moves on the underlying triangulation,
2597
+ including some initial 3 -&gt; 2 moves that increase the number of
2598
+ tetrahedra by blowup_multiple.</p>
2599
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;Braid:[1,2,-3,-3,1,2]&#39;</span><span class="p">)</span>
2600
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">randomize</span><span class="p">()</span>
2601
+ </pre></div>
2602
+ </div>
2603
+ </dd></dl>
2604
+
2605
+ <dl class="py method">
2606
+ <dt class="sig sig-object py" id="snappy.Manifold.reverse_orientation">
2607
+ <span class="sig-name descname"><span class="pre">reverse_orientation</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#snappy.Manifold.reverse_orientation" title="Link to this definition"></a></dt>
2608
+ <dd><p>Reverses the orientation of the Triangulation, presuming that
2609
+ it is orientable.</p>
2610
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m015&#39;</span><span class="p">)</span>
2611
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">cs</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">()</span>
2612
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">reverse_orientation</span><span class="p">()</span>
2613
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">abs</span><span class="p">(</span><span class="n">cs</span> <span class="o">+</span> <span class="n">M</span><span class="o">.</span><span class="n">chern_simons</span><span class="p">())</span>
2614
+ <span class="go">0.0</span>
2615
+ </pre></div>
2616
+ </div>
2617
+ </dd></dl>
2618
+
2619
+ <dl class="py method">
2620
+ <dt class="sig sig-object py" id="snappy.Manifold.save">
2621
+ <span class="sig-name descname"><span class="pre">save</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">file_name</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.save" title="Link to this definition"></a></dt>
2622
+ <dd><p>Save the triangulation as a SnapPea triangulation file.</p>
2623
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
2624
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="s1">&#39;fig-eight.tri&#39;</span><span class="p">)</span>
2625
+ </pre></div>
2626
+ </div>
2627
+ <p>To retrieve a SnapPea triangulation from the saved file
2628
+ you can do the following. The first command creates a cusped
2629
+ manifold M. The second one creates the filled manifold M1
2630
+ with Dehn coefficients (2,3).</p>
2631
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;fig-eight.tri&#39;</span><span class="p">)</span>
2632
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M1</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;fig-eight.tri(2,3)&#39;</span><span class="p">)</span>
2633
+ </pre></div>
2634
+ </div>
2635
+ </dd></dl>
2636
+
2637
+ <dl class="py method">
2638
+ <dt class="sig sig-object py" id="snappy.Manifold.set_name">
2639
+ <span class="sig-name descname"><span class="pre">set_name</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">new_name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#snappy.Manifold.set_name" title="Link to this definition"></a></dt>
2640
+ <dd><p>Give the triangulation a new name.</p>
2641
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;4_1&#39;</span><span class="p">)</span>
2642
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">set_name</span><span class="p">(</span><span class="s1">&#39;figure-eight-comp&#39;</span><span class="p">)</span>
2643
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span>
2644
+ <span class="go">figure-eight-comp(0,0)</span>
2645
+ </pre></div>
2646
+ </div>
2647
+ </dd></dl>
2648
+
2649
+ <dl class="py method">
2650
+ <dt class="sig sig-object py" id="snappy.Manifold.set_peripheral_curves">
2651
+ <span class="sig-name descname"><span class="pre">set_peripheral_curves</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">peripheral_data</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">which_cusp</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">return_matrices</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.set_peripheral_curves" title="Link to this definition"></a></dt>
2652
+ <dd><p>Each cusp has a preferred marking. In the case of a torus
2653
+ cusp, this is pair of essential simple curves meeting in one
2654
+ point; equivalently, a basis of the first homology of the
2655
+ boundary torus. These curves are called the meridian and the
2656
+ longitude.</p>
2657
+ <p>This method changes these markings in various ways. In many
2658
+ cases, if the flag return_matrices is True then it returns
2659
+ a list of change-of-basis matrices is returned, one per
2660
+ cusp, which will restore the original markings if passed
2661
+ as peripheral_data.</p>
2662
+ <ul>
2663
+ <li><p>Make the shortest curves the meridians, and the second
2664
+ shortest curves the longitudes.</p>
2665
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;5_2&#39;</span><span class="p">)</span>
2666
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="s1">&#39;shape&#39;</span><span class="p">)</span>
2667
+ <span class="go">[-2.49024467 + 2.97944707*I]</span>
2668
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">cob</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">set_peripheral_curves</span><span class="p">(</span><span class="s1">&#39;shortest&#39;</span><span class="p">,</span> <span class="n">return_matrices</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
2669
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="s1">&#39;shape&#39;</span><span class="p">)</span>
2670
+ <span class="go">[-0.49024467 + 2.97944707*I]</span>
2671
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">cob</span>
2672
+ <span class="go">[[[1, 0], [-2, 1]]]</span>
2673
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">set_peripheral_curves</span><span class="p">(</span><span class="n">cob</span><span class="p">)</span>
2674
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">cusp_info</span><span class="p">(</span><span class="s1">&#39;shape&#39;</span><span class="p">)</span>
2675
+ <span class="go">[-2.49024467 + 2.97944707*I]</span>
2676
+ </pre></div>
2677
+ </div>
2678
+ <p>You can also make just the meridians as short as
2679
+ possible while fixing the longitudes via the option
2680
+ ‘shortest_meridians’, and conversely with
2681
+ ‘shortest_longitudes’.</p>
2682
+ </li>
2683
+ <li><p>If cusps are Dehn filled, make those curves meridians.</p>
2684
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m125(0,0)(2,5)&#39;</span><span class="p">)</span>
2685
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">set_peripheral_curves</span><span class="p">(</span><span class="s1">&#39;fillings&#39;</span><span class="p">)</span>
2686
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span>
2687
+ <span class="go">m125(0,0)(1,0)</span>
2688
+ </pre></div>
2689
+ </div>
2690
+ </li>
2691
+ <li><p>Change the basis of a particular cusp, say the first one:</p>
2692
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">set_peripheral_curves</span><span class="p">(</span> <span class="p">[</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span> <span class="p">]</span> <span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
2693
+ </pre></div>
2694
+ </div>
2695
+ <p>Here (1,2) is the new meridian written in the old basis, and
2696
+ (1,3) the new longitude.</p>
2697
+ </li>
2698
+ <li><p>Change the basis of all the cusps at once</p>
2699
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">new_curves</span> <span class="o">=</span> <span class="p">[</span> <span class="p">[(</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">)],</span> <span class="p">[(</span><span class="mi">3</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">)]</span> <span class="p">]</span>
2700
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">set_peripheral_curves</span><span class="p">(</span><span class="n">new_curves</span><span class="p">)</span>
2701
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span>
2702
+ <span class="go">m125(0,0)(-1,-2)</span>
2703
+ </pre></div>
2704
+ </div>
2705
+ </li>
2706
+ </ul>
2707
+ </dd></dl>
2708
+
2709
+ <dl class="py method">
2710
+ <dt class="sig sig-object py" id="snappy.Manifold.set_target_holonomy">
2711
+ <span class="sig-name descname"><span class="pre">set_target_holonomy</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">target</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">which_cusp</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">recompute</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.set_target_holonomy" title="Link to this definition"></a></dt>
2712
+ <dd><p>Computes a geometric structure in which the Dehn filling curve
2713
+ on the specified cusp has holonomy equal to the target value.
2714
+ The holonomies of Dehn filling curves on other cusps are left
2715
+ unchanged. If the ‘recompute’ flag is False, the Dehn filling
2716
+ equations are modified, but not solved.</p>
2717
+ </dd></dl>
2718
+
2719
+ <dl class="py method">
2720
+ <dt class="sig sig-object py" id="snappy.Manifold.set_tetrahedra_shapes">
2721
+ <span class="sig-name descname"><span class="pre">set_tetrahedra_shapes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filled_shapes</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">complete_shapes</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fillings</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.set_tetrahedra_shapes" title="Link to this definition"></a></dt>
2722
+ <dd><p>Replaces the tetrahedron shapes with those in the given lists,
2723
+ and sets the Dehn filling coefficients as specified by the
2724
+ fillings argument. The shapes will get double precision
2725
+ values; polishing will be needed for high precision shapes.</p>
2726
+ </dd></dl>
2727
+
2728
+ <dl class="py method">
2729
+ <dt class="sig sig-object py" id="snappy.Manifold.short_slopes">
2730
+ <span class="sig-name descname"><span class="pre">short_slopes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">length</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">6</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">policy</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'unbiased'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">method</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">'maximal'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><span class="pre">None</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">first_cusps</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">List</span><span class="p"><span class="pre">[</span></span><span class="pre">int</span><span class="p"><span class="pre">]</span></span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">[]</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.short_slopes" title="Link to this definition"></a></dt>
2731
+ <dd><p>Returns a list of short slopes (for Dehn-fillings) for each cusp.</p>
2732
+ <p>That is, the method uses <a class="reference internal" href="#snappy.Manifold.cusp_areas" title="snappy.Manifold.cusp_areas"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_areas()</span></code></a> to find
2733
+ (maximal) embedded and disjoint cusp neighborhoods. It uses the boundaries
2734
+ of these cusp neighborhoods to measure the length of a peripheral curve.
2735
+ For each cusp, it determines all simple peripheral curves shorter than
2736
+ the given <code class="xref py py-attr docutils literal notranslate"><span class="pre">length</span></code> (which defaults to 6). The result is a list
2737
+ of the corresponding slopes for each cusp:</p>
2738
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;otet20_00022&quot;</span><span class="p">)</span>
2739
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">short_slopes</span><span class="p">()</span>
2740
+ <span class="go">[[(1, 0), (-1, 1), (0, 1)], [(1, 0)]]</span>
2741
+ </pre></div>
2742
+ </div>
2743
+ <p>It takes the same arguments as <a class="reference internal" href="#snappy.Manifold.cusp_areas" title="snappy.Manifold.cusp_areas"><code class="xref py py-meth docutils literal notranslate"><span class="pre">cusp_areas()</span></code></a>:</p>
2744
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">short_slopes</span><span class="p">(</span><span class="n">policy</span> <span class="o">=</span> <span class="s1">&#39;greedy&#39;</span><span class="p">)</span>
2745
+ <span class="go">[[(1, 0)], [(1, 0)]]</span>
2746
+ </pre></div>
2747
+ </div>
2748
+ <p>The ten exceptional slopes of the figure-eight knot:</p>
2749
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;4_1&quot;</span><span class="p">)</span>
2750
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">short_slopes</span><span class="p">()</span>
2751
+ <span class="go">[[(1, 0), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]</span>
2752
+ </pre></div>
2753
+ </div>
2754
+ <p>Two more slopes appear when increasing length to <span class="math notranslate nohighlight">\(2\pi\)</span>:</p>
2755
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">short_slopes</span><span class="p">(</span><span class="n">length</span> <span class="o">=</span> <span class="mf">6.283185307179586</span><span class="p">)</span>
2756
+ <span class="go">[[(1, 0), (-5, 1), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]]</span>
2757
+ </pre></div>
2758
+ </div>
2759
+ <p><strong>Verified computation</strong></p>
2760
+ <p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">False</span></code>, floating-point issues can arise resulting in
2761
+ incorrect values. The method can be made
2762
+ <a class="reference internal" href="verify.html#verify-primer"><span class="std std-ref">verified</span></a> by passing <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
2763
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;4_1&quot;</span><span class="p">)</span>
2764
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">short_slopes</span><span class="p">(</span><span class="n">verified</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
2765
+ <span class="p">[[(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]]</span>
2766
+ </pre></div>
2767
+ </div>
2768
+ <p>If <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>, the result is guaranteed to contain all short
2769
+ slopes and might contain additional slopes (with lengths slightly longer
2770
+ than the given <code class="xref py py-attr docutils literal notranslate"><span class="pre">length</span></code> but this could not be proven using the
2771
+ interval estimates).</p>
2772
+ <p>The given <code class="xref py py-attr docutils literal notranslate"><span class="pre">length</span></code> is cast to a SageMath <code class="docutils literal notranslate"><span class="pre">RealIntervalField</span></code> of the
2773
+ given precision if <code class="xref py py-attr docutils literal notranslate"><span class="pre">verified</span> <span class="pre">=</span> <span class="pre">True</span></code>:</p>
2774
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">sage.all</span> <span class="kn">import</span> <span class="n">pi</span>
2775
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">short_slopes</span><span class="p">(</span><span class="n">length</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">pi</span><span class="p">,</span> <span class="n">verified</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">bits_prec</span> <span class="o">=</span> <span class="mi">100</span><span class="p">)</span>
2776
+ <span class="p">[[(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]]</span>
2777
+ </pre></div>
2778
+ </div>
2779
+ </dd></dl>
2780
+
2781
+ <dl class="py method">
2782
+ <dt class="sig sig-object py" id="snappy.Manifold.simplify">
2783
+ <span class="sig-name descname"><span class="pre">simplify</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">passes_at_fours</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">6</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.simplify" title="Link to this definition"></a></dt>
2784
+ <dd><p>Try to simplify the triangulation by doing Pachner moves.</p>
2785
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;12n123&#39;</span><span class="p">)</span>
2786
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">simplify</span><span class="p">()</span>
2787
+ </pre></div>
2788
+ </div>
2789
+ <p>It does four kinds of moves that reduce the number of
2790
+ tetrahedra:</p>
2791
+ <ul class="simple">
2792
+ <li><p>3 -&gt; 2 and 2 -&gt; 0 Pacher moves, which eliminate one or two
2793
+ tetrahedra respectively.</p></li>
2794
+ <li><p>On suitable valence-1 edges, does a 2 -&gt; 3 and then 2 -&gt; 0 move,
2795
+ which removes a tetrahedron and creates a new valence-1 edge.</p></li>
2796
+ <li><p>When a 2-simplex has two edges of valence-4 giving rise to the
2797
+ suspension of a pentagon, replace these 6 tetrahedra with a
2798
+ single edge of valence 5.</p></li>
2799
+ </ul>
2800
+ <p>It also does random 4 -&gt; 4 moves in hopes of setting up a
2801
+ simplfication. The argument passes_at_fours is the number of
2802
+ times it goes through the valence-4 edges without progress
2803
+ before giving up.</p>
2804
+ </dd></dl>
2805
+
2806
+ <dl class="py method">
2807
+ <dt class="sig sig-object py" id="snappy.Manifold.slice_obstruction_HKL">
2808
+ <span class="sig-name descname"><span class="pre">slice_obstruction_HKL</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">primes_spec</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">check_in_S3</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.slice_obstruction_HKL" title="Link to this definition"></a></dt>
2809
+ <dd><p>For the exterior of a knot in S^3, searches for a topological
2810
+ slicing obstruction from:</p>
2811
+ <p>Herald, Kirk, Livingston, Math Zeit., 2010
2812
+ <a class="reference external" href="https://dx.doi.org/10.1007/s00209-009-0548-1">https://dx.doi.org/10.1007/s00209-009-0548-1</a>
2813
+ <a class="reference external" href="https://arxiv.org/abs/0804.1355">https://arxiv.org/abs/0804.1355</a></p>
2814
+ <p>The test looks at the cyclic branched covers of the knot of prime
2815
+ order p and the F_q homology thereof where q is an odd prime. The
2816
+ range of such (p, q) pairs searched is given by primes_spec as a
2817
+ list of (p_max, [q_min, q_max]). It returns the pair (p, q) of
2818
+ the first nonzero obstruction found (in which case K is not
2819
+ slice), and otherwise returns None:</p>
2820
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;K12n813&#39;</span><span class="p">)</span>
2821
+ <span class="n">sage</span><span class="p">:</span> <span class="n">spec</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">10</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">20</span><span class="p">]),</span> <span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">])]</span>
2822
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">slice_obstruction_HKL</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
2823
+ <span class="n">Looking</span> <span class="n">at</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">...</span>
2824
+ <span class="n">Looking</span> <span class="n">at</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span> <span class="o">...</span>
2825
+ <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span>
2826
+ </pre></div>
2827
+ </div>
2828
+ <p>You can also specify the p to examine by a range [p_min, p_max] or
2829
+ the q by just q_max:</p>
2830
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">spec</span> <span class="o">=</span> <span class="p">[([</span><span class="mi">3</span><span class="p">,</span> <span class="mi">10</span><span class="p">],</span> <span class="mi">10</span><span class="p">)]</span>
2831
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">slice_obstruction_HKL</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
2832
+ <span class="n">Looking</span> <span class="n">at</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span> <span class="o">...</span>
2833
+ <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span>
2834
+ </pre></div>
2835
+ </div>
2836
+ <p>If primes_spec is just a pair (p, q) then only that obstruction is
2837
+ checked:</p>
2838
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">slice_obstruction_HKL</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
2839
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">slice_obstruction_HKL</span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">))</span>
2840
+ <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span>
2841
+ </pre></div>
2842
+ </div>
2843
+ <p>Technical note: As implemented, can only get an obstruction when
2844
+ the decomposition of H_1(cover; F_q) into irreducible Z/pZ-modules
2845
+ has no repeat factors. The method of [HKL] can be used more
2846
+ broadly, but other cases requires computing many more twisted
2847
+ Alexander polynomials.</p>
2848
+ </dd></dl>
2849
+
2850
+ <dl class="py method">
2851
+ <dt class="sig sig-object py" id="snappy.Manifold.solution_type">
2852
+ <span class="sig-name descname"><span class="pre">solution_type</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">enum</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.solution_type" title="Link to this definition"></a></dt>
2853
+ <dd><p>Returns the type of the current solution to the gluing
2854
+ equations, basically a summary of how degenerate the solution
2855
+ is. If the flag enum=True is set, then an integer value is
2856
+ returned. The possible answers are:</p>
2857
+ <ul class="simple">
2858
+ <li><p>0: ‘not attempted’</p></li>
2859
+ <li><p>1: ‘all tetrahedra positively oriented’ aka ‘geometric_solution’
2860
+ Should correspond to a genuine hyperbolic structure.</p></li>
2861
+ <li><p>2: ‘contains negatively oriented tetrahedra’ aka ‘nongeometric_solution’
2862
+ Probably corresponds to a hyperbolic structure but some
2863
+ simplices have reversed orientations.</p></li>
2864
+ <li><p>3: ‘contains flat tetrahedra’ All tetrahedra have shape in R - {0, 1}.</p></li>
2865
+ <li><p>4: ‘contains degenerate tetrahedra’ Some shapes are close to
2866
+ {0,1, or infinity}.</p></li>
2867
+ <li><p>5: ‘unrecognized solution type’</p></li>
2868
+ <li><p>6: ‘no solution found’</p></li>
2869
+ </ul>
2870
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m007&#39;</span><span class="p">)</span>
2871
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">solution_type</span><span class="p">()</span>
2872
+ <span class="go">&#39;all tetrahedra positively oriented&#39;</span>
2873
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">(</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span> <span class="p">)</span>
2874
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">solution_type</span><span class="p">()</span>
2875
+ <span class="go">&#39;contains negatively oriented tetrahedra&#39;</span>
2876
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">(</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">)</span>
2877
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">solution_type</span><span class="p">()</span>
2878
+ <span class="go">&#39;contains degenerate tetrahedra&#39;</span>
2879
+ </pre></div>
2880
+ </div>
2881
+ </dd></dl>
2882
+
2883
+ <dl class="py method">
2884
+ <dt class="sig sig-object py" id="snappy.Manifold.split">
2885
+ <span class="sig-name descname"><span class="pre">split</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">which_surface</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.split" title="Link to this definition"></a></dt>
2886
+ <dd><p>Split the manifold open along a surface of positive characteristic found
2887
+ by the method “splitting_surfaces”. Returns a list of the pieces, with any
2888
+ sphere boundary components filled in.</p>
2889
+ <p>Here’s an example of a Whitehead double on the trefoil.</p>
2890
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;K14n26039&#39;</span><span class="p">)</span>
2891
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">S</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">splitting_surfaces</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
2892
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">S</span>
2893
+ <span class="go">Orientable two-sided with euler = 0</span>
2894
+ </pre></div>
2895
+ </div>
2896
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">pieces</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">S</span><span class="p">);</span> <span class="n">pieces</span>
2897
+ <span class="go">[K14n26039.a(0,0)(0,0), K14n26039.b(0,0)]</span>
2898
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">pieces</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
2899
+ <span class="go">3.66386238</span>
2900
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">pieces</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">fundamental_group</span><span class="p">()</span><span class="o">.</span><span class="n">relators</span><span class="p">()</span>
2901
+ <span class="go">[&#39;aabbb&#39;]</span>
2902
+ </pre></div>
2903
+ </div>
2904
+ <p>You can also specify a surface by its index.</p>
2905
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;L10n111&#39;</span><span class="p">)</span>
2906
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">max</span><span class="p">(</span> <span class="n">P</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span> <span class="k">for</span> <span class="n">P</span> <span class="ow">in</span> <span class="n">M</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="p">)</span>
2907
+ <span class="go">5.33348957</span>
2908
+ </pre></div>
2909
+ </div>
2910
+ </dd></dl>
2911
+
2912
+ <dl class="py method">
2913
+ <dt class="sig sig-object py" id="snappy.Manifold.splitting_surfaces">
2914
+ <span class="sig-name descname"><span class="pre">splitting_surfaces</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.splitting_surfaces" title="Link to this definition"></a></dt>
2915
+ <dd><p>Searches for connected closed normal surfaces of nonnegative Euler
2916
+ characteristic. If spheres or projective planes are found, then
2917
+ tori and Klein bottles aren’t reported. There is no guarantee
2918
+ that all such normal surfaces will be found nor that any given
2919
+ surface is incompressible. The search is confined to surfaces
2920
+ whose quads are in the tetrahedra that have degenerate shapes.</p>
2921
+ <p>You can split the manifold open along one of these surfaces
2922
+ using the method “split”.</p>
2923
+ <p>A connect sum of two trefoils:</p>
2924
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M1</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;DT: fafBCAEFD&#39;</span><span class="p">)</span>
2925
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">len</span><span class="p">(</span><span class="n">M1</span><span class="o">.</span><span class="n">splitting_surfaces</span><span class="p">())</span>
2926
+ <span class="go">2</span>
2927
+ </pre></div>
2928
+ </div>
2929
+ <p>First satellite knot in the table.</p>
2930
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M2</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;K13n4587&#39;</span><span class="p">)</span>
2931
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M2</span><span class="o">.</span><span class="n">splitting_surfaces</span><span class="p">()</span>
2932
+ <span class="go">[Orientable two-sided with euler = 0]</span>
2933
+ </pre></div>
2934
+ </div>
2935
+ </dd></dl>
2936
+
2937
+ <dl class="py method">
2938
+ <dt class="sig sig-object py" id="snappy.Manifold.symmetric_triangulation">
2939
+ <span class="sig-name descname"><span class="pre">symmetric_triangulation</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.symmetric_triangulation" title="Link to this definition"></a></dt>
2940
+ <dd><p>Returns a Dehn filling description of the manifold realizing
2941
+ the symmetry group.</p>
2942
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m003(-3,1)&#39;</span><span class="p">)</span>
2943
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">symmetry_group</span><span class="p">()</span>
2944
+ <span class="go">D6</span>
2945
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">symmetric_triangulation</span><span class="p">()</span>
2946
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span>
2947
+ <span class="go">m003(1,0)(1,0)(1,0)</span>
2948
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">(</span> <span class="p">[(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)]</span> <span class="p">)</span>
2949
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">symmetry_group</span><span class="p">(</span><span class="n">of_link</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
2950
+ <span class="go">D6</span>
2951
+ </pre></div>
2952
+ </div>
2953
+ </dd></dl>
2954
+
2955
+ <dl class="py method">
2956
+ <dt class="sig sig-object py" id="snappy.Manifold.symmetry_group">
2957
+ <span class="sig-name descname"><span class="pre">symmetry_group</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">of_link</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference internal" href="additional_classes.html#snappy.SymmetryGroup" title="SnapPy.SymmetryGroup"><span class="pre">SymmetryGroup</span></a></span></span><a class="headerlink" href="#snappy.Manifold.symmetry_group" title="Link to this definition"></a></dt>
2958
+ <dd><p>Returns the symmetry group of the Manifold.
2959
+ If the flag “of_link” is set, then it only returns symmetries
2960
+ that preserves the meridians.</p>
2961
+ </dd></dl>
2962
+
2963
+ <dl class="py method">
2964
+ <dt class="sig sig-object py" id="snappy.Manifold.symplectic_basis">
2965
+ <span class="sig-name descname"><span class="pre">symplectic_basis</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">verify</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.symplectic_basis" title="Link to this definition"></a></dt>
2966
+ <dd><p>Extend the Neumann-Zagier matrix to one which is symplectic
2967
+ (up to factors of 2) using oscillating curves, see
2968
+ <a class="reference external" href="https://arxiv.org/abs/2208.06969">Mathews and Purcell ‘22</a>.
2969
+ Only accepts triangulations with 1 cusp.</p>
2970
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;4_1&quot;</span><span class="p">)</span>
2971
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">symplectic_basis</span><span class="p">()</span>
2972
+ <span class="go">[-1 0 -1 -1]</span>
2973
+ <span class="go">[ 2 0 -2 0]</span>
2974
+ <span class="go">[-2 -1 -2 -1]</span>
2975
+ <span class="go">[ 0 -1 -2 -1]</span>
2976
+ </pre></div>
2977
+ </div>
2978
+ <dl class="field-list simple">
2979
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
2980
+ <dd class="field-odd"><p><strong>verify</strong> – Explicitly test if the resulting matrix is symplectic.</p>
2981
+ </dd>
2982
+ </dl>
2983
+ </dd></dl>
2984
+
2985
+ <dl class="py method">
2986
+ <dt class="sig sig-object py" id="snappy.Manifold.tetrahedra_field_gens">
2987
+ <span class="sig-name descname"><span class="pre">tetrahedra_field_gens</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.tetrahedra_field_gens" title="Link to this definition"></a></dt>
2988
+ <dd><p>The shapes of the tetrahedra as ApproximateAlgebraicNumbers. Can be
2989
+ used to compute the tetrahedra field, where the first two parameters
2990
+ are bits of precision and maximum degree of the field:</p>
2991
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M = Manifold(&#39;m015&#39;)
2992
+ sage: tets = M.tetrahedra_field_gens()
2993
+ sage: tets.find_field(100, 10, optimize=True) # doctest: +NORMALIZE_WHITESPACE +NUMERIC9
2994
+ (Number Field in z with defining polynomial x^3 - x - 1
2995
+ with z = -0.6623589786223730? - 0.5622795120623013?*I,
2996
+ &lt;ApproxAN: -0.662358978622 - 0.562279512062*I&gt;, [-z, -z, -z])
2997
+ </pre></div>
2998
+ </div>
2999
+ </dd></dl>
3000
+
3001
+ <dl class="py method">
3002
+ <dt class="sig sig-object py" id="snappy.Manifold.tetrahedra_shapes">
3003
+ <span class="sig-name descname"><span class="pre">tetrahedra_shapes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">part</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fixed_alignment</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dec_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">intervals</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.tetrahedra_shapes" title="Link to this definition"></a></dt>
3004
+ <dd><p>Gives the shapes of the tetrahedra in the current solution to
3005
+ the gluing equations. Returns a list containing one info object
3006
+ for each tetrahedron. The keys are:</p>
3007
+ <ul class="simple">
3008
+ <li><p>rect : the shape of the tetrahedron, as a point in the
3009
+ complex plane.</p></li>
3010
+ <li><p>log : the log of the shape</p></li>
3011
+ <li><p>accuracies: a list of the approximate accuracies of the
3012
+ shapes, in order (rect re, rect im, log re, log im)</p></li>
3013
+ </ul>
3014
+ <p>If the optional variable ‘part’ is set to one of the above,
3015
+ then the function returns only that component of the data.</p>
3016
+ <p>If the flag ‘fixed_alignment’ is set to False, then the edges
3017
+ used to report the shape parameters are chosen so as to
3018
+ normalize the triangle.</p>
3019
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m015&#39;</span><span class="p">)</span>
3020
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">tetrahedra_shapes</span><span class="p">(</span><span class="n">part</span><span class="o">=</span><span class="s1">&#39;rect&#39;</span><span class="p">)</span>
3021
+ <span class="go">[0.66235898 + 0.56227951*I, 0.66235898 + 0.56227951*I, 0.66235898 + 0.56227951*I]</span>
3022
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">tetrahedra_shapes</span><span class="p">()</span>
3023
+ <span class="go">[{&#39;accuracies&#39;: (11, 11, 12, 11), &#39;log&#39;: -0.14059979 + 0.70385772*I, &#39;rect&#39;: 0.66235898 + 0.56227951*I},</span>
3024
+ <span class="go"> {&#39;accuracies&#39;: (11, 11, 11, 11), &#39;log&#39;: -0.14059979 + 0.70385772*I, &#39;rect&#39;: 0.66235898 + 0.56227951*I},</span>
3025
+ <span class="go"> {&#39;accuracies&#39;: (11, 11, 11, 11), &#39;log&#39;: -0.14059979 + 0.70385772*I, &#39;rect&#39;: 0.66235898 + 0.56227951*I}]</span>
3026
+ </pre></div>
3027
+ </div>
3028
+ </dd></dl>
3029
+
3030
+ <dl class="py method">
3031
+ <dt class="sig sig-object py" id="snappy.Manifold.trace_field_gens">
3032
+ <span class="sig-name descname"><span class="pre">trace_field_gens</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">fundamental_group_args</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[]</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.trace_field_gens" title="Link to this definition"></a></dt>
3033
+ <dd><p>The generators of the trace field as ApproximateAlgebraicNumbers. Can be
3034
+ used to compute the tetrahedra field, where the first two parameters
3035
+ are bits of precision and maximum degree of the field:</p>
3036
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m125&#39;</span><span class="p">)</span>
3037
+ <span class="n">sage</span><span class="p">:</span> <span class="n">traces</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">trace_field_gens</span><span class="p">()</span>
3038
+ <span class="n">sage</span><span class="p">:</span> <span class="n">traces</span><span class="o">.</span><span class="n">find_field</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">optimize</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># doctest: +NORMALIZE_WHITESPACE</span>
3039
+ <span class="p">(</span><span class="n">Number</span> <span class="n">Field</span> <span class="ow">in</span> <span class="n">z</span> <span class="k">with</span> <span class="n">defining</span> <span class="n">polynomial</span> <span class="n">x</span><span class="o">^</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span>
3040
+ <span class="k">with</span> <span class="n">z</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="o">*</span><span class="n">I</span><span class="p">,</span>
3041
+ <span class="o">&lt;</span><span class="n">ApproxAN</span><span class="p">:</span> <span class="o">-</span><span class="mf">1.0</span><span class="o">*</span><span class="n">I</span><span class="o">&gt;</span><span class="p">,</span> <span class="p">[</span><span class="n">z</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">z</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span>
3042
+ </pre></div>
3043
+ </div>
3044
+ </dd></dl>
3045
+
3046
+ <dl class="py method">
3047
+ <dt class="sig sig-object py" id="snappy.Manifold.triangulation_isosig">
3048
+ <span class="sig-name descname"><span class="pre">triangulation_isosig</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">decorated</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_cusp_ordering</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_curves</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_curve_orientations</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_filling_orientations</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ignore_orientation</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">str</span></span></span><a class="headerlink" href="#snappy.Manifold.triangulation_isosig" title="Link to this definition"></a></dt>
3049
+ <dd><p>Returns the “(decorated) isomorphism signature”, a compact text
3050
+ representation of the triangulation:</p>
3051
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">T</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
3052
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">()</span>
3053
+ <span class="go">&#39;cPcbbbiht_BaCB&#39;</span>
3054
+ </pre></div>
3055
+ </div>
3056
+ <p>This string can be used later to recreate an isomorphic triangulation:</p>
3057
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">U</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;cPcbbbiht_BaCB&#39;</span><span class="p">)</span>
3058
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">T</span> <span class="o">==</span> <span class="n">U</span>
3059
+ <span class="go">True</span>
3060
+ </pre></div>
3061
+ </div>
3062
+ <p>The isomorphism signature is also used to compute the
3063
+ <a class="reference internal" href="#snappy.Manifold.isometry_signature" title="snappy.Manifold.isometry_signature"><code class="xref py py-meth docutils literal notranslate"><span class="pre">isometry_signature</span></code></a>.
3064
+ It comes in two flavors controlled by the <code class="xref py py-attr docutils literal notranslate"><span class="pre">decorated</span></code> flag.</p>
3065
+ <p><strong>Undecorated isomorphism signature</strong></p>
3066
+ <p>The undecorated isomorphism signature is a complete invariant of the
3067
+ (oriented) triangulation up to combinatorial isomorphism:</p>
3068
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">T</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;m015&#39;</span><span class="p">)</span>
3069
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
3070
+ <span class="go">&#39;dLQbcccdero&#39;</span>
3071
+ </pre></div>
3072
+ </div>
3073
+ <p>It was introduced in
3074
+ <a class="reference external" href="http://arxiv.org/abs/1110.6080">Burton ‘11</a>. It canonizes and
3075
+ generalizes the ealier dehydration string by
3076
+ <a class="reference external" href="https://doi.org/10.1090/S0025-5718-99-01036-4">Callahan, Hildebrand and Weeks ‘99</a>.
3077
+ The undecorated isomorphism signature can also be given to
3078
+ <a class="reference external" href="https://regina-normal.github.io/">Regina</a>’s
3079
+ <code class="docutils literal notranslate"><span class="pre">Triangulation3.fromIsoSig</span></code>.</p>
3080
+ <p>By default, the orientation (if orientable) is ignored. More
3081
+ precisely, it computes the string for both orientations (if orientable)
3082
+ and uses the lexicographically smaller string:</p>
3083
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">T</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;m015&#39;</span><span class="p">)</span>
3084
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
3085
+ <span class="go">&#39;dLQbcccdero&#39;</span>
3086
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">T</span><span class="o">.</span><span class="n">reverse_orientation</span><span class="p">()</span>
3087
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
3088
+ <span class="go">&#39;dLQbcccdero&#39;</span>
3089
+ </pre></div>
3090
+ </div>
3091
+ <p>When specifying <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_orientation</span> <span class="pre">=</span> <span class="pre">False</span></code>, the result
3092
+ encodes the orientation (if orientable). Now the result is
3093
+ different if we change the orientation of a chiral triangulation:</p>
3094
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">T</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;m015&#39;</span><span class="p">)</span>
3095
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">ignore_orientation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
3096
+ <span class="go">&#39;dLQbcccdero&#39;</span>
3097
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">T</span><span class="o">.</span><span class="n">reverse_orientation</span><span class="p">()</span>
3098
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">T</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">ignore_orientation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
3099
+ <span class="go">&#39;dLQbccceekg&#39;</span>
3100
+ </pre></div>
3101
+ </div>
3102
+ <p><strong>Decorated isomorphism signature (default)</strong></p>
3103
+ <p>SnapPy can decorate the isomorphism signature to include the following
3104
+ peripheral information in a canonical way (that is invariant under
3105
+ the action by combinatorial isomorphisms of the triangulation):</p>
3106
+ <ol class="arabic simple">
3107
+ <li><p>Indexing of the cusps (that is, ideal vertices).</p>
3108
+ <ul class="simple">
3109
+ <li><p>Included by default.
3110
+ Can be suppressed with <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_cusp_ordering</span> <span class="pre">=</span> <span class="pre">True</span></code>.</p></li>
3111
+ </ul>
3112
+ </li>
3113
+ <li><p>Peripheral curves (aka meridian and longitude, up to homotopy).</p>
3114
+ <ul class="simple">
3115
+ <li><p>Included by default.
3116
+ Can be suppressed with <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_curves</span> <span class="pre">=</span> <span class="pre">True</span></code>.</p></li>
3117
+ <li><p>By default, the decoration encodes the oriented peripheral curves.
3118
+ By specifying <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_curve_orientations</span> <span class="pre">=</span> <span class="pre">True</span></code>, it encodes
3119
+ the unoriented peripheral curves instead.</p></li>
3120
+ </ul>
3121
+ </li>
3122
+ <li><p>Dehn-fillings (if present).</p>
3123
+ <ul class="simple">
3124
+ <li><p>By default, the decoration encodes the oriented Dehn-fillings.
3125
+ That is, we also encodes the orientation of the peripheral curve
3126
+ that is used for the Dehn-filling (this explanation only
3127
+ works if the coefficients are integral).
3128
+ By specifying <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_filling_orientations</span> <span class="pre">=</span> <span class="pre">True</span></code>, the
3129
+ decoration encodes the unoriented Dehn-fillings.
3130
+ That is, it normalizes the Dehn-filling coefficients by picking
3131
+ a canonical pair among <span class="math notranslate nohighlight">\((m,l)\)</span> and <span class="math notranslate nohighlight">\((-m,-l)\)</span>.</p></li>
3132
+ </ul>
3133
+ </li>
3134
+ </ol>
3135
+ <p>Details of the encoding are explained in the
3136
+ <a class="reference external" href="https://github.com/3-manifolds/SnapPy/blob/master/python/decorated_isosig.py">SnapPy source code</a>.</p>
3137
+ <p><strong>Example</strong></p>
3138
+ <p>Let us consider the links <span class="math notranslate nohighlight">\(9^2_{34}\)</span> and <code class="docutils literal notranslate"><span class="pre">L9a21</span></code>. Note that we use
3139
+ <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation</span></code></a>
3140
+ to make the following examples say something intrinsic about the
3141
+ hyperbolic manifold:</p>
3142
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">snappy</span> <span class="kn">import</span> <span class="n">Manifold</span>
3143
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;9^2_34&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
3144
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;L9a21&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">canonical_retriangulation</span><span class="p">()</span>
3145
+ </pre></div>
3146
+ </div>
3147
+ <p>The decorated isosig recovers the entire peripheral information faithfully
3148
+ (including orientation, see below):</p>
3149
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">()</span>
3150
+ <span class="go">&#39;oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_baBabbbBbC&#39;</span>
3151
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">K</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_baBabbbBbC&#39;</span><span class="p">)</span>
3152
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">isomorphisms_to</span><span class="p">(</span><span class="n">K</span><span class="p">)</span>
3153
+ <span class="go">[0 -&gt; 0 1 -&gt; 1</span>
3154
+ <span class="go">[1 0] [1 0]</span>
3155
+ <span class="go">[0 1] [0 1]</span>
3156
+ <span class="go">Extends to link]</span>
3157
+ </pre></div>
3158
+ </div>
3159
+ <p>The two links have isometric complements:</p>
3160
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
3161
+ <span class="go">&#39;oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo&#39;</span>
3162
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
3163
+ <span class="go">&#39;oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo&#39;</span>
3164
+ </pre></div>
3165
+ </div>
3166
+ <p>However, the complements have different handedness:</p>
3167
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span><span class="n">ignore_orientation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
3168
+ <span class="go">&#39;oLLzLPwzQQccdeghjiiklmnmnnuvuvvavovvffffo&#39;</span>
3169
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">decorated</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span><span class="n">ignore_orientation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
3170
+ <span class="go">&#39;oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo&#39;</span>
3171
+ </pre></div>
3172
+ </div>
3173
+ <p>Also, the cusps/components of the link are indexed differently:</p>
3174
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_curves</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
3175
+ <span class="go">&#39;oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_ba&#39;</span>
3176
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_curves</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
3177
+ <span class="go">&#39;oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_ab&#39;</span>
3178
+ </pre></div>
3179
+ </div>
3180
+ <p>Ignoring the indexing, we also see that the oriented merdians and
3181
+ longitudes do not match:</p>
3182
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
3183
+ <span class="go">&#39;oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_bBbCBabb&#39;</span>
3184
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
3185
+ <span class="go">&#39;oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_BbbCbabb&#39;</span>
3186
+ </pre></div>
3187
+ </div>
3188
+ <p>However, they are the same links (ignoring indexing and orientation):</p>
3189
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">ignore_curve_orientations</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
3190
+ <span class="go">&#39;oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_bBBcbabb&#39;</span>
3191
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span><span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">ignore_curve_orientations</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
3192
+ <span class="go">&#39;oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo_bBBcbabb&#39;</span>
3193
+ </pre></div>
3194
+ </div>
3195
+ <p>Let us create two surgery presentations from the links (note that we
3196
+ fill after
3197
+ <a class="reference internal" href="#snappy.Manifold.canonical_retriangulation" title="snappy.Manifold.canonical_retriangulation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">canonical_retriangulation</span></code></a>
3198
+ since it rejects Dehn-fillings):</p>
3199
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span><span class="mi">0</span><span class="p">)</span>
3200
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">dehn_fill</span><span class="p">((</span><span class="mi">4</span><span class="p">,</span><span class="o">-</span><span class="mi">5</span><span class="p">),</span><span class="mi">1</span><span class="p">)</span>
3201
+ </pre></div>
3202
+ </div>
3203
+ <p>They are equivalent surgery presentations (of the same manifold):</p>
3204
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span>
3205
+ <span class="gp">... </span> <span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
3206
+ <span class="gp">... </span> <span class="n">ignore_curves</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
3207
+ <span class="gp">... </span> <span class="n">ignore_filling_orientations</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
3208
+ <span class="go">&#39;oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo(0,0)(1,5)&#39;</span>
3209
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">triangulation_isosig</span><span class="p">(</span>
3210
+ <span class="gp">... </span> <span class="n">ignore_cusp_ordering</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
3211
+ <span class="gp">... </span> <span class="n">ignore_curves</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
3212
+ <span class="gp">... </span> <span class="n">ignore_filling_orientations</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
3213
+ <span class="go">&#39;oLLvzQLLQQccdhifihnlmkmlnnpvuvbvouggbggoo(0,0)(1,5)&#39;</span>
3214
+ </pre></div>
3215
+ </div>
3216
+ <p><strong>Orientation</strong></p>
3217
+ <p>Note that <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_orientation=True</span></code> only applies to the undecorated
3218
+ part of the isomorphism signature. The decoration can still capture the
3219
+ the orientation.
3220
+ More, precisely, the result of <a class="reference internal" href="#snappy.Manifold.triangulation_isosig" title="snappy.Manifold.triangulation_isosig"><code class="xref py py-meth docutils literal notranslate"><span class="pre">triangulation_isosig()</span></code></a> depends on
3221
+ the orientation (if the triangulation is orientable and chiral) if any
3222
+ of the following is true:</p>
3223
+ <ol class="arabic simple">
3224
+ <li><p><code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_orientation</span> <span class="pre">=</span> <span class="pre">False</span></code>.</p></li>
3225
+ <li><p><code class="xref py py-attr docutils literal notranslate"><span class="pre">decorated</span> <span class="pre">=</span> <span class="pre">True</span></code> and
3226
+ <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_curves</span> <span class="pre">=</span> <span class="pre">False</span></code> and
3227
+ <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_filling_orientations</span> <span class="pre">=</span> <span class="pre">False</span></code>.</p></li>
3228
+ </ol>
3229
+ <p>In these cases, re-constructing a triangulation from the isomorphism
3230
+ signature yields a triangulation with the same handedness.</p>
3231
+ <dl class="field-list simple">
3232
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
3233
+ <dd class="field-odd"><ul class="simple">
3234
+ <li><p><strong>decorated</strong> – Include peripheral information such as indexing of the cusps,
3235
+ (oriented or unoriented) peripheral curves and
3236
+ (oriented or unoriented) Dehn-fillings.</p></li>
3237
+ <li><p><strong>ignore_cusp_ordering</strong> – Do not encode the indexing of the cusps.
3238
+ Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">decorated</span> <span class="pre">=</span> <span class="pre">True</span></code>.</p></li>
3239
+ <li><p><strong>ignore_curves</strong> – Do not encode the peripheral curves.
3240
+ Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">decorated</span> <span class="pre">=</span> <span class="pre">True</span></code>.
3241
+ This is new in SnapPy version 3.2.
3242
+ If <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_curves</span> <span class="pre">=</span> <span class="pre">True</span></code>, the result of this method cannot
3243
+ be given to prior versions.</p></li>
3244
+ <li><p><strong>ignore_curve_orientations</strong> – Do not encode the orientations of the peripheral curves.
3245
+ Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">decorated</span> <span class="pre">=</span> <span class="pre">True</span></code> and
3246
+ <code class="xref py py-attr docutils literal notranslate"><span class="pre">ignore_curves</span> <span class="pre">=</span> <span class="pre">False</span></code>.</p></li>
3247
+ <li><p><strong>ignore_filling_orientations</strong> – Do not encode the orientations of the Dehn-fillings.
3248
+ Only relevant if <code class="xref py py-attr docutils literal notranslate"><span class="pre">decorated</span> <span class="pre">=</span> <span class="pre">True</span></code>.</p></li>
3249
+ <li><p><strong>ignore_orientation</strong> – Do not encode the orientation of the triangulation in the
3250
+ undecorated part of the triangulation isosig.
3251
+ See above section about orientation.</p></li>
3252
+ </ul>
3253
+ </dd>
3254
+ </dl>
3255
+ </dd></dl>
3256
+
3257
+ <dl class="py method">
3258
+ <dt class="sig sig-object py" id="snappy.Manifold.use_field_conversion">
3259
+ <em class="property"><span class="pre">classmethod</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">use_field_conversion</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">func</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.use_field_conversion" title="Link to this definition"></a></dt>
3260
+ <dd><p>A class method for specifying a numerical conversion function.
3261
+ This method is deprecated: SnapPy will automatically use
3262
+ SageMath number types or its own SnapPy number type depending on
3263
+ whether SageMath is available or not.</p>
3264
+ <p>SnapPy includes its own number type, snappy.Number, which can
3265
+ represent floating point real or complex numbers of varying
3266
+ precision. (In fact, Number is a wrapper for a pari number of
3267
+ type ‘t_INT’, ‘t_FRAC’, ‘t_REAL’ or ‘t_COMPLEX’, and the pari
3268
+ gen can be extracted as an attribute: x.gen .) Methods of
3269
+ SnapPy objects which return numerical values will first compute
3270
+ the value as a Number, and then optionally convert the Number
3271
+ to a different numerical type which can be specified by calling
3272
+ this class method.</p>
3273
+ <p>By default SnapPy returns Numbers when loaded into python, and
3274
+ elements of a Sage RealField or ComplexField when loaded into
3275
+ Sage. These will be 64 bit numbers for ordinary Manifolds and
3276
+ 212 bit numbers for high precision manifolds.</p>
3277
+ <p>The func argument should be a function which accepts a number and
3278
+ returns a numerical type of your choosing. Alternatively, the
3279
+ strings ‘sage’ or ‘snappy’ can be passed as arguments to select
3280
+ either of the two default behaviors.</p>
3281
+ <p>EXAMPLE:</p>
3282
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
3283
+ <span class="n">sage</span><span class="p">:</span> <span class="n">R</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span><span class="o">.</span><span class="n">parent</span><span class="p">()</span>
3284
+ <span class="n">sage</span><span class="p">:</span> <span class="n">R</span><span class="o">.</span><span class="n">name</span><span class="p">()</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;RealField&#39;</span><span class="p">)</span>
3285
+ <span class="kc">True</span>
3286
+ <span class="n">sage</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">snappy.number</span> <span class="kn">import</span> <span class="n">SnapPyNumbers</span>
3287
+ <span class="n">sage</span><span class="p">:</span> <span class="n">Manifold</span><span class="o">.</span><span class="n">use_field_conversion</span><span class="p">(</span><span class="s1">&#39;snappy&#39;</span><span class="p">)</span>
3288
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
3289
+ <span class="n">sage</span><span class="p">:</span> <span class="n">R</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span><span class="o">.</span><span class="n">parent</span><span class="p">()</span>
3290
+ <span class="n">sage</span><span class="p">:</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">SnapPyNumbers</span><span class="p">)</span>
3291
+ <span class="kc">True</span>
3292
+ <span class="n">sage</span><span class="p">:</span> <span class="n">Manifold</span><span class="o">.</span><span class="n">use_field_conversion</span><span class="p">(</span><span class="s1">&#39;sage&#39;</span><span class="p">)</span>
3293
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
3294
+ <span class="n">sage</span><span class="p">:</span> <span class="n">R</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span><span class="o">.</span><span class="n">parent</span><span class="p">()</span>
3295
+ <span class="n">sage</span><span class="p">:</span> <span class="n">R</span><span class="o">.</span><span class="n">name</span><span class="p">()</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;RealField&#39;</span><span class="p">)</span>
3296
+ <span class="kc">True</span>
3297
+ </pre></div>
3298
+ </div>
3299
+ </dd></dl>
3300
+
3301
+ <dl class="py method">
3302
+ <dt class="sig sig-object py" id="snappy.Manifold.verify_hyperbolicity">
3303
+ <span class="sig-name descname"><span class="pre">verify_hyperbolicity</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">holonomy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fundamental_group_args</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lift_to_SL</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.verify_hyperbolicity" title="Link to this definition"></a></dt>
3304
+ <dd><p>Given an orientable SnapPy Manifold, verifies its hyperbolicity.</p>
3305
+ <p>Similar to HIKMOT’s <a class="reference internal" href="#snappy.Manifold.verify_hyperbolicity" title="snappy.Manifold.verify_hyperbolicity"><code class="xref py py-meth docutils literal notranslate"><span class="pre">verify_hyperbolicity()</span></code></a>, the result is either
3306
+ <code class="docutils literal notranslate"><span class="pre">(True,</span> <span class="pre">listOfShapeIntervals)</span></code> or <code class="docutils literal notranslate"><span class="pre">(False,</span> <span class="pre">[])</span></code> if verification failed.
3307
+ <code class="docutils literal notranslate"><span class="pre">listOfShapesIntervals</span></code> is a list of complex intervals (elements in
3308
+ sage’s <code class="docutils literal notranslate"><span class="pre">ComplexIntervalField</span></code>) certified to contain the true shapes
3309
+ for the hyperbolic manifold.</p>
3310
+ <p>Higher precision intervals can be obtained by setting <code class="docutils literal notranslate"><span class="pre">bits_prec</span></code>:</p>
3311
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: from snappy import Manifold
3312
+ sage: M = Manifold(&quot;m019&quot;)
3313
+ sage: M.verify_hyperbolicity() # doctest: +NUMERIC12
3314
+ (True, [0.780552527850? + 0.914473662967?*I, 0.780552527850? + 0.91447366296773?*I, 0.4600211755737? + 0.6326241936052?*I])
3315
+
3316
+ sage: M = Manifold(&quot;t02333(3,4)&quot;)
3317
+ sage: M.verify_hyperbolicity() # doctest: +NUMERIC9
3318
+ (True, [2.152188153612? + 0.284940667895?*I, 1.92308491369? + 1.10360701507?*I, 0.014388591584? + 0.143084469681?*I, -2.5493670288? + 3.7453498408?*I, 0.142120333822? + 0.176540027036?*I, 0.504866865874? + 0.82829881681?*I, 0.50479249917? + 0.98036162786?*I, -0.589495705074? + 0.81267480427?*I])
3319
+ </pre></div>
3320
+ </div>
3321
+ <p>One can instead get a holonomy representation associated to the
3322
+ verified hyperbolic structure. This representation takes values
3323
+ in 2x2 matrices with entries in the <code class="docutils literal notranslate"><span class="pre">ComplexIntervalField</span></code>:</p>
3324
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M = Manifold(&quot;m004(1,2)&quot;)
3325
+ sage: success, rho = M.verify_hyperbolicity(holonomy=True)
3326
+ sage: success
3327
+ True
3328
+ sage: trace = rho(&#39;aaB&#39;).trace(); trace # doctest: +NUMERIC9
3329
+ -0.1118628555? + 3.8536121048?*I
3330
+ sage: (trace - 2).contains_zero()
3331
+ False
3332
+ sage: (rho(&#39;aBAbaabAB&#39;).trace() - 2).contains_zero()
3333
+ True
3334
+ </pre></div>
3335
+ </div>
3336
+ <p>Here, there is <strong>provably</strong> a fixed holonomy representation rho0
3337
+ from the fundamental group G of M to SL(2, C) so that for each
3338
+ element g of G the matrix rho0(g) is contained in rho(g). In
3339
+ particular, the above constitutes a proof that the word ‘aaB’ is
3340
+ non-trivial in G. In contrast, the final computation is
3341
+ consistent with ‘aBAbaabAB’ being trivial in G, but <em>does not prove
3342
+ this</em>.</p>
3343
+ <p>A non-hyperbolic manifold (<code class="docutils literal notranslate"><span class="pre">False</span></code> indicates that the manifold
3344
+ might not be hyperbolic but does <strong>not</strong> certify
3345
+ non-hyperbolicity. Sometimes, hyperbolicity can only be verified
3346
+ after increasing the precision):</p>
3347
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sage</span><span class="p">:</span> <span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s2">&quot;4_1(1,0)&quot;</span><span class="p">)</span>
3348
+ <span class="n">sage</span><span class="p">:</span> <span class="n">M</span><span class="o">.</span><span class="n">verify_hyperbolicity</span><span class="p">()</span>
3349
+ <span class="p">(</span><span class="kc">False</span><span class="p">,</span> <span class="p">[])</span>
3350
+ </pre></div>
3351
+ </div>
3352
+ <p>Under the hood, the function will call the <code class="docutils literal notranslate"><span class="pre">CertifiedShapesEngine</span></code> to produce
3353
+ intervals certified to contain a solution to the rectangular gluing equations.
3354
+ It then calls <code class="docutils literal notranslate"><span class="pre">check_logarithmic_gluing_equations_and_positively_oriented_tets</span></code>
3355
+ to verify that the logarithmic gluing equations are fulfilled and that all
3356
+ tetrahedra are positively oriented.</p>
3357
+ </dd></dl>
3358
+
3359
+ <dl class="py method">
3360
+ <dt class="sig sig-object py" id="snappy.Manifold.volume">
3361
+ <span class="sig-name descname"><span class="pre">volume</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">accuracy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verified</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bits_prec</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.volume" title="Link to this definition"></a></dt>
3362
+ <dd><p>Returns the volume of the current solution to the hyperbolic
3363
+ gluing equations; if the solution is sufficiently non-degenerate,
3364
+ this is the sum of the volumes of the hyperbolic pieces in
3365
+ the geometric decomposition of the manifold.</p>
3366
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
3367
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
3368
+ <span class="go">2.02988321</span>
3369
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">M</span><span class="o">.</span><span class="n">solution_type</span><span class="p">()</span>
3370
+ <span class="go">&#39;all tetrahedra positively oriented&#39;</span>
3371
+ </pre></div>
3372
+ </div>
3373
+ <p>The return value has an extra attribute, accuracy, which is the
3374
+ number of digits of accuracy as <em>estimated</em> by SnapPea. When
3375
+ printing the volume, the result is rounded to 1 more than this
3376
+ number of digits.</p>
3377
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">vol</span><span class="p">,</span> <span class="n">accuracy</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">volume</span><span class="p">(</span><span class="n">accuracy</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
3378
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">accuracy</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">63</span><span class="p">)</span> <span class="c1"># Low precision, High precision</span>
3379
+ <span class="go">True</span>
3380
+ </pre></div>
3381
+ </div>
3382
+ <p>Inside SageMath, verified computation of the volume of a
3383
+ hyperbolic manifold is also possible (this will verify first
3384
+ that the manifold is indeed hyperbolic):</p>
3385
+ <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sage: M.volume(verified=True, bits_prec=100) #doctest: +NUMERIC24
3386
+ 2.029883212819307250042405109?
3387
+ </pre></div>
3388
+ </div>
3389
+ </dd></dl>
3390
+
3391
+ <dl class="py method">
3392
+ <dt class="sig sig-object py" id="snappy.Manifold.with_hyperbolic_structure">
3393
+ <span class="sig-name descname"><span class="pre">with_hyperbolic_structure</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.with_hyperbolic_structure" title="Link to this definition"></a></dt>
3394
+ <dd><p>Add a (possibly degenerate) hyperbolic structure, turning the
3395
+ <a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><code class="xref py py-class docutils literal notranslate"><span class="pre">Triangulation</span></code></a> into a <a class="reference internal" href="#snappy.Manifold" title="snappy.Manifold"><code class="xref py py-class docutils literal notranslate"><span class="pre">Manifold</span></code></a>.</p>
3396
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="s1">&#39;m004&#39;</span><span class="p">)</span>
3397
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">with_hyperbolic_structure</span><span class="p">()</span>
3398
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">N</span><span class="o">.</span><span class="n">volume</span><span class="p">()</span>
3399
+ <span class="go">2.02988321</span>
3400
+ </pre></div>
3401
+ </div>
3402
+ </dd></dl>
3403
+
3404
+ <dl class="py method">
3405
+ <dt class="sig sig-object py" id="snappy.Manifold.without_hyperbolic_structure">
3406
+ <span class="sig-name descname"><span class="pre">without_hyperbolic_structure</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#snappy.Manifold.without_hyperbolic_structure" title="Link to this definition"></a></dt>
3407
+ <dd><p>Returns self as a <a class="reference internal" href="triangulation.html#snappy.Triangulation" title="snappy.Triangulation"><code class="xref py py-class docutils literal notranslate"><span class="pre">Triangulation</span></code></a>, forgetting the hyperbolic
3408
+ structure in the process.</p>
3409
+ <div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">M</span> <span class="o">=</span> <span class="n">Manifold</span><span class="p">(</span><span class="s1">&#39;9_42&#39;</span><span class="p">)</span>
3410
+ <span class="gp">&gt;&gt;&gt; </span><span class="n">T</span> <span class="o">=</span> <span class="n">M</span><span class="o">.</span><span class="n">without_hyperbolic_structure</span><span class="p">()</span>
3411
+ <span class="gp">&gt;&gt;&gt; </span><span class="nb">hasattr</span><span class="p">(</span><span class="n">T</span><span class="p">,</span> <span class="s1">&#39;volume&#39;</span><span class="p">)</span>
3412
+ <span class="go">False</span>
3413
+ </pre></div>
3414
+ </div>
3415
+ </dd></dl>
3416
+
3417
+ </dd></dl>
3418
+
3419
+ </section>
3420
+
3421
+
3422
+ </div>
3423
+ </div>
3424
+ <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
3425
+ <a href="snappy.html" class="btn btn-neutral float-left" title="The snappy module and its classes" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
3426
+ <a href="manifoldhp.html" class="btn btn-neutral float-right" title="ManifoldHP: High-precision variant" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
3427
+ </div>
3428
+
3429
+ <hr/>
3430
+
3431
+ <div role="contentinfo">
3432
+ <p>&#169; Copyright 2009-2025, by Marc Culler, Nathan Dunfield, Matthias Goerner, Jeffrey Weeks and others.</p>
3433
+ </div>
3434
+
3435
+ Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
3436
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
3437
+ provided by <a href="https://readthedocs.org">Read the Docs</a>.
3438
+
3439
+
3440
+ </footer>
3441
+ </div>
3442
+ </div>
3443
+ </section>
3444
+ </div>
3445
+ <script>
3446
+ jQuery(function () {
3447
+ SphinxRtdTheme.Navigation.enable(true);
3448
+ });
3449
+ </script>
3450
+
3451
+ </body>
3452
+ </html>