snappy 3.1.1__cp312-cp312-macosx_11_0_arm64.whl → 3.2__cp312-cp312-macosx_11_0_arm64.whl

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