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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (464) hide show
  1. snappy/CyOpenGL.cpython-311-darwin.so +0 -0
  2. snappy/SnapPy.cpython-311-darwin.so +0 -0
  3. snappy/SnapPyHP.cpython-311-darwin.so +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/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 +23 -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 +2 -3
  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/pygments.css +1 -0
  65. snappy/doc/_static/searchtools.js +125 -71
  66. snappy/doc/_static/sphinx_highlight.js +13 -3
  67. snappy/doc/additional_classes.html +291 -122
  68. snappy/doc/bugs.html +17 -20
  69. snappy/doc/censuses.html +34 -53
  70. snappy/doc/credits.html +18 -21
  71. snappy/doc/development.html +88 -68
  72. snappy/doc/genindex.html +66 -145
  73. snappy/doc/index.html +86 -31
  74. snappy/doc/installing.html +164 -182
  75. snappy/doc/manifold.html +1168 -556
  76. snappy/doc/manifoldhp.html +18 -21
  77. snappy/doc/news.html +91 -33
  78. snappy/doc/objects.inv +0 -0
  79. snappy/doc/other.html +20 -22
  80. snappy/doc/platonic_census.html +31 -34
  81. snappy/doc/plink.html +19 -22
  82. snappy/doc/ptolemy.html +20 -22
  83. snappy/doc/ptolemy_classes.html +102 -105
  84. snappy/doc/ptolemy_examples1.html +34 -36
  85. snappy/doc/ptolemy_examples2.html +28 -31
  86. snappy/doc/ptolemy_examples3.html +26 -29
  87. snappy/doc/ptolemy_examples4.html +20 -23
  88. snappy/doc/ptolemy_prelim.html +25 -28
  89. snappy/doc/py-modindex.html +16 -19
  90. snappy/doc/screenshots.html +22 -24
  91. snappy/doc/search.html +15 -18
  92. snappy/doc/searchindex.js +1 -1
  93. snappy/doc/snap.html +18 -21
  94. snappy/doc/snappy.html +18 -20
  95. snappy/doc/spherogram.html +84 -87
  96. snappy/doc/todo.html +17 -20
  97. snappy/doc/triangulation.html +324 -215
  98. snappy/doc/tutorial.html +17 -20
  99. snappy/doc/verify.html +100 -46
  100. snappy/doc/verify_internals.html +106 -563
  101. snappy/drilling/__init__.py +153 -235
  102. snappy/drilling/barycentric.py +103 -0
  103. snappy/drilling/constants.py +0 -2
  104. snappy/drilling/crush.py +56 -130
  105. snappy/drilling/cusps.py +12 -6
  106. snappy/drilling/debug.py +2 -1
  107. snappy/drilling/exceptions.py +7 -40
  108. snappy/drilling/moves.py +302 -243
  109. snappy/drilling/perturb.py +63 -37
  110. snappy/drilling/shorten.py +36 -0
  111. snappy/drilling/subdivide.py +0 -5
  112. snappy/drilling/test.py +23 -0
  113. snappy/drilling/test_cases.py +126 -0
  114. snappy/drilling/tracing.py +9 -37
  115. snappy/exceptions.py +18 -5
  116. snappy/exterior_to_link/barycentric_geometry.py +2 -4
  117. snappy/exterior_to_link/main.py +8 -7
  118. snappy/exterior_to_link/mcomplex_with_link.py +2 -2
  119. snappy/exterior_to_link/rational_linear_algebra.py +1 -1
  120. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
  121. snappy/exterior_to_link/test.py +21 -33
  122. snappy/geometric_structure/__init__.py +212 -0
  123. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  124. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  125. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  126. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  127. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  128. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  129. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  130. snappy/geometric_structure/geodesic/__init__.py +0 -0
  131. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  132. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  133. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  134. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  135. snappy/geometric_structure/geodesic/constants.py +6 -0
  136. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  137. snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
  138. snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
  139. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  140. snappy/geometric_structure/geodesic/line.py +30 -0
  141. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  142. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  143. snappy/geometric_structure/test.py +22 -0
  144. snappy/gui.py +23 -13
  145. snappy/horoviewer.py +7 -7
  146. snappy/hyperboloid/__init__.py +96 -31
  147. snappy/hyperboloid/distances.py +245 -0
  148. snappy/hyperboloid/horoball.py +19 -0
  149. snappy/hyperboloid/line.py +35 -0
  150. snappy/hyperboloid/point.py +9 -0
  151. snappy/hyperboloid/triangle.py +29 -0
  152. snappy/isometry_signature.py +382 -0
  153. snappy/len_spec/__init__.py +596 -0
  154. snappy/len_spec/geodesic_info.py +110 -0
  155. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  156. snappy/len_spec/geodesic_piece.py +143 -0
  157. snappy/len_spec/geometric_structure.py +182 -0
  158. snappy/len_spec/geometry.py +80 -0
  159. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  160. snappy/len_spec/spine.py +206 -0
  161. snappy/len_spec/test.py +24 -0
  162. snappy/len_spec/test_cases.py +69 -0
  163. snappy/len_spec/tile.py +275 -0
  164. snappy/len_spec/word.py +86 -0
  165. snappy/math_basics.py +39 -13
  166. snappy/matrix.py +52 -9
  167. snappy/number.py +12 -6
  168. snappy/numeric_output_checker.py +2 -3
  169. snappy/pari.py +8 -4
  170. snappy/phone_home.py +2 -1
  171. snappy/polyviewer.py +8 -8
  172. snappy/ptolemy/__init__.py +1 -1
  173. snappy/ptolemy/component.py +2 -2
  174. snappy/ptolemy/coordinates.py +25 -25
  175. snappy/ptolemy/findLoops.py +9 -9
  176. snappy/ptolemy/manifoldMethods.py +27 -29
  177. snappy/ptolemy/polynomial.py +50 -57
  178. snappy/ptolemy/processFileBase.py +60 -0
  179. snappy/ptolemy/ptolemyVariety.py +109 -41
  180. snappy/ptolemy/reginaWrapper.py +4 -4
  181. snappy/ptolemy/rur.py +1 -1
  182. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
  183. snappy/ptolemy/test.py +99 -54
  184. snappy/ptolemy/utilities.py +1 -1
  185. snappy/raytracing/__init__.py +64 -0
  186. snappy/raytracing/additional_horospheres.py +64 -0
  187. snappy/raytracing/additional_len_spec_choices.py +63 -0
  188. snappy/raytracing/cohomology_fractal.py +0 -3
  189. snappy/raytracing/eyeball.py +123 -0
  190. snappy/raytracing/finite_raytracing_data.py +17 -17
  191. snappy/raytracing/finite_viewer.py +15 -15
  192. snappy/raytracing/geodesic_tube_info.py +93 -63
  193. snappy/raytracing/geodesics.py +94 -64
  194. snappy/raytracing/geodesics_window.py +56 -34
  195. snappy/raytracing/gui_utilities.py +21 -6
  196. snappy/raytracing/hyperboloid_navigation.py +29 -4
  197. snappy/raytracing/hyperboloid_utilities.py +73 -73
  198. snappy/raytracing/ideal_raytracing_data.py +121 -91
  199. snappy/raytracing/inside_viewer.py +199 -66
  200. snappy/raytracing/pack.py +22 -0
  201. snappy/raytracing/raytracing_data.py +37 -25
  202. snappy/raytracing/raytracing_view.py +70 -65
  203. snappy/raytracing/shaders/Eye.png +0 -0
  204. snappy/raytracing/shaders/NonGeometric.png +0 -0
  205. snappy/raytracing/shaders/__init__.py +39 -3
  206. snappy/raytracing/shaders/fragment.glsl +451 -133
  207. snappy/raytracing/test.py +29 -0
  208. snappy/raytracing/tooltip.py +146 -0
  209. snappy/raytracing/upper_halfspace_utilities.py +42 -9
  210. snappy/sage_helper.py +67 -134
  211. snappy/settings.py +90 -77
  212. snappy/shell.py +2 -0
  213. snappy/snap/character_varieties.py +2 -2
  214. snappy/snap/find_field.py +4 -3
  215. snappy/snap/fundamental_polyhedron.py +2 -2
  216. snappy/snap/kernel_structures.py +5 -1
  217. snappy/snap/nsagetools.py +9 -8
  218. snappy/snap/peripheral/dual_cellulation.py +4 -3
  219. snappy/snap/peripheral/peripheral.py +2 -2
  220. snappy/snap/peripheral/surface.py +5 -5
  221. snappy/snap/peripheral/test.py +1 -1
  222. snappy/snap/polished_reps.py +8 -8
  223. snappy/snap/slice_obs_HKL.py +16 -14
  224. snappy/snap/t3mlite/arrow.py +3 -3
  225. snappy/snap/t3mlite/edge.py +3 -3
  226. snappy/snap/t3mlite/homology.py +2 -2
  227. snappy/snap/t3mlite/mcomplex.py +3 -3
  228. snappy/snap/t3mlite/simplex.py +12 -0
  229. snappy/snap/t3mlite/spun.py +18 -17
  230. snappy/snap/t3mlite/test_vs_regina.py +4 -4
  231. snappy/snap/test.py +37 -53
  232. snappy/snap/utilities.py +4 -5
  233. snappy/test.py +121 -138
  234. snappy/test_cases.py +263 -0
  235. snappy/testing.py +131 -0
  236. snappy/tiling/__init__.py +2 -0
  237. snappy/tiling/canonical_key_dict.py +59 -0
  238. snappy/tiling/dict_based_set.py +79 -0
  239. snappy/tiling/floor.py +49 -0
  240. snappy/tiling/hyperboloid_dict.py +54 -0
  241. snappy/tiling/iter_utils.py +78 -0
  242. snappy/tiling/lifted_tetrahedron.py +22 -0
  243. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  244. snappy/tiling/real_hash_dict.py +164 -0
  245. snappy/tiling/test.py +23 -0
  246. snappy/tiling/tile.py +215 -0
  247. snappy/tiling/triangle.py +33 -0
  248. snappy/tkterminal.py +113 -84
  249. snappy/twister/main.py +1 -7
  250. snappy/twister/twister_core.cpython-311-darwin.so +0 -0
  251. snappy/upper_halfspace/__init__.py +78 -17
  252. snappy/verify/__init__.py +3 -7
  253. snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
  254. snappy/verify/complex_volume/adjust_torsion.py +1 -2
  255. snappy/verify/complex_volume/closed.py +13 -13
  256. snappy/verify/complex_volume/cusped.py +6 -6
  257. snappy/verify/complex_volume/extended_bloch.py +5 -8
  258. snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
  259. snappy/verify/edge_equations.py +80 -0
  260. snappy/verify/exceptions.py +0 -55
  261. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
  262. snappy/verify/interval_newton_shapes_engine.py +7 -5
  263. snappy/verify/interval_tree.py +5 -5
  264. snappy/verify/krawczyk_shapes_engine.py +17 -18
  265. snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
  266. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
  267. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
  268. snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
  269. snappy/verify/shapes.py +5 -3
  270. snappy/verify/short_slopes.py +39 -41
  271. snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
  272. snappy/verify/test.py +57 -60
  273. snappy/verify/upper_halfspace/extended_matrix.py +1 -1
  274. snappy/verify/upper_halfspace/finite_point.py +3 -4
  275. snappy/verify/upper_halfspace/ideal_point.py +9 -9
  276. snappy/verify/volume.py +2 -2
  277. snappy/version.py +2 -2
  278. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +26 -11
  279. snappy-3.2.dist-info/RECORD +503 -0
  280. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  281. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  282. snappy/__pycache__/__init__.cpython-311.pyc +0 -0
  283. snappy/__pycache__/browser.cpython-311.pyc +0 -0
  284. snappy/__pycache__/cache.cpython-311.pyc +0 -0
  285. snappy/__pycache__/database.cpython-311.pyc +0 -0
  286. snappy/__pycache__/db_utilities.cpython-311.pyc +0 -0
  287. snappy/__pycache__/decorated_isosig.cpython-311.pyc +0 -0
  288. snappy/__pycache__/exceptions.cpython-311.pyc +0 -0
  289. snappy/__pycache__/export_stl.cpython-311.pyc +0 -0
  290. snappy/__pycache__/filedialog.cpython-311.pyc +0 -0
  291. snappy/__pycache__/gui.cpython-311.pyc +0 -0
  292. snappy/__pycache__/horoviewer.cpython-311.pyc +0 -0
  293. snappy/__pycache__/infowindow.cpython-311.pyc +0 -0
  294. snappy/__pycache__/math_basics.cpython-311.pyc +0 -0
  295. snappy/__pycache__/matrix.cpython-311.pyc +0 -0
  296. snappy/__pycache__/number.cpython-311.pyc +0 -0
  297. snappy/__pycache__/numeric_output_checker.cpython-311.pyc +0 -0
  298. snappy/__pycache__/pari.cpython-311.pyc +0 -0
  299. snappy/__pycache__/polyviewer.cpython-311.pyc +0 -0
  300. snappy/__pycache__/sage_helper.cpython-311.pyc +0 -0
  301. snappy/__pycache__/version.cpython-311.pyc +0 -0
  302. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  303. snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
  304. snappy/doc/_static/js/html5shiv.min.js +0 -4
  305. snappy/doc/verify_canon.html +0 -304
  306. snappy/drilling/__pycache__/__init__.cpython-311.pyc +0 -0
  307. snappy/drilling/__pycache__/constants.cpython-311.pyc +0 -0
  308. snappy/drilling/__pycache__/crush.cpython-311.pyc +0 -0
  309. snappy/drilling/__pycache__/cusps.cpython-311.pyc +0 -0
  310. snappy/drilling/__pycache__/debug.cpython-311.pyc +0 -0
  311. snappy/drilling/__pycache__/epsilons.cpython-311.pyc +0 -0
  312. snappy/drilling/__pycache__/exceptions.cpython-311.pyc +0 -0
  313. snappy/drilling/__pycache__/fixed_points.cpython-311.pyc +0 -0
  314. snappy/drilling/__pycache__/geodesic_info.cpython-311.pyc +0 -0
  315. snappy/drilling/__pycache__/geodesic_tube.cpython-311.pyc +0 -0
  316. snappy/drilling/__pycache__/geometric_structure.cpython-311.pyc +0 -0
  317. snappy/drilling/__pycache__/line.cpython-311.pyc +0 -0
  318. snappy/drilling/__pycache__/moves.cpython-311.pyc +0 -0
  319. snappy/drilling/__pycache__/peripheral_curves.cpython-311.pyc +0 -0
  320. snappy/drilling/__pycache__/perturb.cpython-311.pyc +0 -0
  321. snappy/drilling/__pycache__/quotient_space.cpython-311.pyc +0 -0
  322. snappy/drilling/__pycache__/spatial_dict.cpython-311.pyc +0 -0
  323. snappy/drilling/__pycache__/subdivide.cpython-311.pyc +0 -0
  324. snappy/drilling/__pycache__/tracing.cpython-311.pyc +0 -0
  325. snappy/drilling/geodesic_tube.py +0 -441
  326. snappy/drilling/geometric_structure.py +0 -366
  327. snappy/drilling/line.py +0 -122
  328. snappy/drilling/quotient_space.py +0 -94
  329. snappy/drilling/spatial_dict.py +0 -128
  330. snappy/exterior_to_link/__pycache__/__init__.cpython-311.pyc +0 -0
  331. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-311.pyc +0 -0
  332. snappy/exterior_to_link/__pycache__/exceptions.cpython-311.pyc +0 -0
  333. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-311.pyc +0 -0
  334. snappy/exterior_to_link/__pycache__/link_projection.cpython-311.pyc +0 -0
  335. snappy/exterior_to_link/__pycache__/main.cpython-311.pyc +0 -0
  336. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-311.pyc +0 -0
  337. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-311.pyc +0 -0
  338. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-311.pyc +0 -0
  339. snappy/exterior_to_link/__pycache__/pl_utils.cpython-311.pyc +0 -0
  340. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-311.pyc +0 -0
  341. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-311.pyc +0 -0
  342. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-311.pyc +0 -0
  343. snappy/exterior_to_link/__pycache__/stored_moves.cpython-311.pyc +0 -0
  344. snappy/hyperboloid/__pycache__/__init__.cpython-311.pyc +0 -0
  345. snappy/manifolds/__pycache__/__init__.cpython-311.pyc +0 -0
  346. snappy/ptolemy/__pycache__/__init__.cpython-311.pyc +0 -0
  347. snappy/ptolemy/__pycache__/component.cpython-311.pyc +0 -0
  348. snappy/ptolemy/__pycache__/coordinates.cpython-311.pyc +0 -0
  349. snappy/ptolemy/__pycache__/fieldExtensions.cpython-311.pyc +0 -0
  350. snappy/ptolemy/__pycache__/findLoops.cpython-311.pyc +0 -0
  351. snappy/ptolemy/__pycache__/homology.cpython-311.pyc +0 -0
  352. snappy/ptolemy/__pycache__/manifoldMethods.cpython-311.pyc +0 -0
  353. snappy/ptolemy/__pycache__/matrix.cpython-311.pyc +0 -0
  354. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-311.pyc +0 -0
  355. snappy/ptolemy/__pycache__/polynomial.cpython-311.pyc +0 -0
  356. snappy/ptolemy/__pycache__/processComponents.cpython-311.pyc +0 -0
  357. snappy/ptolemy/__pycache__/processFileBase.cpython-311.pyc +0 -0
  358. snappy/ptolemy/__pycache__/processFileDispatch.cpython-311.pyc +0 -0
  359. snappy/ptolemy/__pycache__/processMagmaFile.cpython-311.pyc +0 -0
  360. snappy/ptolemy/__pycache__/processRurFile.cpython-311.pyc +0 -0
  361. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-311.pyc +0 -0
  362. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-311.pyc +0 -0
  363. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-311.pyc +0 -0
  364. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-311.pyc +0 -0
  365. snappy/ptolemy/__pycache__/rur.cpython-311.pyc +0 -0
  366. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-311.pyc +0 -0
  367. snappy/ptolemy/__pycache__/utilities.cpython-311.pyc +0 -0
  368. snappy/raytracing/__pycache__/__init__.cpython-311.pyc +0 -0
  369. snappy/raytracing/__pycache__/finite_raytracing_data.cpython-311.pyc +0 -0
  370. snappy/raytracing/__pycache__/gui_utilities.cpython-311.pyc +0 -0
  371. snappy/raytracing/__pycache__/hyperboloid_navigation.cpython-311.pyc +0 -0
  372. snappy/raytracing/__pycache__/hyperboloid_utilities.cpython-311.pyc +0 -0
  373. snappy/raytracing/__pycache__/ideal_raytracing_data.cpython-311.pyc +0 -0
  374. snappy/raytracing/__pycache__/inside_viewer.cpython-311.pyc +0 -0
  375. snappy/raytracing/__pycache__/raytracing_data.cpython-311.pyc +0 -0
  376. snappy/raytracing/__pycache__/raytracing_view.cpython-311.pyc +0 -0
  377. snappy/raytracing/__pycache__/upper_halfspace_utilities.cpython-311.pyc +0 -0
  378. snappy/raytracing/__pycache__/view_scale_controller.cpython-311.pyc +0 -0
  379. snappy/raytracing/zoom_slider/__pycache__/__init__.cpython-311.pyc +0 -0
  380. snappy/snap/__pycache__/__init__.cpython-311.pyc +0 -0
  381. snappy/snap/__pycache__/character_varieties.cpython-311.pyc +0 -0
  382. snappy/snap/__pycache__/fundamental_polyhedron.cpython-311.pyc +0 -0
  383. snappy/snap/__pycache__/interval_reps.cpython-311.pyc +0 -0
  384. snappy/snap/__pycache__/kernel_structures.cpython-311.pyc +0 -0
  385. snappy/snap/__pycache__/mcomplex_base.cpython-311.pyc +0 -0
  386. snappy/snap/__pycache__/nsagetools.cpython-311.pyc +0 -0
  387. snappy/snap/__pycache__/polished_reps.cpython-311.pyc +0 -0
  388. snappy/snap/__pycache__/shapes.cpython-311.pyc +0 -0
  389. snappy/snap/__pycache__/slice_obs_HKL.cpython-311.pyc +0 -0
  390. snappy/snap/__pycache__/utilities.cpython-311.pyc +0 -0
  391. snappy/snap/peripheral/__pycache__/__init__.cpython-311.pyc +0 -0
  392. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-311.pyc +0 -0
  393. snappy/snap/peripheral/__pycache__/link.cpython-311.pyc +0 -0
  394. snappy/snap/peripheral/__pycache__/peripheral.cpython-311.pyc +0 -0
  395. snappy/snap/peripheral/__pycache__/surface.cpython-311.pyc +0 -0
  396. snappy/snap/t3mlite/__pycache__/__init__.cpython-311.pyc +0 -0
  397. snappy/snap/t3mlite/__pycache__/arrow.cpython-311.pyc +0 -0
  398. snappy/snap/t3mlite/__pycache__/corner.cpython-311.pyc +0 -0
  399. snappy/snap/t3mlite/__pycache__/edge.cpython-311.pyc +0 -0
  400. snappy/snap/t3mlite/__pycache__/face.cpython-311.pyc +0 -0
  401. snappy/snap/t3mlite/__pycache__/files.cpython-311.pyc +0 -0
  402. snappy/snap/t3mlite/__pycache__/homology.cpython-311.pyc +0 -0
  403. snappy/snap/t3mlite/__pycache__/linalg.cpython-311.pyc +0 -0
  404. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-311.pyc +0 -0
  405. snappy/snap/t3mlite/__pycache__/perm4.cpython-311.pyc +0 -0
  406. snappy/snap/t3mlite/__pycache__/simplex.cpython-311.pyc +0 -0
  407. snappy/snap/t3mlite/__pycache__/spun.cpython-311.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/surface.cpython-311.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-311.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/vertex.cpython-311.pyc +0 -0
  411. snappy/togl/__init__.py +0 -3
  412. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  413. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  414. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  415. snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
  416. snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
  417. snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
  418. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  419. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  420. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  421. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  422. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  423. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  424. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  425. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  426. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  427. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  428. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  429. snappy/twister/__pycache__/__init__.cpython-311.pyc +0 -0
  430. snappy/twister/__pycache__/main.cpython-311.pyc +0 -0
  431. snappy/upper_halfspace/__pycache__/__init__.cpython-311.pyc +0 -0
  432. snappy/upper_halfspace/__pycache__/ideal_point.cpython-311.pyc +0 -0
  433. snappy/verify/__pycache__/__init__.cpython-311.pyc +0 -0
  434. snappy/verify/__pycache__/cuspCrossSection.cpython-311.pyc +0 -0
  435. snappy/verify/__pycache__/cuspTranslations.cpython-311.pyc +0 -0
  436. snappy/verify/__pycache__/cusp_areas.cpython-311.pyc +0 -0
  437. snappy/verify/__pycache__/cusp_shapes.cpython-311.pyc +0 -0
  438. snappy/verify/__pycache__/exceptions.cpython-311.pyc +0 -0
  439. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-311.pyc +0 -0
  440. snappy/verify/__pycache__/interval_tree.cpython-311.pyc +0 -0
  441. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-311.pyc +0 -0
  442. snappy/verify/__pycache__/realAlgebra.cpython-311.pyc +0 -0
  443. snappy/verify/__pycache__/shapes.cpython-311.pyc +0 -0
  444. snappy/verify/__pycache__/short_slopes.cpython-311.pyc +0 -0
  445. snappy/verify/__pycache__/squareExtensions.cpython-311.pyc +0 -0
  446. snappy/verify/__pycache__/verifyCanonical.cpython-311.pyc +0 -0
  447. snappy/verify/__pycache__/verifyHyperbolicity.cpython-311.pyc +0 -0
  448. snappy/verify/__pycache__/volume.cpython-311.pyc +0 -0
  449. snappy/verify/complex_volume/__pycache__/__init__.cpython-311.pyc +0 -0
  450. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-311.pyc +0 -0
  451. snappy/verify/complex_volume/__pycache__/closed.cpython-311.pyc +0 -0
  452. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-311.pyc +0 -0
  453. snappy/verify/complex_volume/__pycache__/cusped.cpython-311.pyc +0 -0
  454. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-311.pyc +0 -0
  455. snappy/verify/cuspCrossSection.py +0 -1422
  456. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-311.pyc +0 -0
  457. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-311.pyc +0 -0
  458. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-311.pyc +0 -0
  459. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-311.pyc +0 -0
  460. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-311.pyc +0 -0
  461. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-311.pyc +0 -0
  462. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-311.pyc +0 -0
  463. snappy-3.1.1.dist-info/RECORD +0 -585
  464. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
@@ -1,4 +1,7 @@
1
- from ..matrix import matrix
1
+ from ..matrix import make_matrix
2
+ from ..sage_helper import _within_sage
3
+ from ..exceptions import InsufficientPrecisionError
4
+ from ..math_basics import is_ComplexIntervalFieldElement
2
5
 
3
6
  """
4
7
 
@@ -36,7 +39,7 @@ complex 2x2-matrix and uses the isomorphism PGL(2,C)=PSL(2,C).
36
39
 
37
40
 
38
41
  def sl2c_inverse(A):
39
- return matrix([[A[1,1], -A[0, 1]], [-A[1, 0], A[0, 0]]])
42
+ return make_matrix([[A[1,1], -A[0, 1]], [-A[1, 0], A[0, 0]]])
40
43
 
41
44
 
42
45
  def psl2c_to_o13(A):
@@ -46,8 +49,10 @@ def psl2c_to_o13(A):
46
49
  Python implementation of Moebius_to_O31 in matrix_conversion.c.
47
50
  """
48
51
 
49
- return matrix(
50
- [ _o13_matrix_column(A, m)
52
+ Aadj = _adjoint(A)
53
+
54
+ return make_matrix(
55
+ [ _o13_matrix_column(A, m, Aadj)
51
56
  for m in _basis_vectors_sl2c(A.base_ring()) ]).transpose()
52
57
 
53
58
 
@@ -59,27 +64,83 @@ def pgl2c_to_o13(m):
59
64
  """
60
65
  return psl2c_to_o13(m / m.det().sqrt())
61
66
 
67
+ def complex_length_of_psl2c_matrix(m):
68
+ """
69
+ Complex length of translation corresponding to given PSL(2,C)
70
+ matrix.
62
71
 
63
- def _basis_vectors_sl2c(CF):
64
- return [ matrix([[ 1 , 0 ],
65
- [ 0, 1 ]], ring=CF),
66
- matrix([[ 1 , 0 ],
67
- [ 0 ,-1 ]], ring=CF),
68
- matrix([[ 0 , 1 ],
69
- [ 1 , 0 ]], ring=CF),
70
- matrix([[ 0 , 1j],
71
- [-1j, 0 ]], ring=CF) ]
72
+ Note that there is a branch cut here and we need to pick between
73
+ +/- 2 * arccosh(trace / 2).
74
+
75
+ We pick the cut with non-negative real part.
76
+
77
+ For non-verified computations, the real part will be non-negative.
72
78
 
79
+ For verified computations, the real part of the interval will contain
80
+ the non-negative real length. If the real length is very close to zero,
81
+ the real part of the interval might contain negative numbers as well.
82
+ """
83
+
84
+ tr = m.trace()
85
+ if not tr.real() >= 0:
86
+ # SageMath's arccosh has a branch cut on (-inf, -1].
87
+ #
88
+ # Ideally, the complex interval version would make a choice when
89
+ # we cross the branch cut (like it does for log).
90
+ #
91
+ # However, it returns (-pi, pi) as imaginary part when we cross
92
+ # branch cut.
93
+ #
94
+ # So flip trace to avoid the branch cut.
95
+
96
+ tr = -tr
97
+
98
+ l = 2 * _arccosh(tr / 2)
99
+
100
+ # The result it +/-l. But which one is it?
101
+
102
+ if l.real() >= 0:
103
+ # It is unambiguous.
104
+ return l
105
+ if l.real() <= 0:
106
+ # It is unambiguous.
107
+ return -l
108
+
109
+ if is_ComplexIntervalFieldElement(l):
110
+ # It is ambiguous. Be conversative and take both.
111
+ return l.union(-l)
112
+
113
+ raise InsufficientPrecisionError(
114
+ "Encountered NaN when computing complex length of "
115
+ "matrix.\n"
116
+ "Trace: %r\n"
117
+ "Try increasing precision" % tr)
118
+
119
+ def _basis_vectors_sl2c(CF):
120
+ return [ make_matrix([[ 1 , 0 ],
121
+ [ 0, 1 ]], ring=CF),
122
+ make_matrix([[ 1 , 0 ],
123
+ [ 0 ,-1 ]], ring=CF),
124
+ make_matrix([[ 0 , 1 ],
125
+ [ 1 , 0 ]], ring=CF),
126
+ make_matrix([[ 0 , 1j],
127
+ [-1j, 0 ]], ring=CF) ]
73
128
 
74
129
  def _adjoint(m):
75
- return matrix([[ m[0][0].conjugate(), m[1][0].conjugate()],
76
- [ m[0][1].conjugate(), m[1][1].conjugate()]])
130
+ return make_matrix([[ m[0][0].conjugate(), m[1][0].conjugate()],
131
+ [ m[0][1].conjugate(), m[1][1].conjugate()]])
77
132
 
78
133
 
79
- def _o13_matrix_column(A, m):
80
- fAmj = A * m * _adjoint(A)
134
+ def _o13_matrix_column(A, m, Aadj):
135
+ fAmj = A * m * Aadj
81
136
 
82
137
  return [ (fAmj[0][0].real() + fAmj[1][1].real()) / 2,
83
138
  (fAmj[0][0].real() - fAmj[1][1].real()) / 2,
84
139
  fAmj[0][1].real(),
85
140
  fAmj[0][1].imag() ]
141
+
142
+ if _within_sage:
143
+ from ..sage_helper import arccosh as _arccosh
144
+ else:
145
+ def _arccosh(z):
146
+ return z.arccosh()
snappy/verify/__init__.py CHANGED
@@ -1,16 +1,12 @@
1
1
  from .interval_newton_shapes_engine import *
2
2
  from .krawczyk_shapes_engine import *
3
3
 
4
- from .cuspCrossSection import *
5
-
6
- from .verifyHyperbolicity import *
7
- from .verifyCanonical import *
8
- from .cuspTranslations import *
9
- from .cusp_shapes import *
4
+ from .hyperbolicity import *
5
+ from .canonical import *
6
+ from .cusp_translations import *
10
7
  from .volume import *
11
8
  from .complex_volume import *
12
9
  from .interval_tree import *
13
- from .maximal_cusp_area_matrix import *
14
10
 
15
11
  # Choice of algorithm for finding intervals
16
12
  CertifiedShapesEngine = KrawczykShapesEngine
@@ -1,15 +1,15 @@
1
1
  from ..sage_helper import _within_sage, sage_method
2
2
 
3
- from .cuspCrossSection import RealCuspCrossSection
4
- from .squareExtensions import find_shapes_as_complex_sqrt_lin_combinations
5
- from . import verifyHyperbolicity
3
+ from ..geometric_structure.cusp_neighborhood.real_cusp_cross_section import RealCuspCrossSection
4
+ from ..snap.t3mlite import simplex
5
+
6
+ from .square_extensions import find_shapes_as_complex_sqrt_lin_combinations
7
+ from . import edge_equations
8
+ from . import hyperbolicity
6
9
  from . import exceptions
7
10
  from ..exceptions import SnapPeaFatalError
8
11
 
9
- from ..snap import t3mlite as t3m
10
-
11
12
  if _within_sage:
12
- from sage.rings.real_mpfi import RealIntervalField
13
13
  from sage.rings.complex_interval_field import ComplexIntervalField
14
14
  from ..pari import prec_dec_to_bits, prec_bits_to_dec
15
15
 
@@ -26,7 +26,7 @@ default_exact_bits_prec_and_degrees = [( 212, 10),
26
26
  (1000, 20),
27
27
  (2000, 20)]
28
28
 
29
- _num_tries_canonize = 3
29
+ _num_tries_kernel_canonize = 3
30
30
  _max_tries_verify_penalty = 9
31
31
 
32
32
 
@@ -90,7 +90,7 @@ def interval_checked_canonical_triangulation(M, bits_prec=None):
90
90
  c = RealCuspCrossSection.fromManifoldAndShapes(M, shapes)
91
91
 
92
92
  # Use interval arithmetics to verify hyperbolicity
93
- verifyHyperbolicity.check_logarithmic_gluing_equations_and_positively_oriented_tets(
93
+ hyperbolicity.check_logarithmic_gluing_equations_and_positively_oriented_tets(
94
94
  M, shapes)
95
95
 
96
96
  # Normalize cusp area. This is not needed when only 1 cusp
@@ -171,10 +171,10 @@ def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
171
171
  # Check that the exact solutions form a complete hyperbolic structure
172
172
  # We convert to intervals to check that the shapes are positive and
173
173
  # the angles add up to 2pi and not some other multiple of 2pi.
174
- c.check_polynomial_edge_equations_exactly()
174
+ edge_equations.check_polynomial_edge_equations_exactly(c.mcomplex)
175
175
  c.check_cusp_development_exactly()
176
176
  CIF = ComplexIntervalField(bits_prec)
177
- c.check_logarithmic_edge_equations_and_positivity(CIF)
177
+ edge_equations.check_logarithmic_edge_equations_and_positivity(c.mcomplex, CIF)
178
178
 
179
179
  # Normalize cusp area. This is not needed when only 1 cusp
180
180
  if M.num_cusps() > 1:
@@ -204,7 +204,7 @@ def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
204
204
  raise exceptions.TiltProvenPositiveNumericalVerifyError(interval)
205
205
 
206
206
  def index_of_face_corner(corner):
207
- face_index = t3m.simplex.comp(corner.Subsimplex).bit_length() - 1
207
+ face_index = simplex.comp(corner.Subsimplex).bit_length() - 1
208
208
  return 4 * corner.Tetrahedron.Index + face_index
209
209
 
210
210
  # Opacities of all four faces of each tetrahedron, initialize with None.
@@ -221,31 +221,34 @@ def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
221
221
  if None in opacities:
222
222
  raise Exception("Mismatch with opacities")
223
223
 
224
- # If there are transparent faces, this triangulation is just the
224
+ # If there are transparent faces, the given triangulation is just the
225
225
  # proto-canonical triangulation. We need to call into the SnapPea
226
226
  # kernel to retriangulate (introduces finite vertices)
227
- if False in opacities:
227
+ if not all(opacities):
228
228
  return M._canonical_retriangulation(opacities)
229
229
 
230
- # No transparent faces, this triangulation is the canonical triangulation.
230
+ # No transparent faces, this triangulation itself is the canonical cell
231
+ # decomposition.
231
232
  # Return it without introducing finite vertices.
232
233
  return M
233
234
 
234
235
 
235
- def _retrying_canonize(M):
236
+ def _retrying_canonize(M) -> None:
236
237
  """
237
238
  Wrapper for SnapPea kernel's function to compute the proto-canonical
238
239
  triangulation in place. It will retry the kernel function if it fails.
239
- Returns True if and only if the kernel function was successful eventually.
240
+ Raises an exception if it did not succeed eventually.
240
241
  """
241
- for i in range(_num_tries_canonize):
242
+ err = ValueError('_num_tries_canonize is not positive.')
243
+
244
+ for i in range(_num_tries_kernel_canonize):
242
245
  try:
243
246
  M.canonize()
244
- return True
245
- except (RuntimeError, SnapPeaFatalError):
247
+ return
248
+ except (RuntimeError, SnapPeaFatalError) as e:
249
+ err = e
246
250
  M.randomize()
247
- return False
248
-
251
+ raise err
249
252
 
250
253
  def _retrying_high_precision_canonize(M):
251
254
  """
@@ -253,23 +256,28 @@ def _retrying_high_precision_canonize(M):
253
256
  triangulation. It will retry the kernel function if it fails, switching
254
257
  to the quad-double implementation.
255
258
  Returns the proto-canonical triangulation if the kernel function was
256
- successful eventually. Otherwise None. The original manifold is unchanged.
259
+ successful eventually. Otherwise, raises an exception.
260
+ The original manifold is unchanged.
257
261
  """
262
+
263
+ from .. import ManifoldHP
264
+
258
265
  # Make a copy of the manifold
259
266
  Mcopy = M.copy()
260
267
 
261
268
  # Try with the given precision first
262
- if _retrying_canonize(Mcopy):
269
+ try:
270
+ _retrying_canonize(Mcopy)
263
271
  return Mcopy
264
-
265
- # Then try with high precision.
266
- Mhp = M.high_precision()
267
- if _retrying_canonize(Mhp):
268
- return Mhp
269
-
270
- # Fail
271
- return None
272
-
272
+ except (RuntimeError, SnapPeaFatalError) as e:
273
+ if isinstance(M, ManifoldHP):
274
+ # Already using high precision.
275
+ # Give up.
276
+ raise e
277
+ # Then try with high precision.
278
+ Mhp = M.high_precision()
279
+ _retrying_canonize(Mhp)
280
+ return Mhp.low_precision()
273
281
 
274
282
  def _print_exception(e):
275
283
  print('%s: %s' % (type(e).__name__, e))
@@ -317,9 +325,6 @@ def verified_canonical_retriangulation(
317
325
  The exact arithmetics can take a long time. To circumvent it, use
318
326
  ``exact_bits_prec_and_degrees = None``.
319
327
 
320
- More information on the canonical retriangulation can be found in the
321
- SnapPea kernel ``canonize_part_2.c`` and in Section 3.1 of
322
- `Fominykh, Garoufalidis, Goerner, Tarkaev, Vesnin <http://arxiv.org/abs/1502.00383>`_.
323
328
 
324
329
  Canonical cell decomposition of ``m004`` has 2 tetrahedral cells::
325
330
 
@@ -365,7 +370,11 @@ def verified_canonical_retriangulation(
365
370
  non-tetrahedral cells so interval arithmetics can't certify it)::
366
371
 
367
372
  sage: M = Manifold("m412")
368
- sage: verified_canonical_retriangulation(M, exact_bits_prec_and_degrees = None)
373
+ sage: verified_canonical_retriangulation(M, exact_bits_prec_and_degrees = None) # doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL
374
+ Traceback (most recent call last):
375
+ ...
376
+ snappy.verify.exceptions.TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: ... < 0
377
+
369
378
  """
370
379
 
371
380
  # This is the "outer" retry loop: it catches those verification
@@ -374,6 +383,8 @@ def verified_canonical_retriangulation(
374
383
 
375
384
  tries_penalty_left = _max_tries_verify_penalty
376
385
 
386
+ err = ValueError("_max_tries_verify_penalty is not positive.")
387
+
377
388
  while tries_penalty_left > 0:
378
389
  try:
379
390
  # The "inner" retry loop: it catches those verification
@@ -391,6 +402,8 @@ def verified_canonical_retriangulation(
391
402
  exceptions.TiltProvenPositiveNumericalVerifyError,
392
403
  exceptions.EdgeEquationExactVerifyError) as e:
393
404
 
405
+ err = e
406
+
394
407
  # These three exceptions are probably raised due to the
395
408
  # SnapPea kernel failures:
396
409
  # - flat tetrahedra in the proto-canonical triangulation
@@ -436,50 +449,41 @@ def verified_canonical_retriangulation(
436
449
  "proto_canonize.")
437
450
  print("Next step: Give up.")
438
451
 
439
- return None
440
-
441
- return None
452
+ raise e
442
453
 
454
+ raise err
443
455
 
444
456
  def _verified_canonical_retriangulation(
445
457
  M, interval_bits_precs, exact_bits_prec_and_degrees,
446
458
  verbose):
459
+ """
460
+ Implements the "inner" retry loop of verified_canonical_retriangulation
447
461
 
448
- # Implements the "inner" retry loop of verified_canonical_retriangulation
449
-
450
- # If this returns None, it means that we have given up
451
- # If it leaves Exceptions uncaught, the "outer" loop will randomize
452
- # the triangulation.
453
-
454
- num_complete_cusps = 0
455
- num_incomplete_cusps = 0
456
- for cusp_info in M.cusp_info():
457
- if cusp_info['complete?']:
458
- num_complete_cusps += 1
459
- else:
460
- num_incomplete_cusps += 1
462
+ Returns retriangulation or raises exception.
461
463
 
462
- if not num_complete_cusps:
463
- if verbose:
464
- print("Failure: Due to no unfilled cusp.")
465
- print("Next step: Give up.")
466
- return None
464
+ Some exceptions are caught by the "outer" loop to retry, using that
465
+ the SnapPea kernel uses a randomized algorithm to fill incomplete cusps
466
+ (if applicable) and perform the flips to find the proto-canonical
467
+ triangulation.
468
+ """
467
469
 
468
- # Dehn-fill manifold first
469
- if num_incomplete_cusps:
470
- Mfilled = M.filled_triangulation()
471
- else:
470
+ if all(M.cusp_info('complete?')):
472
471
  Mfilled = M
472
+ else:
473
+ # Dehn-fill manifold first
474
+ Mfilled = M.filled_triangulation()
475
+ if not all(Mfilled.cusp_info('complete?')):
476
+ raise ValueError(
477
+ 'Could not compute filled triangulation. '
478
+ 'Are the filling coefficients co-prime integers?')
473
479
 
474
480
  # Try to compute proto-canonical triangulation
475
481
  Mcopy = _retrying_high_precision_canonize(Mfilled)
476
482
 
477
- if not Mcopy:
478
- if verbose:
479
- print("Failure: In SnapPea kernel's proto_canonize()")
480
- print("Next step: Give up.")
481
- return None
482
-
483
+ err = ValueError(
484
+ 'Neither interval_bits_precs nor exact_bits_prec_and_degrees was '
485
+ 'non-empty.')
486
+
483
487
  # First try interval arithmetics to verify
484
488
  if interval_bits_precs:
485
489
  for interval_bits_prec in interval_bits_precs:
@@ -489,7 +493,11 @@ def _verified_canonical_retriangulation(
489
493
  try:
490
494
  return interval_checked_canonical_triangulation(
491
495
  Mcopy, interval_bits_prec)
492
- except (RuntimeError, exceptions.NumericalVerifyError) as e:
496
+ except (RuntimeError,
497
+ ValueError, # Manifold.tetrahedra_shapes,
498
+ # KrawczykShapesEngine.log_gluing_LHSs
499
+ exceptions.NumericalVerifyError) as e:
500
+ err = e
493
501
  if verbose:
494
502
  _print_exception(e)
495
503
  if isinstance(e, exceptions.NumericalVerifyError):
@@ -509,13 +517,13 @@ def _verified_canonical_retriangulation(
509
517
  return exactly_checked_canonical_retriangulation(
510
518
  Mcopy, bits_prec, degree)
511
519
  except FindExactShapesError as e:
520
+ err = e
512
521
  if verbose:
513
522
  _print_exception(e)
514
523
  print("Failure: Could not find exact shapes.")
515
524
  print("Next step: trying different method/precision")
516
525
 
517
- return None
518
-
526
+ raise err
519
527
 
520
528
  _known_canonical_retriangulations = [
521
529
  ('m004', '\x02\x0e\x01\x01\x01-\x1b\x87'),
@@ -1,7 +1,6 @@
1
1
  from ...sage_helper import _within_sage, sage_method
2
2
  if _within_sage:
3
- from sage.all import pi
4
- import sage.all
3
+ from sage.symbolic.constants import pi
5
4
 
6
5
  from .extended_bloch import *
7
6
  from ...snap import t3mlite as t3m
@@ -1,21 +1,21 @@
1
1
  from ...sage_helper import _within_sage, sage_method
2
2
  from ...math_basics import prod
3
3
 
4
+ from ...geometric_structure.cusp_neighborhood.complex_cusp_cross_section import ComplexCuspCrossSection
4
5
  from ...snap import peripheral
6
+ from ...snap.t3mlite import simplex
5
7
 
6
8
  if _within_sage:
7
- from sage.all import pi, xgcd
8
- import sage.all
9
+ from sage.symbolic.constants import pi
10
+ from ...sage_helper import I, xgcd
11
+
12
+ from .. import hyperbolicity
9
13
 
10
14
  from .adjust_torsion import *
11
15
  from .compute_ptolemys import *
12
- from .. import verifyHyperbolicity
13
- from ..cuspCrossSection import ComplexCuspCrossSection
14
- from ...snap import t3mlite as t3m
15
16
 
16
17
  __all__ = ['verified_complex_volume_closed_torsion']
17
18
 
18
-
19
19
  def _compute_holonomy(manifold, shapes):
20
20
  """
21
21
  Computes the holonomy for the peripheral curves for the given 1-cusped
@@ -52,7 +52,7 @@ def zero_lifted_holonomy(manifold, m, l, f):
52
52
  multiple_of_pi = RIF(f*pi)
53
53
 
54
54
  # (m_fill, l_fill) Dehn-filling
55
- m_fill, l_fill = [int(x) for x in manifold.cusp_info()[0]['filling']]
55
+ m_fill, l_fill = (int(x) for x in manifold.cusp_info()[0]['filling'])
56
56
 
57
57
  # Compute what the peripheral curves goes to right now
58
58
  p_interval = (m_fill * m + l_fill * l).imag() / multiple_of_pi
@@ -68,8 +68,8 @@ def zero_lifted_holonomy(manifold, m, l, f):
68
68
 
69
69
  # Compute by what multiple of 2 pi i to adjust
70
70
  g, a, b = xgcd(m_fill, l_fill)
71
- m -= p * a * multiple_of_pi * sage.all.I
72
- l -= p * b * multiple_of_pi * sage.all.I
71
+ m -= p * a * multiple_of_pi * I
72
+ l -= p * b * multiple_of_pi * I
73
73
 
74
74
  # For sanity, double check that we compute it right.
75
75
  p_interval = (m_fill * m + l_fill * l).imag() / multiple_of_pi
@@ -116,7 +116,7 @@ def verified_complex_volume_closed_torsion(manifold, bits_prec=None):
116
116
  'rect', bits_prec=bits_prec, intervals=True)
117
117
 
118
118
  # Check it is a valid hyperbolic structure
119
- verifyHyperbolicity.check_logarithmic_gluing_equations_and_positively_oriented_tets(
119
+ hyperbolicity.check_logarithmic_gluing_equations_and_positively_oriented_tets(
120
120
  manifold, shapes)
121
121
 
122
122
  # Compute holonomy
@@ -128,8 +128,8 @@ def verified_complex_volume_closed_torsion(manifold, bits_prec=None):
128
128
  # Keys for the dual edges in cusp triangulation
129
129
  cusp_dual_edges = [ (i, F, V)
130
130
  for i in range(manifold.num_tetrahedra())
131
- for F in t3m.TwoSubsimplices
132
- for V in t3m.ZeroSubsimplices
131
+ for F in simplex.TwoSubsimplices
132
+ for V in simplex.ZeroSubsimplices
133
133
  if F & V ]
134
134
 
135
135
  # Compute 1-cocycle in C^1(boundary; C^*) matching the holonomy
@@ -165,4 +165,4 @@ def verified_complex_volume_closed_torsion(manifold, bits_prec=None):
165
165
  # I.
166
166
  # Also add multiples of pi^2/2 to try to get the Chern-Simons part
167
167
  # between -pi^2/4 and pi^2/4.
168
- return normalize_by_pi_square_over_two(complex_volume) / sage.all.I
168
+ return normalize_by_pi_square_over_two(complex_volume) / I
@@ -1,13 +1,13 @@
1
1
  from ...sage_helper import _within_sage, sage_method
2
2
 
3
3
  if _within_sage:
4
- import sage.all
4
+ from ...sage_helper import I
5
+
6
+ from .. import hyperbolicity
7
+ from ...geometric_structure.cusp_neighborhood.complex_cusp_cross_section import ComplexCuspCrossSection
5
8
 
6
9
  from .adjust_torsion import *
7
10
  from .compute_ptolemys import *
8
- from .. import verifyHyperbolicity
9
- from ..cuspCrossSection import ComplexCuspCrossSection
10
- from ...snap import t3mlite as t3m
11
11
 
12
12
  __all__ = ['verified_complex_volume_cusped_torsion']
13
13
 
@@ -32,7 +32,7 @@ def verified_complex_volume_cusped_torsion(manifold, bits_prec=None):
32
32
  'rect', bits_prec=bits_prec, intervals=True)
33
33
 
34
34
  # Check it is a valid hyperbolic structure
35
- verifyHyperbolicity.check_logarithmic_gluing_equations_and_positively_oriented_tets(
35
+ hyperbolicity.check_logarithmic_gluing_equations_and_positively_oriented_tets(
36
36
  manifold, shapes)
37
37
 
38
38
  # Compute cusp cross section. For computation of complex volume,
@@ -53,4 +53,4 @@ def verified_complex_volume_cusped_torsion(manifold, bits_prec=None):
53
53
  # I.
54
54
  # Also add multiples of pi^2/2 to try to get the Chern-Simons part
55
55
  # between -pi^2/4 and pi^2/4.
56
- return normalize_by_pi_square_over_two(complex_volume) / sage.all.I
56
+ return normalize_by_pi_square_over_two(complex_volume) / I
@@ -1,11 +1,8 @@
1
1
  from ...sage_helper import _within_sage, sage_method
2
2
 
3
3
  if _within_sage:
4
- from sage.all import (ComplexBallField,
5
- RealField,
6
- Integer, exp, pi)
7
-
8
- import sage.all
4
+ from sage.symbolic.constants import pi
5
+ from ...sage_helper import I, Integer, RealField, ComplexBallField, exp
9
6
 
10
7
 
11
8
  @sage_method
@@ -106,8 +103,8 @@ def compute_Neumanns_Rogers_dilog_from_flattening_w0_w1(w0, w1):
106
103
 
107
104
  # Note that the values computed for log(z) and log(1-z)
108
105
  # are not verified to have the imaginary part between -pi and pi.
109
- logZ = w0 - my_pi * p * sage.all.I
110
- logOneMinusZ = - (w1 - my_pi * q * sage.all.I)
106
+ logZ = w0 - my_pi * p * I
107
+ logOneMinusZ = - (w1 - my_pi * q * I)
111
108
 
112
109
  # Neumann's formula for the complex volume is
113
110
  #
@@ -143,7 +140,7 @@ def compute_Neumanns_Rogers_dilog_from_flattening_w0_w1(w0, w1):
143
140
  # Similar considerations apply to (2) used when Re(z) > 1/2.
144
141
 
145
142
  term1 = logZ * logOneMinusZ
146
- term2 = my_pi * sage.all.I * (p * logOneMinusZ + q * logZ)
143
+ term2 = my_pi * I * (p * logOneMinusZ + q * logZ)
147
144
 
148
145
  if z.real().center() < 0.5:
149
146
  # Check that we can apply equation (1)
@@ -1,5 +1,5 @@
1
+ from ..geometric_structure.cusp_neighborhood.complex_cusp_cross_section import ComplexCuspCrossSection
1
2
  from .shapes import compute_hyperbolic_shapes
2
- from .cuspCrossSection import ComplexCuspCrossSection
3
3
 
4
4
  __all__ = ['cusp_translations_for_manifold',
5
5
  'cusp_translations_for_neighborhood']
@@ -0,0 +1,80 @@
1
+ from .exceptions import *
2
+
3
+ from ..snap.t3mlite import simplex
4
+
5
+ def check_polynomial_edge_equations_exactly(mcomplex):
6
+ """
7
+ Check that the polynomial edge equations are fulfilled exactly.
8
+
9
+ We use the conjugate inverse to support non-orientable manifolds.
10
+ """
11
+
12
+ # For each edge
13
+ for edge in mcomplex.Edges:
14
+ # The exact value when evaluating the edge equation
15
+ val = 1
16
+
17
+ # Iterate through edge embeddings
18
+ for tet, perm in edge.embeddings():
19
+ # Accumulate shapes of the edge exactly
20
+ val *= _shape_for_edge_embedding(tet, perm)
21
+
22
+ if not val == 1:
23
+ raise EdgeEquationExactVerifyError(val)
24
+
25
+ def check_logarithmic_edge_equations_and_positivity(mcomplex, NumericalField):
26
+ """
27
+ Check that the shapes have positive imaginary part and that the
28
+ logarithmic gluing equations have small error.
29
+
30
+ The shapes are coerced into the field given as argument before the
31
+ logarithm is computed. It can be, e.g., a ComplexIntervalField.
32
+ """
33
+
34
+ # For each edge
35
+ for edge in mcomplex.Edges:
36
+
37
+ # The complex interval arithmetic value of the logarithmic
38
+ # version of the edge equation.
39
+ log_sum = 0
40
+
41
+ # Iterate through edge embeddings
42
+ for tet, perm in edge.embeddings():
43
+
44
+ shape = _shape_for_edge_embedding(tet, perm)
45
+
46
+ numerical_shape = NumericalField(shape)
47
+
48
+ log_shape = numerical_shape.log()
49
+
50
+ # Note that this is true for z in R, R < 0 as well,
51
+ # but then it would fail for 1 - 1/z or 1 / (1-z)
52
+
53
+ if not (log_shape.imag() > 0):
54
+ raise ShapePositiveImaginaryPartNumericalVerifyError(
55
+ numerical_shape)
56
+
57
+ # Take logarithm and accumulate
58
+ log_sum += log_shape
59
+
60
+ twoPiI = NumericalField.pi() * NumericalField(2j)
61
+
62
+ if not abs(log_sum - twoPiI) < NumericalField(1e-7):
63
+ raise EdgeEquationLogLiftNumericalVerifyError(log_sum)
64
+
65
+ def _shape_for_edge_embedding(tet, perm):
66
+ """
67
+ Given an edge embedding, find the shape assignment for it.
68
+ If the edge embedding flips orientation, apply conjugate inverse.
69
+ """
70
+
71
+ # Get the shape for this edge embedding
72
+ subsimplex = perm.image(simplex.E01)
73
+
74
+ # Figure out the orientation of this tetrahedron
75
+ # with respect to the edge, apply conjugate inverse
76
+ # if differ
77
+ if perm.sign():
78
+ return 1 / tet.ShapeParameters[subsimplex].conjugate()
79
+ else:
80
+ return tet.ShapeParameters[subsimplex]