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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. snappy/CyOpenGL.cp38-win_amd64.pyd +0 -0
  2. snappy/SnapPy.cp38-win_amd64.pyd +0 -0
  3. snappy/SnapPyHP.cp38-win_amd64.pyd +0 -0
  4. snappy/__init__.py +299 -402
  5. snappy/app.py +70 -20
  6. snappy/browser.py +18 -17
  7. snappy/canonical.py +249 -0
  8. snappy/{verify/cusp_shapes.py → cusps/__init__.py} +8 -18
  9. snappy/cusps/cusp_area_matrix.py +101 -0
  10. snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +23 -39
  11. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  12. snappy/cusps/test.py +21 -0
  13. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  14. snappy/database.py +10 -9
  15. snappy/decorated_isosig.py +337 -114
  16. snappy/dev/extended_ptolemy/complexVolumesClosed.py +40 -7
  17. snappy/dev/extended_ptolemy/extended.py +3 -3
  18. snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
  19. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +1 -1
  20. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  21. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  22. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  23. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  24. snappy/doc/_sources/additional_classes.rst.txt +40 -40
  25. snappy/doc/_sources/bugs.rst.txt +14 -14
  26. snappy/doc/_sources/censuses.rst.txt +51 -51
  27. snappy/doc/_sources/credits.rst.txt +75 -75
  28. snappy/doc/_sources/development.rst.txt +259 -239
  29. snappy/doc/_sources/index.rst.txt +182 -115
  30. snappy/doc/_sources/installing.rst.txt +247 -264
  31. snappy/doc/_sources/manifold.rst.txt +6 -6
  32. snappy/doc/_sources/manifoldhp.rst.txt +46 -46
  33. snappy/doc/_sources/news.rst.txt +355 -283
  34. snappy/doc/_sources/other.rst.txt +25 -25
  35. snappy/doc/_sources/platonic_census.rst.txt +20 -20
  36. snappy/doc/_sources/plink.rst.txt +102 -102
  37. snappy/doc/_sources/ptolemy.rst.txt +66 -66
  38. snappy/doc/_sources/ptolemy_classes.rst.txt +42 -42
  39. snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -297
  40. snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -363
  41. snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -301
  42. snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -61
  43. snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -105
  44. snappy/doc/_sources/screenshots.rst.txt +21 -21
  45. snappy/doc/_sources/snap.rst.txt +87 -87
  46. snappy/doc/_sources/snappy.rst.txt +28 -28
  47. snappy/doc/_sources/spherogram.rst.txt +103 -103
  48. snappy/doc/_sources/todo.rst.txt +47 -47
  49. snappy/doc/_sources/triangulation.rst.txt +11 -11
  50. snappy/doc/_sources/tutorial.rst.txt +49 -49
  51. snappy/doc/_sources/verify.rst.txt +210 -150
  52. snappy/doc/_sources/verify_internals.rst.txt +79 -90
  53. snappy/doc/_static/basic.css +924 -902
  54. snappy/doc/_static/css/badge_only.css +1 -1
  55. snappy/doc/_static/css/theme.css +1 -1
  56. snappy/doc/_static/doctools.js +1 -1
  57. snappy/doc/_static/documentation_options.js +12 -13
  58. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  59. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  60. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  61. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  62. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  63. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  64. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  65. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  66. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  67. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  68. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  69. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  70. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  71. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  72. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  73. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  74. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  75. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  76. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  77. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  78. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  79. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  80. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  81. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  82. snappy/doc/_static/js/versions.js +228 -0
  83. snappy/doc/_static/language_data.js +199 -199
  84. snappy/doc/_static/pygments.css +74 -73
  85. snappy/doc/_static/searchtools.js +125 -71
  86. snappy/doc/_static/snappy_furo.css +33 -33
  87. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
  88. snappy/doc/_static/sphinx_highlight.js +13 -3
  89. snappy/doc/additional_classes.html +1499 -1330
  90. snappy/doc/bugs.html +131 -134
  91. snappy/doc/censuses.html +426 -445
  92. snappy/doc/credits.html +180 -183
  93. snappy/doc/development.html +383 -363
  94. snappy/doc/genindex.html +1330 -1409
  95. snappy/doc/index.html +261 -206
  96. snappy/doc/installing.html +345 -363
  97. snappy/doc/manifold.html +3451 -2839
  98. snappy/doc/manifoldhp.html +179 -182
  99. snappy/doc/news.html +387 -329
  100. snappy/doc/objects.inv +0 -0
  101. snappy/doc/other.html +160 -162
  102. snappy/doc/platonic_census.html +374 -377
  103. snappy/doc/plink.html +209 -212
  104. snappy/doc/ptolemy.html +253 -255
  105. snappy/doc/ptolemy_classes.html +1143 -1146
  106. snappy/doc/ptolemy_examples1.html +408 -410
  107. snappy/doc/ptolemy_examples2.html +470 -473
  108. snappy/doc/ptolemy_examples3.html +413 -416
  109. snappy/doc/ptolemy_examples4.html +194 -197
  110. snappy/doc/ptolemy_prelim.html +247 -250
  111. snappy/doc/py-modindex.html +164 -167
  112. snappy/doc/screenshots.html +140 -142
  113. snappy/doc/search.html +134 -137
  114. snappy/doc/searchindex.js +1 -1
  115. snappy/doc/snap.html +201 -204
  116. snappy/doc/snappy.html +180 -182
  117. snappy/doc/spherogram.html +1210 -1213
  118. snappy/doc/todo.html +165 -168
  119. snappy/doc/triangulation.html +1583 -1474
  120. snappy/doc/tutorial.html +158 -161
  121. snappy/doc/verify.html +329 -275
  122. snappy/doc/verify_internals.html +1234 -1691
  123. snappy/drilling/__init__.py +153 -235
  124. snappy/drilling/barycentric.py +103 -0
  125. snappy/drilling/constants.py +0 -2
  126. snappy/drilling/crush.py +56 -130
  127. snappy/drilling/cusps.py +12 -6
  128. snappy/drilling/debug.py +2 -1
  129. snappy/drilling/exceptions.py +7 -40
  130. snappy/drilling/moves.py +302 -243
  131. snappy/drilling/perturb.py +63 -37
  132. snappy/drilling/shorten.py +36 -0
  133. snappy/drilling/subdivide.py +0 -5
  134. snappy/drilling/test.py +23 -0
  135. snappy/drilling/test_cases.py +126 -0
  136. snappy/drilling/tracing.py +9 -37
  137. snappy/exceptions.py +18 -5
  138. snappy/exterior_to_link/barycentric_geometry.py +2 -4
  139. snappy/exterior_to_link/main.py +8 -7
  140. snappy/exterior_to_link/mcomplex_with_link.py +2 -2
  141. snappy/exterior_to_link/rational_linear_algebra.py +1 -1
  142. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
  143. snappy/exterior_to_link/test.py +21 -33
  144. snappy/geometric_structure/__init__.py +212 -0
  145. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  146. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  147. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  148. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  149. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  150. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  151. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  152. snappy/geometric_structure/geodesic/__init__.py +0 -0
  153. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  154. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  155. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  156. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  157. snappy/geometric_structure/geodesic/constants.py +6 -0
  158. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  159. snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
  160. snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
  161. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  162. snappy/geometric_structure/geodesic/line.py +30 -0
  163. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  164. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  165. snappy/geometric_structure/test.py +22 -0
  166. snappy/gui.py +23 -13
  167. snappy/horoviewer.py +7 -7
  168. snappy/hyperboloid/__init__.py +96 -31
  169. snappy/hyperboloid/distances.py +245 -0
  170. snappy/hyperboloid/horoball.py +19 -0
  171. snappy/hyperboloid/line.py +35 -0
  172. snappy/hyperboloid/point.py +9 -0
  173. snappy/hyperboloid/triangle.py +29 -0
  174. snappy/isometry_signature.py +382 -0
  175. snappy/len_spec/__init__.py +596 -0
  176. snappy/len_spec/geodesic_info.py +110 -0
  177. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  178. snappy/len_spec/geodesic_piece.py +143 -0
  179. snappy/len_spec/geometric_structure.py +182 -0
  180. snappy/len_spec/geometry.py +80 -0
  181. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  182. snappy/len_spec/spine.py +206 -0
  183. snappy/len_spec/test.py +24 -0
  184. snappy/len_spec/test_cases.py +69 -0
  185. snappy/len_spec/tile.py +275 -0
  186. snappy/len_spec/word.py +86 -0
  187. snappy/math_basics.py +39 -13
  188. snappy/matrix.py +52 -9
  189. snappy/number.py +12 -6
  190. snappy/numeric_output_checker.py +2 -3
  191. snappy/pari.py +8 -4
  192. snappy/phone_home.py +2 -1
  193. snappy/polyviewer.py +8 -8
  194. snappy/ptolemy/__init__.py +1 -1
  195. snappy/ptolemy/component.py +2 -2
  196. snappy/ptolemy/coordinates.py +25 -25
  197. snappy/ptolemy/findLoops.py +9 -9
  198. snappy/ptolemy/manifoldMethods.py +27 -29
  199. snappy/ptolemy/polynomial.py +50 -57
  200. snappy/ptolemy/processFileBase.py +60 -0
  201. snappy/ptolemy/ptolemyVariety.py +109 -41
  202. snappy/ptolemy/reginaWrapper.py +4 -4
  203. snappy/ptolemy/rur.py +1 -1
  204. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
  205. snappy/ptolemy/test.py +99 -54
  206. snappy/ptolemy/utilities.py +1 -1
  207. snappy/raytracing/__init__.py +64 -0
  208. snappy/raytracing/additional_horospheres.py +64 -0
  209. snappy/raytracing/additional_len_spec_choices.py +63 -0
  210. snappy/raytracing/cohomology_fractal.py +0 -3
  211. snappy/raytracing/eyeball.py +123 -0
  212. snappy/raytracing/finite_raytracing_data.py +17 -17
  213. snappy/raytracing/finite_viewer.py +15 -15
  214. snappy/raytracing/geodesic_tube_info.py +93 -63
  215. snappy/raytracing/geodesics.py +94 -64
  216. snappy/raytracing/geodesics_window.py +56 -34
  217. snappy/raytracing/gui_utilities.py +21 -6
  218. snappy/raytracing/hyperboloid_navigation.py +29 -4
  219. snappy/raytracing/hyperboloid_utilities.py +73 -73
  220. snappy/raytracing/ideal_raytracing_data.py +121 -91
  221. snappy/raytracing/inside_viewer.py +199 -66
  222. snappy/raytracing/pack.py +22 -0
  223. snappy/raytracing/raytracing_data.py +37 -25
  224. snappy/raytracing/raytracing_view.py +70 -65
  225. snappy/raytracing/shaders/Eye.png +0 -0
  226. snappy/raytracing/shaders/NonGeometric.png +0 -0
  227. snappy/raytracing/shaders/__init__.py +39 -3
  228. snappy/raytracing/shaders/fragment.glsl +451 -133
  229. snappy/raytracing/test.py +29 -0
  230. snappy/raytracing/tooltip.py +146 -0
  231. snappy/raytracing/upper_halfspace_utilities.py +42 -9
  232. snappy/sage_helper.py +67 -134
  233. snappy/settings.py +90 -77
  234. snappy/shell.py +2 -0
  235. snappy/snap/character_varieties.py +2 -2
  236. snappy/snap/find_field.py +4 -3
  237. snappy/snap/fundamental_polyhedron.py +2 -2
  238. snappy/snap/kernel_structures.py +5 -1
  239. snappy/snap/nsagetools.py +9 -8
  240. snappy/snap/peripheral/dual_cellulation.py +4 -3
  241. snappy/snap/peripheral/peripheral.py +2 -2
  242. snappy/snap/peripheral/surface.py +5 -5
  243. snappy/snap/peripheral/test.py +1 -1
  244. snappy/snap/polished_reps.py +8 -8
  245. snappy/snap/slice_obs_HKL.py +16 -14
  246. snappy/snap/t3mlite/arrow.py +3 -3
  247. snappy/snap/t3mlite/edge.py +3 -3
  248. snappy/snap/t3mlite/homology.py +2 -2
  249. snappy/snap/t3mlite/mcomplex.py +3 -3
  250. snappy/snap/t3mlite/simplex.py +12 -0
  251. snappy/snap/t3mlite/spun.py +18 -17
  252. snappy/snap/t3mlite/test_vs_regina.py +4 -4
  253. snappy/snap/test.py +37 -53
  254. snappy/snap/utilities.py +4 -5
  255. snappy/test.py +121 -138
  256. snappy/test_cases.py +263 -0
  257. snappy/testing.py +131 -0
  258. snappy/tiling/__init__.py +2 -0
  259. snappy/tiling/canonical_key_dict.py +59 -0
  260. snappy/tiling/dict_based_set.py +79 -0
  261. snappy/tiling/floor.py +49 -0
  262. snappy/tiling/hyperboloid_dict.py +54 -0
  263. snappy/tiling/iter_utils.py +78 -0
  264. snappy/tiling/lifted_tetrahedron.py +22 -0
  265. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  266. snappy/tiling/real_hash_dict.py +164 -0
  267. snappy/tiling/test.py +23 -0
  268. snappy/tiling/tile.py +215 -0
  269. snappy/tiling/triangle.py +33 -0
  270. snappy/tkterminal.py +113 -84
  271. snappy/twister/main.py +1 -7
  272. snappy/twister/twister_core.cp38-win_amd64.pyd +0 -0
  273. snappy/upper_halfspace/__init__.py +78 -17
  274. snappy/verify/__init__.py +3 -7
  275. snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
  276. snappy/verify/complex_volume/adjust_torsion.py +1 -2
  277. snappy/verify/complex_volume/closed.py +13 -13
  278. snappy/verify/complex_volume/cusped.py +6 -6
  279. snappy/verify/complex_volume/extended_bloch.py +5 -8
  280. snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
  281. snappy/verify/edge_equations.py +80 -0
  282. snappy/verify/exceptions.py +0 -55
  283. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
  284. snappy/verify/interval_newton_shapes_engine.py +7 -5
  285. snappy/verify/interval_tree.py +5 -5
  286. snappy/verify/krawczyk_shapes_engine.py +17 -18
  287. snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
  288. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
  289. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
  290. snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
  291. snappy/verify/shapes.py +5 -3
  292. snappy/verify/short_slopes.py +39 -41
  293. snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
  294. snappy/verify/test.py +57 -60
  295. snappy/verify/upper_halfspace/extended_matrix.py +1 -1
  296. snappy/verify/upper_halfspace/finite_point.py +3 -4
  297. snappy/verify/upper_halfspace/ideal_point.py +9 -9
  298. snappy/verify/volume.py +2 -2
  299. snappy/version.py +2 -2
  300. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +14 -10
  301. snappy-3.2.dist-info/RECORD +503 -0
  302. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  303. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  304. snappy/__pycache__/__init__.cpython-38.pyc +0 -0
  305. snappy/__pycache__/browser.cpython-38.pyc +0 -0
  306. snappy/__pycache__/cache.cpython-38.pyc +0 -0
  307. snappy/__pycache__/database.cpython-38.pyc +0 -0
  308. snappy/__pycache__/db_utilities.cpython-38.pyc +0 -0
  309. snappy/__pycache__/decorated_isosig.cpython-38.pyc +0 -0
  310. snappy/__pycache__/exceptions.cpython-38.pyc +0 -0
  311. snappy/__pycache__/export_stl.cpython-38.pyc +0 -0
  312. snappy/__pycache__/filedialog.cpython-38.pyc +0 -0
  313. snappy/__pycache__/gui.cpython-38.pyc +0 -0
  314. snappy/__pycache__/horoviewer.cpython-38.pyc +0 -0
  315. snappy/__pycache__/math_basics.cpython-38.pyc +0 -0
  316. snappy/__pycache__/matrix.cpython-38.pyc +0 -0
  317. snappy/__pycache__/number.cpython-38.pyc +0 -0
  318. snappy/__pycache__/numeric_output_checker.cpython-38.pyc +0 -0
  319. snappy/__pycache__/pari.cpython-38.pyc +0 -0
  320. snappy/__pycache__/polyviewer.cpython-38.pyc +0 -0
  321. snappy/__pycache__/sage_helper.cpython-38.pyc +0 -0
  322. snappy/__pycache__/version.cpython-38.pyc +0 -0
  323. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  324. snappy/doc/_static/jquery-3.6.0.js +0 -10881
  325. snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
  326. snappy/doc/_static/js/html5shiv.min.js +0 -4
  327. snappy/doc/_static/underscore-1.13.1.js +0 -2042
  328. snappy/doc/_static/underscore.js +0 -6
  329. snappy/doc/verify_canon.html +0 -304
  330. snappy/drilling/__pycache__/__init__.cpython-38.pyc +0 -0
  331. snappy/drilling/__pycache__/constants.cpython-38.pyc +0 -0
  332. snappy/drilling/__pycache__/crush.cpython-38.pyc +0 -0
  333. snappy/drilling/__pycache__/cusps.cpython-38.pyc +0 -0
  334. snappy/drilling/__pycache__/debug.cpython-38.pyc +0 -0
  335. snappy/drilling/__pycache__/epsilons.cpython-38.pyc +0 -0
  336. snappy/drilling/__pycache__/exceptions.cpython-38.pyc +0 -0
  337. snappy/drilling/__pycache__/fixed_points.cpython-38.pyc +0 -0
  338. snappy/drilling/__pycache__/geodesic_info.cpython-38.pyc +0 -0
  339. snappy/drilling/__pycache__/geodesic_tube.cpython-38.pyc +0 -0
  340. snappy/drilling/__pycache__/geometric_structure.cpython-38.pyc +0 -0
  341. snappy/drilling/__pycache__/line.cpython-38.pyc +0 -0
  342. snappy/drilling/__pycache__/moves.cpython-38.pyc +0 -0
  343. snappy/drilling/__pycache__/peripheral_curves.cpython-38.pyc +0 -0
  344. snappy/drilling/__pycache__/perturb.cpython-38.pyc +0 -0
  345. snappy/drilling/__pycache__/quotient_space.cpython-38.pyc +0 -0
  346. snappy/drilling/__pycache__/spatial_dict.cpython-38.pyc +0 -0
  347. snappy/drilling/__pycache__/subdivide.cpython-38.pyc +0 -0
  348. snappy/drilling/__pycache__/tracing.cpython-38.pyc +0 -0
  349. snappy/drilling/geodesic_tube.py +0 -441
  350. snappy/drilling/geometric_structure.py +0 -366
  351. snappy/drilling/line.py +0 -122
  352. snappy/drilling/quotient_space.py +0 -94
  353. snappy/drilling/spatial_dict.py +0 -128
  354. snappy/exterior_to_link/__pycache__/__init__.cpython-38.pyc +0 -0
  355. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-38.pyc +0 -0
  356. snappy/exterior_to_link/__pycache__/exceptions.cpython-38.pyc +0 -0
  357. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-38.pyc +0 -0
  358. snappy/exterior_to_link/__pycache__/link_projection.cpython-38.pyc +0 -0
  359. snappy/exterior_to_link/__pycache__/main.cpython-38.pyc +0 -0
  360. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-38.pyc +0 -0
  361. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-38.pyc +0 -0
  362. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-38.pyc +0 -0
  363. snappy/exterior_to_link/__pycache__/pl_utils.cpython-38.pyc +0 -0
  364. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-38.pyc +0 -0
  365. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-38.pyc +0 -0
  366. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-38.pyc +0 -0
  367. snappy/exterior_to_link/__pycache__/stored_moves.cpython-38.pyc +0 -0
  368. snappy/hyperboloid/__pycache__/__init__.cpython-38.pyc +0 -0
  369. snappy/manifolds/__pycache__/__init__.cpython-38.pyc +0 -0
  370. snappy/ptolemy/__pycache__/__init__.cpython-38.pyc +0 -0
  371. snappy/ptolemy/__pycache__/component.cpython-38.pyc +0 -0
  372. snappy/ptolemy/__pycache__/coordinates.cpython-38.pyc +0 -0
  373. snappy/ptolemy/__pycache__/fieldExtensions.cpython-38.pyc +0 -0
  374. snappy/ptolemy/__pycache__/findLoops.cpython-38.pyc +0 -0
  375. snappy/ptolemy/__pycache__/homology.cpython-38.pyc +0 -0
  376. snappy/ptolemy/__pycache__/manifoldMethods.cpython-38.pyc +0 -0
  377. snappy/ptolemy/__pycache__/matrix.cpython-38.pyc +0 -0
  378. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-38.pyc +0 -0
  379. snappy/ptolemy/__pycache__/polynomial.cpython-38.pyc +0 -0
  380. snappy/ptolemy/__pycache__/processComponents.cpython-38.pyc +0 -0
  381. snappy/ptolemy/__pycache__/processFileBase.cpython-38.pyc +0 -0
  382. snappy/ptolemy/__pycache__/processFileDispatch.cpython-38.pyc +0 -0
  383. snappy/ptolemy/__pycache__/processMagmaFile.cpython-38.pyc +0 -0
  384. snappy/ptolemy/__pycache__/processRurFile.cpython-38.pyc +0 -0
  385. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-38.pyc +0 -0
  386. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-38.pyc +0 -0
  387. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-38.pyc +0 -0
  388. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
  389. snappy/ptolemy/__pycache__/rur.cpython-38.pyc +0 -0
  390. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
  391. snappy/ptolemy/__pycache__/utilities.cpython-38.pyc +0 -0
  392. snappy/snap/__pycache__/__init__.cpython-38.pyc +0 -0
  393. snappy/snap/__pycache__/character_varieties.cpython-38.pyc +0 -0
  394. snappy/snap/__pycache__/fundamental_polyhedron.cpython-38.pyc +0 -0
  395. snappy/snap/__pycache__/interval_reps.cpython-38.pyc +0 -0
  396. snappy/snap/__pycache__/kernel_structures.cpython-38.pyc +0 -0
  397. snappy/snap/__pycache__/mcomplex_base.cpython-38.pyc +0 -0
  398. snappy/snap/__pycache__/nsagetools.cpython-38.pyc +0 -0
  399. snappy/snap/__pycache__/polished_reps.cpython-38.pyc +0 -0
  400. snappy/snap/__pycache__/shapes.cpython-38.pyc +0 -0
  401. snappy/snap/__pycache__/slice_obs_HKL.cpython-38.pyc +0 -0
  402. snappy/snap/__pycache__/utilities.cpython-38.pyc +0 -0
  403. snappy/snap/peripheral/__pycache__/__init__.cpython-38.pyc +0 -0
  404. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-38.pyc +0 -0
  405. snappy/snap/peripheral/__pycache__/link.cpython-38.pyc +0 -0
  406. snappy/snap/peripheral/__pycache__/peripheral.cpython-38.pyc +0 -0
  407. snappy/snap/peripheral/__pycache__/surface.cpython-38.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/__init__.cpython-38.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/arrow.cpython-38.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/corner.cpython-38.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/edge.cpython-38.pyc +0 -0
  412. snappy/snap/t3mlite/__pycache__/face.cpython-38.pyc +0 -0
  413. snappy/snap/t3mlite/__pycache__/files.cpython-38.pyc +0 -0
  414. snappy/snap/t3mlite/__pycache__/homology.cpython-38.pyc +0 -0
  415. snappy/snap/t3mlite/__pycache__/linalg.cpython-38.pyc +0 -0
  416. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-38.pyc +0 -0
  417. snappy/snap/t3mlite/__pycache__/perm4.cpython-38.pyc +0 -0
  418. snappy/snap/t3mlite/__pycache__/simplex.cpython-38.pyc +0 -0
  419. snappy/snap/t3mlite/__pycache__/spun.cpython-38.pyc +0 -0
  420. snappy/snap/t3mlite/__pycache__/surface.cpython-38.pyc +0 -0
  421. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-38.pyc +0 -0
  422. snappy/snap/t3mlite/__pycache__/vertex.cpython-38.pyc +0 -0
  423. snappy/togl/__init__.py +0 -3
  424. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  425. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  426. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  427. snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
  428. snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
  429. snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
  430. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  431. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  432. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  433. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  434. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  435. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  436. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  437. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  438. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  439. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  440. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  441. snappy/twister/__pycache__/__init__.cpython-38.pyc +0 -0
  442. snappy/twister/__pycache__/main.cpython-38.pyc +0 -0
  443. snappy/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
  444. snappy/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
  445. snappy/verify/__pycache__/__init__.cpython-38.pyc +0 -0
  446. snappy/verify/__pycache__/cuspCrossSection.cpython-38.pyc +0 -0
  447. snappy/verify/__pycache__/cuspTranslations.cpython-38.pyc +0 -0
  448. snappy/verify/__pycache__/cusp_areas.cpython-38.pyc +0 -0
  449. snappy/verify/__pycache__/cusp_shapes.cpython-38.pyc +0 -0
  450. snappy/verify/__pycache__/exceptions.cpython-38.pyc +0 -0
  451. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-38.pyc +0 -0
  452. snappy/verify/__pycache__/interval_tree.cpython-38.pyc +0 -0
  453. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-38.pyc +0 -0
  454. snappy/verify/__pycache__/realAlgebra.cpython-38.pyc +0 -0
  455. snappy/verify/__pycache__/shapes.cpython-38.pyc +0 -0
  456. snappy/verify/__pycache__/short_slopes.cpython-38.pyc +0 -0
  457. snappy/verify/__pycache__/squareExtensions.cpython-38.pyc +0 -0
  458. snappy/verify/__pycache__/verifyCanonical.cpython-38.pyc +0 -0
  459. snappy/verify/__pycache__/verifyHyperbolicity.cpython-38.pyc +0 -0
  460. snappy/verify/__pycache__/volume.cpython-38.pyc +0 -0
  461. snappy/verify/complex_volume/__pycache__/__init__.cpython-38.pyc +0 -0
  462. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-38.pyc +0 -0
  463. snappy/verify/complex_volume/__pycache__/closed.cpython-38.pyc +0 -0
  464. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-38.pyc +0 -0
  465. snappy/verify/complex_volume/__pycache__/cusped.cpython-38.pyc +0 -0
  466. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-38.pyc +0 -0
  467. snappy/verify/cuspCrossSection.py +0 -1422
  468. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-38.pyc +0 -0
  469. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-38.pyc +0 -0
  470. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-38.pyc +0 -0
  471. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
  472. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-38.pyc +0 -0
  473. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-38.pyc +0 -0
  474. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
  475. snappy-3.1.1.dist-info/RECORD +0 -575
  476. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,35 @@
1
+ from ..hyperboloid import r13_dot
2
+
3
+ __all__ = [ 'R13Line' ]
4
+
5
+ class R13Line:
6
+ """
7
+ A line in the hyperboloid model - represented by two
8
+ like-like vectors spanning the line.
9
+
10
+ For distance computations, the inner product between the two
11
+ vectors is stored as well.
12
+ """
13
+
14
+ def __init__(self,
15
+ points, # Two light-like vectors
16
+ inner_product=None): # Optional: their inner product
17
+ """
18
+ inner_product can be given if known, otherwise, will be computed.
19
+ """
20
+ self.points = points
21
+ if inner_product is None:
22
+ self.inner_product = r13_dot(points[0], points[1])
23
+ else:
24
+ self.inner_product = inner_product
25
+
26
+ def transformed(self,
27
+ m): # O13-matrix
28
+ """
29
+ Returns image of the line under given O13-matrix m.
30
+ """
31
+
32
+ return R13Line(
33
+ [ m * point for point in self.points],
34
+ self.inner_product)
35
+
@@ -0,0 +1,9 @@
1
+ __all__ = [ 'R13Point' ]
2
+
3
+ class R13Point:
4
+ def __init__(self, point):
5
+ self.point = point
6
+
7
+ def transformed(self,
8
+ m): # O13-matrix
9
+ return R13Point(m * self.point)
@@ -0,0 +1,29 @@
1
+ from .line import R13Line
2
+ from . import (time_r13_normalise,
3
+ space_r13_normalise,
4
+ r13_dot)
5
+
6
+ from typing import Sequence
7
+
8
+ __all__ = ['R13IdealTriangle']
9
+
10
+ class R13IdealTriangle:
11
+ def __init__(self,
12
+ plane, # one space-like normal vector
13
+ bounding_planes, # three space-like normal vectors
14
+ edges : Sequence[R13Line] # Same order as bounding_planes
15
+ ):
16
+ self.plane = plane
17
+ self.bounding_planes = bounding_planes
18
+ self.edges = edges
19
+
20
+ def triangle_bounding_plane(v_opp, v0, v1):
21
+ m = time_r13_normalise(
22
+ -(r13_dot(v1, v_opp) * v0 + r13_dot(v0, v_opp) * v1))
23
+
24
+ return _make_r13_unit_tangent_vector(m - v_opp, m)
25
+
26
+ def _make_r13_unit_tangent_vector(direction, point):
27
+ s = r13_dot(direction, point)
28
+ return space_r13_normalise(direction + s * point)
29
+
@@ -0,0 +1,382 @@
1
+ from . import Triangulation, TriangulationHP, ManifoldHP
2
+ from . import verify
3
+ from .sage_helper import _within_sage
4
+ from .math_basics import is_RealIntervalFieldElement
5
+ from .exceptions import InsufficientPrecisionError, NonorientableManifoldError
6
+ from .geometric_structure.geodesic.exceptions import WordAppearsToBeParabolic
7
+ from .decorated_isosig import key_slope, normalized_slope
8
+ from .matrix import make_vector
9
+
10
+ def isometry_signature(
11
+ manifold, of_link=False, ignore_orientation=True, verified=False,
12
+ interval_bits_precs=verify.default_interval_bits_precs,
13
+ exact_bits_prec_and_degrees=verify.default_exact_bits_prec_and_degrees,
14
+ verbose=False) -> str:
15
+ """
16
+ Returns the "isometry signature", a complete invariant of the hyperbolic
17
+ 3-manifold obtained by applying the Dehn-fillings.
18
+ The isometry signature is always a (decorated) isomorphism signature, see
19
+ :meth:`.triangulation_isosig`, and was introduced in
20
+ `Goerner '16 <http://arxiv.org/abs/1502.00383>`_.
21
+
22
+ Depending on :attr:`ignore_orientation`, it is a complete invariant of
23
+ either the oriented (if orientable) or unoriented hyperbolic 3-manifold.
24
+ If :attr:`of_link = True` is specified, the signature is decorated by the
25
+ unoriented peripheral curves (aka meridian and longitude, up to homotopy).
26
+ If the 3-manifold arises as a link complement, the decorated isometry
27
+ signature obtained with :attr:`of_link = True` is a complete invariant of
28
+ the link.
29
+
30
+ The isometry signature is computed differently based on whether there
31
+ is at least one unfilled cusp.
32
+
33
+ **Cusped manifolds**
34
+
35
+ If there is at least one unfilled cusped, we are in the cusped case.
36
+
37
+ Here is an example of two links having isometric (hyperbolic) complements:
38
+
39
+ >>> M = Manifold("L5a1")
40
+ >>> N = Manifold("L7n2")
41
+ >>> M.isometry_signature()
42
+ 'eLPkbdcddhgggb'
43
+ >>> N.isometry_signature()
44
+ 'eLPkbdcddhgggb'
45
+
46
+ The complements do have opposite handedness though::
47
+
48
+ >>> M.isometry_signature(ignore_orientation=False)
49
+ 'eLPkbdcddxvvcv'
50
+ >>> N.isometry_signature(ignore_orientation=False)
51
+ 'eLPkbdcddhgggb'
52
+
53
+ We can show that the two links are distinct::
54
+
55
+ >>> M.isometry_signature(of_link = True)
56
+ 'eLPkbdcddhgggb_baCbbaCb'
57
+ >>> N.isometry_signature(of_link = True)
58
+ 'eLPkbdcddhgggb_bBcBbaCb'
59
+
60
+ If we Dehn-fill some cusps, the method uses the filled triangulation.
61
+ Here, we Dehn-fill the Whitehead link to get the figure-eight knot::
62
+
63
+ >>> M.dehn_fill((1,1), 0)
64
+ >>> M.isometry_signature(of_link = True)
65
+ 'cPcbbbiht_bacb'
66
+ >>> Manifold("4_1").isometry_signature(of_link = True)
67
+ 'cPcbbbiht_bacb'
68
+
69
+ In general, the isometry signature is the isomorphism signature (see
70
+ :meth:`.triangulation_isosig`) of the
71
+ :meth:`.canonical_retriangulation` of the
72
+ :meth:`.filled_triangulation`::
73
+
74
+ >>> T = M.filled_triangulation().canonical_retriangulation()
75
+ >>> T.triangulation_isosig(ignore_cusp_ordering = True,
76
+ ... ignore_curve_orientations = True)
77
+ 'cPcbbbiht_bacb'
78
+
79
+ **Closed manifolds**
80
+
81
+ If all cusps are filled, we are in the closed case. In this case, the
82
+ isometry signature gives the resulting closed hyperbolic 3-manifold as
83
+ canonical surgery on a hyperbolic 1-cusped manifold (which is encoded by
84
+ its isometry signature). Only orientable manifolds are supported in the
85
+ closed case.
86
+
87
+ >>> M = Manifold("v2000(1,3)")
88
+ >>> M.isometry_signature()
89
+ 'fLLQcacdedenbxxrr(-7,12)'
90
+
91
+ The following code illustrates how the isometry signature is computed::
92
+
93
+ >>> M.length_spectrum_alt(count=2) # doctest: +NUMERIC9
94
+ [Length Core curve Word
95
+ 0.06491027903143 - 2.63765810995071*I - d,
96
+ 0.49405010583448 + 2.38451103485706*I - a]
97
+ >>> K = M.drill_word('d').filled_triangulation().canonical_retriangulation()
98
+ >>> K.dehn_fill((1,0), 0)
99
+ >>> K.triangulation_isosig(ignore_cusp_ordering=True, ignore_curves=True)
100
+ 'fLLQcacdedenbxxrr(-7,12)'
101
+
102
+ Note that there is clearly a unique shortest geodesic in this example.
103
+ In general, the method first considers a canonical set of geodesics.
104
+ For each such geodesic, it computes a candidate signature as above. It
105
+ then picks a canonical signature among the candidates. Further details
106
+ can be found in an upcoming paper.
107
+
108
+ **Verified computations**
109
+
110
+ While the isometry signature is purely combinatorial, some intermediate
111
+ computations are numerical. Thus, if :attr:`verified = False`,
112
+ floating-point issues can arise.
113
+
114
+ The method can be made :ref:`verified <verify-primer>` by passing
115
+ :attr:`verified = True`::
116
+
117
+ sage: M=Manifold("m007(4,1)")
118
+ sage: M.isometry_signature(verified=True)
119
+ 'eLPkbcdddhggsj(3,1)'
120
+
121
+ This method always needs to compute at least one canonical retriangulation.
122
+ It can take the same arguments as :meth:`.canonical_retriangulation` and
123
+ passes them to :meth:`.canonical_retriangulation` when computing the
124
+ verified canonical retriangulation. If the manifold is closed, interval
125
+ arithmetic is used when finding and drilling the short geodesics.
126
+
127
+ :param of_link:
128
+ Also encode the unoriented peripheral curves.
129
+ Note that it is not necessary for the manifold to be a link
130
+ complement to invoke this flag.
131
+ Only relevant in the cusped case.
132
+ :param ignore_orientation:
133
+ Do not encode the orientation of the 3-manifold.
134
+ :param verified:
135
+ Use :ref:`verified computation <verify-primer>`.
136
+ :param interval_bits_precs:
137
+ Passed to :meth:`.canonical_retriangulation` and (in the closed
138
+ case) also used when calling :meth:`.length_spectrum_alt_gen` and
139
+ :meth:`.drill_word` to find and drill the short geodesics.
140
+ :param exact_bits_prec_and_degrees:
141
+ Passed to :meth:`.canonical_retriangulation`.
142
+ :param verbose:
143
+ Print information about finding and drilling the short geodesics.
144
+ Also passed to :meth:`.canonical_retriangulation`.
145
+ """
146
+
147
+ if any(manifold.cusp_info('complete?')):
148
+ return isometry_signature_cusped(
149
+ manifold,
150
+ of_link=of_link,
151
+ ignore_orientation=ignore_orientation,
152
+ verified=verified,
153
+ interval_bits_precs=interval_bits_precs,
154
+ exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
155
+ verbose=verbose)
156
+ else:
157
+ return isometry_signature_closed(
158
+ manifold,
159
+ ignore_orientation=ignore_orientation,
160
+ verified=verified,
161
+ interval_bits_precs=interval_bits_precs,
162
+ exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
163
+ verbose=verbose)
164
+
165
+
166
+ def isometry_signature_cusped(
167
+ manifold, *,
168
+ of_link,
169
+ ignore_orientation,
170
+ verified,
171
+ interval_bits_precs,
172
+ exact_bits_prec_and_degrees,
173
+ verbose):
174
+ if not all(manifold.cusp_info('complete?')):
175
+ manifold = manifold.filled_triangulation()
176
+ if not all(manifold.cusp_info('complete?')):
177
+ raise ValueError(
178
+ 'Could not compute filled triangulation. '
179
+ 'Are the filling coefficients co-prime integers?')
180
+
181
+ retrig = manifold.canonical_retriangulation(
182
+ verified=verified,
183
+ interval_bits_precs=interval_bits_precs,
184
+ exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
185
+ verbose=verbose)
186
+
187
+ return retrig.triangulation_isosig(
188
+ decorated=of_link,
189
+ ignore_cusp_ordering=True,
190
+ ignore_curve_orientations=True,
191
+ ignore_orientation=ignore_orientation)
192
+
193
+ def isometry_signature_closed(
194
+ manifold, *,
195
+ ignore_orientation,
196
+ verified,
197
+ interval_bits_precs,
198
+ exact_bits_prec_and_degrees,
199
+ verbose):
200
+
201
+ if not manifold.is_orientable():
202
+ raise NonorientableManifoldError(
203
+ "Manifold.isometry_signature (closed case)", manifold)
204
+
205
+ if verbose:
206
+ print("Step 1: Finding shortest geodesics")
207
+
208
+ shortest_geodesics = find_shortest_geodesics_precisions(
209
+ manifold,
210
+ bits_precs=interval_bits_precs,
211
+ verified=verified,
212
+ verbose=verbose)
213
+
214
+ if verbose:
215
+ print("Step 2: Drill each geodesic for potential isometry signatures")
216
+
217
+ potential_signatures = []
218
+
219
+ for shortest_geodesic in shortest_geodesics:
220
+ if verbose:
221
+ print("Drilling ", shortest_geodesic)
222
+
223
+ drilled_manifold = drill_manifold_precisions(
224
+ manifold, shortest_geodesic,
225
+ bits_precs=interval_bits_precs,
226
+ verified=verified,
227
+ verbose=verbose)
228
+
229
+ if not all(drilled_manifold.cusp_info('complete?')):
230
+ drilled_manifold = drilled_manifold.filled_triangulation()
231
+
232
+ if verbose:
233
+ print("Computing isometry signature of drilled manifold")
234
+
235
+ try:
236
+ retrig = drilled_manifold.canonical_retriangulation(
237
+ verified=verified,
238
+ interval_bits_precs=interval_bits_precs,
239
+ exact_bits_prec_and_degrees=exact_bits_prec_and_degrees,
240
+ verbose=verbose)
241
+ except Exception as e:
242
+ raise RuntimeError(
243
+ "Could not compute or verify canonical retriangulation of "
244
+ "drilled manifold. "
245
+ "Geodesic was: %s." % shortest_geodesic) from e
246
+
247
+ isosig = retrig.triangulation_isosig(
248
+ decorated=False,
249
+ ignore_orientation=ignore_orientation)
250
+
251
+ for slope in compute_meridian_slopes(isosig, retrig):
252
+ sig = (isosig, slope)
253
+ if verbose:
254
+ print("Potential isometry signature %s%r" % sig)
255
+ potential_signatures.append(sig)
256
+
257
+ isosig, (m, l) = min(potential_signatures, key=key_signature)
258
+
259
+ return '%s(%d,%d)' % (isosig, m, l)
260
+
261
+
262
+ def find_shortest_geodesics_precisions(
263
+ manifold, *, bits_precs, verified, verbose):
264
+
265
+ err = ValueError("bits_precs was empty.")
266
+
267
+ for bits_prec in bits_precs:
268
+ if verbose:
269
+ print("Using precision %d to find shortest geodesics" % bits_prec)
270
+ try:
271
+ return find_shortest_geodesics(
272
+ manifold,
273
+ bits_prec=bits_prec,
274
+ verified=verified,
275
+ verbose=verbose)
276
+ except (InsufficientPrecisionError,
277
+ ValueError,
278
+ RuntimeError # from Manifold.tetrahedra_shapes
279
+ ) as e:
280
+ err = e
281
+
282
+ raise err
283
+
284
+
285
+ def find_shortest_geodesics(manifold, *, bits_prec, verified, verbose):
286
+ length_spectrum = manifold.length_spectrum_alt_gen(
287
+ bits_prec=bits_prec, verified=verified)
288
+
289
+ is_first = True
290
+
291
+ words_to_drill = []
292
+
293
+ for geodesic in length_spectrum:
294
+ if is_first:
295
+ systole = geodesic.length.real()
296
+ cutoff = compute_cutoff(systole)
297
+ is_first = False
298
+ if verbose:
299
+ print("Systole: ", systole)
300
+ print("Cutoff for shortest geodesics: ", cutoff)
301
+
302
+ r = geodesic.length.real()
303
+
304
+ if verbose:
305
+ print("Word: ", geodesic.word)
306
+ print("Geodesic length: ", r)
307
+
308
+ if r > cutoff:
309
+ break
310
+
311
+ if r < cutoff:
312
+ if verbose:
313
+ print("Adding word to candidates")
314
+ words_to_drill.append(geodesic.word)
315
+ continue
316
+
317
+ raise InsufficientPrecisionError(
318
+ "Could not determine whether geodesic length is "
319
+ "less or greater than cutoff.\n"
320
+ "Cutoff: %r\n"
321
+ "Length: %r\n" % (cutoff, r))
322
+
323
+ return words_to_drill
324
+
325
+ _cutoff_binary_digits = 16
326
+
327
+ def compute_cutoff(systole):
328
+ RF = systole.parent()
329
+
330
+ if _within_sage:
331
+ l = systole.log2()
332
+ else:
333
+ l = systole.log() / RF(2).log()
334
+
335
+ f = l.floor()
336
+
337
+ if is_RealIntervalFieldElement(l):
338
+ is_int, f_int = f.is_int()
339
+ if not is_int:
340
+ raise InsufficientPrecisionError(
341
+ "Could not determine magnitude of systole.")
342
+ else:
343
+ f_int = f
344
+
345
+ return systole + RF(2) ** (f_int - _cutoff_binary_digits)
346
+
347
+ def drill_manifold_precisions(
348
+ manifold, word, *,
349
+ bits_precs, verified, verbose):
350
+
351
+ err = ValueError("bits_precs was empty.")
352
+
353
+ for bits_prec in bits_precs:
354
+ try:
355
+ if verbose:
356
+ print("Drilling with precision %d" % bits_prec)
357
+
358
+ return manifold.drill_word(
359
+ word,
360
+ bits_prec=bits_prec,
361
+ verified=verified,
362
+ verbose=verbose)
363
+ except (InsufficientPrecisionError,
364
+ ValueError,
365
+ RuntimeError, # from Manifold.tetrahedra_shapes
366
+ WordAppearsToBeParabolic) as e:
367
+ err = e
368
+
369
+ raise err
370
+
371
+ def compute_meridian_slopes(isosig, tri):
372
+ isosig_tri = Triangulation(isosig, remove_finite_vertices=False)
373
+ # Do not call isosig_tri.set_peripheral_curves('combinatorial')
374
+ # here.
375
+ for iso in tri.isomorphisms_to(isosig_tri):
376
+ cusp_map, = iso.cusp_maps()
377
+ slope = make_vector([cusp_map[0,0], cusp_map[1,0]])
378
+ yield normalized_slope(slope)
379
+
380
+ def key_signature(signature):
381
+ isosig, slope = signature
382
+ return (isosig, key_slope(slope))