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,170 @@
1
+ from ..SnapPy import Info
2
+ from ..math_basics import is_ComplexIntervalFieldElement
3
+
4
+ from typing import Tuple, Optional
5
+
6
+ class LengthSpectrumGeodesicInfo(Info):
7
+ """
8
+ Information about a geodesic in the length spectrum as returned by
9
+ Manifold.length_spectrum_alt_gen.
10
+ """
11
+
12
+ def _body(self) -> str:
13
+ return _format % (
14
+ _format_length(self.length),
15
+ _format_core_curve(self.core_curve),
16
+ self.word)
17
+
18
+ def __repr__(self) -> str:
19
+ if self._is_first:
20
+ return _header + '\n' + self._body()
21
+ else:
22
+ return self._body()
23
+
24
+ _core_curve_label = 'Core curve'
25
+ _verified_num_digits = 19
26
+
27
+ _format = (
28
+ '%%-%ds ' # Length
29
+ '%%-%ds ' # Core curve
30
+ '%%s' # Word
31
+ ) % (_verified_num_digits + len(' + ') + _verified_num_digits + len('*I'),
32
+ len(_core_curve_label))
33
+
34
+ _header = _format % ( 'Length',
35
+ _core_curve_label,
36
+ 'Word')
37
+
38
+ _total_length = len("Out [100:] " + _header)
39
+
40
+ if _total_length > 80:
41
+ raise AssertionError(
42
+ "Total length spectrum string too long: %d" % (
43
+ _total_length))
44
+
45
+ def _format_length(length) -> str:
46
+ if is_ComplexIntervalFieldElement(length):
47
+ return _format_verified_length(length)
48
+ else:
49
+ return _format_unverified_length(length)
50
+
51
+ def _format_verified_length(length) -> str:
52
+ return (
53
+ _format_verified_real_length(length.real()) +
54
+ ' ' +
55
+ _format_verified_imag_length(length.imag()) +
56
+ '*I')
57
+
58
+ def _format_verified_real_length(length) -> str:
59
+ result = repr(length)
60
+ return _make_fixed_length(result, _verified_num_digits)
61
+
62
+ def _format_verified_imag_length(length) -> str:
63
+ result = repr(length)
64
+
65
+ # Consume "-" to consistently format " + " and " - " later.
66
+ has_minus = result[0] == '-'
67
+ if has_minus:
68
+ result = result[1:]
69
+
70
+ # If this appears to be zero
71
+ # (that is small enough that it is of the form 1.0?e-10
72
+ # and cannot be verified to be non-zero), then
73
+ # we write "0.00000?" or "0.00000....".
74
+ if 'e' in result and not length != 0:
75
+ num_zeros = (-abs(length).log10()).lower().floor()
76
+ if num_zeros > 2:
77
+ result = '0.' + num_zeros * '0' + '?'
78
+
79
+ result = _make_fixed_length(result, _verified_num_digits)
80
+
81
+ if has_minus:
82
+ result = '- ' + result
83
+ else:
84
+ result = '+ ' + result
85
+ return result
86
+
87
+ def _format_unverified_length(length) -> str:
88
+ formatStr = "%16.14f"
89
+
90
+ lenStr = formatStr % length.real()
91
+ absImag = abs(length.imag())
92
+ # Unverified: just drop imaginary part if it is close to zero.
93
+ if absImag > 1e-9:
94
+ if length.imag() > 0:
95
+ lenStr += " + "
96
+ else:
97
+ lenStr += " - "
98
+ lenStr += (formatStr % absImag) + "*I"
99
+ return lenStr
100
+
101
+ def _format_word(word : str, max_length : int) -> str:
102
+ """
103
+ >>> _format_word('abcdefghi', 9)
104
+ 'abcdefghi'
105
+ >>> _format_word('abcdefghi', 8)
106
+ 'abcde...'
107
+ >>> _format_word('X1x2x123x12', 11)
108
+ 'X1x2x123x12'
109
+ >>> _format_word('X1x2x123x12', 10)
110
+ 'X1x2...'
111
+ """
112
+
113
+ if len(word) <= max_length:
114
+ return word
115
+
116
+ # If word is too long, write it as "abc..." so that total
117
+ # length is _max_word_length.
118
+ ellipsis = '...'
119
+
120
+ for i in range(max_length - len(ellipsis), -1, -1):
121
+ # Be careful not to break at, say 2, in x123 since
122
+ # x12... would be misleading.
123
+ if not word[i].isdigit():
124
+ break
125
+ return word[:i] + ellipsis
126
+
127
+ def _format_core_curve(core_curve : Optional[int]) -> str:
128
+ if core_curve is None:
129
+ return '-'
130
+ else:
131
+ return 'Cusp %d' % core_curve
132
+
133
+ def _split_scientific_notation(s : str) -> Tuple[str, str]:
134
+ """
135
+ >>> _split_scientific_notation('0.45')
136
+ ('0.45', '')
137
+ >>> _split_scientific_notation('4.5?e-5')
138
+ ('4.5?', 'e-5')
139
+ """
140
+
141
+ parts = s.split('e', 2)
142
+ if len(parts) == 2:
143
+ return parts[0], 'e' + parts[1]
144
+ else:
145
+ return parts[0], ''
146
+
147
+ def _make_fixed_length(result : str, length : int) -> str:
148
+ """
149
+ >>> _make_fixed_length('0.1234567', 9)
150
+ '0.1234567'
151
+ >>> _make_fixed_length('0.1234567', 8)
152
+ '0.123...'
153
+ >>> _make_fixed_length('1.2345678e-4', 9)
154
+ '1.2...e-4'
155
+ """
156
+
157
+ n = len(result)
158
+
159
+ # How many characters to we need to erase.
160
+ k = n - length
161
+
162
+ if k <= 0:
163
+ # We actually need to fill with white space.
164
+ return result + (-k) * ' '
165
+
166
+ # Preserve trailing, e.g., 'e-4'
167
+ m, e = _split_scientific_notation(result)
168
+ ellipsis = '...'
169
+ k += len(ellipsis)
170
+ return m[:-k] + ellipsis + e
@@ -0,0 +1,206 @@
1
+ from ..snap.t3mlite import Mcomplex, simplex, Tetrahedron
2
+ from ..hyperboloid.distances import distance_r13_points
3
+ from ..hyperboloid import compute_inradius_and_incenter_from_planes
4
+ from ..hyperboloid import time_r13_normalise, r13_dot
5
+ from ..math_basics import correct_max
6
+
7
+ def add_spine(mcomplex : Mcomplex):
8
+ """
9
+ Adds a spine to the mcomplex with some geometric structures.
10
+
11
+ The key property of the spine is that every geodesic that is not a core
12
+ curve is intersecting the spine.
13
+
14
+ Topologically, the spine is the dual 2-skeleton of the triangulation.
15
+ Restricted to a tetrahedron, it consists of 12 triangles. The vertices
16
+ of each triangle are on an edge, on a face and inside the tetrahedron.
17
+
18
+ We can give the spine a geometry by picking a point on each edge, on
19
+ each face and in each tetrahedron. Since we are only interested in the
20
+ radius of the spine when restricted to a tetrahedron, we actually do
21
+ not explicitly compute a point for each face.
22
+
23
+ We store the following information about the spine:
24
+ - use the tetrahedron's incenter as its spine center tet.spine_center.
25
+ - compute tet.out_radius, the radius (about the spine center) of a
26
+ tetrahedron truncated by the smaller horotriangles given by the scale
27
+ factor.
28
+ - a point on each edge of the triangulation, stored in tet.spine_points
29
+ - the maximum distance of the tet.spine_points to tet.spine_center in
30
+ tet.spine_radius.
31
+ Lemma: There is a spine of the manifold such that for each tetrahedron
32
+ a ball of this radius about the tetrahedron's spine center will contain
33
+ the restriction of the spine to the tetrahedron.
34
+ Proof: For each face, pick as point on that face the point picked for
35
+ one of the edges of that face. Consider one of the 12 triangles.
36
+ The point furthest from the spine center will be one of its vertices.
37
+ We can ignore the vertex that is the spine center itself. Any other
38
+ vertex of the triangle was considered when computing the maximum
39
+ distance.
40
+ - tet.inv_spine_cosh = 1 / cosh(r) where r is the tet.spine_radius
41
+ - for the entire fundamental domain, we have store the spine center
42
+ of the base tetrahedron in mcomplex.spine_center and the distance of
43
+ the spine point of any edge in the fundamental domain in
44
+ mcomplex.spine_radius.
45
+ """
46
+
47
+ _add_spine_points(mcomplex)
48
+
49
+ for tet in mcomplex.Tetrahedra:
50
+ _, tet.spine_center = compute_inradius_and_incenter_from_planes(
51
+ [ tet.R13_planes[f]
52
+ for f in simplex.TwoSubsimplices ])
53
+
54
+ tet.spine_radius = correct_max(
55
+ [ distance_r13_points(tet.spine_center,
56
+ tet.spine_points[e])
57
+ for e in simplex.OneSubsimplices] )
58
+
59
+ tet.inv_spine_cosh = 1 / tet.spine_radius.cosh()
60
+
61
+ if False:
62
+ for v in simplex.ZeroSubsimplices:
63
+ d = r13_dot(tet.spine_center, tet.R13_vertices[v])
64
+ if not d < - (1 - mcomplex.RF(1e-8)):
65
+ print(tet.spine_points)
66
+ print(tet.R13_vertices)
67
+ raise Exception("Conjecture is wrong.")
68
+
69
+ tet.out_points = {
70
+ (v0, v1): _out_point(tet, v0, v1)
71
+ for v0 in simplex.ZeroSubsimplices
72
+ for v1 in simplex.ZeroSubsimplices
73
+ if v0 != v1 }
74
+
75
+ tet.out_radius = correct_max(
76
+ [ distance_r13_points(tet.spine_center,
77
+ tet.out_points[(v0, v1)])
78
+ for v0 in simplex.ZeroSubsimplices
79
+ for v1 in simplex.ZeroSubsimplices
80
+ if v0 != v1 ])
81
+
82
+ if False:
83
+ print("out, spine =", tet.out_radius, tet.spine_radius)
84
+
85
+ mcomplex.spine_center = mcomplex.baseTet.spine_center
86
+ mcomplex.spine_radius = correct_max(
87
+ [ distance_r13_points(mcomplex.spine_center,
88
+ tet.spine_points[e])
89
+ for tet in mcomplex.Tetrahedra
90
+ for e in simplex.OneSubsimplices ])
91
+
92
+ def _add_spine_points(mcomplex : Mcomplex):
93
+ """
94
+ Adds tet.spine_points.
95
+
96
+ We need to pick the points such that they are inside the tetrahedra
97
+ truncated by the chosen cusp neighborhood or tube about the core curve (if
98
+ cusp is filled). We also need to pick them consistently across tetrahedra.
99
+
100
+ That is if two edges of two (not necessarily distinct) tetrahedra get
101
+ identified in the triangulation, then the two points we pick for those two
102
+ edges need to be the same point in the manifold.
103
+ """
104
+
105
+ for tet in mcomplex.Tetrahedra:
106
+ tet.spine_points = {}
107
+
108
+ for edge in mcomplex.Edges:
109
+ # An edge connects two (possibly not distinct) cusps.
110
+ #
111
+ # If both cusps are complete, this is easy:
112
+ # We simply take as point the midpoint on the edge between the two
113
+ # cusp neighborhoods. Given the vectors defining the
114
+ # corresponding horoballs stored in tet.R13_vertices, we can simply
115
+ # average the two corresponding vectors and normalise.
116
+ #
117
+ # However, if the cusp is incomplete, the horotriangles for one cusp
118
+ # about the edge touch the edge about different points in the
119
+ # manifold (recall the Giant's Causeway picture in
120
+ # scale_triangles_to_avoid_standard_tube).
121
+ #
122
+ # So when we walk about the edge, we need to keep track of the scaling
123
+ # factor that needs to be applied to tet.R13_vertices so that the
124
+ # horotriangle it defines lines up with the first horotriangle about
125
+ # the edge.
126
+ #
127
+ # When we go from one triangle to the next, the scaling factor needs to
128
+ # be adjusted by the ratio of the lengths of the edges of the triangle
129
+ # that we want to glue together.
130
+ #
131
+ # We start by simply picking the midpoint as in the complete case
132
+ # for the first edge embedding. Since the two horotriangles we use
133
+ # are both outside the chosen cusp neighborhood or core curve tube,
134
+ # the point computed this way will be outside those neighborhoods.
135
+
136
+ # Relevant edge length of triangle for cusps
137
+ length0 = None
138
+ length1 = None
139
+
140
+ # Scale factor to align horotriangles for both cusps
141
+ scale0 = mcomplex.RF(1)
142
+ scale1 = mcomplex.RF(1)
143
+
144
+ # Walk about the edge
145
+ for i, (tet, perm) in enumerate(edge.embeddings()):
146
+ # Vertices of tetrahedron corresponding to the cusps
147
+ v0 = simplex.ZeroSubsimplices[perm[0]]
148
+ v1 = simplex.ZeroSubsimplices[perm[1]]
149
+
150
+ # Face we need to cross to get to next embedding
151
+ face2 = simplex.TwoSubsimplices[perm[2]]
152
+ # Face we need to cross to get to previous embedding
153
+ face3 = simplex.TwoSubsimplices[perm[3]]
154
+
155
+ if i == 0:
156
+ # Record whether cusp is complete
157
+ is_complete0 = tet.Class[v0].is_complete
158
+ is_complete1 = tet.Class[v1].is_complete
159
+
160
+ if not is_complete0:
161
+ lengths0 = tet.horotriangles[v0].get_real_lengths()
162
+ if length0 is not None:
163
+ # We are beyond the very first triangle and need to
164
+ # update the scaling factor.
165
+ #
166
+ # We use the ratio of the following edge lengths:
167
+ # - the edge of the current triangle. It is the edge that
168
+ # we need to cross to get to the previous embedding.
169
+ # - the edge of the previous triangle. It is the edge that
170
+ # we needed to cross to get to this embedding.
171
+ scale0 = scale0 * lengths0[face3] / length0
172
+ # Store length for next iteration
173
+ length0 = lengths0[face2]
174
+
175
+ if not is_complete1:
176
+ # Similar
177
+ lengths1 = tet.horotriangles[v1].get_real_lengths()
178
+ if length1 is not None:
179
+ scale1 = scale1 * lengths1[face3] / length1
180
+ length1 = lengths1[face2]
181
+
182
+ tet.spine_points[v0 | v1] = time_r13_normalise(
183
+ scale0 * tet.R13_vertices[v0] + scale1 * tet.R13_vertices[v1])
184
+
185
+ def _out_point(tet : Tetrahedron, v0 : int, v1 : int):
186
+ """
187
+ Compute one vertex of the truncated tetrahedron. Here it is the "large"
188
+ tetrahedron truncated by the "small" horotriangle.
189
+
190
+ Note that for a complete cusps, we only have one horotriangle per tetrahedron
191
+ and vertex of that tetrahedron. But for a filled cusp, we have a pair of
192
+ horotriangles, a "big" one which is outside the chosen core curve tube and
193
+ a "small" one inside the chosen core curve tube.
194
+ """
195
+
196
+ # Inverse scaling factor to get from the default "big" horotriangle to the
197
+ # "small" one.
198
+ s = tet.horotriangles[v0].inverse_scale_to_be_inside_tube
199
+ return _point_on_horosphere(s * tet.R13_vertices[v0], tet.R13_vertices[v1])
200
+
201
+ def _point_on_horosphere(horo_vec, pt):
202
+ """
203
+ The point that is the intersection of the horosphere defined by horo_vec
204
+ and the line from horo_vec to pt.
205
+ """
206
+ return time_r13_normalise( horo_vec - (2 / r13_dot(horo_vec, pt)) * pt)
@@ -0,0 +1,24 @@
1
+ from snappy import testing
2
+ import snappy
3
+
4
+ from snappy import len_spec
5
+ import snappy.len_spec.test_cases
6
+
7
+ modules = [
8
+ len_spec,
9
+ len_spec.word,
10
+ len_spec.length_spectrum_geodesic_info,
11
+ len_spec.test_cases
12
+ ]
13
+
14
+ def run_doctests(verbose=False, print_info=True):
15
+ globs = {'Manifold': snappy.Manifold}
16
+ return testing.doctest_modules(modules,
17
+ verbose=verbose,
18
+ print_info=print_info,
19
+ extraglobs=globs)
20
+
21
+ run_doctests.__name__ = len_spec.__name__
22
+
23
+ if __name__ == '__main__':
24
+ testing.run_doctests_as_main(run_doctests)
@@ -0,0 +1,69 @@
1
+ """
2
+ IMPORTANT: Python only recognises this as a doc string if there is
3
+ nothing before it. In particular, add any includes after the doc string.
4
+
5
+ >>> M = Manifold("m125(3,4)(0,0)")
6
+ >>> spec = M.length_spectrum_alt_gen()
7
+ >>> next(spec) # doctest: +NUMERIC9
8
+ Length Core curve Word
9
+ 0.24208261435543 - 1.73621300277325*I Cusp 0 aBDcDcb
10
+ >>> next(spec).length # doctest: +NUMERIC9
11
+ 0.90986906036840 + 3.03574280072295*I
12
+ >>> next(spec).length # doctest: +NUMERIC9
13
+ 0.98258854739348 - 2.33353878259198*I
14
+ >>> next(spec).length # doctest: +NUMERIC9
15
+ 1.00610499287709 - 3.02617893116978*I
16
+ >>> next(spec).length # doctest: +NUMERIC9
17
+ 1.13551437663552 - 2.12918861416187*I
18
+ >>> next(spec).length # doctest: +NUMERIC9
19
+ 1.63203771292969 + 2.30009520293758*I
20
+
21
+ Examples with +SKIP from length_spectrum_alt
22
+
23
+ >>> M = Manifold("m202(3,4)(3,4)")
24
+ >>> spec = M.length_spectrum_alt(count = 3)
25
+ >>> len(spec)
26
+ 4
27
+ >>> spec[0].length # doctest: +NUMERIC9
28
+ 0.14820741547094 - 1.76955170166922*I
29
+ >>> spec[1].length # doctest: +NUMERIC9
30
+ 0.14820741547097 - 1.76955170166923*I
31
+ >>> spec[2].length # doctest: +NUMERIC9
32
+ 0.79356651781096 + 2.65902431489655*I
33
+ >>> spec[3].length # doctest: +NUMERIC9
34
+ 0.79356651781096 + 2.65902431489655*I
35
+
36
+ Verified:
37
+
38
+ sage: spec = M.length_spectrum_alt(count = 3, verified = True, bits_prec = 110)
39
+ sage: len(spec)
40
+ 4
41
+ sage: spec[0].length # doctest: +NUMERIC9
42
+ 0.14820741547094772? - 1.76955170166923543?*I
43
+ sage: spec[1].length # doctest: +NUMERIC9
44
+ 0.14820741547094772? - 1.76955170166923543?*I
45
+ sage: spec[2].length # doctest: +NUMERIC9
46
+ 0.79356651781095741? + 2.65902431489655135?*I
47
+ sage: spec[3].length # doctest: +NUMERIC9
48
+ 0.79356651781095741? + 2.65902431489655135?*I
49
+
50
+ >>> M = Manifold("m202(3,4)(0,0)")
51
+ >>> M.length_spectrum_alt(max_len = 1.1) # doctest: +NUMERIC9
52
+ [Length Core curve Word
53
+ 0.14742465268512 - 1.78287093565202*I Cusp 0 aabcDabcB,
54
+ 0.81161414965958 + 2.72911699294426*I - b,
55
+ 0.84163270359334 + 2.61245944742151*I - aB,
56
+ 0.93461379591349 + 2.70060614107722*I - a]
57
+
58
+ sage: M.length_spectrum_alt(max_len = 1.1, verified=True, bits_prec=130) # doctest: +NORMALIZE_WHITESPACE
59
+ [Length Core curve Word
60
+ 0.14742465268515... - 1.78287093565201...*I Cusp 0 aabcDabcB,
61
+ 0.81161414965958... + 2.72911699294425...*I - b,
62
+ 0.84163270359334... + 2.61245944742151...*I - aB,
63
+ 0.93461379591349... + 2.70060614107721...*I - a]
64
+
65
+
66
+ """
67
+
68
+ if not __doc__:
69
+ raise Exception("doc string with tests was not recognized.")