snappy 3.0.3__cp38-cp38-macosx_11_0_arm64.whl → 3.2__cp38-cp38-macosx_11_0_arm64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (401) hide show
  1. snappy/CyOpenGL.cpython-38-darwin.so +0 -0
  2. snappy/SnapPy.cpython-38-darwin.so +0 -0
  3. snappy/SnapPyHP.cpython-38-darwin.so +0 -0
  4. snappy/__init__.py +373 -426
  5. snappy/app.py +240 -75
  6. snappy/app_menus.py +93 -78
  7. snappy/browser.py +87 -63
  8. snappy/cache.py +5 -8
  9. snappy/canonical.py +249 -0
  10. snappy/{verify/cusp_shapes.py → cusps/__init__.py} +11 -19
  11. snappy/cusps/cusp_area_matrix.py +101 -0
  12. snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +39 -54
  13. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  14. snappy/cusps/test.py +21 -0
  15. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  16. snappy/database.py +40 -31
  17. snappy/db_utilities.py +13 -14
  18. snappy/decorated_isosig.py +377 -133
  19. snappy/dev/extended_ptolemy/complexVolumesClosed.py +42 -9
  20. snappy/dev/extended_ptolemy/extended.py +32 -25
  21. snappy/dev/extended_ptolemy/giac_rur.py +23 -8
  22. snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
  23. snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +2 -1
  24. snappy/dev/vericlosed/gimbalLoopFinder.py +5 -5
  25. snappy/dev/vericlosed/hyperbolicStructure.py +3 -3
  26. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +2 -2
  27. snappy/dev/vericlosed/truncatedComplex.py +3 -2
  28. snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +4 -3
  29. snappy/doc/_images/geodesics.jpg +0 -0
  30. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  31. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  32. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  33. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  34. snappy/doc/_sources/additional_classes.rst.txt +1 -0
  35. snappy/doc/_sources/credits.rst.txt +6 -1
  36. snappy/doc/_sources/development.rst.txt +69 -50
  37. snappy/doc/_sources/index.rst.txt +101 -66
  38. snappy/doc/_sources/installing.rst.txt +148 -165
  39. snappy/doc/_sources/news.rst.txt +136 -32
  40. snappy/doc/_sources/ptolemy.rst.txt +1 -1
  41. snappy/doc/_sources/ptolemy_examples1.rst.txt +9 -8
  42. snappy/doc/_sources/ptolemy_examples2.rst.txt +3 -3
  43. snappy/doc/_sources/ptolemy_examples3.rst.txt +14 -14
  44. snappy/doc/_sources/ptolemy_prelim.rst.txt +1 -1
  45. snappy/doc/_sources/snap.rst.txt +2 -2
  46. snappy/doc/_sources/snappy.rst.txt +1 -1
  47. snappy/doc/_sources/triangulation.rst.txt +3 -2
  48. snappy/doc/_sources/verify.rst.txt +89 -29
  49. snappy/doc/_sources/verify_internals.rst.txt +5 -16
  50. snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
  51. snappy/doc/_static/SnapPy.ico +0 -0
  52. snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  53. snappy/doc/_static/basic.css +47 -27
  54. snappy/doc/_static/css/badge_only.css +1 -0
  55. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  56. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  57. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  58. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  59. snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
  60. snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  61. snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  62. snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
  63. snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  64. snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
  65. snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  66. snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
  67. snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
  68. snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
  69. snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  70. snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
  71. snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
  72. snappy/doc/_static/css/theme.css +4 -0
  73. snappy/doc/_static/doctools.js +107 -274
  74. snappy/doc/_static/documentation_options.js +6 -5
  75. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  76. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  77. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  78. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  79. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  80. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  81. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  82. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  83. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  84. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  85. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  86. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  87. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  88. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  89. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  90. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  91. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  92. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  93. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  94. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  95. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  96. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  97. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  98. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  99. snappy/doc/_static/jquery.js +2 -2
  100. snappy/doc/_static/js/badge_only.js +1 -0
  101. snappy/doc/_static/js/theme.js +1 -0
  102. snappy/doc/_static/js/versions.js +228 -0
  103. snappy/doc/_static/language_data.js +3 -101
  104. snappy/doc/_static/pygments.css +1 -0
  105. snappy/doc/_static/searchtools.js +489 -398
  106. snappy/doc/_static/snappy_furo.css +33 -0
  107. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
  108. snappy/doc/_static/sphinx_highlight.js +154 -0
  109. snappy/doc/additional_classes.html +688 -263
  110. snappy/doc/bugs.html +107 -94
  111. snappy/doc/censuses.html +155 -127
  112. snappy/doc/credits.html +115 -104
  113. snappy/doc/development.html +184 -146
  114. snappy/doc/genindex.html +287 -204
  115. snappy/doc/index.html +189 -150
  116. snappy/doc/installing.html +259 -266
  117. snappy/doc/manifold.html +1626 -592
  118. snappy/doc/manifoldhp.html +119 -105
  119. snappy/doc/news.html +198 -104
  120. snappy/doc/objects.inv +0 -0
  121. snappy/doc/other.html +117 -105
  122. snappy/doc/platonic_census.html +161 -114
  123. snappy/doc/plink.html +113 -105
  124. snappy/doc/ptolemy.html +131 -108
  125. snappy/doc/ptolemy_classes.html +242 -223
  126. snappy/doc/ptolemy_examples1.html +144 -130
  127. snappy/doc/ptolemy_examples2.html +141 -129
  128. snappy/doc/ptolemy_examples3.html +148 -132
  129. snappy/doc/ptolemy_examples4.html +131 -111
  130. snappy/doc/ptolemy_prelim.html +162 -138
  131. snappy/doc/py-modindex.html +104 -69
  132. snappy/doc/screenshots.html +117 -108
  133. snappy/doc/search.html +115 -84
  134. snappy/doc/searchindex.js +1 -1
  135. snappy/doc/snap.html +109 -96
  136. snappy/doc/snappy.html +134 -97
  137. snappy/doc/spherogram.html +259 -187
  138. snappy/doc/todo.html +107 -94
  139. snappy/doc/triangulation.html +1380 -111
  140. snappy/doc/tutorial.html +107 -94
  141. snappy/doc/verify.html +194 -125
  142. snappy/doc/verify_internals.html +248 -686
  143. snappy/drilling/__init__.py +456 -0
  144. snappy/drilling/barycentric.py +103 -0
  145. snappy/drilling/constants.py +5 -0
  146. snappy/drilling/crush.py +270 -0
  147. snappy/drilling/cusps.py +125 -0
  148. snappy/drilling/debug.py +242 -0
  149. snappy/drilling/epsilons.py +6 -0
  150. snappy/drilling/exceptions.py +55 -0
  151. snappy/drilling/moves.py +620 -0
  152. snappy/drilling/peripheral_curves.py +210 -0
  153. snappy/drilling/perturb.py +188 -0
  154. snappy/drilling/shorten.py +36 -0
  155. snappy/drilling/subdivide.py +274 -0
  156. snappy/drilling/test.py +23 -0
  157. snappy/drilling/test_cases.py +126 -0
  158. snappy/drilling/tracing.py +351 -0
  159. snappy/exceptions.py +23 -3
  160. snappy/export_stl.py +20 -14
  161. snappy/exterior_to_link/__init__.py +2 -0
  162. snappy/exterior_to_link/barycentric_geometry.py +463 -0
  163. snappy/exterior_to_link/exceptions.py +6 -0
  164. snappy/exterior_to_link/geodesic_map.json +14408 -0
  165. snappy/exterior_to_link/hyp_utils.py +112 -0
  166. snappy/exterior_to_link/link_projection.py +323 -0
  167. snappy/exterior_to_link/main.py +197 -0
  168. snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
  169. snappy/exterior_to_link/mcomplex_with_link.py +687 -0
  170. snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
  171. snappy/exterior_to_link/pl_utils.py +491 -0
  172. snappy/exterior_to_link/put_in_S3.py +156 -0
  173. snappy/exterior_to_link/rational_linear_algebra.py +123 -0
  174. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
  175. snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
  176. snappy/exterior_to_link/stored_moves.py +475 -0
  177. snappy/exterior_to_link/test.py +31 -0
  178. snappy/geometric_structure/__init__.py +212 -0
  179. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  180. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  181. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  182. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  183. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  184. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  185. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  186. snappy/geometric_structure/geodesic/__init__.py +0 -0
  187. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  188. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  189. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  190. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  191. snappy/geometric_structure/geodesic/constants.py +6 -0
  192. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  193. snappy/geometric_structure/geodesic/fixed_points.py +93 -0
  194. snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
  195. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  196. snappy/geometric_structure/geodesic/line.py +30 -0
  197. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  198. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  199. snappy/geometric_structure/test.py +22 -0
  200. snappy/gui.py +36 -36
  201. snappy/horoviewer.py +50 -48
  202. snappy/hyperboloid/__init__.py +212 -0
  203. snappy/hyperboloid/distances.py +245 -0
  204. snappy/hyperboloid/horoball.py +19 -0
  205. snappy/hyperboloid/line.py +35 -0
  206. snappy/hyperboloid/point.py +9 -0
  207. snappy/hyperboloid/triangle.py +29 -0
  208. snappy/{infodialog.py → infowindow.py} +32 -33
  209. snappy/isometry_signature.py +382 -0
  210. snappy/len_spec/__init__.py +596 -0
  211. snappy/len_spec/geodesic_info.py +110 -0
  212. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  213. snappy/len_spec/geodesic_piece.py +143 -0
  214. snappy/len_spec/geometric_structure.py +182 -0
  215. snappy/len_spec/geometry.py +80 -0
  216. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  217. snappy/len_spec/spine.py +206 -0
  218. snappy/len_spec/test.py +24 -0
  219. snappy/len_spec/test_cases.py +69 -0
  220. snappy/len_spec/tile.py +275 -0
  221. snappy/len_spec/word.py +86 -0
  222. snappy/manifolds/__init__.py +1 -1
  223. snappy/math_basics.py +176 -0
  224. snappy/matrix.py +525 -0
  225. snappy/number.py +97 -21
  226. snappy/numeric_output_checker.py +37 -27
  227. snappy/pari.py +30 -69
  228. snappy/phone_home.py +25 -20
  229. snappy/polyviewer.py +39 -37
  230. snappy/ptolemy/__init__.py +4 -6
  231. snappy/ptolemy/component.py +14 -12
  232. snappy/ptolemy/coordinates.py +312 -295
  233. snappy/ptolemy/fieldExtensions.py +14 -12
  234. snappy/ptolemy/findLoops.py +43 -31
  235. snappy/ptolemy/geometricRep.py +24 -26
  236. snappy/ptolemy/homology.py +12 -7
  237. snappy/ptolemy/manifoldMethods.py +69 -70
  238. snappy/ptolemy/matrix.py +65 -26
  239. snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +18 -14
  240. snappy/ptolemy/polynomial.py +125 -119
  241. snappy/ptolemy/processComponents.py +36 -30
  242. snappy/ptolemy/processFileBase.py +79 -18
  243. snappy/ptolemy/processFileDispatch.py +13 -14
  244. snappy/ptolemy/processMagmaFile.py +44 -39
  245. snappy/ptolemy/processRurFile.py +18 -11
  246. snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +20 -17
  247. snappy/ptolemy/ptolemyObstructionClass.py +13 -17
  248. snappy/ptolemy/ptolemyVariety.py +190 -121
  249. snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +20 -19
  250. snappy/ptolemy/reginaWrapper.py +25 -29
  251. snappy/ptolemy/rur.py +6 -14
  252. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +27 -22
  253. snappy/ptolemy/test.py +247 -188
  254. snappy/ptolemy/utilities.py +41 -43
  255. snappy/raytracing/__init__.py +64 -0
  256. snappy/raytracing/additional_horospheres.py +64 -0
  257. snappy/raytracing/additional_len_spec_choices.py +63 -0
  258. snappy/raytracing/cohomology_fractal.py +10 -6
  259. snappy/raytracing/eyeball.py +123 -0
  260. snappy/raytracing/finite_raytracing_data.py +48 -38
  261. snappy/raytracing/finite_viewer.py +218 -210
  262. snappy/raytracing/geodesic_tube_info.py +174 -0
  263. snappy/raytracing/geodesics.py +246 -0
  264. snappy/raytracing/geodesics_window.py +258 -0
  265. snappy/raytracing/gui_utilities.py +152 -40
  266. snappy/raytracing/hyperboloid_navigation.py +102 -52
  267. snappy/raytracing/hyperboloid_utilities.py +114 -261
  268. snappy/raytracing/ideal_raytracing_data.py +256 -179
  269. snappy/raytracing/inside_viewer.py +522 -253
  270. snappy/raytracing/pack.py +22 -0
  271. snappy/raytracing/raytracing_data.py +46 -34
  272. snappy/raytracing/raytracing_view.py +190 -109
  273. snappy/raytracing/shaders/Eye.png +0 -0
  274. snappy/raytracing/shaders/NonGeometric.png +0 -0
  275. snappy/raytracing/shaders/__init__.py +60 -4
  276. snappy/raytracing/shaders/fragment.glsl +575 -148
  277. snappy/raytracing/test.py +29 -0
  278. snappy/raytracing/tooltip.py +146 -0
  279. snappy/raytracing/upper_halfspace_utilities.py +98 -0
  280. snappy/raytracing/view_scale_controller.py +98 -0
  281. snappy/raytracing/zoom_slider/__init__.py +32 -29
  282. snappy/raytracing/zoom_slider/test.py +2 -0
  283. snappy/sage_helper.py +69 -123
  284. snappy/{preferences.py → settings.py} +167 -145
  285. snappy/shell.py +4 -0
  286. snappy/snap/__init__.py +12 -8
  287. snappy/snap/character_varieties.py +24 -18
  288. snappy/snap/find_field.py +35 -34
  289. snappy/snap/fundamental_polyhedron.py +99 -85
  290. snappy/snap/generators.py +6 -8
  291. snappy/snap/interval_reps.py +18 -6
  292. snappy/snap/kernel_structures.py +8 -3
  293. snappy/snap/mcomplex_base.py +1 -2
  294. snappy/snap/nsagetools.py +107 -53
  295. snappy/snap/peripheral/__init__.py +1 -1
  296. snappy/snap/peripheral/dual_cellulation.py +15 -7
  297. snappy/snap/peripheral/link.py +20 -16
  298. snappy/snap/peripheral/peripheral.py +22 -14
  299. snappy/snap/peripheral/surface.py +47 -50
  300. snappy/snap/peripheral/test.py +8 -8
  301. snappy/snap/polished_reps.py +65 -40
  302. snappy/snap/shapes.py +41 -22
  303. snappy/snap/slice_obs_HKL.py +64 -25
  304. snappy/snap/t3mlite/arrow.py +88 -51
  305. snappy/snap/t3mlite/corner.py +5 -6
  306. snappy/snap/t3mlite/edge.py +32 -21
  307. snappy/snap/t3mlite/face.py +7 -9
  308. snappy/snap/t3mlite/files.py +31 -23
  309. snappy/snap/t3mlite/homology.py +14 -10
  310. snappy/snap/t3mlite/linalg.py +158 -56
  311. snappy/snap/t3mlite/mcomplex.py +739 -291
  312. snappy/snap/t3mlite/perm4.py +236 -84
  313. snappy/snap/t3mlite/setup.py +9 -10
  314. snappy/snap/t3mlite/simplex.py +65 -48
  315. snappy/snap/t3mlite/spun.py +42 -30
  316. snappy/snap/t3mlite/surface.py +45 -45
  317. snappy/snap/t3mlite/test.py +3 -0
  318. snappy/snap/t3mlite/test_vs_regina.py +17 -13
  319. snappy/snap/t3mlite/tetrahedron.py +25 -24
  320. snappy/snap/t3mlite/vertex.py +8 -13
  321. snappy/snap/test.py +45 -52
  322. snappy/snap/utilities.py +66 -65
  323. snappy/test.py +155 -158
  324. snappy/test_cases.py +263 -0
  325. snappy/testing.py +131 -0
  326. snappy/tiling/__init__.py +2 -0
  327. snappy/tiling/canonical_key_dict.py +59 -0
  328. snappy/tiling/dict_based_set.py +79 -0
  329. snappy/tiling/floor.py +49 -0
  330. snappy/tiling/hyperboloid_dict.py +54 -0
  331. snappy/tiling/iter_utils.py +78 -0
  332. snappy/tiling/lifted_tetrahedron.py +22 -0
  333. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  334. snappy/tiling/real_hash_dict.py +164 -0
  335. snappy/tiling/test.py +23 -0
  336. snappy/tiling/tile.py +215 -0
  337. snappy/tiling/triangle.py +33 -0
  338. snappy/tkterminal.py +313 -203
  339. snappy/twister/main.py +1 -8
  340. snappy/twister/twister_core.cpython-38-darwin.so +0 -0
  341. snappy/upper_halfspace/__init__.py +146 -0
  342. snappy/upper_halfspace/ideal_point.py +26 -0
  343. snappy/verify/__init__.py +4 -8
  344. snappy/verify/{verifyCanonical.py → canonical.py} +114 -97
  345. snappy/verify/complex_volume/__init__.py +3 -2
  346. snappy/verify/complex_volume/adjust_torsion.py +13 -11
  347. snappy/verify/complex_volume/closed.py +29 -24
  348. snappy/verify/complex_volume/compute_ptolemys.py +8 -6
  349. snappy/verify/complex_volume/cusped.py +10 -9
  350. snappy/verify/complex_volume/extended_bloch.py +14 -12
  351. snappy/verify/{cuspTranslations.py → cusp_translations.py} +15 -14
  352. snappy/verify/edge_equations.py +80 -0
  353. snappy/verify/exceptions.py +23 -56
  354. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +19 -15
  355. snappy/verify/interval_newton_shapes_engine.py +51 -211
  356. snappy/verify/interval_tree.py +27 -25
  357. snappy/verify/krawczyk_shapes_engine.py +47 -50
  358. snappy/verify/maximal_cusp_area_matrix/__init__.py +17 -86
  359. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +58 -48
  360. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +53 -57
  361. snappy/verify/{realAlgebra.py → real_algebra.py} +26 -20
  362. snappy/verify/shapes.py +10 -7
  363. snappy/verify/short_slopes.py +41 -42
  364. snappy/verify/{squareExtensions.py → square_extensions.py} +96 -92
  365. snappy/verify/test.py +59 -57
  366. snappy/verify/upper_halfspace/extended_matrix.py +5 -5
  367. snappy/verify/upper_halfspace/finite_point.py +44 -31
  368. snappy/verify/upper_halfspace/ideal_point.py +69 -57
  369. snappy/verify/volume.py +15 -12
  370. snappy/version.py +2 -3
  371. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/METADATA +14 -12
  372. snappy-3.2.dist-info/RECORD +503 -0
  373. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  374. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -1
  375. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/top_level.txt +10 -1
  376. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  377. snappy/doc/_static/classic.css +0 -266
  378. snappy/doc/_static/jquery-3.5.1.js +0 -10872
  379. snappy/doc/_static/sidebar.js +0 -159
  380. snappy/doc/_static/underscore-1.13.1.js +0 -2042
  381. snappy/doc/_static/underscore.js +0 -6
  382. snappy/doc/verify_canon.html +0 -283
  383. snappy/ppm_to_png.py +0 -243
  384. snappy/togl/__init__.py +0 -3
  385. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  386. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  387. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  388. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  389. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  390. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  391. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  392. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  393. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  394. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  395. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  396. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  397. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  398. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  399. snappy/verify/cuspCrossSection.py +0 -1413
  400. snappy/verify/mathHelpers.py +0 -64
  401. snappy-3.0.3.dist-info/RECORD +0 -360
snappy/twister/main.py CHANGED
@@ -1,6 +1,5 @@
1
1
  ### Required modules:
2
2
  # Some standard modules.
3
- from __future__ import print_function
4
3
  import os
5
4
  from random import choice
6
5
  from itertools import combinations
@@ -9,12 +8,6 @@ import snappy
9
8
  from plink import LinkManager
10
9
  from .twister_core import build_bundle, build_splitting, twister_version
11
10
 
12
- # Python 3 compatibility
13
- try:
14
- basestring
15
- except NameError: # Python 3
16
- basestring = unicode = str
17
-
18
11
  surface_database_path = os.path.join(os.path.dirname(__file__), 'surfaces')
19
12
  surface_database = set(os.listdir(surface_database_path))
20
13
  version = twister_version()
@@ -23,7 +16,7 @@ def _get_surface(surface):
23
16
  if isinstance(surface, tuple) and len(surface) == 2 and isinstance(surface[0], int) and isinstance(surface[1], int):
24
17
  return LP_surface(surface[0], surface[1])
25
18
 
26
- if isinstance(surface, basestring):
19
+ if isinstance(surface, str):
27
20
  # If surface is actually the contents of a surface file.
28
21
  if surface.startswith('# A Twister surface file'):
29
22
  return surface
@@ -0,0 +1,146 @@
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
5
+
6
+ """
7
+
8
+ upper_halfspace contains methods relating to the upper halfspace model
9
+
10
+ H^3 = { w = z + ti : t > 0 }
11
+
12
+ with a PSL(2,C)-matrix m = [[a,b],[c,d]] acting as
13
+
14
+ w |-> (a * w + b)^-1 * (c * w + d)
15
+
16
+ It also contains methods converting from the upper halfspace model to
17
+ other models of hyperbolic space including the conversion psl2c_to_o13.
18
+
19
+ Points on the boundary C union {infty} of H^3 can be stored by either
20
+ assigning a complex number or the sentinel
21
+ upper_halfspace.ideal_point.Infinity to a variable. Functions using this
22
+ representations of the boundary of H^3 are in ideal_point.
23
+
24
+ Conventions:
25
+
26
+ A SL(2,C)-matrix is a matrix constructed by snappy.matrix.matrix(...)
27
+ (that is either snappy's own SimpleMatrix or a SageMath matrix type)
28
+ with base_ring being a complex type (either a SnapPy.Number or one
29
+ of SageMath's complex types including ComplexIntervalField, but not
30
+ python's native complex type, e.g., 1 + 1j) and determinant being one.
31
+
32
+ psl2c in a function name indicates that the function takes an SL(2,C)-matrix
33
+ and the result (at least up rounding errors) does change when multiplying
34
+ by -1.
35
+
36
+ pgl2c in a function name indicates that the function takes any non-degenerate
37
+ complex 2x2-matrix and uses the isomorphism PGL(2,C)=PSL(2,C).
38
+ """
39
+
40
+
41
+ def sl2c_inverse(A):
42
+ return make_matrix([[A[1,1], -A[0, 1]], [-A[1, 0], A[0, 0]]])
43
+
44
+
45
+ def psl2c_to_o13(A):
46
+ """
47
+ Converts matrix in PSL(2,C) to O13.
48
+
49
+ Python implementation of Moebius_to_O31 in matrix_conversion.c.
50
+ """
51
+
52
+ Aadj = _adjoint(A)
53
+
54
+ return make_matrix(
55
+ [ _o13_matrix_column(A, m, Aadj)
56
+ for m in _basis_vectors_sl2c(A.base_ring()) ]).transpose()
57
+
58
+
59
+ def pgl2c_to_o13(m):
60
+ """
61
+ Converts matrix in PGL(2,C) to O13.
62
+
63
+ Python implementation of Moebius_to_O31 in matrix_conversion.c.
64
+ """
65
+ return psl2c_to_o13(m / m.det().sqrt())
66
+
67
+ def complex_length_of_psl2c_matrix(m):
68
+ """
69
+ Complex length of translation corresponding to given PSL(2,C)
70
+ matrix.
71
+
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.
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) ]
128
+
129
+ def _adjoint(m):
130
+ return make_matrix([[ m[0][0].conjugate(), m[1][0].conjugate()],
131
+ [ m[0][1].conjugate(), m[1][1].conjugate()]])
132
+
133
+
134
+ def _o13_matrix_column(A, m, Aadj):
135
+ fAmj = A * m * Aadj
136
+
137
+ return [ (fAmj[0][0].real() + fAmj[1][1].real()) / 2,
138
+ (fAmj[0][0].real() - fAmj[1][1].real()) / 2,
139
+ fAmj[0][1].real(),
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()
@@ -0,0 +1,26 @@
1
+ from ..matrix import vector
2
+
3
+ __all__ = ['Infinity', 'ideal_point_to_r13']
4
+
5
+ Infinity = 'Infinity'
6
+
7
+
8
+ def ideal_point_to_r13(z, RF):
9
+ """
10
+ Takes a boundary point z of H^3, that is either a complex number
11
+ or Infinite, and a real field type.
12
+
13
+ Returns the corresponding unit light vector in the hyperboloid model.
14
+ """
15
+ if z == Infinity:
16
+ return vector([RF(1), RF(1), RF(0), RF(0)])
17
+
18
+ z_re = z.real()
19
+ z_im = z.imag()
20
+ z_abs_sqr = z_re**2 + z_im**2
21
+ denom = z_abs_sqr + 1
22
+
23
+ return vector([RF(1),
24
+ (z_abs_sqr - 1) / denom,
25
+ 2 * z_re / denom,
26
+ 2 * z_im / denom])
snappy/verify/__init__.py CHANGED
@@ -1,17 +1,13 @@
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
17
- #CertifiedShapesEngine = IntervalNewtonShapesEngine
13
+ # CertifiedShapesEngine = IntervalNewtonShapesEngine
@@ -1,17 +1,15 @@
1
- from __future__ import print_function
2
-
3
1
  from ..sage_helper import _within_sage, sage_method
4
2
 
5
- from .cuspCrossSection import RealCuspCrossSection
6
- from .squareExtensions import find_shapes_as_complex_sqrt_lin_combinations
7
- 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
8
9
  from . import exceptions
9
10
  from ..exceptions import SnapPeaFatalError
10
11
 
11
- from ..snap import t3mlite as t3m
12
-
13
12
  if _within_sage:
14
- from sage.rings.real_mpfi import RealIntervalField
15
13
  from sage.rings.complex_interval_field import ComplexIntervalField
16
14
  from ..pari import prec_dec_to_bits, prec_bits_to_dec
17
15
 
@@ -28,23 +26,25 @@ default_exact_bits_prec_and_degrees = [( 212, 10),
28
26
  (1000, 20),
29
27
  (2000, 20)]
30
28
 
31
- _num_tries_canonize = 3
29
+ _num_tries_kernel_canonize = 3
32
30
  _max_tries_verify_penalty = 9
33
31
 
32
+
34
33
  class FindExactShapesError(RuntimeError):
35
34
  """
36
35
  Raised when snap failed to find the exact shapes using the LLL-algorithm
37
36
  for a manifold.
38
37
  """
39
38
 
39
+
40
40
  @sage_method
41
- def interval_checked_canonical_triangulation(M, bits_prec = None):
41
+ def interval_checked_canonical_triangulation(M, bits_prec=None):
42
42
  """
43
43
  Given a canonical triangulation of a cusped (possibly non-orientable)
44
44
  manifold M, return this triangulation if it has tetrahedral cells and can
45
45
  be verified using interval arithmetics with the optional, given precision.
46
46
  Otherwise, raises an Exception.
47
-
47
+
48
48
  It fails when we call it on something which is not the canonical
49
49
  triangulation::
50
50
 
@@ -70,7 +70,7 @@ def interval_checked_canonical_triangulation(M, bits_prec = None):
70
70
  Traceback (most recent call last):
71
71
  ...
72
72
  TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: 0.?e-1... < 0
73
-
73
+
74
74
  Has a cubical canonical cell::
75
75
 
76
76
  sage: M = Manifold("m412")
@@ -79,20 +79,20 @@ def interval_checked_canonical_triangulation(M, bits_prec = None):
79
79
  Traceback (most recent call last):
80
80
  ...
81
81
  TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: 0.?e-1... < 0
82
-
82
+
83
83
  """
84
84
 
85
85
  # Get verified shape intervals
86
- shapes = M.tetrahedra_shapes('rect', intervals = True,
87
- bits_prec = bits_prec)
86
+ shapes = M.tetrahedra_shapes('rect', intervals=True,
87
+ bits_prec=bits_prec)
88
88
 
89
89
  # Compute cusp cross sections
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
97
97
  if M.num_cusps() > 1:
98
98
  c.normalize_cusps()
@@ -121,6 +121,7 @@ def interval_checked_canonical_triangulation(M, bits_prec = None):
121
121
  # Return M
122
122
  return M
123
123
 
124
+
124
125
  @sage_method
125
126
  def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
126
127
  """
@@ -136,12 +137,12 @@ def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
136
137
  sage: K = exactly_checked_canonical_retriangulation(M, 300, 4)
137
138
 
138
139
  M's canonical cell decomposition has a cube, so non-tetrahedral::
139
-
140
+
140
141
  sage: K.has_finite_vertices()
141
142
  True
142
143
 
143
144
  Has 12 tetrahedra after the retrianglation::
144
-
145
+
145
146
  sage: K.num_tetrahedra()
146
147
  12
147
148
 
@@ -170,10 +171,10 @@ def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
170
171
  # Check that the exact solutions form a complete hyperbolic structure
171
172
  # We convert to intervals to check that the shapes are positive and
172
173
  # the angles add up to 2pi and not some other multiple of 2pi.
173
- c.check_polynomial_edge_equations_exactly()
174
+ edge_equations.check_polynomial_edge_equations_exactly(c.mcomplex)
174
175
  c.check_cusp_development_exactly()
175
176
  CIF = ComplexIntervalField(bits_prec)
176
- c.check_logarithmic_edge_equations_and_positivity(CIF)
177
+ edge_equations.check_logarithmic_edge_equations_and_positivity(c.mcomplex, CIF)
177
178
 
178
179
  # Normalize cusp area. This is not needed when only 1 cusp
179
180
  if M.num_cusps() > 1:
@@ -193,56 +194,61 @@ def exactly_checked_canonical_retriangulation(M, bits_prec, degree):
193
194
  # Tilt is negative, return True
194
195
  if sign < 0:
195
196
  return True
196
-
197
+
197
198
  # Tilt is zero, return False
198
199
  if sign == 0:
199
200
  return False
200
-
201
+
201
202
  # Tilt is positive, raise exception
202
203
  if sign > 0:
203
204
  raise exceptions.TiltProvenPositiveNumericalVerifyError(interval)
204
205
 
205
206
  def index_of_face_corner(corner):
206
- face_index = t3m.simplex.comp(corner.Subsimplex).bit_length() - 1
207
+ face_index = simplex.comp(corner.Subsimplex).bit_length() - 1
207
208
  return 4 * corner.Tetrahedron.Index + face_index
208
209
 
209
210
  # Opacities of all four faces of each tetrahedron, initialize with None.
210
211
  # The format is opacity of face 0, 1, 2, 3 of the first tetrahedron,
211
212
  # ... of second tetrahedron, ...
212
213
  opacities = (4 * len(c.mcomplex.Tetrahedra)) * [ None ]
213
-
214
+
214
215
  # For each face of the triangulation
215
216
  for face in c.mcomplex.Faces:
216
217
  opacity = get_opacity(face.Tilt)
217
218
  for corner in face.Corners:
218
219
  opacities[index_of_face_corner(corner)] = opacity
219
-
220
+
220
221
  if None in opacities:
221
222
  raise Exception("Mismatch with opacities")
222
223
 
223
- # If there are transparent faces, this triangulation is just the
224
+ # If there are transparent faces, the given triangulation is just the
224
225
  # proto-canonical triangulation. We need to call into the SnapPea
225
226
  # kernel to retriangulate (introduces finite vertices)
226
- if False in opacities:
227
+ if not all(opacities):
227
228
  return M._canonical_retriangulation(opacities)
228
229
 
229
- # No transparent faces, this triangulation is the canonical triangulation.
230
+ # No transparent faces, this triangulation itself is the canonical cell
231
+ # decomposition.
230
232
  # Return it without introducing finite vertices.
231
233
  return M
232
234
 
233
- def _retrying_canonize(M):
235
+
236
+ def _retrying_canonize(M) -> None:
234
237
  """
235
238
  Wrapper for SnapPea kernel's function to compute the proto-canonical
236
239
  triangulation in place. It will retry the kernel function if it fails.
237
- Returns True if and only if the kernel function was successful eventually.
240
+ Raises an exception if it did not succeed eventually.
238
241
  """
239
- 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):
240
245
  try:
241
246
  M.canonize()
242
- return True
243
- except (RuntimeError, SnapPeaFatalError):
247
+ return
248
+ except (RuntimeError, SnapPeaFatalError) as e:
249
+ err = e
244
250
  M.randomize()
245
- return False
251
+ raise err
246
252
 
247
253
  def _retrying_high_precision_canonize(M):
248
254
  """
@@ -250,43 +256,49 @@ def _retrying_high_precision_canonize(M):
250
256
  triangulation. It will retry the kernel function if it fails, switching
251
257
  to the quad-double implementation.
252
258
  Returns the proto-canonical triangulation if the kernel function was
253
- successful eventually. Otherwise None. The original manifold is unchanged.
259
+ successful eventually. Otherwise, raises an exception.
260
+ The original manifold is unchanged.
254
261
  """
262
+
263
+ from .. import ManifoldHP
264
+
255
265
  # Make a copy of the manifold
256
266
  Mcopy = M.copy()
257
-
267
+
258
268
  # Try with the given precision first
259
- if _retrying_canonize(Mcopy):
269
+ try:
270
+ _retrying_canonize(Mcopy)
260
271
  return Mcopy
261
-
262
- # Then try with high precision.
263
- Mhp = M.high_precision()
264
- if _retrying_canonize(Mhp):
265
- return Mhp
266
-
267
- # Fail
268
- return None
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()
269
281
 
270
282
  def _print_exception(e):
271
283
  print('%s: %s' % (type(e).__name__, e))
272
284
 
285
+
273
286
  @sage_method
274
287
  def verified_canonical_retriangulation(
275
288
  M,
276
- interval_bits_precs = default_interval_bits_precs,
277
- exact_bits_prec_and_degrees = default_exact_bits_prec_and_degrees,
278
- verbose = False):
279
-
289
+ interval_bits_precs=default_interval_bits_precs,
290
+ exact_bits_prec_and_degrees=default_exact_bits_prec_and_degrees,
291
+ verbose=False):
280
292
  """
281
293
  Given some triangulation of a cusped (possibly non-orientable) manifold ``M``,
282
294
  return its canonical retriangulation. Return ``None`` if it could not certify
283
295
  the result.
284
296
 
285
- To compute the canonical retriangulation, it first prepares the manifold
297
+ To compute the canonical retriangulation, it first prepares the manifold
286
298
  (filling all Dehn-filled cusps and trying to find a proto-canonical
287
299
  triangulation).
288
300
  It then tries to certify the canonical triangulation using interval
289
- arithmetics. If this fails, it uses snap (using `LLL-algorithm
301
+ arithmetics. If this fails, it uses snap (using `LLL-algorithm
290
302
  <http://en.wikipedia.org/wiki/Lenstra%E2%80%93Lenstra%E2%80%93Lov%C3%A1sz_lattice_basis_reduction_algorithm>`_)
291
303
  to guess
292
304
  exact representations of the shapes in the shape field and then certifies
@@ -313,9 +325,6 @@ def verified_canonical_retriangulation(
313
325
  The exact arithmetics can take a long time. To circumvent it, use
314
326
  ``exact_bits_prec_and_degrees = None``.
315
327
 
316
- More information on the canonical retriangulation can be found in the
317
- SnapPea kernel ``canonize_part_2.c`` and in Section 3.1 of
318
- `Fominykh, Garoufalidis, Goerner, Tarkaev, Vesnin <http://arxiv.org/abs/1502.00383>`_.
319
328
 
320
329
  Canonical cell decomposition of ``m004`` has 2 tetrahedral cells::
321
330
 
@@ -335,7 +344,7 @@ def verified_canonical_retriangulation(
335
344
  True
336
345
  sage: K.num_tetrahedra()
337
346
  18
338
-
347
+
339
348
  Canonical cell decomposition of ``m412`` is a cube and has exactly 8
340
349
  symmetries::
341
350
 
@@ -361,15 +370,21 @@ def verified_canonical_retriangulation(
361
370
  non-tetrahedral cells so interval arithmetics can't certify it)::
362
371
 
363
372
  sage: M = Manifold("m412")
364
- 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
+
365
378
  """
366
379
 
367
380
  # This is the "outer" retry loop: it catches those verification
368
381
  # failures that can probably be fixed by taking a different
369
382
  # triangulation
370
-
383
+
371
384
  tries_penalty_left = _max_tries_verify_penalty
372
385
 
386
+ err = ValueError("_max_tries_verify_penalty is not positive.")
387
+
373
388
  while tries_penalty_left > 0:
374
389
  try:
375
390
  # The "inner" retry loop: it catches those verification
@@ -383,11 +398,13 @@ def verified_canonical_retriangulation(
383
398
  M, interval_bits_precs, exact_bits_prec_and_degrees,
384
399
  verbose)
385
400
 
386
- except (ZeroDivisionError,
401
+ except (ZeroDivisionError,
387
402
  exceptions.TiltProvenPositiveNumericalVerifyError,
388
403
  exceptions.EdgeEquationExactVerifyError) as e:
389
404
 
390
- # These three exceptions are probably raised due to the
405
+ err = e
406
+
407
+ # These three exceptions are probably raised due to the
391
408
  # SnapPea kernel failures:
392
409
  # - flat tetrahedra in the proto-canonical triangulation
393
410
  # - this provably not being the proto-canonical triangulation
@@ -432,49 +449,41 @@ def verified_canonical_retriangulation(
432
449
  "proto_canonize.")
433
450
  print("Next step: Give up.")
434
451
 
435
- return None
436
-
437
- return None
452
+ raise e
453
+
454
+ raise err
438
455
 
439
456
  def _verified_canonical_retriangulation(
440
457
  M, interval_bits_precs, exact_bits_prec_and_degrees,
441
458
  verbose):
459
+ """
460
+ Implements the "inner" retry loop of verified_canonical_retriangulation
442
461
 
443
- # Implements the "inner" retry loop of verified_canonical_retriangulation
444
-
445
- # If this returns None, it means that we have given up
446
- # If it leaves Exceptions uncaught, the "outer" loop will randomize
447
- # the triangulation.
448
-
449
- num_complete_cusps = 0
450
- num_incomplete_cusps = 0
451
- for cusp_info in M.cusp_info():
452
- if cusp_info['complete?']:
453
- num_complete_cusps += 1
454
- else:
455
- num_incomplete_cusps += 1
462
+ Returns retriangulation or raises exception.
456
463
 
457
- if not num_complete_cusps:
458
- if verbose:
459
- print("Failure: Due to no unfilled cusp.")
460
- print("Next step: Give up.")
461
- 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
+ """
462
469
 
463
- # Dehn-fill manifold first
464
- if num_incomplete_cusps:
465
- Mfilled = M.filled_triangulation()
466
- else:
470
+ if all(M.cusp_info('complete?')):
467
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?')
468
479
 
469
480
  # Try to compute proto-canonical triangulation
470
481
  Mcopy = _retrying_high_precision_canonize(Mfilled)
471
482
 
472
- if not Mcopy:
473
- if verbose:
474
- print("Failure: In SnapPea kernel's proto_canonize()")
475
- print("Next step: Give up.")
476
- return None
477
-
483
+ err = ValueError(
484
+ 'Neither interval_bits_precs nor exact_bits_prec_and_degrees was '
485
+ 'non-empty.')
486
+
478
487
  # First try interval arithmetics to verify
479
488
  if interval_bits_precs:
480
489
  for interval_bits_prec in interval_bits_precs:
@@ -484,7 +493,11 @@ def _verified_canonical_retriangulation(
484
493
  try:
485
494
  return interval_checked_canonical_triangulation(
486
495
  Mcopy, interval_bits_prec)
487
- 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
488
501
  if verbose:
489
502
  _print_exception(e)
490
503
  if isinstance(e, exceptions.NumericalVerifyError):
@@ -504,22 +517,26 @@ def _verified_canonical_retriangulation(
504
517
  return exactly_checked_canonical_retriangulation(
505
518
  Mcopy, bits_prec, degree)
506
519
  except FindExactShapesError as e:
520
+ err = e
507
521
  if verbose:
508
522
  _print_exception(e)
509
523
  print("Failure: Could not find exact shapes.")
510
524
  print("Next step: trying different method/precision")
511
525
 
512
- return None
526
+ raise err
513
527
 
514
528
  _known_canonical_retriangulations = [
515
529
  ('m004', '\x02\x0e\x01\x01\x01-\x1b\x87'),
516
530
  ('m412', '\x0c\x80\xac\xff\x07\x05\x07\t\n\t\x08\t\n\x0b\x0b\n\x0b\xe4\xe4\xe4\xe4\xe4\xe1\xe1\xe1\xe1\xe1\xe1\xe1\xe1'),
517
531
  ('m137', '\x12\x00\xb0\xfa\xaf\x0f\x04\t\x0b\x08\x07\x07\n\x0c\x0e\r\n\x0f\x0f\r\x11\x11\x10\x10\x11\xb4\xe4\xe1\xe1\xe1\xb4\xe1\xe1\xb1\xe1\xb4\xe4\xe4\xe1\xb1\xe1\xe1\xb4\xe1') ]
518
-
532
+
533
+
519
534
  def _test_against_known_canonical_retriangulations():
520
535
  from snappy import Manifold
521
536
  for name, bytes_ in _known_canonical_retriangulations:
522
- M = Manifold(name); K = verified_canonical_retriangulation(M)
523
- L = Manifold('empty'); L._from_bytes(bytes_)
524
- if not len(K.isomorphisms_to(L)):
537
+ M = Manifold(name)
538
+ K = verified_canonical_retriangulation(M)
539
+ L = Manifold('empty')
540
+ L._from_bytes(bytes_)
541
+ if not K.isomorphisms_to(L):
525
542
  raise Exception('%s failed' % name)
@@ -5,9 +5,10 @@ from .closed import *
5
5
 
6
6
  __all__ = ['verified_complex_volume_torsion']
7
7
 
8
+
8
9
  @sage_method
9
- def verified_complex_volume_torsion(manifold, bits_prec = None):
10
-
10
+ def verified_complex_volume_torsion(manifold, bits_prec=None):
11
+
11
12
  completeness = [
12
13
  cusp_info['complete?'] for cusp_info in manifold.cusp_info() ]
13
14