snappy 3.1__cp310-cp310-macosx_11_0_arm64.whl → 3.2__cp310-cp310-macosx_11_0_arm64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (465) hide show
  1. snappy/CyOpenGL.cpython-310-darwin.so +0 -0
  2. snappy/SnapPy.cpython-310-darwin.so +0 -0
  3. snappy/SnapPyHP.cpython-310-darwin.so +0 -0
  4. snappy/__init__.py +299 -402
  5. snappy/app.py +70 -20
  6. snappy/browser.py +18 -17
  7. snappy/canonical.py +249 -0
  8. snappy/{verify/cusp_shapes.py → cusps/__init__.py} +8 -18
  9. snappy/cusps/cusp_area_matrix.py +101 -0
  10. snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +23 -39
  11. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  12. snappy/cusps/test.py +21 -0
  13. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  14. snappy/database.py +10 -9
  15. snappy/decorated_isosig.py +337 -114
  16. snappy/dev/extended_ptolemy/complexVolumesClosed.py +40 -7
  17. snappy/dev/extended_ptolemy/extended.py +3 -3
  18. snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
  19. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +1 -1
  20. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  21. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  22. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  23. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  24. snappy/doc/_sources/credits.rst.txt +6 -1
  25. snappy/doc/_sources/development.rst.txt +66 -46
  26. snappy/doc/_sources/index.rst.txt +72 -5
  27. snappy/doc/_sources/installing.rst.txt +145 -162
  28. snappy/doc/_sources/news.rst.txt +73 -1
  29. snappy/doc/_sources/ptolemy_examples1.rst.txt +8 -7
  30. snappy/doc/_sources/ptolemy_examples3.rst.txt +2 -2
  31. snappy/doc/_sources/triangulation.rst.txt +2 -2
  32. snappy/doc/_sources/verify.rst.txt +89 -29
  33. snappy/doc/_sources/verify_internals.rst.txt +5 -16
  34. snappy/doc/_static/basic.css +23 -1
  35. snappy/doc/_static/css/badge_only.css +1 -1
  36. snappy/doc/_static/css/theme.css +1 -1
  37. snappy/doc/_static/doctools.js +1 -1
  38. snappy/doc/_static/documentation_options.js +2 -3
  39. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  40. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  41. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  42. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  43. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  44. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  45. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  46. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  47. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  48. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  49. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  50. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  51. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  52. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  53. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  54. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  55. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  56. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  57. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  58. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  59. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  60. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  61. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  62. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  63. snappy/doc/_static/js/versions.js +228 -0
  64. snappy/doc/_static/language_data.js +2 -2
  65. snappy/doc/_static/pygments.css +1 -0
  66. snappy/doc/_static/searchtools.js +125 -71
  67. snappy/doc/_static/sphinx_highlight.js +13 -3
  68. snappy/doc/additional_classes.html +291 -122
  69. snappy/doc/bugs.html +17 -20
  70. snappy/doc/censuses.html +34 -53
  71. snappy/doc/credits.html +22 -22
  72. snappy/doc/development.html +88 -68
  73. snappy/doc/genindex.html +66 -145
  74. snappy/doc/index.html +86 -31
  75. snappy/doc/installing.html +164 -182
  76. snappy/doc/manifold.html +1168 -556
  77. snappy/doc/manifoldhp.html +18 -21
  78. snappy/doc/news.html +91 -33
  79. snappy/doc/objects.inv +0 -0
  80. snappy/doc/other.html +20 -22
  81. snappy/doc/platonic_census.html +31 -34
  82. snappy/doc/plink.html +19 -22
  83. snappy/doc/ptolemy.html +20 -22
  84. snappy/doc/ptolemy_classes.html +102 -105
  85. snappy/doc/ptolemy_examples1.html +34 -36
  86. snappy/doc/ptolemy_examples2.html +28 -31
  87. snappy/doc/ptolemy_examples3.html +26 -29
  88. snappy/doc/ptolemy_examples4.html +20 -23
  89. snappy/doc/ptolemy_prelim.html +25 -28
  90. snappy/doc/py-modindex.html +16 -19
  91. snappy/doc/screenshots.html +22 -24
  92. snappy/doc/search.html +15 -18
  93. snappy/doc/searchindex.js +1 -1
  94. snappy/doc/snap.html +18 -21
  95. snappy/doc/snappy.html +18 -20
  96. snappy/doc/spherogram.html +84 -87
  97. snappy/doc/todo.html +17 -20
  98. snappy/doc/triangulation.html +324 -215
  99. snappy/doc/tutorial.html +17 -20
  100. snappy/doc/verify.html +100 -46
  101. snappy/doc/verify_internals.html +106 -563
  102. snappy/drilling/__init__.py +153 -235
  103. snappy/drilling/barycentric.py +103 -0
  104. snappy/drilling/constants.py +0 -2
  105. snappy/drilling/crush.py +56 -130
  106. snappy/drilling/cusps.py +12 -6
  107. snappy/drilling/debug.py +2 -1
  108. snappy/drilling/exceptions.py +7 -40
  109. snappy/drilling/moves.py +302 -243
  110. snappy/drilling/perturb.py +63 -37
  111. snappy/drilling/shorten.py +36 -0
  112. snappy/drilling/subdivide.py +0 -5
  113. snappy/drilling/test.py +23 -0
  114. snappy/drilling/test_cases.py +126 -0
  115. snappy/drilling/tracing.py +9 -37
  116. snappy/exceptions.py +18 -5
  117. snappy/exterior_to_link/barycentric_geometry.py +2 -4
  118. snappy/exterior_to_link/main.py +8 -7
  119. snappy/exterior_to_link/mcomplex_with_link.py +2 -2
  120. snappy/exterior_to_link/rational_linear_algebra.py +1 -1
  121. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
  122. snappy/exterior_to_link/test.py +21 -33
  123. snappy/geometric_structure/__init__.py +212 -0
  124. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  125. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  126. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  127. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  128. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  129. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  130. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  131. snappy/geometric_structure/geodesic/__init__.py +0 -0
  132. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  133. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  134. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  135. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  136. snappy/geometric_structure/geodesic/constants.py +6 -0
  137. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  138. snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
  139. snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
  140. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  141. snappy/geometric_structure/geodesic/line.py +30 -0
  142. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  143. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  144. snappy/geometric_structure/test.py +22 -0
  145. snappy/gui.py +23 -13
  146. snappy/horoviewer.py +7 -7
  147. snappy/hyperboloid/__init__.py +96 -31
  148. snappy/hyperboloid/distances.py +245 -0
  149. snappy/hyperboloid/horoball.py +19 -0
  150. snappy/hyperboloid/line.py +35 -0
  151. snappy/hyperboloid/point.py +9 -0
  152. snappy/hyperboloid/triangle.py +29 -0
  153. snappy/isometry_signature.py +382 -0
  154. snappy/len_spec/__init__.py +596 -0
  155. snappy/len_spec/geodesic_info.py +110 -0
  156. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  157. snappy/len_spec/geodesic_piece.py +143 -0
  158. snappy/len_spec/geometric_structure.py +182 -0
  159. snappy/len_spec/geometry.py +80 -0
  160. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  161. snappy/len_spec/spine.py +206 -0
  162. snappy/len_spec/test.py +24 -0
  163. snappy/len_spec/test_cases.py +69 -0
  164. snappy/len_spec/tile.py +275 -0
  165. snappy/len_spec/word.py +86 -0
  166. snappy/math_basics.py +39 -13
  167. snappy/matrix.py +52 -9
  168. snappy/number.py +12 -6
  169. snappy/numeric_output_checker.py +2 -3
  170. snappy/pari.py +8 -4
  171. snappy/phone_home.py +2 -1
  172. snappy/polyviewer.py +8 -8
  173. snappy/ptolemy/__init__.py +1 -1
  174. snappy/ptolemy/component.py +2 -2
  175. snappy/ptolemy/coordinates.py +25 -25
  176. snappy/ptolemy/findLoops.py +9 -9
  177. snappy/ptolemy/manifoldMethods.py +27 -29
  178. snappy/ptolemy/polynomial.py +50 -57
  179. snappy/ptolemy/processFileBase.py +60 -0
  180. snappy/ptolemy/ptolemyVariety.py +109 -41
  181. snappy/ptolemy/reginaWrapper.py +4 -4
  182. snappy/ptolemy/rur.py +1 -1
  183. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
  184. snappy/ptolemy/test.py +99 -54
  185. snappy/ptolemy/utilities.py +1 -1
  186. snappy/raytracing/__init__.py +64 -0
  187. snappy/raytracing/additional_horospheres.py +64 -0
  188. snappy/raytracing/additional_len_spec_choices.py +63 -0
  189. snappy/raytracing/cohomology_fractal.py +0 -3
  190. snappy/raytracing/eyeball.py +123 -0
  191. snappy/raytracing/finite_raytracing_data.py +17 -17
  192. snappy/raytracing/finite_viewer.py +15 -15
  193. snappy/raytracing/geodesic_tube_info.py +93 -63
  194. snappy/raytracing/geodesics.py +94 -64
  195. snappy/raytracing/geodesics_window.py +56 -34
  196. snappy/raytracing/gui_utilities.py +21 -6
  197. snappy/raytracing/hyperboloid_navigation.py +29 -4
  198. snappy/raytracing/hyperboloid_utilities.py +73 -73
  199. snappy/raytracing/ideal_raytracing_data.py +121 -91
  200. snappy/raytracing/inside_viewer.py +199 -66
  201. snappy/raytracing/pack.py +22 -0
  202. snappy/raytracing/raytracing_data.py +37 -25
  203. snappy/raytracing/raytracing_view.py +70 -65
  204. snappy/raytracing/shaders/Eye.png +0 -0
  205. snappy/raytracing/shaders/NonGeometric.png +0 -0
  206. snappy/raytracing/shaders/__init__.py +39 -3
  207. snappy/raytracing/shaders/fragment.glsl +451 -133
  208. snappy/raytracing/test.py +29 -0
  209. snappy/raytracing/tooltip.py +146 -0
  210. snappy/raytracing/upper_halfspace_utilities.py +42 -9
  211. snappy/sage_helper.py +67 -134
  212. snappy/settings.py +90 -77
  213. snappy/shell.py +2 -0
  214. snappy/snap/character_varieties.py +2 -2
  215. snappy/snap/find_field.py +4 -3
  216. snappy/snap/fundamental_polyhedron.py +2 -2
  217. snappy/snap/kernel_structures.py +5 -1
  218. snappy/snap/nsagetools.py +9 -8
  219. snappy/snap/peripheral/dual_cellulation.py +4 -3
  220. snappy/snap/peripheral/peripheral.py +2 -2
  221. snappy/snap/peripheral/surface.py +5 -5
  222. snappy/snap/peripheral/test.py +1 -1
  223. snappy/snap/polished_reps.py +8 -8
  224. snappy/snap/slice_obs_HKL.py +16 -14
  225. snappy/snap/t3mlite/arrow.py +3 -3
  226. snappy/snap/t3mlite/edge.py +3 -3
  227. snappy/snap/t3mlite/homology.py +2 -2
  228. snappy/snap/t3mlite/mcomplex.py +3 -3
  229. snappy/snap/t3mlite/simplex.py +12 -0
  230. snappy/snap/t3mlite/spun.py +18 -17
  231. snappy/snap/t3mlite/test_vs_regina.py +4 -4
  232. snappy/snap/test.py +37 -53
  233. snappy/snap/utilities.py +4 -5
  234. snappy/test.py +121 -138
  235. snappy/test_cases.py +263 -0
  236. snappy/testing.py +131 -0
  237. snappy/tiling/__init__.py +2 -0
  238. snappy/tiling/canonical_key_dict.py +59 -0
  239. snappy/tiling/dict_based_set.py +79 -0
  240. snappy/tiling/floor.py +49 -0
  241. snappy/tiling/hyperboloid_dict.py +54 -0
  242. snappy/tiling/iter_utils.py +78 -0
  243. snappy/tiling/lifted_tetrahedron.py +22 -0
  244. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  245. snappy/tiling/real_hash_dict.py +164 -0
  246. snappy/tiling/test.py +23 -0
  247. snappy/tiling/tile.py +215 -0
  248. snappy/tiling/triangle.py +33 -0
  249. snappy/tkterminal.py +116 -86
  250. snappy/twister/main.py +1 -7
  251. snappy/twister/twister_core.cpython-310-darwin.so +0 -0
  252. snappy/upper_halfspace/__init__.py +78 -17
  253. snappy/verify/__init__.py +3 -7
  254. snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
  255. snappy/verify/complex_volume/adjust_torsion.py +1 -2
  256. snappy/verify/complex_volume/closed.py +13 -13
  257. snappy/verify/complex_volume/cusped.py +6 -6
  258. snappy/verify/complex_volume/extended_bloch.py +5 -8
  259. snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
  260. snappy/verify/edge_equations.py +80 -0
  261. snappy/verify/exceptions.py +0 -55
  262. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
  263. snappy/verify/interval_newton_shapes_engine.py +7 -5
  264. snappy/verify/interval_tree.py +5 -5
  265. snappy/verify/krawczyk_shapes_engine.py +17 -18
  266. snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
  267. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
  268. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
  269. snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
  270. snappy/verify/shapes.py +5 -3
  271. snappy/verify/short_slopes.py +39 -41
  272. snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
  273. snappy/verify/test.py +57 -60
  274. snappy/verify/upper_halfspace/extended_matrix.py +1 -1
  275. snappy/verify/upper_halfspace/finite_point.py +3 -4
  276. snappy/verify/upper_halfspace/ideal_point.py +9 -9
  277. snappy/verify/volume.py +2 -2
  278. snappy/version.py +2 -2
  279. {snappy-3.1.dist-info → snappy-3.2.dist-info}/METADATA +26 -11
  280. snappy-3.2.dist-info/RECORD +503 -0
  281. {snappy-3.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  282. {snappy-3.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  283. snappy/__pycache__/__init__.cpython-310.pyc +0 -0
  284. snappy/__pycache__/browser.cpython-310.pyc +0 -0
  285. snappy/__pycache__/cache.cpython-310.pyc +0 -0
  286. snappy/__pycache__/database.cpython-310.pyc +0 -0
  287. snappy/__pycache__/db_utilities.cpython-310.pyc +0 -0
  288. snappy/__pycache__/decorated_isosig.cpython-310.pyc +0 -0
  289. snappy/__pycache__/exceptions.cpython-310.pyc +0 -0
  290. snappy/__pycache__/export_stl.cpython-310.pyc +0 -0
  291. snappy/__pycache__/filedialog.cpython-310.pyc +0 -0
  292. snappy/__pycache__/gui.cpython-310.pyc +0 -0
  293. snappy/__pycache__/horoviewer.cpython-310.pyc +0 -0
  294. snappy/__pycache__/infowindow.cpython-310.pyc +0 -0
  295. snappy/__pycache__/math_basics.cpython-310.pyc +0 -0
  296. snappy/__pycache__/matrix.cpython-310.pyc +0 -0
  297. snappy/__pycache__/number.cpython-310.pyc +0 -0
  298. snappy/__pycache__/numeric_output_checker.cpython-310.pyc +0 -0
  299. snappy/__pycache__/pari.cpython-310.pyc +0 -0
  300. snappy/__pycache__/polyviewer.cpython-310.pyc +0 -0
  301. snappy/__pycache__/sage_helper.cpython-310.pyc +0 -0
  302. snappy/__pycache__/version.cpython-310.pyc +0 -0
  303. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  304. snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
  305. snappy/doc/_static/js/html5shiv.min.js +0 -4
  306. snappy/doc/verify_canon.html +0 -304
  307. snappy/drilling/__pycache__/__init__.cpython-310.pyc +0 -0
  308. snappy/drilling/__pycache__/constants.cpython-310.pyc +0 -0
  309. snappy/drilling/__pycache__/crush.cpython-310.pyc +0 -0
  310. snappy/drilling/__pycache__/cusps.cpython-310.pyc +0 -0
  311. snappy/drilling/__pycache__/debug.cpython-310.pyc +0 -0
  312. snappy/drilling/__pycache__/epsilons.cpython-310.pyc +0 -0
  313. snappy/drilling/__pycache__/exceptions.cpython-310.pyc +0 -0
  314. snappy/drilling/__pycache__/fixed_points.cpython-310.pyc +0 -0
  315. snappy/drilling/__pycache__/geodesic_info.cpython-310.pyc +0 -0
  316. snappy/drilling/__pycache__/geodesic_tube.cpython-310.pyc +0 -0
  317. snappy/drilling/__pycache__/geometric_structure.cpython-310.pyc +0 -0
  318. snappy/drilling/__pycache__/line.cpython-310.pyc +0 -0
  319. snappy/drilling/__pycache__/moves.cpython-310.pyc +0 -0
  320. snappy/drilling/__pycache__/peripheral_curves.cpython-310.pyc +0 -0
  321. snappy/drilling/__pycache__/perturb.cpython-310.pyc +0 -0
  322. snappy/drilling/__pycache__/quotient_space.cpython-310.pyc +0 -0
  323. snappy/drilling/__pycache__/spatial_dict.cpython-310.pyc +0 -0
  324. snappy/drilling/__pycache__/subdivide.cpython-310.pyc +0 -0
  325. snappy/drilling/__pycache__/tracing.cpython-310.pyc +0 -0
  326. snappy/drilling/geodesic_tube.py +0 -441
  327. snappy/drilling/geometric_structure.py +0 -366
  328. snappy/drilling/line.py +0 -122
  329. snappy/drilling/quotient_space.py +0 -94
  330. snappy/drilling/spatial_dict.py +0 -128
  331. snappy/exterior_to_link/__pycache__/__init__.cpython-310.pyc +0 -0
  332. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-310.pyc +0 -0
  333. snappy/exterior_to_link/__pycache__/exceptions.cpython-310.pyc +0 -0
  334. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-310.pyc +0 -0
  335. snappy/exterior_to_link/__pycache__/link_projection.cpython-310.pyc +0 -0
  336. snappy/exterior_to_link/__pycache__/main.cpython-310.pyc +0 -0
  337. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-310.pyc +0 -0
  338. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-310.pyc +0 -0
  339. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-310.pyc +0 -0
  340. snappy/exterior_to_link/__pycache__/pl_utils.cpython-310.pyc +0 -0
  341. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-310.pyc +0 -0
  342. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-310.pyc +0 -0
  343. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-310.pyc +0 -0
  344. snappy/exterior_to_link/__pycache__/stored_moves.cpython-310.pyc +0 -0
  345. snappy/hyperboloid/__pycache__/__init__.cpython-310.pyc +0 -0
  346. snappy/manifolds/__pycache__/__init__.cpython-310.pyc +0 -0
  347. snappy/ptolemy/__pycache__/__init__.cpython-310.pyc +0 -0
  348. snappy/ptolemy/__pycache__/component.cpython-310.pyc +0 -0
  349. snappy/ptolemy/__pycache__/coordinates.cpython-310.pyc +0 -0
  350. snappy/ptolemy/__pycache__/fieldExtensions.cpython-310.pyc +0 -0
  351. snappy/ptolemy/__pycache__/findLoops.cpython-310.pyc +0 -0
  352. snappy/ptolemy/__pycache__/homology.cpython-310.pyc +0 -0
  353. snappy/ptolemy/__pycache__/manifoldMethods.cpython-310.pyc +0 -0
  354. snappy/ptolemy/__pycache__/matrix.cpython-310.pyc +0 -0
  355. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-310.pyc +0 -0
  356. snappy/ptolemy/__pycache__/polynomial.cpython-310.pyc +0 -0
  357. snappy/ptolemy/__pycache__/processComponents.cpython-310.pyc +0 -0
  358. snappy/ptolemy/__pycache__/processFileBase.cpython-310.pyc +0 -0
  359. snappy/ptolemy/__pycache__/processFileDispatch.cpython-310.pyc +0 -0
  360. snappy/ptolemy/__pycache__/processMagmaFile.cpython-310.pyc +0 -0
  361. snappy/ptolemy/__pycache__/processRurFile.cpython-310.pyc +0 -0
  362. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-310.pyc +0 -0
  363. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-310.pyc +0 -0
  364. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-310.pyc +0 -0
  365. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-310.pyc +0 -0
  366. snappy/ptolemy/__pycache__/rur.cpython-310.pyc +0 -0
  367. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-310.pyc +0 -0
  368. snappy/ptolemy/__pycache__/utilities.cpython-310.pyc +0 -0
  369. snappy/raytracing/__pycache__/__init__.cpython-310.pyc +0 -0
  370. snappy/raytracing/__pycache__/finite_raytracing_data.cpython-310.pyc +0 -0
  371. snappy/raytracing/__pycache__/gui_utilities.cpython-310.pyc +0 -0
  372. snappy/raytracing/__pycache__/hyperboloid_navigation.cpython-310.pyc +0 -0
  373. snappy/raytracing/__pycache__/hyperboloid_utilities.cpython-310.pyc +0 -0
  374. snappy/raytracing/__pycache__/ideal_raytracing_data.cpython-310.pyc +0 -0
  375. snappy/raytracing/__pycache__/inside_viewer.cpython-310.pyc +0 -0
  376. snappy/raytracing/__pycache__/raytracing_data.cpython-310.pyc +0 -0
  377. snappy/raytracing/__pycache__/raytracing_view.cpython-310.pyc +0 -0
  378. snappy/raytracing/__pycache__/upper_halfspace_utilities.cpython-310.pyc +0 -0
  379. snappy/raytracing/__pycache__/view_scale_controller.cpython-310.pyc +0 -0
  380. snappy/raytracing/zoom_slider/__pycache__/__init__.cpython-310.pyc +0 -0
  381. snappy/snap/__pycache__/__init__.cpython-310.pyc +0 -0
  382. snappy/snap/__pycache__/character_varieties.cpython-310.pyc +0 -0
  383. snappy/snap/__pycache__/fundamental_polyhedron.cpython-310.pyc +0 -0
  384. snappy/snap/__pycache__/interval_reps.cpython-310.pyc +0 -0
  385. snappy/snap/__pycache__/kernel_structures.cpython-310.pyc +0 -0
  386. snappy/snap/__pycache__/mcomplex_base.cpython-310.pyc +0 -0
  387. snappy/snap/__pycache__/nsagetools.cpython-310.pyc +0 -0
  388. snappy/snap/__pycache__/polished_reps.cpython-310.pyc +0 -0
  389. snappy/snap/__pycache__/shapes.cpython-310.pyc +0 -0
  390. snappy/snap/__pycache__/slice_obs_HKL.cpython-310.pyc +0 -0
  391. snappy/snap/__pycache__/utilities.cpython-310.pyc +0 -0
  392. snappy/snap/peripheral/__pycache__/__init__.cpython-310.pyc +0 -0
  393. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-310.pyc +0 -0
  394. snappy/snap/peripheral/__pycache__/link.cpython-310.pyc +0 -0
  395. snappy/snap/peripheral/__pycache__/peripheral.cpython-310.pyc +0 -0
  396. snappy/snap/peripheral/__pycache__/surface.cpython-310.pyc +0 -0
  397. snappy/snap/t3mlite/__pycache__/__init__.cpython-310.pyc +0 -0
  398. snappy/snap/t3mlite/__pycache__/arrow.cpython-310.pyc +0 -0
  399. snappy/snap/t3mlite/__pycache__/corner.cpython-310.pyc +0 -0
  400. snappy/snap/t3mlite/__pycache__/edge.cpython-310.pyc +0 -0
  401. snappy/snap/t3mlite/__pycache__/face.cpython-310.pyc +0 -0
  402. snappy/snap/t3mlite/__pycache__/files.cpython-310.pyc +0 -0
  403. snappy/snap/t3mlite/__pycache__/homology.cpython-310.pyc +0 -0
  404. snappy/snap/t3mlite/__pycache__/linalg.cpython-310.pyc +0 -0
  405. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-310.pyc +0 -0
  406. snappy/snap/t3mlite/__pycache__/perm4.cpython-310.pyc +0 -0
  407. snappy/snap/t3mlite/__pycache__/simplex.cpython-310.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/spun.cpython-310.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/surface.cpython-310.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-310.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/vertex.cpython-310.pyc +0 -0
  412. snappy/togl/__init__.py +0 -3
  413. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  414. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  415. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  416. snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
  417. snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
  418. snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
  419. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  420. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  421. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  422. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  423. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  424. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  425. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  426. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  427. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  428. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  429. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  430. snappy/twister/__pycache__/__init__.cpython-310.pyc +0 -0
  431. snappy/twister/__pycache__/main.cpython-310.pyc +0 -0
  432. snappy/upper_halfspace/__pycache__/__init__.cpython-310.pyc +0 -0
  433. snappy/upper_halfspace/__pycache__/ideal_point.cpython-310.pyc +0 -0
  434. snappy/verify/__pycache__/__init__.cpython-310.pyc +0 -0
  435. snappy/verify/__pycache__/cuspCrossSection.cpython-310.pyc +0 -0
  436. snappy/verify/__pycache__/cuspTranslations.cpython-310.pyc +0 -0
  437. snappy/verify/__pycache__/cusp_areas.cpython-310.pyc +0 -0
  438. snappy/verify/__pycache__/cusp_shapes.cpython-310.pyc +0 -0
  439. snappy/verify/__pycache__/exceptions.cpython-310.pyc +0 -0
  440. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-310.pyc +0 -0
  441. snappy/verify/__pycache__/interval_tree.cpython-310.pyc +0 -0
  442. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-310.pyc +0 -0
  443. snappy/verify/__pycache__/realAlgebra.cpython-310.pyc +0 -0
  444. snappy/verify/__pycache__/shapes.cpython-310.pyc +0 -0
  445. snappy/verify/__pycache__/short_slopes.cpython-310.pyc +0 -0
  446. snappy/verify/__pycache__/squareExtensions.cpython-310.pyc +0 -0
  447. snappy/verify/__pycache__/verifyCanonical.cpython-310.pyc +0 -0
  448. snappy/verify/__pycache__/verifyHyperbolicity.cpython-310.pyc +0 -0
  449. snappy/verify/__pycache__/volume.cpython-310.pyc +0 -0
  450. snappy/verify/complex_volume/__pycache__/__init__.cpython-310.pyc +0 -0
  451. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-310.pyc +0 -0
  452. snappy/verify/complex_volume/__pycache__/closed.cpython-310.pyc +0 -0
  453. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-310.pyc +0 -0
  454. snappy/verify/complex_volume/__pycache__/cusped.cpython-310.pyc +0 -0
  455. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-310.pyc +0 -0
  456. snappy/verify/cuspCrossSection.py +0 -1422
  457. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-310.pyc +0 -0
  458. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-310.pyc +0 -0
  459. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-310.pyc +0 -0
  460. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-310.pyc +0 -0
  461. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-310.pyc +0 -0
  462. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-310.pyc +0 -0
  463. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-310.pyc +0 -0
  464. snappy-3.1.dist-info/RECORD +0 -585
  465. {snappy-3.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
@@ -2,62 +2,63 @@ from . import exceptions
2
2
  from . import epsilons
3
3
  from . import debug
4
4
  from .tracing import trace_geodesic
5
- from .crush import crush_geodesic_pieces
6
- from .line import R13LineWithMatrix
7
- from .geometric_structure import add_r13_geometry, word_to_psl2c_matrix
8
- from .geodesic_info import GeodesicInfo, sample_line
9
5
  from .perturb import perturb_geodesics
10
6
  from .subdivide import traverse_geodesics_to_subdivide
7
+ from .barycentric import mark_subtetrahedra_about_geodesic_pieces
8
+ from .shorten import shorten_in_barycentric_subdivision
9
+ from .crush import crush_geodesic_pieces
11
10
  from .cusps import (
12
11
  CuspPostDrillInfo,
13
12
  index_geodesics_and_add_post_drill_infos,
14
13
  reorder_vertices_and_get_post_drill_infos,
15
14
  refill_and_adjust_peripheral_curves)
16
15
 
16
+ from .. import Manifold, ManifoldHP
17
+
18
+ from ..geometric_structure.geodesic.geodesic_start_point_info import GeodesicStartPointInfo, compute_geodesic_start_point_info
19
+ from ..geometric_structure import (add_r13_geometry,
20
+ add_filling_information)
21
+ from ..geometric_structure.geodesic.add_core_curves import add_r13_core_curves
22
+ from ..geometric_structure.geodesic.line import R13LineWithMatrix
17
23
  from ..snap.t3mlite import Mcomplex
18
24
  from ..exceptions import InsufficientPrecisionError
19
25
 
20
-
21
- import functools
22
- from typing import Sequence
23
-
26
+ from typing import Optional, Sequence
24
27
 
25
28
  def drill_word(manifold,
26
29
  word : str,
27
30
  verified : bool = False,
28
- bits_prec=None,
29
- verbose : bool = False):
31
+ bits_prec : Optional[int] = None,
32
+ verbose : bool = False) -> Manifold:
30
33
  """
31
34
  Drills the geodesic corresponding to the given word in the unsimplified
32
- fundamental group.
35
+ fundamental group. Here is an example::
33
36
 
34
- >>> from snappy import Manifold
35
37
  >>> M = Manifold("m004")
36
- >>> M.length_spectrum(1.2, include_words = True, grouped = False)
37
- mult length topology parity word
38
- 1 1.08707014499574 - 1.72276844987009*I circle + a
39
- 1 1.08707014499574 + 1.72276844987009*I circle + bC
38
+ >>> M.length_spectrum_alt(max_len=1.2) # doctest: +NUMERIC9
39
+ [Length Core curve Word
40
+ 1.08707014499574 + 1.72276844987009*I - bC,
41
+ 1.08707014499574 - 1.72276844987009*I - a]
40
42
  >>> N = M.drill_word('a')
41
43
  >>> N.identify()
42
44
  [m129(0,0)(0,0), 5^2_1(0,0)(0,0), L5a1(0,0)(0,0), ooct01_00001(0,0)(0,0)]
43
45
 
44
- The last cusp of the new manifold corresponds to the drilled
45
- geodesic and the longitude and meridian for that cusp are chosen such that
46
- (1,0)-filling results in the original (undrilled) manifold. The orientation
47
- of the new longitude is chosen so that it is parallel to the closed geodesic.
48
- That is, the new longitude is homotopic to the closed geodesic when embedding
49
- the drilled manifold into the original manifold.
46
+ The last cusp of the resulting manifold corresponds to the drilled
47
+ geodesic. The longitude and meridian for that cusp are chosen such that
48
+ ``(1,0)``-filling the last cusp results in the given (undrilled) manifold::
50
49
 
51
- >>> N.dehn_fill((1,0),1)
50
+ >>> N.dehn_fill((1,0),-1)
52
51
  >>> M.is_isometric_to(N)
53
52
  True
54
53
  >>> N.cusp_info(1)['core_length'] # doctest: +NUMERIC9
55
54
  1.08707014499574 - 1.72276844987009*I
55
+
56
+ The orientation of the new longitude is chosen so that it is parallel to
57
+ the closed geodesic. That is, the new longitude is homotopic to the closed
58
+ geodesic when embedding the drilled manifold into the given manifold.
56
59
 
57
- If the drilled geodesic coincides with a core curve of a filled cusp, the
58
- cusp is unfilled instead and the longitude and meridian changed so that
59
- the above again applies. The cusp order is also changed so that the unfilled
60
- cusp becomes the last cusp.
60
+ If the given geodesic coincides with a core curve of a filled cusp, the
61
+ cusp is unfilled instead::
61
62
 
62
63
  >>> M = Manifold("m004(2,3)")
63
64
  >>> M.volume() # doctest: +NUMERIC9
@@ -71,29 +72,19 @@ def drill_word(manifold,
71
72
  m004_drilled(0,0)
72
73
  >>> N.num_cusps()
73
74
  1
74
- >>> N.dehn_fill((1,0))
75
+
76
+ In this case, the peripheral information is also
77
+ updated such that the above remark about ``(1,0)``-filling applies again::
78
+
79
+ >>> N.dehn_fill((1,0), -1)
75
80
  >>> N.volume() # doctest: +NUMERIC9
76
81
  1.73712388065
77
82
 
78
- Even though the output of the drilling geodesic algorithm is a
79
- triangulation and thus combinatorial in nature, the intermediate
80
- computations to compute the intersections of the geodesic with the
81
- faces of the tetrahedra is numerical. Sometimes it is necessary to increase
82
- the precision with `bits_prec` to make this computation accurate or succeed.
83
- If `verified = True` is specified, intervals are used for all computations
84
- and the result is provably correct (only supported when used inside
85
- SageMath).
86
- That is, the algorithm will fail with an exception (most likely
87
- InsufficientPrecisionError) if insufficient precision is used. Example of
88
- verified computation::
83
+ That is, the longitude and meridian of the unfilled cusps are reinstalled
84
+ and the cusps reindexed so that the unfilled cusp becomes the last cusp.
89
85
 
90
- sage: M = Manifold("m004(2,3)")
91
- sage: M.drill_word('caa', verified = True, bits_prec = 100)
92
- m004_drilled(2,3)(0,0)
93
-
94
- An example where we drill the core geodesic::
86
+ Here is another example where we drill the core geodesic::
95
87
 
96
- >>> from snappy import Manifold
97
88
  >>> M = Manifold("v2986(3,4)")
98
89
  >>> N = M.drill_word('EdFgabcGEdFgaDcc')
99
90
  >>> N.is_isometric_to(Manifold("v2986"), return_isometries = True) # doctest: +NORMALIZE_WHITESPACE
@@ -101,6 +92,42 @@ def drill_word(manifold,
101
92
  [3 -1]
102
93
  [4 -1]
103
94
  Does not extend to link]
95
+
96
+ While the result of drilling a geodesic is a triangulation and thus
97
+ combinatorial in nature, some intermediate computations (for example,
98
+ to compute the intersections of the geodesic with the faces of the
99
+ tetrahedra) are numerical. Sometimes, it is necessary to increase the
100
+ precision with :attr:`bits_prec` to make the method succeed and produce
101
+ the correct result.
102
+
103
+ **Verified computation**
104
+
105
+ If :attr:`verified = False`, floating-point issues can arise resulting
106
+ in drilling the wrong loop. The method can be made
107
+ :ref:`verified <verify-primer>` by passing :attr:`verified = True`::
108
+
109
+ sage: M = Manifold("m004(2,3)")
110
+ sage: M.drill_word('caa', verified = True, bits_prec = 100)
111
+ m004_drilled(2,3)(0,0)
112
+
113
+ That is, if the precision is insufficient to prove the result is correct,
114
+ the algorithm fails with an exception (most likely
115
+ ``InsufficientPrecisionError``).
116
+
117
+ :param word:
118
+ The word in the unsimplified fundamental group specifying the
119
+ geodesic to be drilled.
120
+ :param bits_prec:
121
+ The precision used in the intermediate computation. Increase
122
+ if the computation failed.
123
+ :param verified:
124
+ Use :ref:`verified computation <verify-primer>`.
125
+ :param verbose:
126
+ Print intermediate results and statistics.
127
+
128
+ :return:
129
+ Manifold obtained by drilling geodesic. ``(1,0)``-filling the
130
+ last cusp gives the given (undrilled) manifold.
104
131
  """
105
132
 
106
133
  return drill_words(manifold,
@@ -113,17 +140,17 @@ def drill_word(manifold,
113
140
  def drill_words(manifold,
114
141
  words : Sequence[str],
115
142
  verified : bool = False,
116
- bits_prec=None,
117
- verbose : bool = False):
143
+ bits_prec : Optional[int] = None,
144
+ verbose : bool = False) -> Manifold:
118
145
  """
119
- A generalization of M.drill_word taking a list of words to
120
- drill several geodesics simultaneously.
121
-
122
- Here is an example where we drill the core curve corresponding to the third cusp
123
- and a geodesic that is not a core curve:
146
+ A generalization of :meth:`drill_word <Manifold.drill_word>` to drill
147
+ several geodesics simultaneously. It takes a list of words in the
148
+ unsimplified fundamental group.
124
149
 
150
+ Here is an example where we drill two geodesics. One of the geodesics is
151
+ the core curve corresponding to the third cusp. The other geodesic is not
152
+ a core curve::
125
153
 
126
- >>> from snappy import Manifold
127
154
  >>> M=Manifold("t12047(0,0)(1,3)(1,4)(1,5)")
128
155
  >>> [ info.get('core_length') for info in M.cusp_info() ] # doctest: +NUMERIC9
129
156
  [None,
@@ -139,17 +166,19 @@ def drill_words(manifold,
139
166
  >>> N
140
167
  t12047_drilled(0,0)(1,3)(1,5)(0,0)(0,0)
141
168
 
142
- The last n cusps correspond to the n geodesics that were drilled, appearing
143
- in the same order the words for the geodesics were given. Note that in the
144
- above example, the drilled manifold has only five cusps even though the
145
- original manifold had four cusps and we drilled two geodesics. This is
146
- because one geodesic was a core curve. The corresponding cusp was unfilled
147
- (from (1,4)) and grouped with the other cusps coming from drilling.
169
+ Let n be the number of geodesics that were drilled. Then the last n
170
+ cusps correspond to the drilled geodesics and appear in the same order than
171
+ the geodesics were given as words. Note that in the above example, we expect
172
+ six cusps since we started with four cusps and drilled two geodesics. However,
173
+ we only obtain five cusps because one geodesic was a core curve. The
174
+ corresponding cusp was unfilled (from ``(1,4)``) and grouped with the other
175
+ cusps coming from drilling.
148
176
 
149
- We obtain the original (undrilled) manifold by (1,0)-filling the last n cusps.
177
+ We obtain the given (undrilled) manifold by ``(1,0)``-filling the last n
178
+ cusps.
150
179
 
151
- >>> N.dehn_fill((1,0), 3)
152
- >>> N.dehn_fill((1,0), 4)
180
+ >>> N.dehn_fill((1,0), -2)
181
+ >>> N.dehn_fill((1,0), -1)
153
182
  >>> M.is_isometric_to(N)
154
183
  True
155
184
  >>> [ info.get('core_length') for info in N.cusp_info() ] # doctest: +NUMERIC9
@@ -159,6 +188,21 @@ def drill_words(manifold,
159
188
  0.317363079597924 + 1.48157893409218*I,
160
189
  1.43914411734251 + 2.66246879992796*I]
161
190
 
191
+ :param word:
192
+ The words in the unsimplified fundamental group specifying the
193
+ geodesics to be drilled.
194
+ :param bits_prec:
195
+ The precision used in the intermediate computation. Increase
196
+ if the computation failed.
197
+ :param verified:
198
+ Use :ref:`verified computation <verify-primer>`.
199
+ :param verbose:
200
+ Print intermediate results and statistics.
201
+
202
+ :return:
203
+ Manifold obtained by drilling geodesics. ``(1,0)``-filling the
204
+ last n cusps gives the given (undrilled) manifold where n is the
205
+ number of given words.
162
206
  """
163
207
 
164
208
  if isinstance(words, str):
@@ -227,13 +271,15 @@ def drill_words_implementation(
227
271
  add_r13_geometry(mcomplex,
228
272
  manifold,
229
273
  verified=verified, bits_prec=bits_prec)
274
+ add_filling_information(mcomplex, manifold)
275
+ add_r13_core_curves(mcomplex, manifold)
230
276
 
231
277
  # For the words compute basic information such as the corresponding
232
278
  # matrix and the end points and a sample point on the fixed line.
233
279
  # Try to conjugate/translate matrix and end points such that the
234
280
  # line intersects the fundamental domain.
235
- geodesics : Sequence[GeodesicInfo] = [
236
- compute_geodesic_info(mcomplex, word)
281
+ geodesics : Sequence[GeodesicStartPointInfo] = [
282
+ compute_geodesic_start_point_info(mcomplex, word)
237
283
  for word in words ]
238
284
 
239
285
  # Record information in the geodesics and triangulation needed
@@ -246,6 +292,11 @@ def drill_words_implementation(
246
292
  geodesics_to_drill = [ g for g in geodesics
247
293
  if not g.core_curve_cusp ]
248
294
 
295
+ if verbose:
296
+ for g in geodesics:
297
+ if g.core_curve_cusp:
298
+ print("%s is core curve" % g.word)
299
+
249
300
  if perturb:
250
301
  # Move the sample point for each geodesic a bit and use it
251
302
  # as start point. Much of perturb_geodesics is about computing
@@ -300,60 +351,8 @@ def drill_words_implementation(
300
351
 
301
352
  return drilled_manifold
302
353
 
303
-
304
- def _verify_not_parabolic(m, mcomplex, word):
305
- """
306
- Raise exception when user gives a word corresponding to a parabolic
307
- matrix.
308
- """
309
-
310
- if mcomplex.verified:
311
- epsilon = 0
312
- else:
313
- epsilon = epsilons.compute_epsilon(mcomplex.RF)
314
-
315
- tr = m.trace()
316
- if not (abs(tr - 2) > epsilon and abs(tr + 2) > epsilon):
317
- raise exceptions.WordAppearsToBeParabolic(word, tr)
318
-
319
-
320
- def compute_geodesic_info(mcomplex : Mcomplex,
321
- word) -> GeodesicInfo:
322
- """
323
- Compute basic information about a geodesic given a word.
324
-
325
- add_r13_geometry must have been called on the Mcomplex.
326
- """
327
-
328
- m = word_to_psl2c_matrix(mcomplex, word)
329
- _verify_not_parabolic(m, mcomplex, word)
330
- # Line fixed by matrix
331
- line = R13LineWithMatrix.from_psl2c_matrix(m)
332
-
333
- # Pick a point on the line
334
- start_point = sample_line(line)
335
-
336
- g = GeodesicInfo(
337
- mcomplex=mcomplex,
338
- trace=m.trace(),
339
- unnormalised_start_point=start_point,
340
- unnormalised_end_point=line.o13_matrix * start_point,
341
- line=line)
342
-
343
- # Determines whether geodesic corresponds to a core curve.
344
- # Applies Decktransformations so that start point lies within
345
- # the interior of one tetrahedron in the fundamental domain or
346
- # within the union of two tetrahedra neighboring in the hyperboloid
347
- # model.
348
- #
349
- # See GeodesicInfo for details.
350
- g.find_tet_or_core_curve()
351
-
352
- return g
353
-
354
-
355
354
  def drill_geodesics(mcomplex : Mcomplex,
356
- geodesics : Sequence[GeodesicInfo],
355
+ geodesics : Sequence[GeodesicStartPointInfo],
357
356
  verbose : bool = False) -> Mcomplex:
358
357
  """
359
358
  Given a triangulation with geometric structure attached with
@@ -361,7 +360,7 @@ def drill_geodesics(mcomplex : Mcomplex,
361
360
  the triangulation (with finite vertices) obtained by drilling
362
361
  the geodesics.
363
362
 
364
- Each provided GeodesicInfo is supposed to have a start point and
363
+ Each provided GeodesicStartPointInfo is supposed to have a start point and
365
364
  a tetrahedron in the fundamental domain that contains the start point
366
365
  in its interior and an end point such that the line segment from the
367
366
  start to the endpoint forms a closed curve in the manifold.
@@ -400,10 +399,20 @@ def drill_geodesics(mcomplex : Mcomplex,
400
399
  print("Number of tets after subdividing: %d" % (
401
400
  len(tetrahedra)))
402
401
 
402
+ # Mark which subtetrahedra in the barycentric subdivision
403
+ # are adjacent to the closed curve we traced.
404
+ mark_subtetrahedra_about_geodesic_pieces(tetrahedra)
405
+
406
+ # If the simple closed curve is having two consecutive pieces
407
+ # adjacent to the same face, making it shorter by replacing
408
+ # the two pieces by just one corresponding to the third edge
409
+ # of the triangle.
410
+ shorten_in_barycentric_subdivision(tetrahedra, verbose)
411
+
403
412
  # Perform a barycentric subdivision. Then crush all tetrahedra
404
413
  # touching the closed curve we traced. Note that
405
414
  # crush_geodesic_pieces is actually doing the subdivision and
406
- # crushing in just one step.
415
+ # crushing of the subsimplices marked above in just one step.
407
416
  result : Mcomplex = crush_geodesic_pieces(tetrahedra)
408
417
 
409
418
  # Sanity checks while we are still testing the new features.
@@ -412,21 +421,31 @@ def drill_geodesics(mcomplex : Mcomplex,
412
421
 
413
422
  return result
414
423
 
415
- # Create a version of drill_word and drill_words suitable
416
- # for ManifoldHP.
417
- # Use @functools.wraps to carry forward the argument names
418
- # and default values and the doc string.
419
-
420
-
421
- @functools.wraps(drill_word)
422
- def drill_word_hp(*args, **kwargs):
423
- return drill_word(*args, **kwargs).high_precision()
424
-
425
-
426
- @functools.wraps(drill_words)
427
- def drill_words_hp(*args, **kwargs):
428
- return drill_words(*args, **kwargs).high_precision()
429
-
424
+ def drill_word_hp(manifold,
425
+ word : str,
426
+ verified : bool = False,
427
+ bits_prec : Optional[int] = None,
428
+ verbose : bool = False) -> ManifoldHP:
429
+ return drill_word(
430
+ manifold,
431
+ word = word,
432
+ verified = verified,
433
+ bits_prec = bits_prec,
434
+ verbose = verbose).high_precision()
435
+ drill_word_hp.__doc__ = drill_word.__doc__
436
+
437
+ def drill_words_hp(manifold,
438
+ words : Sequence[str],
439
+ verified : bool = False,
440
+ bits_prec : Optional[int] = None,
441
+ verbose : bool = False) -> ManifoldHP:
442
+ return drill_words(
443
+ manifold,
444
+ words = words,
445
+ verified = verified,
446
+ bits_prec = bits_prec,
447
+ verbose = verbose).high_precision()
448
+ drill_words_hp.__doc__ = drill_words.__doc__
430
449
 
431
450
  def _add_methods(mfld_class, high_precision=False):
432
451
  if high_precision:
@@ -435,104 +454,3 @@ def _add_methods(mfld_class, high_precision=False):
435
454
  else:
436
455
  mfld_class.drill_word = drill_word
437
456
  mfld_class.drill_words = drill_words
438
-
439
-
440
- def dummy_function_for_additional_doctests():
441
- """
442
- Test with manifold without symmetry. Note that the code in drilling is
443
- deterministic but the SnapPea kernel code to remove the finite vertices
444
- and simplify is not. Thus, we need canonical_retriangulation() to get
445
- a consistent result:
446
-
447
- >>> from snappy import Manifold, ManifoldHP
448
- >>> from snappy.drilling.exceptions import GeodesicSystemNotSimpleError
449
- >>> M = Manifold("v2986")
450
- >>> M.drill_word('gB').canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
451
- 'kLvvAQQkbhijhghgjijxxacvcccccv_baBaaBDbBa'
452
-
453
- Test non-simple geodesic and verified computation:
454
-
455
- sage: M = ManifoldHP("m004")
456
- sage: try:
457
- ... M.drill_word('bbCC', verified = True)
458
- ... except GeodesicSystemNotSimpleError as e:
459
- ... print("Not simple")
460
- Not simple
461
-
462
- Tests drilling one geodesic that intersects 1-skeleton::
463
-
464
- >>> M = Manifold("m125")
465
- >>> M.drill_word('d').triangulation_isosig(ignore_orientation=False)
466
- 'gLLPQcdefeffpvauppb_acbBbBaaBbacbBa'
467
-
468
- Tests drilling two geodesics that intersect each other:
469
-
470
- >>> try: # doctest: +NUMERIC9
471
- ... M.drill_words(['d','Ad'])
472
- ... except GeodesicSystemNotSimpleError as e:
473
- ... print("Max tube radius:", e.maximal_tube_radius)
474
- Max tube radius: 0.0000000000
475
-
476
- Tests drilling geodesics that are entirely in the 2-skeleton::
477
-
478
- >>> M.drill_words(['a','acAADa']).triangulation_isosig(ignore_orientation=False)
479
- 'iLMvPQcbbdfhgghhpuabpauab_acbdaBbaBbaBcBBbcbbb'
480
-
481
- Same test as verified computation::
482
-
483
- sage: M.drill_words(['a','acAADa'], verified = True).triangulation_isosig(ignore_orientation=False)
484
- 'iLMvPQcbbdfhgghhpuabpauab_acbdaBbaBbaBcBBbcbbb'
485
-
486
- Test error when drilling something close to core curve::
487
-
488
- >>> from snappy import Manifold
489
- >>> M = Manifold("m125")
490
- >>> MM = M.drill_word('d')
491
- >>> MM.dehn_fill((1,0),2)
492
- >>> bad_word = 'bc'
493
- >>> MM.drill_word(bad_word) # doctest: +ELLIPSIS
494
- Traceback (most recent call last):
495
- ...
496
- snappy.drilling.exceptions.GeodesicCloseToCoreCurve: The given geodesic is very close to a core curve and might intersect it.
497
-
498
- There are two places where we detect whether the geodesic is close
499
- to a core curve (rather than tiling forever). Test the other place
500
- in the GeodesicTube code used to determine the maximal amount we can
501
- perturb the geodesic:
502
-
503
- >>> drill_words_implementation(MM, [bad_word], verified = False, bits_prec = 53, perturb = True) # doctest: +ELLIPSIS
504
- Traceback (most recent call last):
505
- ...
506
- snappy.drilling.exceptions.GeodesicCloseToCoreCurve: The given geodesic is very close to a core curve and might intersect it.
507
-
508
- A particular tricky case in terms testing that the start piece is correctly
509
- handled by 2-3 moves (in particular, commit f9879d04 introduced a bug):
510
-
511
- >>> Manifold("m004").drill_words(['CAC','CCbC']).canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
512
- 'qLvvLvAMQQQkcgimopkllmpkonnnpixcaelchapewetvrn_bcaaBbBBbaBaBbB'
513
-
514
-
515
- An interesting case where geodesic intersects triangulation in only one tetrahedron:
516
-
517
- >>> Manifold("m019").drill_word('A').canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
518
- 'gLLPQccdefffqffqqof_BaaBdcbb'
519
-
520
- A bug in an earlier implementation found by Nathan Dunfield (where putting the words in one order caused a failure):
521
-
522
- >>> import sys
523
- >>> original_limit = sys.getrecursionlimit()
524
- >>> sys.setrecursionlimit(100000)
525
- >>> def drilled_isosig(M, words):
526
- ... for i in range(10):
527
- ... try:
528
- ... F = M.drill_words(words).filled_triangulation()
529
- ... return F.canonical_retriangulation().triangulation_isosig(ignore_orientation=False)
530
- ... except RuntimeError:
531
- ... pass
532
- >>> drilled_isosig(Manifold('K11n34(0,1)'), ['iFcdbEiFJ', 'iFJ'])
533
- 'zLLvLLwzAwPQMQzzQkcdgijkjplssrnrotqruvwyxyxyhsgnnighueqdniblsipklpxgcr_BcaBbBba'
534
- >>> drilled_isosig(Manifold('K11n34(0,1)'), ['iFJ', 'iFcdbEiFJ'])
535
- 'zLLvLLwzAwPQMQzzQkcdgijkjplssrnrotqruvwyxyxyhsgnnighueqdniblsipklpxgcr_babBbaBcaB'
536
- >>> sys.setrecursionlimit(original_limit)
537
-
538
- """
@@ -0,0 +1,103 @@
1
+ from .tracing import GeodesicPiece
2
+
3
+ from ..snap.t3mlite import Tetrahedron, Perm4, simplex
4
+
5
+ from typing import Dict, List, Sequence, Tuple
6
+
7
+ def mark_subtetrahedra_about_geodesic_pieces(
8
+ tetrahedra : Sequence[Tetrahedron]) -> None:
9
+ """
10
+ Record which subtetrahedra of the barycentric subdivision
11
+ are adjacent to a piece of the geodesic.
12
+
13
+ This is recorded in the array Tetrahedron.marked_subtetrahedra.
14
+
15
+ Recall that the subtetrahedra of the barycentric subdivision
16
+ are indexed by S4 permutations. The index within
17
+ Tetrahedron.marked_subtetrahedra is given by perm_to_index(p).
18
+
19
+ The value of Tetrahedron.marked_subtetrahedra[j] is 0 if
20
+ the subtetrahedron is not adjacent to any piece of the geodesic.
21
+ Otherwise, it is +/-1 depending on whether the 0-1 edge
22
+ of the subtetrahedron is parallel or anti-parallel to the
23
+ geodesic piece. This is recorded to orient the meridian
24
+ and longitude.
25
+ """
26
+
27
+ for tet in tetrahedra:
28
+ tet.marked_subtetrahedra = 24 * [ 0 ]
29
+
30
+ for tet in tetrahedra:
31
+ for piece in tet.geodesic_pieces:
32
+ mark_subtetrahedra_about_edge(tet, _perm_for_piece(piece))
33
+
34
+ transpositions : List[Perm4] = [ Perm4((1,0,2,3)),
35
+ Perm4((0,2,1,3)),
36
+ Perm4((0,1,3,2)) ]
37
+
38
+ def perm_to_index(perm : Perm4) -> int:
39
+ """
40
+ list(Perm4.S4())[perm_to_index(p)] returns the same Perm4 p.
41
+ """
42
+ return _perm_tuple_to_index[perm.tuple()]
43
+
44
+ _perm_tuple_to_index : Dict[Tuple[int, int, int, int], int] = {
45
+ perm.tuple() : i for i, perm in enumerate(Perm4.S4()) }
46
+
47
+ def _perm_for_piece(piece : GeodesicPiece):
48
+ """
49
+ Given a GeodesicPiece with endpoints being on the vertices
50
+ of the tetrahedron and spanning an oriented edge of the tetrahedron,
51
+ find an "edge embedding permutation" (similar to regina's
52
+ edge embedding) that maps the 0-1 edge to the given edge.
53
+
54
+ The subtetrahedron corresponding to this permutation is
55
+ adjacent to half of this edge.
56
+ """
57
+
58
+ s0 = piece.endpoints[0].subsimplex
59
+ s1 = piece.endpoints[1].subsimplex
60
+
61
+ # Important to consistently always pick a permutation of the
62
+ # same parity and respect the ordering of the vertices V0 and V1
63
+ # since this affects which subtetrahedron will be chosen as peripheral
64
+ # base subtetrahedron - and thus ultimately affects the orientation
65
+ # of the meridian and longitude computed by install_peripheral_curves.
66
+ for perm in Perm4.A4():
67
+ if perm.image(simplex.V0) == s0 and perm.image(simplex.V1) == s1:
68
+ return perm
69
+
70
+ def mark_subtetrahedra_about_edge(tet0 : Tetrahedron, perm0 : Perm4, orientation : int = 1):
71
+ """
72
+ Given a subtetrahedron in the barycentric subdivision parametrized
73
+ by a tetrahedron and permutation, find all subtetrahedra adjacent to the
74
+ same edge in the original triangulation and mark them in
75
+ Tetrahedron.marked_subtetrahedra.
76
+
77
+ By default (orientation = 1), the subtetrahedra are marked by +/-1 according
78
+ to whether each is parallel or anti-parallel to the given edge.
79
+ Subtetrahedra can be unmarked by forcing orientation = 0.
80
+ """
81
+
82
+ tet = tet0
83
+ perm = perm0
84
+
85
+ while True:
86
+ # All subtetrahedra touching the same edge in the current
87
+ # tetrahedron.
88
+ for edge_perm in [ perm,
89
+ perm * transpositions[2] ]:
90
+ for marked_subtet, subtet_perm in [
91
+ (+orientation, edge_perm),
92
+ (-orientation, edge_perm * transpositions[0]) ]:
93
+ j = perm_to_index(subtet_perm)
94
+ tet.marked_subtetrahedra[j] = marked_subtet
95
+
96
+ # Find the next "edge embedding"
97
+ face = perm.image(simplex.F3)
98
+ tet, perm = (
99
+ tet.Neighbor[face],
100
+ tet.Gluing[face] * perm * transpositions[2])
101
+ # Stop if back at the first "edge embedding"
102
+ if tet is tet0 and perm.tuple() == perm0.tuple():
103
+ return
@@ -1,7 +1,5 @@
1
- graph_trace_max_steps = 300
2
1
  trace_max_steps = 300
3
2
 
4
- start_point_bias = 1.2498653253
5
3
  piece_midpoint_bias = 1.818449629072142
6
4
 
7
5
  point_perturbation_direction = [0.8466, 0.3176, 0.4268]