snappy 3.1.1__cp38-cp38-win_amd64.whl → 3.2__cp38-cp38-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. snappy/CyOpenGL.cp38-win_amd64.pyd +0 -0
  2. snappy/SnapPy.cp38-win_amd64.pyd +0 -0
  3. snappy/SnapPyHP.cp38-win_amd64.pyd +0 -0
  4. snappy/__init__.py +299 -402
  5. snappy/app.py +70 -20
  6. snappy/browser.py +18 -17
  7. snappy/canonical.py +249 -0
  8. snappy/{verify/cusp_shapes.py → cusps/__init__.py} +8 -18
  9. snappy/cusps/cusp_area_matrix.py +101 -0
  10. snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +23 -39
  11. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  12. snappy/cusps/test.py +21 -0
  13. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  14. snappy/database.py +10 -9
  15. snappy/decorated_isosig.py +337 -114
  16. snappy/dev/extended_ptolemy/complexVolumesClosed.py +40 -7
  17. snappy/dev/extended_ptolemy/extended.py +3 -3
  18. snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
  19. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +1 -1
  20. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  21. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  22. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  23. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  24. snappy/doc/_sources/additional_classes.rst.txt +40 -40
  25. snappy/doc/_sources/bugs.rst.txt +14 -14
  26. snappy/doc/_sources/censuses.rst.txt +51 -51
  27. snappy/doc/_sources/credits.rst.txt +75 -75
  28. snappy/doc/_sources/development.rst.txt +259 -239
  29. snappy/doc/_sources/index.rst.txt +182 -115
  30. snappy/doc/_sources/installing.rst.txt +247 -264
  31. snappy/doc/_sources/manifold.rst.txt +6 -6
  32. snappy/doc/_sources/manifoldhp.rst.txt +46 -46
  33. snappy/doc/_sources/news.rst.txt +355 -283
  34. snappy/doc/_sources/other.rst.txt +25 -25
  35. snappy/doc/_sources/platonic_census.rst.txt +20 -20
  36. snappy/doc/_sources/plink.rst.txt +102 -102
  37. snappy/doc/_sources/ptolemy.rst.txt +66 -66
  38. snappy/doc/_sources/ptolemy_classes.rst.txt +42 -42
  39. snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -297
  40. snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -363
  41. snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -301
  42. snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -61
  43. snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -105
  44. snappy/doc/_sources/screenshots.rst.txt +21 -21
  45. snappy/doc/_sources/snap.rst.txt +87 -87
  46. snappy/doc/_sources/snappy.rst.txt +28 -28
  47. snappy/doc/_sources/spherogram.rst.txt +103 -103
  48. snappy/doc/_sources/todo.rst.txt +47 -47
  49. snappy/doc/_sources/triangulation.rst.txt +11 -11
  50. snappy/doc/_sources/tutorial.rst.txt +49 -49
  51. snappy/doc/_sources/verify.rst.txt +210 -150
  52. snappy/doc/_sources/verify_internals.rst.txt +79 -90
  53. snappy/doc/_static/basic.css +924 -902
  54. snappy/doc/_static/css/badge_only.css +1 -1
  55. snappy/doc/_static/css/theme.css +1 -1
  56. snappy/doc/_static/doctools.js +1 -1
  57. snappy/doc/_static/documentation_options.js +12 -13
  58. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  59. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  60. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  61. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  62. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  63. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  64. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  65. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  66. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  67. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  68. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  69. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  70. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  71. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  72. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  73. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  74. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  75. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  76. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  77. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  78. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  79. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  80. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  81. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  82. snappy/doc/_static/js/versions.js +228 -0
  83. snappy/doc/_static/language_data.js +199 -199
  84. snappy/doc/_static/pygments.css +74 -73
  85. snappy/doc/_static/searchtools.js +125 -71
  86. snappy/doc/_static/snappy_furo.css +33 -33
  87. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
  88. snappy/doc/_static/sphinx_highlight.js +13 -3
  89. snappy/doc/additional_classes.html +1499 -1330
  90. snappy/doc/bugs.html +131 -134
  91. snappy/doc/censuses.html +426 -445
  92. snappy/doc/credits.html +180 -183
  93. snappy/doc/development.html +383 -363
  94. snappy/doc/genindex.html +1330 -1409
  95. snappy/doc/index.html +261 -206
  96. snappy/doc/installing.html +345 -363
  97. snappy/doc/manifold.html +3451 -2839
  98. snappy/doc/manifoldhp.html +179 -182
  99. snappy/doc/news.html +387 -329
  100. snappy/doc/objects.inv +0 -0
  101. snappy/doc/other.html +160 -162
  102. snappy/doc/platonic_census.html +374 -377
  103. snappy/doc/plink.html +209 -212
  104. snappy/doc/ptolemy.html +253 -255
  105. snappy/doc/ptolemy_classes.html +1143 -1146
  106. snappy/doc/ptolemy_examples1.html +408 -410
  107. snappy/doc/ptolemy_examples2.html +470 -473
  108. snappy/doc/ptolemy_examples3.html +413 -416
  109. snappy/doc/ptolemy_examples4.html +194 -197
  110. snappy/doc/ptolemy_prelim.html +247 -250
  111. snappy/doc/py-modindex.html +164 -167
  112. snappy/doc/screenshots.html +140 -142
  113. snappy/doc/search.html +134 -137
  114. snappy/doc/searchindex.js +1 -1
  115. snappy/doc/snap.html +201 -204
  116. snappy/doc/snappy.html +180 -182
  117. snappy/doc/spherogram.html +1210 -1213
  118. snappy/doc/todo.html +165 -168
  119. snappy/doc/triangulation.html +1583 -1474
  120. snappy/doc/tutorial.html +158 -161
  121. snappy/doc/verify.html +329 -275
  122. snappy/doc/verify_internals.html +1234 -1691
  123. snappy/drilling/__init__.py +153 -235
  124. snappy/drilling/barycentric.py +103 -0
  125. snappy/drilling/constants.py +0 -2
  126. snappy/drilling/crush.py +56 -130
  127. snappy/drilling/cusps.py +12 -6
  128. snappy/drilling/debug.py +2 -1
  129. snappy/drilling/exceptions.py +7 -40
  130. snappy/drilling/moves.py +302 -243
  131. snappy/drilling/perturb.py +63 -37
  132. snappy/drilling/shorten.py +36 -0
  133. snappy/drilling/subdivide.py +0 -5
  134. snappy/drilling/test.py +23 -0
  135. snappy/drilling/test_cases.py +126 -0
  136. snappy/drilling/tracing.py +9 -37
  137. snappy/exceptions.py +18 -5
  138. snappy/exterior_to_link/barycentric_geometry.py +2 -4
  139. snappy/exterior_to_link/main.py +8 -7
  140. snappy/exterior_to_link/mcomplex_with_link.py +2 -2
  141. snappy/exterior_to_link/rational_linear_algebra.py +1 -1
  142. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
  143. snappy/exterior_to_link/test.py +21 -33
  144. snappy/geometric_structure/__init__.py +212 -0
  145. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  146. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  147. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  148. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  149. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  150. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  151. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  152. snappy/geometric_structure/geodesic/__init__.py +0 -0
  153. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  154. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  155. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  156. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  157. snappy/geometric_structure/geodesic/constants.py +6 -0
  158. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  159. snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
  160. snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
  161. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  162. snappy/geometric_structure/geodesic/line.py +30 -0
  163. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  164. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  165. snappy/geometric_structure/test.py +22 -0
  166. snappy/gui.py +23 -13
  167. snappy/horoviewer.py +7 -7
  168. snappy/hyperboloid/__init__.py +96 -31
  169. snappy/hyperboloid/distances.py +245 -0
  170. snappy/hyperboloid/horoball.py +19 -0
  171. snappy/hyperboloid/line.py +35 -0
  172. snappy/hyperboloid/point.py +9 -0
  173. snappy/hyperboloid/triangle.py +29 -0
  174. snappy/isometry_signature.py +382 -0
  175. snappy/len_spec/__init__.py +596 -0
  176. snappy/len_spec/geodesic_info.py +110 -0
  177. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  178. snappy/len_spec/geodesic_piece.py +143 -0
  179. snappy/len_spec/geometric_structure.py +182 -0
  180. snappy/len_spec/geometry.py +80 -0
  181. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  182. snappy/len_spec/spine.py +206 -0
  183. snappy/len_spec/test.py +24 -0
  184. snappy/len_spec/test_cases.py +69 -0
  185. snappy/len_spec/tile.py +275 -0
  186. snappy/len_spec/word.py +86 -0
  187. snappy/math_basics.py +39 -13
  188. snappy/matrix.py +52 -9
  189. snappy/number.py +12 -6
  190. snappy/numeric_output_checker.py +2 -3
  191. snappy/pari.py +8 -4
  192. snappy/phone_home.py +2 -1
  193. snappy/polyviewer.py +8 -8
  194. snappy/ptolemy/__init__.py +1 -1
  195. snappy/ptolemy/component.py +2 -2
  196. snappy/ptolemy/coordinates.py +25 -25
  197. snappy/ptolemy/findLoops.py +9 -9
  198. snappy/ptolemy/manifoldMethods.py +27 -29
  199. snappy/ptolemy/polynomial.py +50 -57
  200. snappy/ptolemy/processFileBase.py +60 -0
  201. snappy/ptolemy/ptolemyVariety.py +109 -41
  202. snappy/ptolemy/reginaWrapper.py +4 -4
  203. snappy/ptolemy/rur.py +1 -1
  204. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
  205. snappy/ptolemy/test.py +99 -54
  206. snappy/ptolemy/utilities.py +1 -1
  207. snappy/raytracing/__init__.py +64 -0
  208. snappy/raytracing/additional_horospheres.py +64 -0
  209. snappy/raytracing/additional_len_spec_choices.py +63 -0
  210. snappy/raytracing/cohomology_fractal.py +0 -3
  211. snappy/raytracing/eyeball.py +123 -0
  212. snappy/raytracing/finite_raytracing_data.py +17 -17
  213. snappy/raytracing/finite_viewer.py +15 -15
  214. snappy/raytracing/geodesic_tube_info.py +93 -63
  215. snappy/raytracing/geodesics.py +94 -64
  216. snappy/raytracing/geodesics_window.py +56 -34
  217. snappy/raytracing/gui_utilities.py +21 -6
  218. snappy/raytracing/hyperboloid_navigation.py +29 -4
  219. snappy/raytracing/hyperboloid_utilities.py +73 -73
  220. snappy/raytracing/ideal_raytracing_data.py +121 -91
  221. snappy/raytracing/inside_viewer.py +199 -66
  222. snappy/raytracing/pack.py +22 -0
  223. snappy/raytracing/raytracing_data.py +37 -25
  224. snappy/raytracing/raytracing_view.py +70 -65
  225. snappy/raytracing/shaders/Eye.png +0 -0
  226. snappy/raytracing/shaders/NonGeometric.png +0 -0
  227. snappy/raytracing/shaders/__init__.py +39 -3
  228. snappy/raytracing/shaders/fragment.glsl +451 -133
  229. snappy/raytracing/test.py +29 -0
  230. snappy/raytracing/tooltip.py +146 -0
  231. snappy/raytracing/upper_halfspace_utilities.py +42 -9
  232. snappy/sage_helper.py +67 -134
  233. snappy/settings.py +90 -77
  234. snappy/shell.py +2 -0
  235. snappy/snap/character_varieties.py +2 -2
  236. snappy/snap/find_field.py +4 -3
  237. snappy/snap/fundamental_polyhedron.py +2 -2
  238. snappy/snap/kernel_structures.py +5 -1
  239. snappy/snap/nsagetools.py +9 -8
  240. snappy/snap/peripheral/dual_cellulation.py +4 -3
  241. snappy/snap/peripheral/peripheral.py +2 -2
  242. snappy/snap/peripheral/surface.py +5 -5
  243. snappy/snap/peripheral/test.py +1 -1
  244. snappy/snap/polished_reps.py +8 -8
  245. snappy/snap/slice_obs_HKL.py +16 -14
  246. snappy/snap/t3mlite/arrow.py +3 -3
  247. snappy/snap/t3mlite/edge.py +3 -3
  248. snappy/snap/t3mlite/homology.py +2 -2
  249. snappy/snap/t3mlite/mcomplex.py +3 -3
  250. snappy/snap/t3mlite/simplex.py +12 -0
  251. snappy/snap/t3mlite/spun.py +18 -17
  252. snappy/snap/t3mlite/test_vs_regina.py +4 -4
  253. snappy/snap/test.py +37 -53
  254. snappy/snap/utilities.py +4 -5
  255. snappy/test.py +121 -138
  256. snappy/test_cases.py +263 -0
  257. snappy/testing.py +131 -0
  258. snappy/tiling/__init__.py +2 -0
  259. snappy/tiling/canonical_key_dict.py +59 -0
  260. snappy/tiling/dict_based_set.py +79 -0
  261. snappy/tiling/floor.py +49 -0
  262. snappy/tiling/hyperboloid_dict.py +54 -0
  263. snappy/tiling/iter_utils.py +78 -0
  264. snappy/tiling/lifted_tetrahedron.py +22 -0
  265. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  266. snappy/tiling/real_hash_dict.py +164 -0
  267. snappy/tiling/test.py +23 -0
  268. snappy/tiling/tile.py +215 -0
  269. snappy/tiling/triangle.py +33 -0
  270. snappy/tkterminal.py +113 -84
  271. snappy/twister/main.py +1 -7
  272. snappy/twister/twister_core.cp38-win_amd64.pyd +0 -0
  273. snappy/upper_halfspace/__init__.py +78 -17
  274. snappy/verify/__init__.py +3 -7
  275. snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
  276. snappy/verify/complex_volume/adjust_torsion.py +1 -2
  277. snappy/verify/complex_volume/closed.py +13 -13
  278. snappy/verify/complex_volume/cusped.py +6 -6
  279. snappy/verify/complex_volume/extended_bloch.py +5 -8
  280. snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
  281. snappy/verify/edge_equations.py +80 -0
  282. snappy/verify/exceptions.py +0 -55
  283. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
  284. snappy/verify/interval_newton_shapes_engine.py +7 -5
  285. snappy/verify/interval_tree.py +5 -5
  286. snappy/verify/krawczyk_shapes_engine.py +17 -18
  287. snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
  288. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
  289. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
  290. snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
  291. snappy/verify/shapes.py +5 -3
  292. snappy/verify/short_slopes.py +39 -41
  293. snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
  294. snappy/verify/test.py +57 -60
  295. snappy/verify/upper_halfspace/extended_matrix.py +1 -1
  296. snappy/verify/upper_halfspace/finite_point.py +3 -4
  297. snappy/verify/upper_halfspace/ideal_point.py +9 -9
  298. snappy/verify/volume.py +2 -2
  299. snappy/version.py +2 -2
  300. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +14 -10
  301. snappy-3.2.dist-info/RECORD +503 -0
  302. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  303. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  304. snappy/__pycache__/__init__.cpython-38.pyc +0 -0
  305. snappy/__pycache__/browser.cpython-38.pyc +0 -0
  306. snappy/__pycache__/cache.cpython-38.pyc +0 -0
  307. snappy/__pycache__/database.cpython-38.pyc +0 -0
  308. snappy/__pycache__/db_utilities.cpython-38.pyc +0 -0
  309. snappy/__pycache__/decorated_isosig.cpython-38.pyc +0 -0
  310. snappy/__pycache__/exceptions.cpython-38.pyc +0 -0
  311. snappy/__pycache__/export_stl.cpython-38.pyc +0 -0
  312. snappy/__pycache__/filedialog.cpython-38.pyc +0 -0
  313. snappy/__pycache__/gui.cpython-38.pyc +0 -0
  314. snappy/__pycache__/horoviewer.cpython-38.pyc +0 -0
  315. snappy/__pycache__/math_basics.cpython-38.pyc +0 -0
  316. snappy/__pycache__/matrix.cpython-38.pyc +0 -0
  317. snappy/__pycache__/number.cpython-38.pyc +0 -0
  318. snappy/__pycache__/numeric_output_checker.cpython-38.pyc +0 -0
  319. snappy/__pycache__/pari.cpython-38.pyc +0 -0
  320. snappy/__pycache__/polyviewer.cpython-38.pyc +0 -0
  321. snappy/__pycache__/sage_helper.cpython-38.pyc +0 -0
  322. snappy/__pycache__/version.cpython-38.pyc +0 -0
  323. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  324. snappy/doc/_static/jquery-3.6.0.js +0 -10881
  325. snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
  326. snappy/doc/_static/js/html5shiv.min.js +0 -4
  327. snappy/doc/_static/underscore-1.13.1.js +0 -2042
  328. snappy/doc/_static/underscore.js +0 -6
  329. snappy/doc/verify_canon.html +0 -304
  330. snappy/drilling/__pycache__/__init__.cpython-38.pyc +0 -0
  331. snappy/drilling/__pycache__/constants.cpython-38.pyc +0 -0
  332. snappy/drilling/__pycache__/crush.cpython-38.pyc +0 -0
  333. snappy/drilling/__pycache__/cusps.cpython-38.pyc +0 -0
  334. snappy/drilling/__pycache__/debug.cpython-38.pyc +0 -0
  335. snappy/drilling/__pycache__/epsilons.cpython-38.pyc +0 -0
  336. snappy/drilling/__pycache__/exceptions.cpython-38.pyc +0 -0
  337. snappy/drilling/__pycache__/fixed_points.cpython-38.pyc +0 -0
  338. snappy/drilling/__pycache__/geodesic_info.cpython-38.pyc +0 -0
  339. snappy/drilling/__pycache__/geodesic_tube.cpython-38.pyc +0 -0
  340. snappy/drilling/__pycache__/geometric_structure.cpython-38.pyc +0 -0
  341. snappy/drilling/__pycache__/line.cpython-38.pyc +0 -0
  342. snappy/drilling/__pycache__/moves.cpython-38.pyc +0 -0
  343. snappy/drilling/__pycache__/peripheral_curves.cpython-38.pyc +0 -0
  344. snappy/drilling/__pycache__/perturb.cpython-38.pyc +0 -0
  345. snappy/drilling/__pycache__/quotient_space.cpython-38.pyc +0 -0
  346. snappy/drilling/__pycache__/spatial_dict.cpython-38.pyc +0 -0
  347. snappy/drilling/__pycache__/subdivide.cpython-38.pyc +0 -0
  348. snappy/drilling/__pycache__/tracing.cpython-38.pyc +0 -0
  349. snappy/drilling/geodesic_tube.py +0 -441
  350. snappy/drilling/geometric_structure.py +0 -366
  351. snappy/drilling/line.py +0 -122
  352. snappy/drilling/quotient_space.py +0 -94
  353. snappy/drilling/spatial_dict.py +0 -128
  354. snappy/exterior_to_link/__pycache__/__init__.cpython-38.pyc +0 -0
  355. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-38.pyc +0 -0
  356. snappy/exterior_to_link/__pycache__/exceptions.cpython-38.pyc +0 -0
  357. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-38.pyc +0 -0
  358. snappy/exterior_to_link/__pycache__/link_projection.cpython-38.pyc +0 -0
  359. snappy/exterior_to_link/__pycache__/main.cpython-38.pyc +0 -0
  360. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-38.pyc +0 -0
  361. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-38.pyc +0 -0
  362. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-38.pyc +0 -0
  363. snappy/exterior_to_link/__pycache__/pl_utils.cpython-38.pyc +0 -0
  364. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-38.pyc +0 -0
  365. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-38.pyc +0 -0
  366. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-38.pyc +0 -0
  367. snappy/exterior_to_link/__pycache__/stored_moves.cpython-38.pyc +0 -0
  368. snappy/hyperboloid/__pycache__/__init__.cpython-38.pyc +0 -0
  369. snappy/manifolds/__pycache__/__init__.cpython-38.pyc +0 -0
  370. snappy/ptolemy/__pycache__/__init__.cpython-38.pyc +0 -0
  371. snappy/ptolemy/__pycache__/component.cpython-38.pyc +0 -0
  372. snappy/ptolemy/__pycache__/coordinates.cpython-38.pyc +0 -0
  373. snappy/ptolemy/__pycache__/fieldExtensions.cpython-38.pyc +0 -0
  374. snappy/ptolemy/__pycache__/findLoops.cpython-38.pyc +0 -0
  375. snappy/ptolemy/__pycache__/homology.cpython-38.pyc +0 -0
  376. snappy/ptolemy/__pycache__/manifoldMethods.cpython-38.pyc +0 -0
  377. snappy/ptolemy/__pycache__/matrix.cpython-38.pyc +0 -0
  378. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-38.pyc +0 -0
  379. snappy/ptolemy/__pycache__/polynomial.cpython-38.pyc +0 -0
  380. snappy/ptolemy/__pycache__/processComponents.cpython-38.pyc +0 -0
  381. snappy/ptolemy/__pycache__/processFileBase.cpython-38.pyc +0 -0
  382. snappy/ptolemy/__pycache__/processFileDispatch.cpython-38.pyc +0 -0
  383. snappy/ptolemy/__pycache__/processMagmaFile.cpython-38.pyc +0 -0
  384. snappy/ptolemy/__pycache__/processRurFile.cpython-38.pyc +0 -0
  385. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-38.pyc +0 -0
  386. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-38.pyc +0 -0
  387. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-38.pyc +0 -0
  388. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
  389. snappy/ptolemy/__pycache__/rur.cpython-38.pyc +0 -0
  390. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
  391. snappy/ptolemy/__pycache__/utilities.cpython-38.pyc +0 -0
  392. snappy/snap/__pycache__/__init__.cpython-38.pyc +0 -0
  393. snappy/snap/__pycache__/character_varieties.cpython-38.pyc +0 -0
  394. snappy/snap/__pycache__/fundamental_polyhedron.cpython-38.pyc +0 -0
  395. snappy/snap/__pycache__/interval_reps.cpython-38.pyc +0 -0
  396. snappy/snap/__pycache__/kernel_structures.cpython-38.pyc +0 -0
  397. snappy/snap/__pycache__/mcomplex_base.cpython-38.pyc +0 -0
  398. snappy/snap/__pycache__/nsagetools.cpython-38.pyc +0 -0
  399. snappy/snap/__pycache__/polished_reps.cpython-38.pyc +0 -0
  400. snappy/snap/__pycache__/shapes.cpython-38.pyc +0 -0
  401. snappy/snap/__pycache__/slice_obs_HKL.cpython-38.pyc +0 -0
  402. snappy/snap/__pycache__/utilities.cpython-38.pyc +0 -0
  403. snappy/snap/peripheral/__pycache__/__init__.cpython-38.pyc +0 -0
  404. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-38.pyc +0 -0
  405. snappy/snap/peripheral/__pycache__/link.cpython-38.pyc +0 -0
  406. snappy/snap/peripheral/__pycache__/peripheral.cpython-38.pyc +0 -0
  407. snappy/snap/peripheral/__pycache__/surface.cpython-38.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/__init__.cpython-38.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/arrow.cpython-38.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/corner.cpython-38.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/edge.cpython-38.pyc +0 -0
  412. snappy/snap/t3mlite/__pycache__/face.cpython-38.pyc +0 -0
  413. snappy/snap/t3mlite/__pycache__/files.cpython-38.pyc +0 -0
  414. snappy/snap/t3mlite/__pycache__/homology.cpython-38.pyc +0 -0
  415. snappy/snap/t3mlite/__pycache__/linalg.cpython-38.pyc +0 -0
  416. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-38.pyc +0 -0
  417. snappy/snap/t3mlite/__pycache__/perm4.cpython-38.pyc +0 -0
  418. snappy/snap/t3mlite/__pycache__/simplex.cpython-38.pyc +0 -0
  419. snappy/snap/t3mlite/__pycache__/spun.cpython-38.pyc +0 -0
  420. snappy/snap/t3mlite/__pycache__/surface.cpython-38.pyc +0 -0
  421. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-38.pyc +0 -0
  422. snappy/snap/t3mlite/__pycache__/vertex.cpython-38.pyc +0 -0
  423. snappy/togl/__init__.py +0 -3
  424. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  425. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  426. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  427. snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
  428. snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
  429. snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
  430. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  431. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  432. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  433. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  434. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  435. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  436. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  437. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  438. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  439. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  440. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  441. snappy/twister/__pycache__/__init__.cpython-38.pyc +0 -0
  442. snappy/twister/__pycache__/main.cpython-38.pyc +0 -0
  443. snappy/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
  444. snappy/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
  445. snappy/verify/__pycache__/__init__.cpython-38.pyc +0 -0
  446. snappy/verify/__pycache__/cuspCrossSection.cpython-38.pyc +0 -0
  447. snappy/verify/__pycache__/cuspTranslations.cpython-38.pyc +0 -0
  448. snappy/verify/__pycache__/cusp_areas.cpython-38.pyc +0 -0
  449. snappy/verify/__pycache__/cusp_shapes.cpython-38.pyc +0 -0
  450. snappy/verify/__pycache__/exceptions.cpython-38.pyc +0 -0
  451. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-38.pyc +0 -0
  452. snappy/verify/__pycache__/interval_tree.cpython-38.pyc +0 -0
  453. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-38.pyc +0 -0
  454. snappy/verify/__pycache__/realAlgebra.cpython-38.pyc +0 -0
  455. snappy/verify/__pycache__/shapes.cpython-38.pyc +0 -0
  456. snappy/verify/__pycache__/short_slopes.cpython-38.pyc +0 -0
  457. snappy/verify/__pycache__/squareExtensions.cpython-38.pyc +0 -0
  458. snappy/verify/__pycache__/verifyCanonical.cpython-38.pyc +0 -0
  459. snappy/verify/__pycache__/verifyHyperbolicity.cpython-38.pyc +0 -0
  460. snappy/verify/__pycache__/volume.cpython-38.pyc +0 -0
  461. snappy/verify/complex_volume/__pycache__/__init__.cpython-38.pyc +0 -0
  462. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-38.pyc +0 -0
  463. snappy/verify/complex_volume/__pycache__/closed.cpython-38.pyc +0 -0
  464. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-38.pyc +0 -0
  465. snappy/verify/complex_volume/__pycache__/cusped.cpython-38.pyc +0 -0
  466. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-38.pyc +0 -0
  467. snappy/verify/cuspCrossSection.py +0 -1422
  468. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-38.pyc +0 -0
  469. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-38.pyc +0 -0
  470. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-38.pyc +0 -0
  471. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
  472. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-38.pyc +0 -0
  473. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-38.pyc +0 -0
  474. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
  475. snappy-3.1.1.dist-info/RECORD +0 -575
  476. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
@@ -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]