snappy 3.1.1__cp311-cp311-win_amd64.whl → 3.2__cp311-cp311-win_amd64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (476) hide show
  1. snappy/CyOpenGL.cp311-win_amd64.pyd +0 -0
  2. snappy/SnapPy.cp311-win_amd64.pyd +0 -0
  3. snappy/SnapPyHP.cp311-win_amd64.pyd +0 -0
  4. snappy/__init__.py +299 -402
  5. snappy/app.py +70 -20
  6. snappy/browser.py +18 -17
  7. snappy/canonical.py +249 -0
  8. snappy/{verify/cusp_shapes.py → cusps/__init__.py} +8 -18
  9. snappy/cusps/cusp_area_matrix.py +101 -0
  10. snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +23 -39
  11. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  12. snappy/cusps/test.py +21 -0
  13. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  14. snappy/database.py +10 -9
  15. snappy/decorated_isosig.py +337 -114
  16. snappy/dev/extended_ptolemy/complexVolumesClosed.py +40 -7
  17. snappy/dev/extended_ptolemy/extended.py +3 -3
  18. snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
  19. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +1 -1
  20. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  21. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  22. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  23. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  24. snappy/doc/_sources/additional_classes.rst.txt +40 -40
  25. snappy/doc/_sources/bugs.rst.txt +14 -14
  26. snappy/doc/_sources/censuses.rst.txt +51 -51
  27. snappy/doc/_sources/credits.rst.txt +75 -75
  28. snappy/doc/_sources/development.rst.txt +259 -239
  29. snappy/doc/_sources/index.rst.txt +182 -115
  30. snappy/doc/_sources/installing.rst.txt +247 -264
  31. snappy/doc/_sources/manifold.rst.txt +6 -6
  32. snappy/doc/_sources/manifoldhp.rst.txt +46 -46
  33. snappy/doc/_sources/news.rst.txt +355 -283
  34. snappy/doc/_sources/other.rst.txt +25 -25
  35. snappy/doc/_sources/platonic_census.rst.txt +20 -20
  36. snappy/doc/_sources/plink.rst.txt +102 -102
  37. snappy/doc/_sources/ptolemy.rst.txt +66 -66
  38. snappy/doc/_sources/ptolemy_classes.rst.txt +42 -42
  39. snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -297
  40. snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -363
  41. snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -301
  42. snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -61
  43. snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -105
  44. snappy/doc/_sources/screenshots.rst.txt +21 -21
  45. snappy/doc/_sources/snap.rst.txt +87 -87
  46. snappy/doc/_sources/snappy.rst.txt +28 -28
  47. snappy/doc/_sources/spherogram.rst.txt +103 -103
  48. snappy/doc/_sources/todo.rst.txt +47 -47
  49. snappy/doc/_sources/triangulation.rst.txt +11 -11
  50. snappy/doc/_sources/tutorial.rst.txt +49 -49
  51. snappy/doc/_sources/verify.rst.txt +210 -150
  52. snappy/doc/_sources/verify_internals.rst.txt +79 -90
  53. snappy/doc/_static/basic.css +924 -902
  54. snappy/doc/_static/css/badge_only.css +1 -1
  55. snappy/doc/_static/css/theme.css +1 -1
  56. snappy/doc/_static/doctools.js +1 -1
  57. snappy/doc/_static/documentation_options.js +12 -13
  58. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  59. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  60. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  61. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  62. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  63. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  64. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  65. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  66. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  67. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  68. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  69. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  70. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  71. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  72. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  73. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  74. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  75. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  76. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  77. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  78. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  79. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  80. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  81. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  82. snappy/doc/_static/js/versions.js +228 -0
  83. snappy/doc/_static/language_data.js +199 -199
  84. snappy/doc/_static/pygments.css +74 -73
  85. snappy/doc/_static/searchtools.js +125 -71
  86. snappy/doc/_static/snappy_furo.css +33 -33
  87. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
  88. snappy/doc/_static/sphinx_highlight.js +13 -3
  89. snappy/doc/additional_classes.html +1499 -1330
  90. snappy/doc/bugs.html +131 -134
  91. snappy/doc/censuses.html +426 -445
  92. snappy/doc/credits.html +180 -183
  93. snappy/doc/development.html +383 -363
  94. snappy/doc/genindex.html +1330 -1409
  95. snappy/doc/index.html +261 -206
  96. snappy/doc/installing.html +345 -363
  97. snappy/doc/manifold.html +3451 -2839
  98. snappy/doc/manifoldhp.html +179 -182
  99. snappy/doc/news.html +387 -329
  100. snappy/doc/objects.inv +0 -0
  101. snappy/doc/other.html +160 -162
  102. snappy/doc/platonic_census.html +374 -377
  103. snappy/doc/plink.html +209 -212
  104. snappy/doc/ptolemy.html +253 -255
  105. snappy/doc/ptolemy_classes.html +1143 -1146
  106. snappy/doc/ptolemy_examples1.html +408 -410
  107. snappy/doc/ptolemy_examples2.html +470 -473
  108. snappy/doc/ptolemy_examples3.html +413 -416
  109. snappy/doc/ptolemy_examples4.html +194 -197
  110. snappy/doc/ptolemy_prelim.html +247 -250
  111. snappy/doc/py-modindex.html +164 -167
  112. snappy/doc/screenshots.html +140 -142
  113. snappy/doc/search.html +134 -137
  114. snappy/doc/searchindex.js +1 -1
  115. snappy/doc/snap.html +201 -204
  116. snappy/doc/snappy.html +180 -182
  117. snappy/doc/spherogram.html +1210 -1213
  118. snappy/doc/todo.html +165 -168
  119. snappy/doc/triangulation.html +1583 -1474
  120. snappy/doc/tutorial.html +158 -161
  121. snappy/doc/verify.html +329 -275
  122. snappy/doc/verify_internals.html +1234 -1691
  123. snappy/drilling/__init__.py +153 -235
  124. snappy/drilling/barycentric.py +103 -0
  125. snappy/drilling/constants.py +0 -2
  126. snappy/drilling/crush.py +56 -130
  127. snappy/drilling/cusps.py +12 -6
  128. snappy/drilling/debug.py +2 -1
  129. snappy/drilling/exceptions.py +7 -40
  130. snappy/drilling/moves.py +302 -243
  131. snappy/drilling/perturb.py +63 -37
  132. snappy/drilling/shorten.py +36 -0
  133. snappy/drilling/subdivide.py +0 -5
  134. snappy/drilling/test.py +23 -0
  135. snappy/drilling/test_cases.py +126 -0
  136. snappy/drilling/tracing.py +9 -37
  137. snappy/exceptions.py +18 -5
  138. snappy/exterior_to_link/barycentric_geometry.py +2 -4
  139. snappy/exterior_to_link/main.py +8 -7
  140. snappy/exterior_to_link/mcomplex_with_link.py +2 -2
  141. snappy/exterior_to_link/rational_linear_algebra.py +1 -1
  142. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
  143. snappy/exterior_to_link/test.py +21 -33
  144. snappy/geometric_structure/__init__.py +212 -0
  145. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  146. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  147. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  148. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  149. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  150. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  151. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  152. snappy/geometric_structure/geodesic/__init__.py +0 -0
  153. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  154. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  155. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  156. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  157. snappy/geometric_structure/geodesic/constants.py +6 -0
  158. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  159. snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
  160. snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
  161. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  162. snappy/geometric_structure/geodesic/line.py +30 -0
  163. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  164. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  165. snappy/geometric_structure/test.py +22 -0
  166. snappy/gui.py +23 -13
  167. snappy/horoviewer.py +7 -7
  168. snappy/hyperboloid/__init__.py +96 -31
  169. snappy/hyperboloid/distances.py +245 -0
  170. snappy/hyperboloid/horoball.py +19 -0
  171. snappy/hyperboloid/line.py +35 -0
  172. snappy/hyperboloid/point.py +9 -0
  173. snappy/hyperboloid/triangle.py +29 -0
  174. snappy/isometry_signature.py +382 -0
  175. snappy/len_spec/__init__.py +596 -0
  176. snappy/len_spec/geodesic_info.py +110 -0
  177. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  178. snappy/len_spec/geodesic_piece.py +143 -0
  179. snappy/len_spec/geometric_structure.py +182 -0
  180. snappy/len_spec/geometry.py +80 -0
  181. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  182. snappy/len_spec/spine.py +206 -0
  183. snappy/len_spec/test.py +24 -0
  184. snappy/len_spec/test_cases.py +69 -0
  185. snappy/len_spec/tile.py +275 -0
  186. snappy/len_spec/word.py +86 -0
  187. snappy/math_basics.py +39 -13
  188. snappy/matrix.py +52 -9
  189. snappy/number.py +12 -6
  190. snappy/numeric_output_checker.py +2 -3
  191. snappy/pari.py +8 -4
  192. snappy/phone_home.py +2 -1
  193. snappy/polyviewer.py +8 -8
  194. snappy/ptolemy/__init__.py +1 -1
  195. snappy/ptolemy/component.py +2 -2
  196. snappy/ptolemy/coordinates.py +25 -25
  197. snappy/ptolemy/findLoops.py +9 -9
  198. snappy/ptolemy/manifoldMethods.py +27 -29
  199. snappy/ptolemy/polynomial.py +50 -57
  200. snappy/ptolemy/processFileBase.py +60 -0
  201. snappy/ptolemy/ptolemyVariety.py +109 -41
  202. snappy/ptolemy/reginaWrapper.py +4 -4
  203. snappy/ptolemy/rur.py +1 -1
  204. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
  205. snappy/ptolemy/test.py +99 -54
  206. snappy/ptolemy/utilities.py +1 -1
  207. snappy/raytracing/__init__.py +64 -0
  208. snappy/raytracing/additional_horospheres.py +64 -0
  209. snappy/raytracing/additional_len_spec_choices.py +63 -0
  210. snappy/raytracing/cohomology_fractal.py +0 -3
  211. snappy/raytracing/eyeball.py +123 -0
  212. snappy/raytracing/finite_raytracing_data.py +17 -17
  213. snappy/raytracing/finite_viewer.py +15 -15
  214. snappy/raytracing/geodesic_tube_info.py +93 -63
  215. snappy/raytracing/geodesics.py +94 -64
  216. snappy/raytracing/geodesics_window.py +56 -34
  217. snappy/raytracing/gui_utilities.py +21 -6
  218. snappy/raytracing/hyperboloid_navigation.py +29 -4
  219. snappy/raytracing/hyperboloid_utilities.py +73 -73
  220. snappy/raytracing/ideal_raytracing_data.py +121 -91
  221. snappy/raytracing/inside_viewer.py +199 -66
  222. snappy/raytracing/pack.py +22 -0
  223. snappy/raytracing/raytracing_data.py +37 -25
  224. snappy/raytracing/raytracing_view.py +70 -65
  225. snappy/raytracing/shaders/Eye.png +0 -0
  226. snappy/raytracing/shaders/NonGeometric.png +0 -0
  227. snappy/raytracing/shaders/__init__.py +39 -3
  228. snappy/raytracing/shaders/fragment.glsl +451 -133
  229. snappy/raytracing/test.py +29 -0
  230. snappy/raytracing/tooltip.py +146 -0
  231. snappy/raytracing/upper_halfspace_utilities.py +42 -9
  232. snappy/sage_helper.py +67 -134
  233. snappy/settings.py +90 -77
  234. snappy/shell.py +2 -0
  235. snappy/snap/character_varieties.py +2 -2
  236. snappy/snap/find_field.py +4 -3
  237. snappy/snap/fundamental_polyhedron.py +2 -2
  238. snappy/snap/kernel_structures.py +5 -1
  239. snappy/snap/nsagetools.py +9 -8
  240. snappy/snap/peripheral/dual_cellulation.py +4 -3
  241. snappy/snap/peripheral/peripheral.py +2 -2
  242. snappy/snap/peripheral/surface.py +5 -5
  243. snappy/snap/peripheral/test.py +1 -1
  244. snappy/snap/polished_reps.py +8 -8
  245. snappy/snap/slice_obs_HKL.py +16 -14
  246. snappy/snap/t3mlite/arrow.py +3 -3
  247. snappy/snap/t3mlite/edge.py +3 -3
  248. snappy/snap/t3mlite/homology.py +2 -2
  249. snappy/snap/t3mlite/mcomplex.py +3 -3
  250. snappy/snap/t3mlite/simplex.py +12 -0
  251. snappy/snap/t3mlite/spun.py +18 -17
  252. snappy/snap/t3mlite/test_vs_regina.py +4 -4
  253. snappy/snap/test.py +37 -53
  254. snappy/snap/utilities.py +4 -5
  255. snappy/test.py +121 -138
  256. snappy/test_cases.py +263 -0
  257. snappy/testing.py +131 -0
  258. snappy/tiling/__init__.py +2 -0
  259. snappy/tiling/canonical_key_dict.py +59 -0
  260. snappy/tiling/dict_based_set.py +79 -0
  261. snappy/tiling/floor.py +49 -0
  262. snappy/tiling/hyperboloid_dict.py +54 -0
  263. snappy/tiling/iter_utils.py +78 -0
  264. snappy/tiling/lifted_tetrahedron.py +22 -0
  265. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  266. snappy/tiling/real_hash_dict.py +164 -0
  267. snappy/tiling/test.py +23 -0
  268. snappy/tiling/tile.py +215 -0
  269. snappy/tiling/triangle.py +33 -0
  270. snappy/tkterminal.py +113 -84
  271. snappy/twister/main.py +1 -7
  272. snappy/twister/twister_core.cp311-win_amd64.pyd +0 -0
  273. snappy/upper_halfspace/__init__.py +78 -17
  274. snappy/verify/__init__.py +3 -7
  275. snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
  276. snappy/verify/complex_volume/adjust_torsion.py +1 -2
  277. snappy/verify/complex_volume/closed.py +13 -13
  278. snappy/verify/complex_volume/cusped.py +6 -6
  279. snappy/verify/complex_volume/extended_bloch.py +5 -8
  280. snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
  281. snappy/verify/edge_equations.py +80 -0
  282. snappy/verify/exceptions.py +0 -55
  283. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
  284. snappy/verify/interval_newton_shapes_engine.py +7 -5
  285. snappy/verify/interval_tree.py +5 -5
  286. snappy/verify/krawczyk_shapes_engine.py +17 -18
  287. snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
  288. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
  289. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
  290. snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
  291. snappy/verify/shapes.py +5 -3
  292. snappy/verify/short_slopes.py +39 -41
  293. snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
  294. snappy/verify/test.py +57 -60
  295. snappy/verify/upper_halfspace/extended_matrix.py +1 -1
  296. snappy/verify/upper_halfspace/finite_point.py +3 -4
  297. snappy/verify/upper_halfspace/ideal_point.py +9 -9
  298. snappy/verify/volume.py +2 -2
  299. snappy/version.py +2 -2
  300. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +26 -11
  301. snappy-3.2.dist-info/RECORD +503 -0
  302. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  303. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  304. snappy/__pycache__/__init__.cpython-311.pyc +0 -0
  305. snappy/__pycache__/browser.cpython-311.pyc +0 -0
  306. snappy/__pycache__/cache.cpython-311.pyc +0 -0
  307. snappy/__pycache__/database.cpython-311.pyc +0 -0
  308. snappy/__pycache__/db_utilities.cpython-311.pyc +0 -0
  309. snappy/__pycache__/decorated_isosig.cpython-311.pyc +0 -0
  310. snappy/__pycache__/exceptions.cpython-311.pyc +0 -0
  311. snappy/__pycache__/export_stl.cpython-311.pyc +0 -0
  312. snappy/__pycache__/filedialog.cpython-311.pyc +0 -0
  313. snappy/__pycache__/gui.cpython-311.pyc +0 -0
  314. snappy/__pycache__/horoviewer.cpython-311.pyc +0 -0
  315. snappy/__pycache__/math_basics.cpython-311.pyc +0 -0
  316. snappy/__pycache__/matrix.cpython-311.pyc +0 -0
  317. snappy/__pycache__/number.cpython-311.pyc +0 -0
  318. snappy/__pycache__/numeric_output_checker.cpython-311.pyc +0 -0
  319. snappy/__pycache__/pari.cpython-311.pyc +0 -0
  320. snappy/__pycache__/polyviewer.cpython-311.pyc +0 -0
  321. snappy/__pycache__/sage_helper.cpython-311.pyc +0 -0
  322. snappy/__pycache__/version.cpython-311.pyc +0 -0
  323. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  324. snappy/doc/_static/jquery-3.6.0.js +0 -10881
  325. snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
  326. snappy/doc/_static/js/html5shiv.min.js +0 -4
  327. snappy/doc/_static/underscore-1.13.1.js +0 -2042
  328. snappy/doc/_static/underscore.js +0 -6
  329. snappy/doc/verify_canon.html +0 -304
  330. snappy/drilling/__pycache__/__init__.cpython-311.pyc +0 -0
  331. snappy/drilling/__pycache__/constants.cpython-311.pyc +0 -0
  332. snappy/drilling/__pycache__/crush.cpython-311.pyc +0 -0
  333. snappy/drilling/__pycache__/cusps.cpython-311.pyc +0 -0
  334. snappy/drilling/__pycache__/debug.cpython-311.pyc +0 -0
  335. snappy/drilling/__pycache__/epsilons.cpython-311.pyc +0 -0
  336. snappy/drilling/__pycache__/exceptions.cpython-311.pyc +0 -0
  337. snappy/drilling/__pycache__/fixed_points.cpython-311.pyc +0 -0
  338. snappy/drilling/__pycache__/geodesic_info.cpython-311.pyc +0 -0
  339. snappy/drilling/__pycache__/geodesic_tube.cpython-311.pyc +0 -0
  340. snappy/drilling/__pycache__/geometric_structure.cpython-311.pyc +0 -0
  341. snappy/drilling/__pycache__/line.cpython-311.pyc +0 -0
  342. snappy/drilling/__pycache__/moves.cpython-311.pyc +0 -0
  343. snappy/drilling/__pycache__/peripheral_curves.cpython-311.pyc +0 -0
  344. snappy/drilling/__pycache__/perturb.cpython-311.pyc +0 -0
  345. snappy/drilling/__pycache__/quotient_space.cpython-311.pyc +0 -0
  346. snappy/drilling/__pycache__/spatial_dict.cpython-311.pyc +0 -0
  347. snappy/drilling/__pycache__/subdivide.cpython-311.pyc +0 -0
  348. snappy/drilling/__pycache__/tracing.cpython-311.pyc +0 -0
  349. snappy/drilling/geodesic_tube.py +0 -441
  350. snappy/drilling/geometric_structure.py +0 -366
  351. snappy/drilling/line.py +0 -122
  352. snappy/drilling/quotient_space.py +0 -94
  353. snappy/drilling/spatial_dict.py +0 -128
  354. snappy/exterior_to_link/__pycache__/__init__.cpython-311.pyc +0 -0
  355. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-311.pyc +0 -0
  356. snappy/exterior_to_link/__pycache__/exceptions.cpython-311.pyc +0 -0
  357. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-311.pyc +0 -0
  358. snappy/exterior_to_link/__pycache__/link_projection.cpython-311.pyc +0 -0
  359. snappy/exterior_to_link/__pycache__/main.cpython-311.pyc +0 -0
  360. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-311.pyc +0 -0
  361. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-311.pyc +0 -0
  362. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-311.pyc +0 -0
  363. snappy/exterior_to_link/__pycache__/pl_utils.cpython-311.pyc +0 -0
  364. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-311.pyc +0 -0
  365. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-311.pyc +0 -0
  366. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-311.pyc +0 -0
  367. snappy/exterior_to_link/__pycache__/stored_moves.cpython-311.pyc +0 -0
  368. snappy/hyperboloid/__pycache__/__init__.cpython-311.pyc +0 -0
  369. snappy/manifolds/__pycache__/__init__.cpython-311.pyc +0 -0
  370. snappy/ptolemy/__pycache__/__init__.cpython-311.pyc +0 -0
  371. snappy/ptolemy/__pycache__/component.cpython-311.pyc +0 -0
  372. snappy/ptolemy/__pycache__/coordinates.cpython-311.pyc +0 -0
  373. snappy/ptolemy/__pycache__/fieldExtensions.cpython-311.pyc +0 -0
  374. snappy/ptolemy/__pycache__/findLoops.cpython-311.pyc +0 -0
  375. snappy/ptolemy/__pycache__/homology.cpython-311.pyc +0 -0
  376. snappy/ptolemy/__pycache__/manifoldMethods.cpython-311.pyc +0 -0
  377. snappy/ptolemy/__pycache__/matrix.cpython-311.pyc +0 -0
  378. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-311.pyc +0 -0
  379. snappy/ptolemy/__pycache__/polynomial.cpython-311.pyc +0 -0
  380. snappy/ptolemy/__pycache__/processComponents.cpython-311.pyc +0 -0
  381. snappy/ptolemy/__pycache__/processFileBase.cpython-311.pyc +0 -0
  382. snappy/ptolemy/__pycache__/processFileDispatch.cpython-311.pyc +0 -0
  383. snappy/ptolemy/__pycache__/processMagmaFile.cpython-311.pyc +0 -0
  384. snappy/ptolemy/__pycache__/processRurFile.cpython-311.pyc +0 -0
  385. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-311.pyc +0 -0
  386. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-311.pyc +0 -0
  387. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-311.pyc +0 -0
  388. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-311.pyc +0 -0
  389. snappy/ptolemy/__pycache__/rur.cpython-311.pyc +0 -0
  390. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-311.pyc +0 -0
  391. snappy/ptolemy/__pycache__/utilities.cpython-311.pyc +0 -0
  392. snappy/snap/__pycache__/__init__.cpython-311.pyc +0 -0
  393. snappy/snap/__pycache__/character_varieties.cpython-311.pyc +0 -0
  394. snappy/snap/__pycache__/fundamental_polyhedron.cpython-311.pyc +0 -0
  395. snappy/snap/__pycache__/interval_reps.cpython-311.pyc +0 -0
  396. snappy/snap/__pycache__/kernel_structures.cpython-311.pyc +0 -0
  397. snappy/snap/__pycache__/mcomplex_base.cpython-311.pyc +0 -0
  398. snappy/snap/__pycache__/nsagetools.cpython-311.pyc +0 -0
  399. snappy/snap/__pycache__/polished_reps.cpython-311.pyc +0 -0
  400. snappy/snap/__pycache__/shapes.cpython-311.pyc +0 -0
  401. snappy/snap/__pycache__/slice_obs_HKL.cpython-311.pyc +0 -0
  402. snappy/snap/__pycache__/utilities.cpython-311.pyc +0 -0
  403. snappy/snap/peripheral/__pycache__/__init__.cpython-311.pyc +0 -0
  404. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-311.pyc +0 -0
  405. snappy/snap/peripheral/__pycache__/link.cpython-311.pyc +0 -0
  406. snappy/snap/peripheral/__pycache__/peripheral.cpython-311.pyc +0 -0
  407. snappy/snap/peripheral/__pycache__/surface.cpython-311.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/__init__.cpython-311.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/arrow.cpython-311.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/corner.cpython-311.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/edge.cpython-311.pyc +0 -0
  412. snappy/snap/t3mlite/__pycache__/face.cpython-311.pyc +0 -0
  413. snappy/snap/t3mlite/__pycache__/files.cpython-311.pyc +0 -0
  414. snappy/snap/t3mlite/__pycache__/homology.cpython-311.pyc +0 -0
  415. snappy/snap/t3mlite/__pycache__/linalg.cpython-311.pyc +0 -0
  416. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-311.pyc +0 -0
  417. snappy/snap/t3mlite/__pycache__/perm4.cpython-311.pyc +0 -0
  418. snappy/snap/t3mlite/__pycache__/simplex.cpython-311.pyc +0 -0
  419. snappy/snap/t3mlite/__pycache__/spun.cpython-311.pyc +0 -0
  420. snappy/snap/t3mlite/__pycache__/surface.cpython-311.pyc +0 -0
  421. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-311.pyc +0 -0
  422. snappy/snap/t3mlite/__pycache__/vertex.cpython-311.pyc +0 -0
  423. snappy/togl/__init__.py +0 -3
  424. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  425. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  426. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  427. snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
  428. snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
  429. snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
  430. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  431. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  432. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  433. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  434. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  435. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  436. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  437. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  438. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  439. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  440. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  441. snappy/twister/__pycache__/__init__.cpython-311.pyc +0 -0
  442. snappy/twister/__pycache__/main.cpython-311.pyc +0 -0
  443. snappy/upper_halfspace/__pycache__/__init__.cpython-311.pyc +0 -0
  444. snappy/upper_halfspace/__pycache__/ideal_point.cpython-311.pyc +0 -0
  445. snappy/verify/__pycache__/__init__.cpython-311.pyc +0 -0
  446. snappy/verify/__pycache__/cuspCrossSection.cpython-311.pyc +0 -0
  447. snappy/verify/__pycache__/cuspTranslations.cpython-311.pyc +0 -0
  448. snappy/verify/__pycache__/cusp_areas.cpython-311.pyc +0 -0
  449. snappy/verify/__pycache__/cusp_shapes.cpython-311.pyc +0 -0
  450. snappy/verify/__pycache__/exceptions.cpython-311.pyc +0 -0
  451. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-311.pyc +0 -0
  452. snappy/verify/__pycache__/interval_tree.cpython-311.pyc +0 -0
  453. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-311.pyc +0 -0
  454. snappy/verify/__pycache__/realAlgebra.cpython-311.pyc +0 -0
  455. snappy/verify/__pycache__/shapes.cpython-311.pyc +0 -0
  456. snappy/verify/__pycache__/short_slopes.cpython-311.pyc +0 -0
  457. snappy/verify/__pycache__/squareExtensions.cpython-311.pyc +0 -0
  458. snappy/verify/__pycache__/verifyCanonical.cpython-311.pyc +0 -0
  459. snappy/verify/__pycache__/verifyHyperbolicity.cpython-311.pyc +0 -0
  460. snappy/verify/__pycache__/volume.cpython-311.pyc +0 -0
  461. snappy/verify/complex_volume/__pycache__/__init__.cpython-311.pyc +0 -0
  462. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-311.pyc +0 -0
  463. snappy/verify/complex_volume/__pycache__/closed.cpython-311.pyc +0 -0
  464. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-311.pyc +0 -0
  465. snappy/verify/complex_volume/__pycache__/cusped.cpython-311.pyc +0 -0
  466. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-311.pyc +0 -0
  467. snappy/verify/cuspCrossSection.py +0 -1422
  468. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-311.pyc +0 -0
  469. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-311.pyc +0 -0
  470. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-311.pyc +0 -0
  471. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-311.pyc +0 -0
  472. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-311.pyc +0 -0
  473. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-311.pyc +0 -0
  474. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-311.pyc +0 -0
  475. snappy-3.1.1.dist-info/RECORD +0 -575
  476. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
snappy/__init__.py CHANGED
@@ -3,14 +3,18 @@
3
3
  # logging.basicConfig(filename='example.log',level=logging.DEBUG)
4
4
  # logging.debug('This message should go to the log file')
5
5
  import sys
6
- from .SnapPy import (AbelianGroup, HolonomyGroup, FundamentalGroup,
7
- DirichletDomain, CuspNeighborhood, SymmetryGroup,
8
- AlternatingKnotExteriors, NonalternatingKnotExteriors,
6
+ from .SnapPy import (AbelianGroup,
7
+ FundamentalGroup,
8
+ SymmetryGroup,
9
+ Isometry,
10
+ AlternatingKnotExteriors,
11
+ NonalternatingKnotExteriors,
9
12
  pari)
10
- from .exceptions import SnapPeaFatalError, InsufficientPrecisionError
11
13
  from .SnapPy import DirichletDomain
12
14
  from .SnapPyHP import DirichletDomain as DirichletDomainHP
15
+ from .SnapPy import CuspNeighborhood
13
16
  from .SnapPyHP import CuspNeighborhood as CuspNeighborhoodHP
17
+ from .SnapPy import HolonomyGroup
14
18
  from .SnapPyHP import HolonomyGroup as HolonomyGroupHP
15
19
 
16
20
  from .SnapPy import Triangulation as _TriangulationLP
@@ -23,18 +27,56 @@ import time
23
27
  from .SnapPy import set_rand_seed
24
28
  set_rand_seed(int(time.time()))
25
29
 
30
+ from .exceptions import (SnapPeaFatalError,
31
+ InsufficientPrecisionError,
32
+ NonorientableManifoldError)
26
33
 
34
+ from typing import Union, Tuple, List, Optional
35
+
36
+ # Subclass to be able to monkey-patch
27
37
  class Triangulation(_TriangulationLP):
28
38
  __doc__ = _TriangulationLP.__doc__
29
39
 
30
-
40
+ # Subclass to be able to monkey-patch
31
41
  class TriangulationHP(_TriangulationHP):
32
42
  __doc__ = _TriangulationHP.__doc__
33
43
 
34
-
35
- class Manifold(_ManifoldLP):
44
+ # We want Manifold to be a subclass of Triangulation.
45
+ # Unfortunately, that introduces a diamond pattern here.
46
+ # Luckily, the python resolves methods and bases classes
47
+ # in the presence of a diamond pattern seem to work just
48
+ # fine. In particular, we do not double allocate the underlying
49
+ # C structures.
50
+ class Manifold(_ManifoldLP, Triangulation):
36
51
  __doc__ = _ManifoldLP.__doc__
37
52
 
53
+ def identify(self, extends_to_link=False):
54
+ """
55
+ Looks for the manifold in all of the SnapPy databases.
56
+ For hyperbolic manifolds this is done by searching for isometries:
57
+
58
+ >>> M = Manifold('m125')
59
+ >>> M.identify()
60
+ [m125(0,0)(0,0), L13n5885(0,0)(0,0), ooct01_00000(0,0)(0,0)]
61
+
62
+ By default, there is no restriction on the isometries. One can
63
+ require that the isometry take meridians to meridians. This
64
+ might return fewer results:
65
+
66
+ >>> M.identify(extends_to_link=True)
67
+ [m125(0,0)(0,0), ooct01_00000(0,0)(0,0)]
68
+
69
+ For closed manifolds, extends_to_link doesn't make sense
70
+ because of how the kernel code works:
71
+
72
+ >>> C = Manifold("m015(1,2)")
73
+ >>> C.identify()
74
+ [m006(-5,2)]
75
+ >>> C.identify(True)
76
+ []
77
+ """
78
+ return self._identify(extends_to_link)
79
+
38
80
  def high_precision(self):
39
81
  """
40
82
  Return a high precision version of this manifold.
@@ -59,15 +101,9 @@ class Manifold(_ManifoldLP):
59
101
  def low_precision(self):
60
102
  return self.copy()
61
103
 
62
- def is_isometric_to(self, other, return_isometries=False):
63
- __doc__ = _ManifoldLP.is_isometric_to.__doc__
64
- if other.__class__ is ManifoldHP:
65
- return _ManifoldHP.is_isometric_to(self.high_precision(), other,
66
- return_isometries)
67
- return _ManifoldLP.is_isometric_to(self, other, return_isometries)
68
-
69
-
70
- class ManifoldHP(_ManifoldHP):
104
+ # We want ManifoldHP to be a subclass of TriangulationHP.
105
+ # See comment about Manifold and the diamond pattern.
106
+ class ManifoldHP(_ManifoldHP, TriangulationHP):
71
107
  __doc__ = _ManifoldHP.__doc__
72
108
 
73
109
  def low_precision(self):
@@ -95,13 +131,6 @@ class ManifoldHP(_ManifoldHP):
95
131
  def high_precision(self):
96
132
  return self.copy()
97
133
 
98
- def is_isometric_to(self, other, return_isometries=False):
99
- __doc__ = _ManifoldHP.is_isometric_to.__doc__
100
- if other.__class__ is Manifold:
101
- return _ManifoldHP.is_isometric_to(self, other.high_precision(),
102
- return_isometries)
103
- return _ManifoldHP.is_isometric_to(self, other, return_isometries)
104
-
105
134
  def identify(self, extends_to_link=False):
106
135
  """
107
136
  Looks for the manifold in all of the SnapPy databases.
@@ -128,7 +157,7 @@ class ManifoldHP(_ManifoldHP):
128
157
  []
129
158
 
130
159
  """
131
- return self.low_precision().identify(extends_to_link)
160
+ return self.low_precision()._identify(extends_to_link)
132
161
 
133
162
 
134
163
  SnapPy._manifold_class = Manifold
@@ -144,7 +173,75 @@ __all__ = ['Triangulation', 'Manifold', 'ManifoldHP', 'AbelianGroup',
144
173
  'InsufficientPrecisionError',
145
174
  'pari', 'twister', ]
146
175
 
147
- from .sage_helper import _within_sage
176
+ def _symmetrize_high_precision_manifold(
177
+ mfd1 : Union[Manifold, ManifoldHP],
178
+ mfd2 : Union[Manifold, ManifoldHP]
179
+ ) -> Union[Tuple[Manifold, Manifold],
180
+ Tuple[ManifoldHP, ManifoldHP]]:
181
+ """
182
+ Given a (potential) mix of two Manifold and ManifoldHP,
183
+ promote one to high precision if necessary and return
184
+ the result as pair.
185
+ """
186
+ resolved_mfd1 = mfd1
187
+ resolved_mfd2 = mfd2
188
+ high1 = isinstance(mfd1, ManifoldHP)
189
+ high2 = isinstance(mfd2, ManifoldHP)
190
+ if high1 and not high2:
191
+ resolved_mfd2 = ManifoldHP(mfd2)
192
+ if high2 and not high1:
193
+ resolved_mfd1 = ManifoldHP(mfd1)
194
+ return (resolved_mfd1, resolved_mfd2)
195
+
196
+ def _symmetrize_low_precision_triangulation(
197
+ tri1 : Union[Triangulation, TriangulationHP],
198
+ tri2 : Union[Triangulation, TriangulationHP]
199
+ ) -> Union[Tuple[Triangulation, Triangulation],
200
+ Tuple[TriangulationHP, TriangulationHP]]:
201
+ """
202
+ Given a (potential) mix of two Triangulation and TriangulationHP,
203
+ demote one to low precision if necessary and return
204
+ the result as pair.
205
+ """
206
+ resolved_tri1 = tri1
207
+ resolved_tri2 = tri2
208
+ low1 = isinstance(tri1, Triangulation)
209
+ low2 = isinstance(tri2, Triangulation)
210
+ if low1 and not low2:
211
+ resolved_tri2 = Triangulation(tri2, remove_finite_vertices=False)
212
+ if low2 and not low1:
213
+ resolved_tri1 = Triangulation(tri1, remove_finite_vertices=False)
214
+ return (resolved_tri1, resolved_tri2)
215
+
216
+ def is_isometric_to(self,
217
+ other : Union[Manifold, ManifoldHP],
218
+ return_isometries : bool = False
219
+ ) -> Union[bool, List[Isometry]]:
220
+ resolved_self, resolved_other = (
221
+ _symmetrize_high_precision_manifold(
222
+ self, other))
223
+
224
+ return resolved_self._is_isometric_to(
225
+ resolved_other,
226
+ return_isometries=return_isometries)
227
+
228
+ is_isometric_to.__doc__ = _ManifoldLP._is_isometric_to.__doc__
229
+ Manifold.is_isometric_to = is_isometric_to
230
+ ManifoldHP.is_isometric_to = is_isometric_to
231
+
232
+ def isomorphisms_to(self,
233
+ other : Union[Triangulation, TriangulationHP]
234
+ ) -> List[Isometry]:
235
+ resolved_self, resolved_other = (
236
+ _symmetrize_low_precision_triangulation(
237
+ self, other))
238
+
239
+ return resolved_self._isomorphisms_to(
240
+ resolved_other)
241
+
242
+ isomorphisms_to.__doc__ = _TriangulationLP._isomorphisms_to.__doc__
243
+ Triangulation.isomorphisms_to = isomorphisms_to
244
+ TriangulationHP.isomorphisms_to = isomorphisms_to
148
245
 
149
246
  from . import snap
150
247
  snap.add_methods(Manifold)
@@ -162,283 +259,108 @@ from . import verify
162
259
  Manifold.verify_hyperbolicity = verify.verify_hyperbolicity
163
260
  ManifoldHP.verify_hyperbolicity = verify.verify_hyperbolicity
164
261
 
262
+ from . import len_spec
263
+ Manifold.length_spectrum_alt_gen = len_spec.length_spectrum_alt_gen
264
+ ManifoldHP.length_spectrum_alt_gen = len_spec.length_spectrum_alt_gen
265
+ Manifold.length_spectrum_alt = len_spec.length_spectrum_alt
266
+ ManifoldHP.length_spectrum_alt = len_spec.length_spectrum_alt
165
267
 
166
- def canonical_retriangulation(
167
- manifold, verified=False,
168
- interval_bits_precs=verify.default_interval_bits_precs,
169
- exact_bits_prec_and_degrees=verify.default_exact_bits_prec_and_degrees,
170
- verbose=False):
171
- """
172
- The canonical retriangulation which is closely related to the canonical
173
- cell decomposition and described in more detail `here
174
- <verify.html#the-canonical-retriangulation-and-the-isometry-signature>`_::
175
-
176
- >>> M = Manifold("m412")
177
- >>> K = M.canonical_retriangulation()
178
- >>> len(K.isomorphisms_to(K)) # Unverified size of the isometry group.
179
- 8
180
-
181
- When used inside `Sage <http://sagemath.org/>`_ and ``verified = True`` is
182
- passed as argument, the verify module will certify the result to be
183
- correct::
184
-
185
- sage: M = Manifold("m412")
186
- sage: K = M.canonical_retriangulation(verified = True)
187
- sage: len(K.isomorphisms_to(K)) # Verified size of the isometry group.
188
- 8
189
-
190
- See :py:meth:`verify.verified_canonical_retriangulation` for the
191
- additional options.
192
- """
193
- if False in manifold.cusp_info('complete?'):
194
- raise ValueError('Canonical retriangulation needs all cusps to be complete')
195
-
196
- if verified:
197
- return verify.verified_canonical_retriangulation(
198
- manifold,
199
- interval_bits_precs=interval_bits_precs,
200
- exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
201
- verbose=verbose)
202
- else:
203
- return manifold._canonical_retriangulation()
204
-
205
-
206
- Manifold.canonical_retriangulation = canonical_retriangulation
207
- ManifoldHP.canonical_retriangulation = canonical_retriangulation
208
-
268
+ from . import canonical
269
+ Manifold.canonical_retriangulation = canonical.canonical_retriangulation
270
+ ManifoldHP.canonical_retriangulation = canonical.canonical_retriangulation_hp
209
271
 
210
- def isometry_signature(
211
- manifold, of_link=False, verified=False,
212
- interval_bits_precs=verify.default_interval_bits_precs,
213
- exact_bits_prec_and_degrees=verify.default_exact_bits_prec_and_degrees,
214
- verbose=False):
215
- """
216
- The isomorphism signature of the canonical retriangulation. This is a
217
- complete invariant of the isometry type of a hyperbolic 3-manifold and
218
- described in more detail `here
219
- <verify.html#the-canonical-retriangulation-and-the-isometry-signature>`_::
220
-
221
- >>> M = Manifold("m125")
222
- >>> M.isometry_signature() # Unverified isometry signature
223
- 'gLLPQccdefffqffqqof'
224
-
225
- When used inside `Sage <http://sagemath.org/>`_ and ``verified = True`` is
226
- passed as argument, the verify module will certify the result to be
227
- correct::
228
-
229
- sage: M = Manifold("m125")
230
- sage: M.isometry_signature(verified = True) # Verified isometry signature
231
- 'gLLPQccdefffqffqqof'
232
-
233
- When ``of_link = True`` is specified, the peripheral curves are included in
234
- such a way that the result is a complete invariant of a link. In particular,
235
- ``isometry_signature(of_link=True)`` is invariant under changing the
236
- ordering or orientations of the components or flipping all crossings of a
237
- link simultaneously (it passes ``ignore_cusp_order = True,
238
- ignore_curve_orientations = True`` to
239
- :py:meth:`Manifold.triangulation_isosig`)::
240
-
241
- >>> Manifold("5^2_1").isometry_signature(of_link = True)
242
- 'eLPkbdcddhgggb_baCbbaCb'
243
- >>> Manifold("7^2_8").isometry_signature(of_link = True)
244
- 'eLPkbdcddhgggb_bBcBbaCb'
245
-
246
- See :py:meth:`verify.verified_canonical_retriangulation` for the
247
- additional options.
248
-
249
- Note that interval methods cannot verify a canonical retriangulation
250
- with non-tetrahedral cells such as in the cas of ``m412``, so the following
251
- call returns ``None``::
252
-
253
- sage: M = Manifold("m412")
254
- sage: M.isometry_signature(verified = True, exact_bits_prec_and_degrees = None)
255
-
256
- """
257
- if False in manifold.cusp_info('complete?'):
258
- raise ValueError('isometry_signature needs all cusps to be complete')
259
-
260
- retrig = manifold.canonical_retriangulation(
261
- verified=verified,
262
- interval_bits_precs=interval_bits_precs,
263
- exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
264
- verbose=verbose)
265
-
266
- if not retrig:
267
- return None
268
-
269
- return retrig.triangulation_isosig(decorated=of_link,
270
- ignore_cusp_ordering=True,
271
- ignore_curve_orientations=True)
272
+ from . import isometry_signature
272
273
 
274
+ Manifold.isometry_signature = isometry_signature.isometry_signature
275
+ ManifoldHP.isometry_signature = isometry_signature.isometry_signature
273
276
 
274
- Manifold.isometry_signature = isometry_signature
275
- ManifoldHP.isometry_signature = isometry_signature
277
+ from .cusps import cusp_area_matrix
276
278
 
279
+ Manifold.cusp_area_matrix = cusp_area_matrix.cusp_area_matrix
280
+ ManifoldHP.cusp_area_matrix = cusp_area_matrix.cusp_area_matrix
277
281
 
278
- def cusp_area_matrix(manifold, method='trigDependentTryCanonize',
279
- verified=False, bits_prec=None):
280
- r"""
281
- This function returns a matrix that can be used to check whether
282
- cusp neighborhoods of areas a\ :sub:`0`\ , ..., a\ :sub:`m-1` are
283
- disjoint: the cusp neighborhoods about cusp i and j are
284
- disjoint (respectively, the cusp neighborhood embeds if i and j
285
- are equal) if a\ :sub:`i` * a\ :sub:`j` is less than or equal to
286
- the entry (i,j) of the cusp area matrix. Note that the "if"
287
- becomes "if and only if" if we pick the "maximal cusp area
288
- matrix".
289
-
290
- This function can operate in different ways (determined by
291
- ``method``). By default (``method='trigDependentTryCanonize'``),
292
- it returns a result which can be suboptimal and non-deterministic
293
- but is quicker to compute and sufficies for many applications::
294
-
295
- >>> M = Manifold("s776")
296
- >>> M.cusp_area_matrix() # doctest: +NUMERIC12
297
- [28.0000000000000 7.00000000000000 6.99999999999999]
298
- [7.00000000000000 21.4375000000000 7.00000000000000]
299
- [6.99999999999999 7.00000000000000 21.4375000000000]
300
-
301
- If ``method='maximal'`` is specified, the result is the "maximal
302
- cusp area matrix", thus it is optimal and an invariant of the
303
- manifold with labeled cusps. Note that the "maximal cusp area
304
- matrix" is only available as verified computation and thus
305
- requires passing ``verified = True``::
306
-
307
- sage: M.cusp_area_matrix(method = 'maximal', verified=True) # doctest: +NUMERIC6
308
- [28.0000000000? 7.0000000000? 7.0000000000?]
309
- [ 7.0000000000? 28.000000000? 7.00000000000?]
310
- [ 7.0000000000? 7.00000000000? 28.00000000?]
311
-
312
- If ``verified = True`` is specified and ``method`` is not
313
- ``maximal``, the entries are all guaranteed to be less than the
314
- corresponding ones in the maximal cusp area matrix (more
315
- precisely, the lower end point of the interval is guaranteed to be
316
- less than the true value of the corresponding maximal cusp area
317
- matrix entry)::
318
-
319
- sage: M.cusp_area_matrix(verified=True, bits_prec=70) # doctest: +NUMERIC15
320
- [ 28.000000000000000? 7.0000000000000000? 7.0000000000000000?]
321
- [ 7.0000000000000000? 21.4375000000000000? 7.0000000000000000?]
322
- [ 7.0000000000000000? 7.0000000000000000? 21.4375000000000000?]
323
-
324
- For expert users:
325
-
326
- Besides the two values above, ``method`` can be ``trigDependent``:
327
- this result is also fast to compute by making the assumption that
328
- cusp neighborhoods are not only disjoint but also in "standard
329
- form" with respect to the triangulation (i.e., when lifting of a
330
- cusp neighborhood to a horoball in the universal cover, it
331
- intersects a geodesic tetrahedron in three but not four
332
- faces). ``trigDependentTryCanonize`` is similar to
333
- ``trigDependent`` but tries to "proto-canonize" (a copy of) the
334
- triangulation first since this often produces a matrix that is
335
- closer to the maximal cusp area matrix, for example::
336
-
337
- >>> M = Manifold("o9_35953")
338
- >>> M.cusp_area_matrix(method = 'trigDependent') # doctest: +NUMERIC9
339
- [72.9848715318467 12.7560424258060]
340
- [12.7560424258060 6.65567118002656]
341
- >>> M.cusp_area_matrix(method = 'trigDependentTryCanonize') # doctest: +NUMERIC9
342
- [72.9848715318466 12.7560424258060]
343
- [12.7560424258060 62.1043047674605]
344
-
345
- Compare to maximal area matrix::
346
-
347
- sage: M.cusp_area_matrix(method = 'maximal', verified = True, bits_prec = 100) # doctest: +NUMERIC15
348
- [ 72.984871531846664? 12.7560424258059765562778?]
349
- [12.7560424258059765562778? 62.104304767460978078?]
282
+ from .cusps import cusp_areas_from_matrix
350
283
 
284
+ def cusp_areas(manifold,
285
+ policy : str = 'unbiased',
286
+ method : str = 'maximal',
287
+ verified : bool = False,
288
+ bits_prec : Optional[int] = None,
289
+ first_cusps : List[int] = []):
351
290
  """
291
+ Returns a list of areas, one for each cusp. The cusp neighborhoods
292
+ defined by these areas are embedded and disjoint. Furthermore, these
293
+ neighborhoods are maximal in that they fail to be embedded or
294
+ disjoint if any cusp neighborhood is enlarged (unless :attr:`method`
295
+ is set to a value different from the default).
352
296
 
353
- if method == 'maximal':
354
- if not verified:
355
- raise NotImplementedError("Maximal cusp area matrix only "
356
- "available as verified computation. "
357
- "Pass verified = True.")
358
- return verify.verified_maximal_cusp_area_matrix(
359
- manifold, bits_prec=bits_prec)
360
- if method in ['trigDependent', 'trigDependentTryCanonize']:
361
- if method == 'trigDependentTryCanonize':
362
- manifold = manifold.copy()
363
- manifold.canonize()
364
-
365
- return verify.triangulation_dependent_cusp_area_matrix(
366
- manifold, verified=verified, bits_prec=bits_prec)
367
-
368
- raise ValueError("method passed to cusp_area_matrix must be "
369
- "'trigDependent', 'trigDependentTryCanonize', "
370
- "or 'maximal'.")
297
+ There are different policies how these cusp neighborhoods are found.
371
298
 
372
-
373
- Manifold.cusp_area_matrix = cusp_area_matrix
374
- ManifoldHP.cusp_area_matrix = cusp_area_matrix
375
-
376
- from .verify import cusp_areas as verify_cusp_areas
377
-
378
-
379
- def cusp_areas(manifold, policy='unbiased',
380
- method='trigDependentTryCanonize',
381
- verified=False, bits_prec=None, first_cusps=[]):
382
- """
383
- Picks areas for the cusps such that the corresponding cusp
384
- neighborhoods are disjoint. By default, the ``policy`` is
385
- ``unbiased`` which means that the cusp neighborhoods are blown up
386
- simultaneously with a cusp neighborhood stopping to grow when it
387
- touches another cusp neighborhood or itself::
299
+ The default :attr:`policy` is ``unbiased``. This means that the
300
+ cusp neighborhoods are blown up simultaneously and a cusp neighborhood
301
+ stops growing when it touches any cusp neighborhood including itself::
388
302
 
389
303
  >>> M = Manifold("s776")
390
304
  >>> M.cusp_areas() # doctest: +NUMERIC9
391
305
  [2.64575131106459, 2.64575131106459, 2.64575131106459]
392
306
 
393
- Alternatively, ``policy='greedy'`` means that the first cusp
394
- neighborhood is blown up until it touches itself, then the second
395
- cusp neighborhood is blown up until it touches itself or the first
396
- cusp neighborhood, ...::
307
+ Alternatively, :attr:`policy='greedy'` can be specified. This means
308
+ that the first cusp neighborhood is blown up until it touches itself,
309
+ then the second cusp neighborhood is blown up until it touches itself
310
+ or the first cusp neighborhood, and so on::
397
311
 
398
312
  >>> M.cusp_areas(policy='greedy') # doctest: +NUMERIC9
399
313
  [5.29150262212918, 1.32287565553230, 1.32287565553229]
400
314
 
401
- To specify cusps to be blown up first, and in which order to blow
402
- them up, set ``first_cusps`` to the appropriate list of cusps.
315
+ Use :attr:`first_cusps` to specify the order in which the cusp
316
+ neighborhoods are blown up::
403
317
 
404
- >>> M = Manifold('o9_44210')
405
- >>> M.cusp_areas(policy='greedy') # doctest: +NUMERIC9
406
- [7.053940530873898, 3.2712450270, 2.7091590087]
407
- >>> M.cusp_areas(policy='greedy', first_cusps=[]) # doctest: +NUMERIC9
408
- [7.053940530873898, 3.2712450270, 2.7091590087]
409
- >>> M.cusp_areas(policy='greedy', first_cusps=[0,]) # doctest: +NUMERIC9
410
- [7.053940530873898, 3.2712450270, 2.7091590087]
411
- >>> M.cusp_areas(policy='greedy', first_cusps=[0,1]) # doctest: +NUMERIC9
412
- [7.053940530873898, 3.2712450270, 2.7091590087]
413
- >>> M.cusp_areas(policy='greedy', first_cusps=[0,1,2]) # doctest: +NUMERIC9
414
- [7.053940530873898, 3.2712450270, 2.7091590087]
415
- >>> M.cusp_areas(policy='greedy', first_cusps=[0,2,1]) # doctest: +NUMERIC9
416
- [7.053940530873898, 2.3513135103, 3.7690945490]
417
- >>> M.cusp_areas(policy='greedy', first_cusps=[1,]) # doctest: +NUMERIC9
418
- [4.0302253322, 5.725527974287718, 1.5478612583]
419
-
420
- ``cusp_areas`` is implemented using
421
- :py:meth:`Manifold.cusp_area_matrix` and the same arguments
422
- (``method``, ``verified``, ``bits_prec``) are accepted. For
423
- example, verified computations are supported::
424
-
425
- sage: M=Manifold("v2854")
426
- sage: M.cusp_areas(verified=True) # doctest: +NUMERIC9
427
- [3.6005032476?, 3.6005032476?]
318
+ >>> M.cusp_areas(policy='greedy', first_cusps=[1,0,2]) # doctest: +NUMERIC9
319
+ [1.32287565553230, 5.29150262212918, 1.32287565553229]
320
+
321
+ An incomplete list can be given to :attr:`first_cusps`. In this case,
322
+ the list is automatically completed by appending the remaining cusps in
323
+ order. Thus, the above call is equivalent to::
324
+
325
+ >>> M.cusp_areas(policy='greedy', first_cusps=[1]) # doctest: +NUMERIC9
326
+ [1.32287565553230, 5.29150262212918, 1.32287565553229]
428
327
 
429
- If ``method='maximal'``, ``policy='unbiased'`` and
430
- ``verified=True``, the result is an invariant of the manifold with
431
- labeled cusps and the corresponding cusp neighborhoods are maximal
432
- in that every cusp neighborhood is touching some (not necessarily
433
- distinct) cusp neighborhood.
328
+ Under the hood, this method is using
329
+ :meth:`~snappy.Manifold.cusp_area_matrix`.
434
330
 
435
- Area of the cusp neighborhood touching itself for a one-cusped
436
- manifold::
331
+ **Verified computation**
437
332
 
438
- sage: M=Manifold("v1959")
439
- sage: M.cusp_areas(method='maximal', verified=True, bits_prec=100) # doctest: +NUMERIC15
440
- [7.15679216175810579?]
333
+ If :attr:`verified = False`, floating-point issues can arise resulting in
334
+ incorrect values. The method can be made
335
+ :ref:`verified <verify-primer>` by passing :attr:`verified = True`::
441
336
 
337
+ sage: M=Manifold("s776")
338
+ sage: M.cusp_areas(verified=True) # doctest: +NUMERIC9
339
+ [2.64575131107?, 2.64575131107?, 2.64575131107?]
340
+
341
+ :param verified:
342
+ Use :ref:`verified computation <verify-primer>`.
343
+ :param bits_prec:
344
+ Precision used for computation. Increase if computation
345
+ did not succeed or a more precise result is desired.
346
+ :param method:
347
+ Passed to :meth:`~snappy.Manifold.cusp_area_matrix`. If set
348
+ to a value different from the default ``maximal``, the cusp
349
+ neighborhoods stop growing when the corresponding value
350
+ in the computed cusp area matrix is exceeded. At this point,
351
+ the cusp neighborhood might not necessarily touch any other
352
+ cusp neighborhood since we do not use the maximal cusp area
353
+ matrix.
354
+ :param policy:
355
+ Specifies process of choosing cusp neighborhoods.
356
+ Either ``unbiased`` or ``greedy``, see above.
357
+ :param first_cusps:
358
+ Preference order of cusps.
359
+ Only relevant if :attr:`policy='greedy'`, see above.
360
+ :return:
361
+ Areas of maximal embedded and disjoint cusp neighborhoods
362
+ (default). Or areas of some embedded and disjoint cusp
363
+ neighborhoods (if :attr:`method` switches to older algorithm).
442
364
  """
443
365
  if policy not in ['unbiased', 'greedy']:
444
366
  raise ValueError("policy passed to cusp_areas must be 'unbiased' "
@@ -448,10 +370,9 @@ def cusp_areas(manifold, policy='unbiased',
448
370
  method=method, verified=verified, bits_prec=bits_prec)
449
371
 
450
372
  if policy == 'unbiased':
451
- return verify_cusp_areas.unbiased_cusp_areas_from_cusp_area_matrix(m)
373
+ return cusp_areas_from_matrix.unbiased_cusp_areas_from_cusp_area_matrix(m)
452
374
  else:
453
- return verify_cusp_areas.greedy_cusp_areas_from_cusp_area_matrix(m, first_cusps=first_cusps)
454
-
375
+ return cusp_areas_from_matrix.greedy_cusp_areas_from_cusp_area_matrix(m, first_cusps=first_cusps)
455
376
 
456
377
  Manifold.cusp_areas = cusp_areas
457
378
  ManifoldHP.cusp_areas = cusp_areas
@@ -461,26 +382,29 @@ from .verify import short_slopes as verify_short_slopes
461
382
 
462
383
  def short_slopes(manifold,
463
384
  length=6,
464
- policy='unbiased', method='trigDependentTryCanonize',
465
- verified=False, bits_prec=None, first_cusps=[]):
385
+ policy : str = 'unbiased',
386
+ method : str = 'maximal',
387
+ verified : bool = False,
388
+ bits_prec : Optional[int] = None,
389
+ first_cusps : List[int] = []):
466
390
  """
467
- Picks disjoint cusp neighborhoods (using
468
- :py:meth:`Manifold.cusp_areas`, thus the same arguments can be
469
- used) and returns for each cusp the slopes that have length less
470
- or equal to given ``length`` (defaults to 6) when measured on the
471
- boundary of the cusp neighborhood::
391
+ Returns a list of short slopes (for Dehn-fillings) for each cusp.
392
+
393
+ That is, the method uses :meth:`~snappy.Manifold.cusp_areas` to find
394
+ (maximal) embedded and disjoint cusp neighborhoods. It uses the boundaries
395
+ of these cusp neighborhoods to measure the length of a peripheral curve.
396
+ For each cusp, it determines all simple peripheral curves shorter than
397
+ the given :attr:`length` (which defaults to 6). The result is a list
398
+ of the corresponding slopes for each cusp::
472
399
 
473
400
  >>> M = Manifold("otet20_00022")
474
401
  >>> M.short_slopes()
475
402
  [[(1, 0), (-1, 1), (0, 1)], [(1, 0)]]
476
403
 
477
- When ``verified=True``, the result is guaranteed
478
- to contain all slopes of length less or equal to given ``length``
479
- (and could contain additional slopes if precision is not high
480
- enough)::
404
+ It takes the same arguments as :meth:`~snappy.Manifold.cusp_areas`::
481
405
 
482
- sage: M.short_slopes(verified = True)
483
- [[(1, 0), (-1, 1), (0, 1)], [(1, 0)]]
406
+ >>> M.short_slopes(policy = 'greedy')
407
+ [[(1, 0)], [(1, 0)]]
484
408
 
485
409
  The ten exceptional slopes of the figure-eight knot::
486
410
 
@@ -488,12 +412,28 @@ def short_slopes(manifold,
488
412
  >>> M.short_slopes()
489
413
  [[(1, 0), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]
490
414
 
491
- Two more slopes appear when increasing length to 2 pi::
415
+ Two more slopes appear when increasing length to :math:`2\\pi`::
492
416
 
493
417
  >>> M.short_slopes(length = 6.283185307179586)
494
418
  [[(1, 0), (-5, 1), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]]
495
419
 
496
- When using verified computations, ``length`` is converted into the ``RealIntervalField`` of requested precision::
420
+ **Verified computation**
421
+
422
+ If :attr:`verified = False`, floating-point issues can arise resulting in
423
+ incorrect values. The method can be made
424
+ :ref:`verified <verify-primer>` by passing :attr:`verified = True`::
425
+
426
+ sage: M = Manifold("4_1")
427
+ sage: M.short_slopes(verified = True)
428
+ [[(1, 0), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]
429
+
430
+ If :attr:`verified = True`, the result is guaranteed to contain all short
431
+ slopes and might contain additional slopes (with lengths slightly longer
432
+ than the given :attr:`length` but this could not be proven using the
433
+ interval estimates).
434
+
435
+ The given :attr:`length` is cast to a SageMath ``RealIntervalField`` of the
436
+ given precision if :attr:`verified = True`::
497
437
 
498
438
  sage: from sage.all import pi
499
439
  sage: M.short_slopes(length = 2 * pi, verified = True, bits_prec = 100)
@@ -516,42 +456,43 @@ Manifold.short_slopes = short_slopes
516
456
  ManifoldHP.short_slopes = short_slopes
517
457
 
518
458
 
519
- def cusp_translations(manifold, policy='unbiased',
520
- method='trigDependentTryCanonize',
521
- verified=False, bits_prec=None, first_cusps=[]):
459
+ def cusp_translations(manifold,
460
+ policy : str = 'unbiased',
461
+ method : str = 'maximal',
462
+ verified : bool = False,
463
+ bits_prec : Optional[int] = None,
464
+ first_cusps : List[int] = []):
522
465
  """
523
- Picks disjoint cusp neighborhoods and returns the respective
524
- (complex) Euclidean translations of the meridian and longitude for
525
- each cusp. The method takes the same arguments as
526
- :py:meth:`Manifold.cusp_areas` and uses that method to pick the
527
- cusp neighborhood. The result is a list of pairs, the second entry
528
- corresponding to a longitude is always real::
466
+ Returns a list of the (complex) Euclidean translations corresponding to the
467
+ meridian and longitude of each cusp.
468
+
469
+ That is, the method uses :meth:`~snappy.Manifold.cusp_areas` to find
470
+ (maximal) embedded and disjoint cusp neighborhoods. It then uses the
471
+ boundaries of these cusp neighborhoods to measure the meridian and
472
+ longitude of each cusp. The result is a pair for each cusp. The first
473
+ entry of the pair corresponds to the meridian and is complex. The
474
+ second entry corresponds to the longitude and is always real::
529
475
 
530
476
  >>> M = Manifold("s776")
531
477
  >>> M.cusp_translations() # doctest: +NUMERIC9
532
478
  [(0.500000000000000 + 1.32287565553230*I, 2.00000000000000), (0.500000000000000 + 1.32287565553230*I, 2.00000000000000), (0.499999999999999 + 1.32287565553230*I, 2.00000000000000)]
533
479
 
534
- Arguments such as ``policy='greedy'`` are interpreted the same way as
535
- for :py:meth:`Manifold.cusp_areas`::
480
+ It takes the same arguments as :meth:`~snappy.Manifold.cusp_areas`::
536
481
 
537
- >>> M.cusp_translations(policy = 'greedy', first_cusps = [], bits_prec = 100) # doctest: +NUMERIC21
482
+ >>> M.cusp_translations(policy = 'greedy') # doctest: +NUMERIC9
538
483
  [(0.70710678118654752440084436210 + 1.8708286933869706927918743662*I, 2.8284271247461900976033774484), (0.35355339059327376220042218105 + 0.93541434669348534639593718308*I, 1.4142135623730950488016887242), (0.35355339059327376220042218105 + 0.93541434669348534639593718308*I, 1.4142135623730950488016887242)]
539
484
 
540
- and can return verified intervals::
541
-
542
- sage: M.cusp_translations(method = 'maximal', verified = True) # doctest: +NUMERIC9
543
- [(0.50000000000? + 1.32287565553?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?)]
544
-
545
- that are guaranteed to contain the true translations of cusp neighborhoods
546
- verified to be disjoint (the element corresponding to a longitude
547
- is always in a ``RealIntervalField``).
485
+ **Verified computations**
548
486
 
549
- **Remark:** The default ``method = 'trigDependentTryCanonize'`` is
550
- (potentially) non-deterministic and thus the result of
487
+ If :attr:`verified = False`, floating-point issues can arise resulting in
488
+ incorrect values. The method can be made
489
+ :ref:`verified <verify-primer>` by passing :attr:`verified = True`::
551
490
 
552
- [ M.cusp_translations()[i] for i in range(M.num_cusps()) ]
491
+ sage: M.cusp_translations(verified = True) # doctest: +NUMERIC9
492
+ [(0.50000000000? + 1.32287565553?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?), (0.500000000000? + 1.32287565554?*I, 2.00000000000?)]
553
493
 
554
- might not correspond to disjoint cusp neighborhoods.
494
+ Note that the first element of each pair is a SageMath ``ComplexIntervalField`` and
495
+ the second element a ``RealIntervalField``.
555
496
  """
556
497
 
557
498
  return [
@@ -572,31 +513,44 @@ ManifoldHP.cusp_translations = cusp_translations
572
513
  def complex_volume(manifold, verified_modulo_2_torsion=False,
573
514
  bits_prec=None):
574
515
  """
575
- Returns the complex volume, i.e.
576
- volume + i 2 pi^2 (chern simons)
577
-
578
- >>> M = Manifold('5_2')
579
- >>> M.complex_volume() # doctest: +NUMERIC6
580
- 2.82812209 - 3.02412838*I
581
- >>> c = M.chern_simons()
582
- >>> M.dehn_fill((1,2))
583
- >>> M.complex_volume() # doctest: +NUMERIC6
584
- 2.22671790 + 1.52619361*I
585
- >>> M = Manifold("3_1")
586
- >>> cvol = M.complex_volume()
587
- >>> cvol.real() # doctest: +NUMERIC6
588
- 0
589
- >>> cvol.imag() # doctest: +NUMERIC6
590
- -1.64493407
516
+ Returns the complex volume modulo :math:`i \\pi^2` which is given by
517
+
518
+ .. math::
519
+ \\text{vol} + i \\text{CS}
520
+
521
+ where :math:`\\text{CS}` is the (unnormalized) Chern-Simons invariant.
522
+
523
+ >>> M = Manifold('5_2')
524
+ >>> M.complex_volume() # doctest: +NUMERIC6
525
+ 2.82812209 - 3.02412838*I
526
+
527
+ Note that :meth:`chern_simons <snappy.Manifold.chern_simons>`
528
+ normalizes the Chern-Simons invariant by dividing it by
529
+ :math:`2 \\pi^2 = 19.7392...` ::
530
+
531
+ >>> M.chern_simons() # doctest: +NUMERIC6
532
+ -0.153204133297152
533
+
534
+ More examples::
535
+
536
+ >>> M.dehn_fill((1,2))
537
+ >>> M.complex_volume() # doctest: +NUMERIC6
538
+ 2.22671790 + 1.52619361*I
539
+ >>> M = Manifold("3_1") # A non-hyperbolic example.
540
+ >>> cvol = M.complex_volume()
541
+ >>> cvol.real() # doctest: +NUMERIC6
542
+ 0
543
+ >>> cvol.imag() # doctest: +NUMERIC6
544
+ -1.64493407
591
545
 
592
546
  If no cusp is filled or there is only one cusped (filled or
593
547
  unfilled), the complex volume can be verified up to multiples
594
- of i pi^2 / 2 by passing `verified_modulo_2_torsion = True`
595
- when inside SageMath (and higher precision can be requested
596
- with `bits_prec`)::
548
+ of :math:`i \\pi^2 /2` by passing ``verified_modulo_2_torsion = True``
549
+ when inside SageMath. Higher precision can be requested
550
+ with ``bits_prec``::
597
551
 
598
552
  sage: M = Manifold("m015")
599
- sage: M.complex_volume(verified_modulo_2_torsion=True, bits_prec = 90) # doctest: +NUMERIC24
553
+ sage: M.complex_volume(verified_modulo_2_torsion=True, bits_prec = 93) # doctest: +NUMERIC21
600
554
  2.828122088330783162764? + 1.910673824035377649698?*I
601
555
  sage: M = Manifold("m015(3,4)")
602
556
  sage: M.complex_volume(verified_modulo_2_torsion=True) # doctest: +NUMERIC6
@@ -614,7 +568,6 @@ def complex_volume(manifold, verified_modulo_2_torsion=False,
614
568
 
615
569
  return manifold._complex_volume()
616
570
 
617
-
618
571
  Manifold.complex_volume = complex_volume
619
572
  ManifoldHP.complex_volume = complex_volume
620
573
 
@@ -622,67 +575,10 @@ from . import drilling
622
575
  drilling._add_methods(Manifold)
623
576
  drilling._add_methods(ManifoldHP, high_precision=True)
624
577
 
625
- try:
626
- from .gui import ViewerWindow
627
- from .raytracing.inside_viewer import InsideViewer
628
- from .raytracing.inside_viewer import NonorientableUnsupportedError
629
- from .raytracing import cohomology_fractal
630
- except ImportError as e:
631
- InsideViewer = None
632
- _importErrorRaytracing = str(e)
633
-
634
-
635
- def manifold_inside_view(self, cohomology_class=None, geodesics=[]):
636
- """
637
- Show raytraced inside view of hyperbolic manifold. See
638
- `images <https://im.icerm.brown.edu/portfolio/snappy-views/>`_
639
- and `demo video <https://youtu.be/CAERhmUCkRs>`_.
640
-
641
- >>> M = Manifold("m004")
642
- >>> M.inside_view() #doctest: +CYMODERNOPENGL
643
-
644
- Or show the cohomology fractal:
645
-
646
- >>> M = Manifold("m004")
647
- >>> M.inside_view(cohomology_class = 0) #doctest: +CYMODERNOPENGL
648
-
649
- The cohomology class in H^2(M, bd M; R) producing the cohomology
650
- fractal can be specified as a cocycle or using an automatically computed
651
- basis (of, say, length ``n``). Thus, ``cohomology_class`` can be one of
652
- the following.
653
-
654
- - An integer ``i`` between 0 and ``n`` - 1 to pick the ``i``-th basis
655
- vector.
656
- - An array of length ``n`` specifying the cohomology class as linear
657
- combination of basis vectors.
658
- - A weight for each face of each tetrahedron.
659
-
660
- """
661
-
662
- if InsideViewer is None:
663
- raise RuntimeError("Raytraced inside view not imported; "
664
- "Tk or CyOpenGL is probably missing "
665
- "(original error : %s)" % _importErrorRaytracing)
666
-
667
- if not self.is_orientable():
668
- raise NonorientableUnsupportedError(self)
669
-
670
- weights, cohomology_basis, cohomology_class = (
671
- cohomology_fractal.compute_weights_basis_class(
672
- self, cohomology_class))
673
-
674
- return ViewerWindow(
675
- InsideViewer,
676
- self,
677
- title="Inside view of %s" % self.name(),
678
- weights=weights,
679
- cohomology_basis=cohomology_basis,
680
- cohomology_class=cohomology_class,
681
- geodesics=geodesics)
682
-
578
+ from . import raytracing
683
579
 
684
- Manifold.inside_view = manifold_inside_view
685
- ManifoldHP.inside_view = manifold_inside_view
580
+ Manifold.inside_view = raytracing.inside_view
581
+ ManifoldHP.inside_view = raytracing.inside_view
686
582
 
687
583
 
688
584
  def all_translations(self, verified=False, bits_prec=None):
@@ -742,7 +638,7 @@ def all_translations(self, verified=False, bits_prec=None):
742
638
  """
743
639
 
744
640
  if verified or bits_prec:
745
- # Use the implementation in verify.cuspTranslations that uses
641
+ # Use the implementation in verify.cusp_translations that uses
746
642
  # tetrahedra_shapes and ComplexCuspNeighborhood
747
643
  return verify.cusp_translations_for_neighborhood(
748
644
  self, verified=verified, bits_prec=bits_prec)
@@ -761,6 +657,7 @@ from . import twister
761
657
 
762
658
  from . import database
763
659
  database.Manifold = Manifold
660
+ database.Triangulation = Triangulation
764
661
  snappy_module = sys.modules[__name__]
765
662
  database_objects = []
766
663
  known_manifold_packages = [('snappy_manifolds', True),