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/canonical.py ADDED
@@ -0,0 +1,249 @@
1
+ from . import verify
2
+ from . import Triangulation, TriangulationHP, Manifold, ManifoldHP
3
+
4
+ from typing import Optional, Union, Sequence, Tuple
5
+
6
+ __all__ = ['canonical_retriangulation', 'canonical_retriangulation_hp']
7
+
8
+ def _canonical_retriangulation(
9
+ manifold : Union[Manifold, ManifoldHP],
10
+ verified : bool,
11
+ interval_bits_precs : Sequence[int],
12
+ exact_bits_prec_and_degrees : Sequence[Tuple[int, int]],
13
+ verbose : bool) -> Union[Triangulation, TriangulationHP,
14
+ Manifold, ManifoldHP]:
15
+ """
16
+ Returns a triangulation canonically associated to the hyperbolic manifold.
17
+ That is, the triangulation is (up to combinatorial isomorphism relabeling
18
+ the tetrahedra and vertices) completely determined by the isometry type of
19
+ the hyperbolic manifold.
20
+
21
+ Manifolds with incomplete cusps are rejected (unlike in the case of
22
+ :meth:`isometry_signature <snappy.Manifold.isometry_signature>`).
23
+
24
+ We now describe the canonical retriangulation. If all cells of
25
+ the canonical cell decomposition (defined by `Epstein and Penner '88
26
+ <https://projecteuclid.org/euclid.jdg/1214441650>`_) are tetrahedral,
27
+ :meth:`canonical_retriangulation <Manifold.canonical_retriangulation>`
28
+ simply returns that ideal triangulation as a
29
+ :class:`Manifold <snappy.Manifold>`. Here is an example::
30
+
31
+ >>> M = Manifold("m015")
32
+ >>> K = M.canonical_retriangulation()
33
+ >>> K.has_finite_vertices()
34
+ False
35
+ >>> K.solution_type()
36
+ 'all tetrahedra positively oriented'
37
+
38
+ If there are non-tetrahedral cells,
39
+ :meth:`canonical_retriangulation <Manifold.canonical_retriangulation>`
40
+ subdivides the canonical cell decomposition. It introduces a finite vertex
41
+ for each canonical cell resulting in a
42
+ :class:`Triangulation <snappy.Triangulation>`. Here is an example where the
43
+ canonical cell is a cube::
44
+
45
+ >>> M = Manifold("m412")
46
+ >>> K = M.canonical_retriangulation()
47
+ >>> K.has_finite_vertices()
48
+ True
49
+
50
+ The canonical retriangulation can be used to find the symmetries of a
51
+ single manifold. It also can compute the isometries between two
52
+ manifolds. We do this using
53
+ :meth:`isomorphisms_to <snappy.Triangulation.isomorphisms_to>`::
54
+
55
+ >>> M = Manifold("5_2").canonical_retriangulation()
56
+ >>> N = Manifold("m015").canonical_retriangulation()
57
+ >>> M.isomorphisms_to(M) #doctest: +ELLIPSIS
58
+ [0 -> 0
59
+ [1 0]
60
+ [0 1]
61
+ ...
62
+ >>> M.isomorphisms_to(N) #doctest: +ELLIPSIS
63
+ [0 -> 0
64
+ [-1 2]
65
+ [ 0 -1]
66
+ ...
67
+
68
+ The canonical retriangulation is also the basis for the
69
+ :meth:`isometry_signature <snappy.Manifold.isometry_signature>`.
70
+
71
+ **Subdivision**
72
+
73
+ If the canonical cell decomposition has a non-tetrahedral cell, the method
74
+ subdivides. You can think of the subdivision in either of the following
75
+ (equivalent) ways:
76
+
77
+ - A coarsening of the barycentric subdivision with only a quarter of the
78
+ number of tetrahedra. That is, take the barycentric subdivision and
79
+ merge the four tetrahedra adjacent to a barycentric edge connecting
80
+ an edge midpoint to a face midpoint.
81
+ - Taking the double suspension of each face (which is an ideal n-gon)
82
+ about the centers of the two neighboring 3-cells. Then split each
83
+ such topological "lens" into n tetrahedra along its central axis.
84
+
85
+ **Verified computations**
86
+
87
+ While the canonical retriangulation is combinatorial, some intermediate
88
+ computations are numerical. Thus, if :attr:`verified = False`,
89
+ floating-point issues can arise.
90
+ (Arguably this gave rise to a mistake in the
91
+ non-orientable census. ``x101`` and ``x103`` were later identified as
92
+ the same by `Burton '14 <http://arxiv.org/abs/1311.7615>`_.)
93
+
94
+ The method can be made :ref:`verified <verify-primer>` by passing
95
+ :attr:`verified = True`::
96
+
97
+ sage: M = Manifold("v2986")
98
+ sage: K = M.canonical_retriangulation(verified = True)
99
+ sage: K.has_finite_vertices() # Cell decomposition verified to be tetrahedral
100
+ False
101
+ sage: K.triangulation_isosig(decorated=False) # Verified isometry signature.
102
+ 'jvLALQQdeefgihihiokcmmwwswg'
103
+ sage: len(K.isomorphisms_to(K)) # Verified to have no (non-trivial) symmetries.
104
+ 1
105
+
106
+ Interval arithmetic can only be used to verify the canonical cell decomposition
107
+ if all cells are tetrahedral. For non-tetrahedral cells, the method
108
+ automatically switches to
109
+ exact methods to verify the canonical cell decomposition. That is, it uses
110
+ snap-like methods
111
+ (`LLL-algorithm <http://en.wikipedia.org/wiki/Lenstra%E2%80%93Lenstra%E2%80%93Lov%C3%A1sz_lattice_basis_reduction_algorithm>`_)
112
+ to guess a representation of the
113
+ shapes in the shape field. It then uses exact arithmetic to verify the
114
+ shapes form a valid geometric structure and compute the necessary tilts
115
+ to verify the canonical cell decomposition. Note that this can take a
116
+ long time!
117
+
118
+ Here is an example where exact methods are used::
119
+
120
+ sage: M = Manifold("m412")
121
+ sage: K = M.canonical_retriangulation(verified = True)
122
+ sage: K.has_finite_vertices() # Has non-tetrahedral cell
123
+ True
124
+
125
+ If the canonical retriangulation cannot be verified, an exception will be
126
+ raised. (Note that this is new (and safer) in Version 3.2. Prior to that
127
+ version, :meth:`Manifold.canonical_retriangulation` could return ``None``
128
+ instead.)
129
+
130
+ Here is an example where we skip the (potentially lengthy) exact methods
131
+ needed to verify a non-tetrahedral cell. The method fails (early
132
+ and with an exception) since the cells are actually tetrahedral::
133
+
134
+ sage: M = Manifold("m412")
135
+ sage: K = M.canonical_retriangulation(verified = True, exact_bits_prec_and_degrees = []) # doctest: +ELLIPSIS +IGNORE_EXCEPTION_DETAIL
136
+ Traceback (most recent call last):
137
+ ...
138
+ snappy.verify.exceptions.TiltInequalityNumericalVerifyError: Numerical verification that tilt is negative has failed: ... < 0
139
+
140
+ :param verified:
141
+ Use :ref:`verified computation <verify-primer>`.
142
+ :param interval_bits_precs:
143
+ Only relevant if :attr:`verified = True`.
144
+ A list of (increasing) precisions used to try to
145
+ certify the canonical cell decomposition using intervals. Each
146
+ precision is tried until we succeed. If none succeeded, we move on
147
+ to exact methods.
148
+ :param exact_bits_prec_and_degrees:
149
+ Only relevant if :attr:`verified = True`.
150
+ A list of pairs (precision, max degree) used when the
151
+ LLL-algorithm is trying to find the defining
152
+ polynomial of the shape field with
153
+ ``ListOfApproximateAlgebraicNumbers.find_field``.
154
+ Each pair is tried until we succeed.
155
+ :param verbose:
156
+ Print information about the methods tried to compute and verify the
157
+ canonical retriangulation.
158
+ :return:
159
+ If the canonical cell decomposition exists entirely of
160
+ (hyperbolic ideal) tetrahedra, a :class:`Manifold` with those
161
+ tetrahedra.
162
+ Otherwise, a :class:`Triangulation` that is a subdivision of the
163
+ canonical cell decomposition.
164
+ """
165
+
166
+ # More information on the canonical retriangulation can be found in the
167
+ # SnapPea kernel ``canonize_part_2.c`` and in Section 3.1 of
168
+ # `Fominykh, Garoufalidis, Goerner, Tarkaev, Vesnin <http://arxiv.org/abs/1502.00383>`_.
169
+
170
+ if not all(manifold.cusp_info('complete?')):
171
+ # It is unclear what to do when there are filling coefficients.
172
+ # The SnapPea kernel ignores them and uses the complete structure
173
+ # to compute the canonical retriangulation.
174
+ #
175
+ # That makes sense to, e.g., compute a canonical representation
176
+ # of a surgery diagram.
177
+ #
178
+ # In other situations, it makes perfectly sense to fill the cusps
179
+ # instead. That is, e.g., what the isometry_signature does.
180
+ #
181
+ # Since it is ambiguous, I decided to simply reject it here.
182
+ #
183
+ # It is easy enough for a user to either call fill_triangulation
184
+ # or to save the coefficients and unfill all cusps.
185
+ #
186
+ raise ValueError(
187
+ 'Canonical retriangulation needs all cusps to be complete.')
188
+
189
+ if verified:
190
+ # verified_canonical_retriangulation has code to check
191
+ # for incomplete cusps and fill them that never gets
192
+ # executed because of the above "if"
193
+ return verify.verified_canonical_retriangulation(
194
+ manifold,
195
+ interval_bits_precs=interval_bits_precs,
196
+ exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
197
+ verbose=verbose)
198
+ else:
199
+ # Note that the SnapPea kernel actually ignores Dehn-fillings
200
+ # when computing the canonical retriangulation.
201
+ if not all(manifold.cusp_info('complete?')):
202
+ # Never executed because of above "if".
203
+ manifold = manifold.filled_triangulation()
204
+ if not all(manifold.cusp_info('complete?')):
205
+ raise ValueError(
206
+ 'Could not compute filled triangulation. '
207
+ 'Are the filling coefficients co-prime integers?')
208
+
209
+ K = manifold._canonical_retriangulation()
210
+ if K.has_finite_vertices():
211
+ return K
212
+ else:
213
+ if isinstance(manifold, ManifoldHP):
214
+ return ManifoldHP(K)
215
+ else:
216
+ return Manifold(K)
217
+
218
+ # Wraps _canonical_retriangulation to have the correct return type
219
+ def canonical_retriangulation(
220
+ manifold : Manifold,
221
+ verified : bool = False,
222
+ interval_bits_precs : Sequence[int] = verify.default_interval_bits_precs,
223
+ exact_bits_prec_and_degrees : Sequence[Tuple[int, int]] = verify.default_exact_bits_prec_and_degrees,
224
+ verbose : bool = False) -> Union[Triangulation, Manifold]:
225
+ return _canonical_retriangulation(
226
+ manifold,
227
+ verified = verified,
228
+ interval_bits_precs = interval_bits_precs,
229
+ exact_bits_prec_and_degrees = exact_bits_prec_and_degrees,
230
+ verbose = verbose)
231
+ canonical_retriangulation.__doc__ = _canonical_retriangulation.__doc__
232
+
233
+ # Wraps _canonical_retriangulation to have the correct return type
234
+ def canonical_retriangulation_hp(
235
+ manifold : ManifoldHP,
236
+ verified : bool = False,
237
+ interval_bits_precs : Sequence[int] = verify.default_interval_bits_precs,
238
+ exact_bits_prec_and_degrees : Sequence[Tuple[int, int]] = verify.default_exact_bits_prec_and_degrees,
239
+ verbose : bool = False) -> Union[TriangulationHP, ManifoldHP]:
240
+ return _canonical_retriangulation(
241
+ manifold,
242
+ verified = verified,
243
+ interval_bits_precs = interval_bits_precs,
244
+ exact_bits_prec_and_degrees = exact_bits_prec_and_degrees,
245
+ verbose = verbose)
246
+ canonical_retriangulation_hp.__doc__ = _canonical_retriangulation.__doc__
247
+
248
+
249
+
@@ -1,23 +1,15 @@
1
- from .cuspCrossSection import ComplexCuspCrossSection
2
- from .shapes import compute_hyperbolic_shapes
1
+ """
2
+ Computing data about cusps such as cusp matrix, shape, translations
3
+ and exceptional slopes.
4
+ """
3
5
 
4
- __all__ = ['NonorientableManifoldError', 'compute_cusp_shapes']
6
+ from ..geometric_structure.cusp_neighborhood.complex_cusp_cross_section import ComplexCuspCrossSection
7
+ from ..verify.shapes import compute_hyperbolic_shapes
8
+ from ..exceptions import NonorientableManifoldError
5
9
 
6
- class NonorientableManifoldError(RuntimeError):
10
+ def compute_cusp_shapes(manifold, verified, bits_prec=None):
7
11
  """
8
- Exception raised when trying to compute cusp shapes for a non-orientable
9
- manifold.
10
- """
11
- def __init__(self, manifold):
12
- self.manifold = manifold
13
-
14
- def __str__(self):
15
- return (('Cannot compute cusp shapes for non-orientable '
16
- 'manifold %s') % self.manifold)
17
-
18
- def compute_cusp_shapes(manifold, verified, bits_prec = None):
19
- """
20
- Compute verified cusp shapes (following the SnapPea kernel convention,
12
+ Compute cusp shapes. Following the SnapPea kernel convention,
21
13
  it returns the conjugate of the quotient of the translations
22
14
  corresponding to the longitude and meridian for each cusp.
23
15
 
@@ -28,7 +20,7 @@ def compute_cusp_shapes(manifold, verified, bits_prec = None):
28
20
  sage: M = Manifold('s843')
29
21
  sage: M.cusp_info('shape', verified = True) # doctest: +NUMERIC12
30
22
  [0.46738227587? + 1.19036005068?*I, 0.0841873244146? + 1.0506945576790?*I]
31
-
23
+
32
24
  sage: M.cusp_info('shape', verified = True, bits_prec = 100) # doctest: +NUMERIC21
33
25
  [0.4673822758634149679181698? + 1.1903600506742881207098974?*I, 0.084187324414612694374797272? + 1.050694557679002004845675723?*I]
34
26
  """
@@ -37,7 +29,7 @@ def compute_cusp_shapes(manifold, verified, bits_prec = None):
37
29
  raise NonorientableManifoldError(manifold)
38
30
 
39
31
  shapes = compute_hyperbolic_shapes(
40
- manifold, verified = verified, bits_prec = bits_prec)
32
+ manifold, verified=verified, bits_prec=bits_prec)
41
33
 
42
34
  # Compute cusp cross section
43
35
  c = ComplexCuspCrossSection.fromManifoldAndShapes(manifold, shapes)
@@ -0,0 +1,101 @@
1
+ from .maximal_cusp_area_matrix import maximal_cusp_area_matrix
2
+ from .trig_cusp_area_matrix import triangulation_dependent_cusp_area_matrix
3
+ from ..verify.maximal_cusp_area_matrix import legacy_verified_maximal_cusp_area_matrix
4
+
5
+ from typing import Optional
6
+
7
+ def cusp_area_matrix(
8
+ manifold,
9
+ method : str = 'maximal',
10
+ verified : bool = False,
11
+ bits_prec : Optional[int] = None):
12
+ """
13
+ Returns the maximal cusp area matrix :math:`(A_{ij})` where
14
+ :math:`A_{ij}` is defined as follows.
15
+ Let :math:`C_i` and :math:`C_j` be the (open) cusp neighborhoods about cusp
16
+ :math:`i` and :math:`j`. Let :math:`A(C_i)` and :math:`A(C_j)` be the
17
+ areas of :math:`C_i` and :math:`C_j`, respectively. Then, :math:`C_i`
18
+ and :math:`C_j` are embedded (if :math:`i = j`) or disjoint (otherwise)
19
+ if and only if :math:`A(C_i)A(C_j) \\leq A_{ij}`.
20
+
21
+ Here is an example::
22
+
23
+ >>> M = Manifold("L6a5")
24
+ >>> M.cusp_area_matrix() # doctest: +NUMERIC12
25
+ [27.9999999999996 7.00000000000000 7.00000000000000]
26
+ [7.00000000000000 27.9999999999999 7.00000000000000]
27
+ [7.00000000000000 7.00000000000000 28.0000000000001]
28
+
29
+
30
+ **Faster lower bounds**
31
+
32
+ This section can be skipped by most users!
33
+
34
+ Prior to SnapPy version 3.2, the algorithm to compute the maximal cusp
35
+ area matrix was much slower and required :attr:`verified = True` and
36
+ SageMath. Thus, in prior versions, :attr:`method` defaulted to
37
+ ``trigDependentTryCanonize``. This meant, that, by default,
38
+ :meth:`~snappy.Manifold.cusp_area_matrix` only returned
39
+ (some) lower bounds for the maximal cusp area matrix entries.
40
+
41
+ These lower bounds can still be accessed::
42
+
43
+ >>> M.cusp_area_matrix(method = 'trigDependentTryCanonize') # doctest: +NUMERIC12
44
+ [21.4375000000000 7.00000000000000 7.00000000000000]
45
+ [7.00000000000000 28.0000000000000 7.00000000000000]
46
+ [7.00000000000000 7.00000000000000 28.0000000000000]
47
+
48
+ If :attr:`method = 'trigDependent'` or
49
+ :attr:`method = 'trigDependenyTryCanonize'`, the result is triangulation
50
+ dependent or not even deterministic, respectively.
51
+ Furthermore, if :attr:`verified = True` is also set, while the left
52
+ endpoints of the intervals are lower bounds for the maximal cusp area
53
+ matrix entries, the right endpoints are meaningless and could be smaller
54
+ or larger than the maximal cusp area matrix entries.
55
+
56
+ **Verified computation**
57
+
58
+ If :attr:`verified = False`, floating-point issues can arise resulting in
59
+ incorrect values. The method can be made
60
+ :ref:`verified <verify-primer>` by passing :attr:`verified = True`::
61
+
62
+ sage: M.cusp_area_matrix(verified=True) # doctest: +NUMERIC3
63
+ [ 28.0000? 7.000000000000? 7.00000000000?]
64
+ [7.000000000000? 28.000000? 7.00000000000?]
65
+ [ 7.00000000000? 7.00000000000? 28.00000?]
66
+
67
+ :param verified:
68
+ Use :ref:`verified computation <verify-primer>`.
69
+ :param bits_prec:
70
+ Precision used for computation. Increase if computation
71
+ did not succeed or a more precise result is desired.
72
+ :param method:
73
+ Switches to older algorithms giving lower bounds when
74
+ ``trigDependentTryCanonize`` and ``trigDependent``.
75
+ :return:
76
+ Maximal cusp area matrix (default) or lower bounds
77
+ (if :attr:`method` switches to older algorithm).
78
+ """
79
+
80
+ if method == 'maximal':
81
+ return maximal_cusp_area_matrix(
82
+ manifold, bits_prec=bits_prec, verified=verified)
83
+ if method == 'maximalLegacy':
84
+ if not verified:
85
+ raise NotImplementedError("Maximal cusp area matrix only "
86
+ "available as verified computation. "
87
+ "Pass verified = True.")
88
+ return legacy_verified_maximal_cusp_area_matrix(
89
+ manifold, bits_prec=bits_prec)
90
+ if method in ['trigDependent', 'trigDependentTryCanonize']:
91
+ if method == 'trigDependentTryCanonize':
92
+ manifold = manifold.copy()
93
+ manifold.canonize()
94
+
95
+ return triangulation_dependent_cusp_area_matrix(
96
+ manifold, bits_prec=bits_prec, verified=verified)
97
+
98
+ raise ValueError("method passed to cusp_area_matrix must be "
99
+ "'trigDependent', 'trigDependentTryCanonize', "
100
+ "or 'maximal'.")
101
+
@@ -1,28 +1,8 @@
1
- from ..sage_helper import _within_sage
2
- from .mathHelpers import interval_aware_min
1
+ from ..math_basics import correct_min, is_RealIntervalFieldElement
3
2
 
4
3
  __all__ = ['unbiased_cusp_areas_from_cusp_area_matrix',
5
4
  'greedy_cusp_areas_from_cusp_area_matrix']
6
5
 
7
- if _within_sage:
8
- from sage.rings.real_mpfi import is_RealIntervalFieldElement
9
-
10
- # python's sqrt only work for floats
11
- # They would fail or convert to float losing precision
12
- from sage.all import sqrt
13
- else:
14
- import math
15
-
16
- # Otherwise, define our own sqrt which checks whether
17
- # the given type defines a sqrt method and fallsback
18
- # to python's log and sqrt which has the above drawback of
19
- # potentially losing precision.
20
- def sqrt(x):
21
- if hasattr(x, 'sqrt'):
22
- return x.sqrt()
23
- return math.sqrt(x)
24
-
25
-
26
6
  def unbiased_cusp_areas_from_cusp_area_matrix(cusp_area_matrix):
27
7
  """
28
8
 
@@ -34,24 +14,25 @@ def unbiased_cusp_areas_from_cusp_area_matrix(cusp_area_matrix):
34
14
  ... [RIF(6.0,6.001 ),RIF(4.0, 4.001)]]))
35
15
  [3.00?, 2.000?]
36
16
 
37
- >>> from snappy.SnapPy import matrix
17
+ >>> from snappy.number import Number, number_to_native_number
18
+ >>> def N(x): return number_to_native_number(Number(x))
19
+ >>> from snappy.matrix import make_matrix
38
20
  >>> unbiased_cusp_areas_from_cusp_area_matrix(
39
- ... matrix([[10.0, 40.0],
40
- ... [40.0, 20.0]]))
21
+ ... make_matrix([[N(10.0), N(40.0)],
22
+ ... [N(40.0), N(20.0)]])) # doctest: +NUMERIC9
41
23
  [3.1622776601683795, 4.47213595499958]
42
24
 
43
25
  """
44
26
 
45
- if _within_sage:
46
- if is_RealIntervalFieldElement(cusp_area_matrix[0, 0]):
47
- return _verified_unbiased_cusp_areas_from_cusp_area_matrix(
48
- cusp_area_matrix)
27
+ if is_RealIntervalFieldElement(cusp_area_matrix[0, 0]):
28
+ return _verified_unbiased_cusp_areas_from_cusp_area_matrix(
29
+ cusp_area_matrix)
49
30
 
50
31
  return _unverified_unbiased_cusp_areas_from_cusp_area_matrix(
51
32
  cusp_area_matrix)
52
33
 
34
+
53
35
  def greedy_cusp_areas_from_cusp_area_matrix(cusp_area_matrix, first_cusps=[]):
54
-
55
36
  """
56
37
 
57
38
  sage: from sage.all import matrix, RIF
@@ -60,27 +41,28 @@ def greedy_cusp_areas_from_cusp_area_matrix(cusp_area_matrix, first_cusps=[]):
60
41
  ... [RIF(6.0,6.001 ),RIF(10.0, 10.001)]]))
61
42
  [3.0001?, 2.000?]
62
43
 
63
- >>> from snappy.SnapPy import matrix
44
+ >>> from snappy.number import Number, number_to_native_number
45
+ >>> def N(x): return number_to_native_number(Number(x))
46
+ >>> from snappy.matrix import make_matrix
64
47
  >>> greedy_cusp_areas_from_cusp_area_matrix(
65
- ... matrix([[10.0, 40.0],
66
- ... [40.0, 20.0]]))
48
+ ... make_matrix([[N(10.0), N(40.0)],
49
+ ... [N(40.0), N(20.0)]])) # doctest: +NUMERIC9
67
50
  [3.1622776601683795, 4.47213595499958]
68
-
69
- """
70
51
 
52
+ """
71
53
  num_cusps = cusp_area_matrix.dimensions()[0]
72
54
 
73
55
  result = list(range(num_cusps)) # Make space for range; initial values irrelevant
74
56
 
75
57
  # Cusp permutation given in Cayley notation
76
58
  sigma = first_cusps + [ i for i in range(num_cusps) if i not in first_cusps ]
77
-
59
+
78
60
  for i in range(num_cusps):
79
61
  stoppers = [ cusp_area_matrix[sigma[i], sigma[j]] / result[sigma[j]]
80
62
  for j in range(i) ]
81
- self_stopper = sqrt(cusp_area_matrix[sigma[i], sigma[i]])
63
+ self_stopper = cusp_area_matrix[sigma[i], sigma[i]].sqrt()
82
64
 
83
- result[sigma[i]] = interval_aware_min(stoppers + [ self_stopper ])
65
+ result[sigma[i]] = correct_min(stoppers + [ self_stopper ])
84
66
 
85
67
  return result
86
68
 
@@ -100,28 +82,31 @@ def _interval_minimum_candidates(intervals_and_extras):
100
82
  def _find_potential_stoppers(cusp_area_matrix, assigned_areas):
101
83
  def stopper(i, j):
102
84
  if not assigned_areas[i] is None:
103
- return cusp_area_matrix[i,j] / assigned_areas[i]
85
+ return cusp_area_matrix[i, j] / assigned_areas[i]
104
86
  if not assigned_areas[j] is None:
105
- return cusp_area_matrix[i,j] / assigned_areas[j]
106
- return sqrt(cusp_area_matrix[i, j])
87
+ return cusp_area_matrix[i, j] / assigned_areas[j]
88
+ return cusp_area_matrix[i, j].sqrt()
107
89
 
108
90
  num_cusps = cusp_area_matrix.dimensions()[0]
109
91
 
110
- return [ (stopper(i, j), (i, j))
111
- for i in range(num_cusps)
112
- for j in range(i, num_cusps)
113
- if (assigned_areas[j] is None) or (assigned_areas[i] is None) ]
92
+ return [(stopper(i, j), (i, j))
93
+ for i in range(num_cusps)
94
+ for j in range(i, num_cusps)
95
+ if (assigned_areas[j] is None) or (assigned_areas[i] is None)]
96
+
114
97
 
115
98
  def _find_stoppers(cusp_area_matrix, assigned_areas):
116
99
  return _interval_minimum_candidates(
117
100
  _find_potential_stoppers(cusp_area_matrix, assigned_areas))
118
101
 
102
+
119
103
  def _union_intervals(intervals):
120
104
  result = intervals[0]
121
105
  for i in intervals[1:]:
122
106
  result = result.union(i)
123
107
  return result
124
108
 
109
+
125
110
  def _get_cusps_from_stoppers(stoppers, assigned_areas):
126
111
  result = set()
127
112
  for stopper in stoppers:
@@ -130,19 +115,19 @@ def _get_cusps_from_stoppers(stoppers, assigned_areas):
130
115
  result.add(cusp)
131
116
  return result
132
117
 
133
- def _verified_unbiased_cusp_areas_from_cusp_area_matrix(
134
- cusp_area_matrix):
118
+
119
+ def _verified_unbiased_cusp_areas_from_cusp_area_matrix(cusp_area_matrix):
135
120
 
136
121
  num_cusps = cusp_area_matrix.dimensions()[0]
137
122
 
138
- result = num_cusps * [ None ]
139
-
123
+ result = num_cusps * [None]
124
+
140
125
  while None in result:
141
126
  stoppers = _find_stoppers(cusp_area_matrix, result)
142
127
 
143
- stoppers_union = _union_intervals([ stopper[0] for stopper in stoppers ])
128
+ stoppers_union = _union_intervals([stopper[0] for stopper in stoppers])
144
129
  cusps = _get_cusps_from_stoppers(stoppers, result)
145
- stopper_pairs = set([stopper[1] for stopper in stoppers])
130
+ stopper_pairs = {stopper[1] for stopper in stoppers}
146
131
 
147
132
  stop_size = (stoppers_union * stoppers_union) / stoppers_union
148
133
 
@@ -163,15 +148,16 @@ def _verified_unbiased_cusp_areas_from_cusp_area_matrix(
163
148
 
164
149
  return result
165
150
 
151
+
166
152
  def _find_minimal_stopper(cusp_area_matrix, assigned_areas):
167
153
  return min(_find_potential_stoppers(cusp_area_matrix, assigned_areas))
168
154
 
169
- def _unverified_unbiased_cusp_areas_from_cusp_area_matrix(
170
- cusp_area_matrix):
155
+
156
+ def _unverified_unbiased_cusp_areas_from_cusp_area_matrix(cusp_area_matrix):
171
157
  num_cusps = cusp_area_matrix.dimensions()[0]
172
158
  num_pending = num_cusps
173
159
 
174
- result = num_cusps * [ None ]
160
+ result = num_cusps * [None]
175
161
 
176
162
  while num_pending > 0:
177
163
  stop_size, (i, j) = _find_minimal_stopper(cusp_area_matrix, result)
@@ -185,4 +171,3 @@ def _unverified_unbiased_cusp_areas_from_cusp_area_matrix(
185
171
  num_pending -= 1
186
172
 
187
173
  return result
188
-