snappy 3.3__cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.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 (541) hide show
  1. snappy/CyOpenGL.cpython-310-aarch64-linux-gnu.so +0 -0
  2. snappy/SnapPy.cpython-310-aarch64-linux-gnu.so +0 -0
  3. snappy/SnapPy.ico +0 -0
  4. snappy/SnapPy.png +0 -0
  5. snappy/SnapPyHP.cpython-310-aarch64-linux-gnu.so +0 -0
  6. snappy/__init__.py +534 -0
  7. snappy/app.py +604 -0
  8. snappy/app_menus.py +372 -0
  9. snappy/browser.py +998 -0
  10. snappy/cache.py +25 -0
  11. snappy/canonical.py +249 -0
  12. snappy/cusps/__init__.py +280 -0
  13. snappy/cusps/cusp_area_matrix.py +98 -0
  14. snappy/cusps/cusp_areas_from_matrix.py +96 -0
  15. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  16. snappy/cusps/short_slopes_for_cusp.py +217 -0
  17. snappy/cusps/test.py +22 -0
  18. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  19. snappy/database.py +454 -0
  20. snappy/db_utilities.py +79 -0
  21. snappy/decorated_isosig.py +717 -0
  22. snappy/dev/__init__.py +0 -0
  23. snappy/dev/extended_ptolemy/__init__.py +8 -0
  24. snappy/dev/extended_ptolemy/closed.py +106 -0
  25. snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
  26. snappy/dev/extended_ptolemy/direct.py +42 -0
  27. snappy/dev/extended_ptolemy/extended.py +406 -0
  28. snappy/dev/extended_ptolemy/giac_helper.py +43 -0
  29. snappy/dev/extended_ptolemy/giac_rur.py +129 -0
  30. snappy/dev/extended_ptolemy/gluing.py +46 -0
  31. snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
  32. snappy/dev/extended_ptolemy/printMatrices.py +70 -0
  33. snappy/dev/vericlosed/__init__.py +1 -0
  34. snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
  35. snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
  36. snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
  37. snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
  38. snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
  39. snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
  40. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
  41. snappy/dev/vericlosed/orb/__init__.py +1 -0
  42. snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
  43. snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
  44. snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
  45. snappy/dev/vericlosed/test.py +54 -0
  46. snappy/dev/vericlosed/truncatedComplex.py +176 -0
  47. snappy/dev/vericlosed/verificationError.py +58 -0
  48. snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
  49. snappy/doc/_images/SnapPy-196.png +0 -0
  50. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  51. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  52. snappy/doc/_images/mac.png +0 -0
  53. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  54. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  55. snappy/doc/_images/plink-action.png +0 -0
  56. snappy/doc/_images/ubuntu.png +0 -0
  57. snappy/doc/_images/win7.png +0 -0
  58. snappy/doc/_sources/additional_classes.rst.txt +40 -0
  59. snappy/doc/_sources/bugs.rst.txt +14 -0
  60. snappy/doc/_sources/censuses.rst.txt +52 -0
  61. snappy/doc/_sources/credits.rst.txt +81 -0
  62. snappy/doc/_sources/development.rst.txt +261 -0
  63. snappy/doc/_sources/index.rst.txt +215 -0
  64. snappy/doc/_sources/installing.rst.txt +249 -0
  65. snappy/doc/_sources/manifold.rst.txt +6 -0
  66. snappy/doc/_sources/manifoldhp.rst.txt +46 -0
  67. snappy/doc/_sources/news.rst.txt +425 -0
  68. snappy/doc/_sources/other.rst.txt +25 -0
  69. snappy/doc/_sources/platonic_census.rst.txt +20 -0
  70. snappy/doc/_sources/plink.rst.txt +102 -0
  71. snappy/doc/_sources/ptolemy.rst.txt +66 -0
  72. snappy/doc/_sources/ptolemy_classes.rst.txt +42 -0
  73. snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -0
  74. snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -0
  75. snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -0
  76. snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -0
  77. snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -0
  78. snappy/doc/_sources/screenshots.rst.txt +21 -0
  79. snappy/doc/_sources/snap.rst.txt +87 -0
  80. snappy/doc/_sources/snappy.rst.txt +28 -0
  81. snappy/doc/_sources/spherogram.rst.txt +103 -0
  82. snappy/doc/_sources/todo.rst.txt +47 -0
  83. snappy/doc/_sources/triangulation.rst.txt +11 -0
  84. snappy/doc/_sources/tutorial.rst.txt +49 -0
  85. snappy/doc/_sources/verify.rst.txt +210 -0
  86. snappy/doc/_sources/verify_internals.rst.txt +79 -0
  87. snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
  88. snappy/doc/_static/SnapPy.ico +0 -0
  89. snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  90. snappy/doc/_static/basic.css +906 -0
  91. snappy/doc/_static/css/badge_only.css +1 -0
  92. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  93. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  94. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  95. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  96. snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
  97. snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  98. snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  99. snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
  100. snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  101. snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
  102. snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  103. snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
  104. snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
  105. snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
  106. snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  107. snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
  108. snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
  109. snappy/doc/_static/css/theme.css +4 -0
  110. snappy/doc/_static/doctools.js +149 -0
  111. snappy/doc/_static/documentation_options.js +13 -0
  112. snappy/doc/_static/file.png +0 -0
  113. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  114. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  115. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  116. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  117. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  118. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  119. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  120. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  121. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  122. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  123. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  124. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  125. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  126. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  127. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  128. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  129. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  130. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  131. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  132. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  133. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  134. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  135. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  136. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  137. snappy/doc/_static/jquery.js +2 -0
  138. snappy/doc/_static/js/badge_only.js +1 -0
  139. snappy/doc/_static/js/theme.js +1 -0
  140. snappy/doc/_static/js/versions.js +228 -0
  141. snappy/doc/_static/language_data.js +192 -0
  142. snappy/doc/_static/minus.png +0 -0
  143. snappy/doc/_static/plus.png +0 -0
  144. snappy/doc/_static/pygments.css +75 -0
  145. snappy/doc/_static/searchtools.js +635 -0
  146. snappy/doc/_static/snappy_furo.css +33 -0
  147. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
  148. snappy/doc/_static/sphinx_highlight.js +154 -0
  149. snappy/doc/additional_classes.html +1500 -0
  150. snappy/doc/bugs.html +132 -0
  151. snappy/doc/censuses.html +453 -0
  152. snappy/doc/credits.html +184 -0
  153. snappy/doc/development.html +385 -0
  154. snappy/doc/doc-latest/additional_classes.html +1500 -0
  155. snappy/doc/doc-latest/bugs.html +132 -0
  156. snappy/doc/doc-latest/censuses.html +453 -0
  157. snappy/doc/doc-latest/credits.html +184 -0
  158. snappy/doc/doc-latest/development.html +385 -0
  159. snappy/doc/doc-latest/genindex.html +1349 -0
  160. snappy/doc/doc-latest/index.html +287 -0
  161. snappy/doc/doc-latest/installing.html +346 -0
  162. snappy/doc/doc-latest/manifold.html +3632 -0
  163. snappy/doc/doc-latest/manifoldhp.html +180 -0
  164. snappy/doc/doc-latest/news.html +438 -0
  165. snappy/doc/doc-latest/objects.inv +0 -0
  166. snappy/doc/doc-latest/other.html +160 -0
  167. snappy/doc/doc-latest/platonic_census.html +376 -0
  168. snappy/doc/doc-latest/plink.html +210 -0
  169. snappy/doc/doc-latest/ptolemy.html +253 -0
  170. snappy/doc/doc-latest/ptolemy_classes.html +1144 -0
  171. snappy/doc/doc-latest/ptolemy_examples1.html +409 -0
  172. snappy/doc/doc-latest/ptolemy_examples2.html +471 -0
  173. snappy/doc/doc-latest/ptolemy_examples3.html +414 -0
  174. snappy/doc/doc-latest/ptolemy_examples4.html +195 -0
  175. snappy/doc/doc-latest/ptolemy_prelim.html +248 -0
  176. snappy/doc/doc-latest/py-modindex.html +165 -0
  177. snappy/doc/doc-latest/screenshots.html +141 -0
  178. snappy/doc/doc-latest/search.html +135 -0
  179. snappy/doc/doc-latest/searchindex.js +1 -0
  180. snappy/doc/doc-latest/snap.html +202 -0
  181. snappy/doc/doc-latest/snappy.html +181 -0
  182. snappy/doc/doc-latest/spherogram.html +1346 -0
  183. snappy/doc/doc-latest/todo.html +166 -0
  184. snappy/doc/doc-latest/triangulation.html +1676 -0
  185. snappy/doc/doc-latest/tutorial.html +159 -0
  186. snappy/doc/doc-latest/verify.html +330 -0
  187. snappy/doc/doc-latest/verify_internals.html +1235 -0
  188. snappy/doc/genindex.html +1349 -0
  189. snappy/doc/index.html +287 -0
  190. snappy/doc/installing.html +346 -0
  191. snappy/doc/manifold.html +3632 -0
  192. snappy/doc/manifoldhp.html +180 -0
  193. snappy/doc/news.html +438 -0
  194. snappy/doc/objects.inv +0 -0
  195. snappy/doc/other.html +160 -0
  196. snappy/doc/platonic_census.html +376 -0
  197. snappy/doc/plink.html +210 -0
  198. snappy/doc/ptolemy.html +253 -0
  199. snappy/doc/ptolemy_classes.html +1144 -0
  200. snappy/doc/ptolemy_examples1.html +409 -0
  201. snappy/doc/ptolemy_examples2.html +471 -0
  202. snappy/doc/ptolemy_examples3.html +414 -0
  203. snappy/doc/ptolemy_examples4.html +195 -0
  204. snappy/doc/ptolemy_prelim.html +248 -0
  205. snappy/doc/py-modindex.html +165 -0
  206. snappy/doc/screenshots.html +141 -0
  207. snappy/doc/search.html +135 -0
  208. snappy/doc/searchindex.js +1 -0
  209. snappy/doc/snap.html +202 -0
  210. snappy/doc/snappy.html +181 -0
  211. snappy/doc/spherogram.html +1346 -0
  212. snappy/doc/todo.html +166 -0
  213. snappy/doc/triangulation.html +1676 -0
  214. snappy/doc/tutorial.html +159 -0
  215. snappy/doc/verify.html +330 -0
  216. snappy/doc/verify_internals.html +1235 -0
  217. snappy/drilling/__init__.py +456 -0
  218. snappy/drilling/barycentric.py +103 -0
  219. snappy/drilling/constants.py +5 -0
  220. snappy/drilling/crush.py +270 -0
  221. snappy/drilling/cusps.py +125 -0
  222. snappy/drilling/debug.py +242 -0
  223. snappy/drilling/epsilons.py +6 -0
  224. snappy/drilling/exceptions.py +55 -0
  225. snappy/drilling/moves.py +620 -0
  226. snappy/drilling/peripheral_curves.py +210 -0
  227. snappy/drilling/perturb.py +188 -0
  228. snappy/drilling/shorten.py +36 -0
  229. snappy/drilling/subdivide.py +274 -0
  230. snappy/drilling/test.py +23 -0
  231. snappy/drilling/test_cases.py +132 -0
  232. snappy/drilling/tracing.py +351 -0
  233. snappy/exceptions.py +26 -0
  234. snappy/export_stl.py +120 -0
  235. snappy/exterior_to_link/__init__.py +2 -0
  236. snappy/exterior_to_link/barycentric_geometry.py +463 -0
  237. snappy/exterior_to_link/exceptions.py +6 -0
  238. snappy/exterior_to_link/geodesic_map.json +14408 -0
  239. snappy/exterior_to_link/hyp_utils.py +112 -0
  240. snappy/exterior_to_link/link_projection.py +323 -0
  241. snappy/exterior_to_link/main.py +198 -0
  242. snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
  243. snappy/exterior_to_link/mcomplex_with_link.py +687 -0
  244. snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
  245. snappy/exterior_to_link/pl_utils.py +491 -0
  246. snappy/exterior_to_link/put_in_S3.py +156 -0
  247. snappy/exterior_to_link/rational_linear_algebra.py +130 -0
  248. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
  249. snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
  250. snappy/exterior_to_link/stored_moves.py +475 -0
  251. snappy/exterior_to_link/test.py +31 -0
  252. snappy/filedialog.py +28 -0
  253. snappy/geometric_structure/__init__.py +212 -0
  254. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  255. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +691 -0
  256. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +480 -0
  257. snappy/geometric_structure/cusp_neighborhood/exceptions.py +41 -0
  258. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +294 -0
  259. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +156 -0
  260. snappy/geometric_structure/cusp_neighborhood/vertices.py +35 -0
  261. snappy/geometric_structure/geodesic/__init__.py +0 -0
  262. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  263. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  264. snappy/geometric_structure/geodesic/canonical_representatives.py +52 -0
  265. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  266. snappy/geometric_structure/geodesic/constants.py +6 -0
  267. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  268. snappy/geometric_structure/geodesic/fixed_points.py +106 -0
  269. snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
  270. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  271. snappy/geometric_structure/geodesic/line.py +30 -0
  272. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  273. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +128 -0
  274. snappy/geometric_structure/test.py +22 -0
  275. snappy/gui.py +121 -0
  276. snappy/horoviewer.py +443 -0
  277. snappy/hyperboloid/__init__.py +212 -0
  278. snappy/hyperboloid/distances.py +259 -0
  279. snappy/hyperboloid/horoball.py +19 -0
  280. snappy/hyperboloid/line.py +35 -0
  281. snappy/hyperboloid/point.py +9 -0
  282. snappy/hyperboloid/triangle.py +29 -0
  283. snappy/info_icon.gif +0 -0
  284. snappy/infowindow.py +65 -0
  285. snappy/isometry_signature.py +389 -0
  286. snappy/len_spec/__init__.py +609 -0
  287. snappy/len_spec/geodesic_info.py +129 -0
  288. snappy/len_spec/geodesic_key_info_dict.py +116 -0
  289. snappy/len_spec/geodesic_piece.py +146 -0
  290. snappy/len_spec/geometric_structure.py +182 -0
  291. snappy/len_spec/geometry.py +136 -0
  292. snappy/len_spec/length_spectrum_geodesic_info.py +185 -0
  293. snappy/len_spec/spine.py +128 -0
  294. snappy/len_spec/test.py +24 -0
  295. snappy/len_spec/test_cases.py +69 -0
  296. snappy/len_spec/tile.py +276 -0
  297. snappy/len_spec/word.py +86 -0
  298. snappy/manifolds/HTWKnots/alternating.gz +0 -0
  299. snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
  300. snappy/manifolds/__init__.py +3 -0
  301. snappy/margulis/__init__.py +332 -0
  302. snappy/margulis/cusp_neighborhood_neighborhood.py +66 -0
  303. snappy/margulis/geodesic_neighborhood.py +152 -0
  304. snappy/margulis/margulis_info.py +21 -0
  305. snappy/margulis/mu_from_neighborhood_pair.py +175 -0
  306. snappy/margulis/neighborhood.py +29 -0
  307. snappy/margulis/test.py +22 -0
  308. snappy/math_basics.py +187 -0
  309. snappy/matrix.py +525 -0
  310. snappy/number.py +657 -0
  311. snappy/numeric_output_checker.py +345 -0
  312. snappy/pari.py +41 -0
  313. snappy/phone_home.py +57 -0
  314. snappy/polyviewer.py +259 -0
  315. snappy/ptolemy/__init__.py +17 -0
  316. snappy/ptolemy/component.py +103 -0
  317. snappy/ptolemy/coordinates.py +2290 -0
  318. snappy/ptolemy/fieldExtensions.py +153 -0
  319. snappy/ptolemy/findLoops.py +473 -0
  320. snappy/ptolemy/geometricRep.py +59 -0
  321. snappy/ptolemy/homology.py +165 -0
  322. snappy/ptolemy/magma/default.magma_template +229 -0
  323. snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
  324. snappy/ptolemy/manifoldMethods.py +395 -0
  325. snappy/ptolemy/matrix.py +350 -0
  326. snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
  327. snappy/ptolemy/polynomial.py +856 -0
  328. snappy/ptolemy/processComponents.py +173 -0
  329. snappy/ptolemy/processFileBase.py +247 -0
  330. snappy/ptolemy/processFileDispatch.py +46 -0
  331. snappy/ptolemy/processMagmaFile.py +392 -0
  332. snappy/ptolemy/processRurFile.py +150 -0
  333. snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
  334. snappy/ptolemy/ptolemyObstructionClass.py +64 -0
  335. snappy/ptolemy/ptolemyVariety.py +995 -0
  336. snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
  337. snappy/ptolemy/reginaWrapper.py +698 -0
  338. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  339. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  340. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  341. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  342. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  343. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  344. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  345. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  346. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  347. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  348. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
  349. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  350. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  351. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
  352. snappy/ptolemy/rur.py +545 -0
  353. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
  354. snappy/ptolemy/test.py +1126 -0
  355. snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
  356. snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
  357. snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
  358. snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
  359. snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
  360. snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
  361. snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
  362. snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
  363. snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
  364. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  365. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  366. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  367. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  368. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  369. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  370. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  371. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  372. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
  373. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
  374. snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
  375. snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
  376. snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
  377. snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
  378. snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
  379. snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
  380. snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
  381. snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
  382. snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
  383. snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
  384. snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
  385. snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
  386. snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
  387. snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
  388. snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
  389. snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
  390. snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
  391. snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
  392. snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
  393. snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  394. snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  395. snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
  396. snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
  397. snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  398. snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  399. snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
  400. snappy/ptolemy/utilities.py +236 -0
  401. snappy/raytracing/__init__.py +64 -0
  402. snappy/raytracing/additional_horospheres.py +64 -0
  403. snappy/raytracing/additional_len_spec_choices.py +63 -0
  404. snappy/raytracing/cohomology_fractal.py +197 -0
  405. snappy/raytracing/eyeball.py +124 -0
  406. snappy/raytracing/finite_raytracing_data.py +237 -0
  407. snappy/raytracing/finite_viewer.py +590 -0
  408. snappy/raytracing/geodesic_tube_info.py +174 -0
  409. snappy/raytracing/geodesics.py +246 -0
  410. snappy/raytracing/geodesics_window.py +258 -0
  411. snappy/raytracing/gui_utilities.py +293 -0
  412. snappy/raytracing/hyperboloid_navigation.py +556 -0
  413. snappy/raytracing/hyperboloid_utilities.py +234 -0
  414. snappy/raytracing/ideal_raytracing_data.py +592 -0
  415. snappy/raytracing/inside_viewer.py +974 -0
  416. snappy/raytracing/pack.py +22 -0
  417. snappy/raytracing/raytracing_data.py +126 -0
  418. snappy/raytracing/raytracing_view.py +454 -0
  419. snappy/raytracing/shaders/Eye.png +0 -0
  420. snappy/raytracing/shaders/NonGeometric.png +0 -0
  421. snappy/raytracing/shaders/__init__.py +101 -0
  422. snappy/raytracing/shaders/fragment.glsl +1744 -0
  423. snappy/raytracing/test.py +29 -0
  424. snappy/raytracing/tooltip.py +146 -0
  425. snappy/raytracing/upper_halfspace_utilities.py +98 -0
  426. snappy/raytracing/view_scale_controller.py +98 -0
  427. snappy/raytracing/zoom_slider/__init__.py +263 -0
  428. snappy/raytracing/zoom_slider/inward.png +0 -0
  429. snappy/raytracing/zoom_slider/inward18.png +0 -0
  430. snappy/raytracing/zoom_slider/outward.png +0 -0
  431. snappy/raytracing/zoom_slider/outward18.png +0 -0
  432. snappy/raytracing/zoom_slider/test.py +20 -0
  433. snappy/sage_helper.py +119 -0
  434. snappy/settings.py +407 -0
  435. snappy/shell.py +53 -0
  436. snappy/snap/__init__.py +117 -0
  437. snappy/snap/character_varieties.py +375 -0
  438. snappy/snap/find_field.py +372 -0
  439. snappy/snap/fox_milnor.py +271 -0
  440. snappy/snap/fundamental_polyhedron.py +569 -0
  441. snappy/snap/generators.py +39 -0
  442. snappy/snap/interval_reps.py +81 -0
  443. snappy/snap/kernel_structures.py +128 -0
  444. snappy/snap/mcomplex_base.py +18 -0
  445. snappy/snap/nsagetools.py +716 -0
  446. snappy/snap/peripheral/__init__.py +1 -0
  447. snappy/snap/peripheral/dual_cellulation.py +219 -0
  448. snappy/snap/peripheral/link.py +127 -0
  449. snappy/snap/peripheral/peripheral.py +159 -0
  450. snappy/snap/peripheral/surface.py +522 -0
  451. snappy/snap/peripheral/test.py +35 -0
  452. snappy/snap/polished_reps.py +335 -0
  453. snappy/snap/shapes.py +152 -0
  454. snappy/snap/slice_obs_HKL/__init__.py +194 -0
  455. snappy/snap/slice_obs_HKL/basics.py +236 -0
  456. snappy/snap/slice_obs_HKL/direct.py +217 -0
  457. snappy/snap/slice_obs_HKL/poly_norm.py +212 -0
  458. snappy/snap/slice_obs_HKL/rep_theory.py +424 -0
  459. snappy/snap/t3mlite/__init__.py +2 -0
  460. snappy/snap/t3mlite/arrow.py +243 -0
  461. snappy/snap/t3mlite/corner.py +22 -0
  462. snappy/snap/t3mlite/edge.py +172 -0
  463. snappy/snap/t3mlite/face.py +37 -0
  464. snappy/snap/t3mlite/files.py +211 -0
  465. snappy/snap/t3mlite/homology.py +53 -0
  466. snappy/snap/t3mlite/linalg.py +419 -0
  467. snappy/snap/t3mlite/mcomplex.py +1499 -0
  468. snappy/snap/t3mlite/perm4.py +320 -0
  469. snappy/snap/t3mlite/setup.py +12 -0
  470. snappy/snap/t3mlite/simplex.py +199 -0
  471. snappy/snap/t3mlite/spun.py +297 -0
  472. snappy/snap/t3mlite/surface.py +519 -0
  473. snappy/snap/t3mlite/test.py +20 -0
  474. snappy/snap/t3mlite/test_vs_regina.py +86 -0
  475. snappy/snap/t3mlite/tetrahedron.py +109 -0
  476. snappy/snap/t3mlite/vertex.py +42 -0
  477. snappy/snap/test.py +139 -0
  478. snappy/snap/utilities.py +288 -0
  479. snappy/test.py +213 -0
  480. snappy/test_cases.py +263 -0
  481. snappy/testing.py +131 -0
  482. snappy/tiling/__init__.py +2 -0
  483. snappy/tiling/dict_based_set.py +79 -0
  484. snappy/tiling/floor.py +49 -0
  485. snappy/tiling/hyperboloid_dict.py +54 -0
  486. snappy/tiling/iter_utils.py +78 -0
  487. snappy/tiling/lifted_tetrahedron.py +22 -0
  488. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  489. snappy/tiling/quotient_dict.py +70 -0
  490. snappy/tiling/real_hash_dict.py +164 -0
  491. snappy/tiling/test.py +23 -0
  492. snappy/tiling/tile.py +224 -0
  493. snappy/tiling/triangle.py +33 -0
  494. snappy/tkterminal.py +920 -0
  495. snappy/twister/__init__.py +20 -0
  496. snappy/twister/main.py +646 -0
  497. snappy/twister/surfaces/S_0_1 +3 -0
  498. snappy/twister/surfaces/S_0_2 +3 -0
  499. snappy/twister/surfaces/S_0_4 +7 -0
  500. snappy/twister/surfaces/S_0_4_Lantern +8 -0
  501. snappy/twister/surfaces/S_1 +3 -0
  502. snappy/twister/surfaces/S_1_1 +4 -0
  503. snappy/twister/surfaces/S_1_2 +5 -0
  504. snappy/twister/surfaces/S_1_2_5 +6 -0
  505. snappy/twister/surfaces/S_2 +6 -0
  506. snappy/twister/surfaces/S_2_1 +8 -0
  507. snappy/twister/surfaces/S_2_heeg +10 -0
  508. snappy/twister/surfaces/S_3 +8 -0
  509. snappy/twister/surfaces/S_3_1 +10 -0
  510. snappy/twister/surfaces/S_4_1 +12 -0
  511. snappy/twister/surfaces/S_5_1 +14 -0
  512. snappy/twister/surfaces/heeg_fig8 +9 -0
  513. snappy/twister/twister_core.cpython-310-aarch64-linux-gnu.so +0 -0
  514. snappy/upper_halfspace/__init__.py +146 -0
  515. snappy/upper_halfspace/ideal_point.py +29 -0
  516. snappy/verify/__init__.py +13 -0
  517. snappy/verify/canonical.py +542 -0
  518. snappy/verify/complex_volume/__init__.py +18 -0
  519. snappy/verify/complex_volume/adjust_torsion.py +86 -0
  520. snappy/verify/complex_volume/closed.py +168 -0
  521. snappy/verify/complex_volume/compute_ptolemys.py +90 -0
  522. snappy/verify/complex_volume/cusped.py +56 -0
  523. snappy/verify/complex_volume/extended_bloch.py +201 -0
  524. snappy/verify/cusp_translations.py +85 -0
  525. snappy/verify/edge_equations.py +80 -0
  526. snappy/verify/exceptions.py +254 -0
  527. snappy/verify/hyperbolicity.py +224 -0
  528. snappy/verify/interval_newton_shapes_engine.py +523 -0
  529. snappy/verify/interval_tree.py +400 -0
  530. snappy/verify/krawczyk_shapes_engine.py +518 -0
  531. snappy/verify/real_algebra.py +286 -0
  532. snappy/verify/shapes.py +25 -0
  533. snappy/verify/square_extensions.py +1005 -0
  534. snappy/verify/test.py +72 -0
  535. snappy/verify/volume.py +128 -0
  536. snappy/version.py +2 -0
  537. snappy-3.3.dist-info/METADATA +58 -0
  538. snappy-3.3.dist-info/RECORD +541 -0
  539. snappy-3.3.dist-info/WHEEL +6 -0
  540. snappy-3.3.dist-info/entry_points.txt +2 -0
  541. snappy-3.3.dist-info/top_level.txt +28 -0
@@ -0,0 +1,136 @@
1
+ from ..hyperboloid.distances import cosh_distance_r13_point_line
2
+ from ..hyperboloid import r13_dot
3
+ from ..math_basics import correct_min, correct_max # type: ignor
4
+ from ..exceptions import InsufficientPrecisionError
5
+
6
+ from ..snap.t3mlite import simplex, Tetrahedron
7
+
8
+ from typing import Optional, Any
9
+
10
+ def lower_bound_geodesic_length(
11
+ lower_bound_cosh_distance, inv_spine_cosh):
12
+ """
13
+ This implements a version of Proposition 3.5 of
14
+ Weeks-Hodgson's Symmetries, Isometries and Length Spectra of Closed
15
+ Hyperbolic Three-Manifolds. Slightly changing notation, it says:
16
+
17
+ To find all closed geodesics of length at most L, it sufficies to
18
+ find all translates gD such that d(x, gx) <= R where
19
+ R = 2 arccosh(cosh(r) cosh(L/2)).
20
+
21
+ The input is a lower_bound_distance, a lower bound on the radius R of the
22
+ ball we have covered by tiles, and inv_spine_cosh = 1/cosh(r) where
23
+ r is a given tetrahedron's spine radius. More precisely, r is the radius
24
+ with respect to a given's tetrahedron's spine center (typically incenter)
25
+ of the intersection of the triangulation's spine with the tetrahedron.
26
+
27
+ The output is L which has the following property: Any geodesic in M that
28
+ intersects the given tetrahedron's spine and has length less than L is
29
+ among the ones we have encountered during tiling so far.
30
+
31
+ Note that our R is defined slightly differently, thus we can actually drop
32
+ the factor of 2 through out:
33
+
34
+ R = arccosh(cosh(r) cosh(L))
35
+
36
+ We also want an expression in L:
37
+
38
+ L = arccosh(cosh(R) / cosh(r))
39
+
40
+ And want to conservatively return 0 if this is not well-defined.
41
+
42
+ Note that we use the tetrahedron's spine radius here. But since we are
43
+ interested in geodesics and length bounds intrinsic to the manifold, the
44
+ length spectrum computation starts a tiling process for each tetrahedron.
45
+
46
+ Note that if the geometric structure is complete, every geodesic
47
+ will intersect the spine. However, for a spun-triangulation, this
48
+ only applies to geodesics that are not core curves. This is fine
49
+ since we treat core curves separately when computing the length
50
+ spectrum.
51
+ """
52
+
53
+ if lower_bound_cosh_distance > 1:
54
+ q = lower_bound_cosh_distance * inv_spine_cosh
55
+ if q > 1:
56
+ return q.arccosh()
57
+ RF = lower_bound_cosh_distance.parent()
58
+ return RF(0)
59
+
60
+ def lower_bound_cosh_distance_r13_point_truncated_tetrahedron(
61
+ point, tet : Tetrahedron, *, verified : bool):
62
+
63
+ """
64
+ A lower bound for cosh of the distance of a point to a truncated
65
+ tetrahedron tet. Assumes the point is outside the truncated tetrahedron.
66
+
67
+ The truncated tetrahedron is given as follows: ideal triangles
68
+ tet.R13_triangles[f] for each face forming the ideal tetrahedron
69
+ underlying the truncated tetrahedron, a lower bound tet.out_radius
70
+ of the truncated tetrahedron about its spine center (which is the
71
+ ideal tetrahedron's incenter).
72
+ """
73
+
74
+ # We compute one lower bound from the distance to the ideal tetrahedron.
75
+ #
76
+ # Ignore (irrelevant) contributions to the min from those faces
77
+ # where the associated half-space does not contain the point.
78
+ cosh_d_faces = _min([
79
+ cosh_d
80
+ for f in simplex.TwoSubsimplices
81
+ if (cosh_d := lower_bound_cosh_distance_r13_point_triangle(
82
+ point, tet.R13_triangles[f], verified=verified)) is not None ])
83
+
84
+ # We compute the other lower bound as
85
+ #
86
+ # d_out = distance_r13_points(point, tet.spine_center) - tet.out_radius
87
+ #
88
+ # We use trigonometric inequalities to avoid evaluating transcendentals.
89
+ cosh_d_spine_center = -r13_dot(point, tet.spine_center)
90
+ if not cosh_d_spine_center > tet.cosh_out_radius:
91
+ # Only use the second lower bound if d_out has positive sign.
92
+ return cosh_d_faces
93
+
94
+ sinh_d_spine_center = (cosh_d_spine_center ** 2 - 1).sqrt()
95
+ cosh_d_out = (cosh_d_spine_center * tet.cosh_out_radius -
96
+ sinh_d_spine_center * tet.sinh_out_radius)
97
+
98
+ if not cosh_d_out > 1:
99
+ return cosh_d_faces
100
+
101
+ return correct_max([cosh_d_out, cosh_d_faces])
102
+
103
+ def lower_bound_cosh_distance_r13_point_triangle(
104
+ point, triangle, *, verified : bool) -> Optional[Any]:
105
+ """
106
+ Return None if associated half-space does not contain the point.
107
+ """
108
+
109
+ if verified:
110
+ epsilon = 0
111
+ else:
112
+ RF = point[0].parent()
113
+ epsilon = _compute_epsilon(RF)
114
+
115
+ sinh_dist_point_plane = r13_dot(point, triangle.plane)
116
+ if sinh_dist_point_plane <= -epsilon:
117
+ return None
118
+ for bounding_plane, edge in zip(triangle.bounding_planes,
119
+ triangle.edges):
120
+ if r13_dot(point, bounding_plane) > epsilon:
121
+ return cosh_distance_r13_point_line(point, edge)
122
+
123
+ return (sinh_dist_point_plane ** 2 + 1).sqrt()
124
+
125
+ def _compute_epsilon(RF):
126
+ return RF(0.5) ** (RF.prec() // 2)
127
+
128
+ def _min(values):
129
+ n = len(values)
130
+ if n == 0:
131
+ raise InsufficientPrecisionError(
132
+ "Could not verify point outside of tetrahedron.")
133
+ elif n == 1:
134
+ return values[0]
135
+ else:
136
+ return correct_min(values)
@@ -0,0 +1,185 @@
1
+ from ..SnapPy import Info
2
+ from ..math_basics import (
3
+ is_RealIntervalFieldElement,
4
+ is_ComplexIntervalFieldElement)
5
+
6
+ from typing import Tuple, Optional
7
+
8
+ class LengthSpectrumGeodesicInfo(Info):
9
+ """
10
+ Information about a geodesic in the length spectrum as returned by
11
+ Manifold.length_spectrum_alt_gen.
12
+ """
13
+
14
+ def _body(self) -> str:
15
+ if self._is_intermediate:
16
+ return _format_intermediate % (
17
+ _format_real_length(self.length.real()))
18
+ else:
19
+ return _format % (
20
+ _format_length(self.length),
21
+ _format_core_curve(self.core_curve),
22
+ self.word)
23
+
24
+ def __repr__(self) -> str:
25
+ if self._is_first:
26
+ return _header + '\n' + self._body()
27
+ else:
28
+ return self._body()
29
+
30
+ _core_curve_label = 'Core curve'
31
+ _verified_num_digits = 19
32
+
33
+ _format = (
34
+ '%%-%ds ' # Length
35
+ '%%-%ds ' # Core curve
36
+ '%%s' # Word
37
+ ) % (_verified_num_digits + len(' + ') + _verified_num_digits + len('*I'),
38
+ len(_core_curve_label))
39
+
40
+ _format_intermediate = (
41
+ ' Up to length %%-%ds' % _verified_num_digits)
42
+
43
+ _format_unverified_real = "%16.14f"
44
+
45
+ _header = _format % ( 'Length',
46
+ _core_curve_label,
47
+ 'Word')
48
+
49
+ _total_length = len("Out [100:] " + _header)
50
+
51
+ if _total_length > 80:
52
+ raise AssertionError(
53
+ "Total length spectrum string too long: %d" % (
54
+ _total_length))
55
+
56
+ def _format_length(length) -> str:
57
+ if is_ComplexIntervalFieldElement(length):
58
+ return _format_verified_length(length)
59
+ else:
60
+ return _format_unverified_length(length)
61
+
62
+ def _format_verified_length(length) -> str:
63
+ return (
64
+ _format_verified_real_length(length.real()) +
65
+ ' ' +
66
+ _format_verified_imag_length(length.imag()) +
67
+ '*I')
68
+
69
+ def _format_verified_real_length(length) -> str:
70
+ result = repr(length)
71
+ return _make_fixed_length(result, _verified_num_digits)
72
+
73
+ def _format_verified_imag_length(length) -> str:
74
+ result = repr(length)
75
+
76
+ # Consume "-" to consistently format " + " and " - " later.
77
+ has_minus = result[0] == '-'
78
+ if has_minus:
79
+ result = result[1:]
80
+
81
+ # If this appears to be zero
82
+ # (that is small enough that it is of the form 1.0?e-10
83
+ # and cannot be verified to be non-zero), then
84
+ # we write "0.00000?" or "0.00000....".
85
+ if 'e' in result and not length != 0:
86
+ num_zeros = (-abs(length).log10()).lower().floor()
87
+ if num_zeros > 2:
88
+ result = '0.' + num_zeros * '0' + '?'
89
+
90
+ result = _make_fixed_length(result, _verified_num_digits)
91
+
92
+ if has_minus:
93
+ result = '- ' + result
94
+ else:
95
+ result = '+ ' + result
96
+ return result
97
+
98
+ def _format_unverified_length(length) -> str:
99
+ lenStr = _format_unverified_real % length.real()
100
+ absImag = abs(length.imag())
101
+ # Unverified: just drop imaginary part if it is close to zero.
102
+ if absImag > 1e-9:
103
+ if length.imag() > 0:
104
+ lenStr += " + "
105
+ else:
106
+ lenStr += " - "
107
+ lenStr += (_format_unverified_real % absImag) + "*I"
108
+ return lenStr
109
+
110
+ def _format_word(word : str, max_length : int) -> str:
111
+ """
112
+ >>> _format_word('abcdefghi', 9)
113
+ 'abcdefghi'
114
+ >>> _format_word('abcdefghi', 8)
115
+ 'abcde...'
116
+ >>> _format_word('X1x2x123x12', 11)
117
+ 'X1x2x123x12'
118
+ >>> _format_word('X1x2x123x12', 10)
119
+ 'X1x2...'
120
+ """
121
+
122
+ if len(word) <= max_length:
123
+ return word
124
+
125
+ # If word is too long, write it as "abc..." so that total
126
+ # length is _max_word_length.
127
+ ellipsis = '...'
128
+
129
+ for i in range(max_length - len(ellipsis), -1, -1):
130
+ # Be careful not to break at, say 2, in x123 since
131
+ # x12... would be misleading.
132
+ if not word[i].isdigit():
133
+ break
134
+ return word[:i] + ellipsis
135
+
136
+ def _format_core_curve(core_curve : Optional[int]) -> str:
137
+ if core_curve is None:
138
+ return '-'
139
+ else:
140
+ return 'Cusp %d' % core_curve
141
+
142
+ def _format_real_length(length):
143
+ if is_RealIntervalFieldElement(length):
144
+ return _format_verified_real_length(length.real())
145
+ else:
146
+ return _format_unverified_real % length.real()
147
+
148
+ def _split_scientific_notation(s : str) -> Tuple[str, str]:
149
+ """
150
+ >>> _split_scientific_notation('0.45')
151
+ ('0.45', '')
152
+ >>> _split_scientific_notation('4.5?e-5')
153
+ ('4.5?', 'e-5')
154
+ """
155
+
156
+ parts = s.split('e', 2)
157
+ if len(parts) == 2:
158
+ return parts[0], 'e' + parts[1]
159
+ else:
160
+ return parts[0], ''
161
+
162
+ def _make_fixed_length(result : str, length : int) -> str:
163
+ """
164
+ >>> _make_fixed_length('0.1234567', 9)
165
+ '0.1234567'
166
+ >>> _make_fixed_length('0.1234567', 8)
167
+ '0.123...'
168
+ >>> _make_fixed_length('1.2345678e-4', 9)
169
+ '1.2...e-4'
170
+ """
171
+
172
+ n = len(result)
173
+
174
+ # How many characters to we need to erase.
175
+ k = n - length
176
+
177
+ if k <= 0:
178
+ # We actually need to fill with white space.
179
+ return result + (-k) * ' '
180
+
181
+ # Preserve trailing, e.g., 'e-4'
182
+ m, e = _split_scientific_notation(result)
183
+ ellipsis = '...'
184
+ k += len(ellipsis)
185
+ return m[:-k] + ellipsis + e
@@ -0,0 +1,128 @@
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 generalized cusp neighborhoods (that is
27
+ cusp neighborhoods for complete cusps and tubes about core curves
28
+ for incomplete cusps).
29
+ - points on the edges of the triangulation, stored in tet.spine_points.
30
+ - the maximum distance of the tet.spine_points to tet.spine_center in
31
+ tet.spine_radius.
32
+ - tet.inv_spine_cosh = 1 / cosh(r) where r is the tet.spine_radius
33
+ - for the entire fundamental domain, we store a global spine center
34
+ and radius in mcomplex.spine_center and mcomplex.spine_radius.
35
+ """
36
+
37
+ for tet in mcomplex.Tetrahedra:
38
+ if False:
39
+ for v in simplex.ZeroSubsimplices:
40
+ d = r13_dot(tet.spine_center, tet.R13_vertices[v])
41
+ if not d < - (1 - mcomplex.RF(1e-8)):
42
+ print(tet.spine_points)
43
+ print(tet.R13_vertices)
44
+ raise Exception("Conjecture is wrong.")
45
+
46
+ tet.out_points = {
47
+ (v0, v1): _out_point(tet, v0, v1)
48
+ for v0 in simplex.ZeroSubsimplices
49
+ for v1 in simplex.ZeroSubsimplices
50
+ if v0 != v1 }
51
+
52
+ tet.spine_points = {
53
+ v0 | v1: time_r13_normalise(
54
+ tet.out_points[(v0, v1)] + tet.out_points[(v1, v0)])
55
+ for v0 in simplex.ZeroSubsimplices
56
+ for v1 in simplex.ZeroSubsimplices
57
+ if v0 < v1 }
58
+
59
+ for v0 in simplex.ZeroSubsimplices:
60
+ if tet.Class[v0].is_complete:
61
+ continue
62
+ for v1 in simplex.ZeroSubsimplices:
63
+ if v0 == v1:
64
+ continue
65
+ e = v0 | v1
66
+ mu_v0v1 = tet.horotriangles[v0].inverse_scale_to_be_on_tube[e]
67
+ mu_v1v0 = tet.horotriangles[v1].inverse_scale_to_be_on_tube[e]
68
+ f = simplex.RightFace[e]
69
+ a = tet.horotriangles[v0].get_real_lengths()[f]
70
+ b = tet.horotriangles[v1].get_real_lengths()[f]
71
+
72
+ # mu_v0v1 / mu_v1v0 < 1 / (a * b)
73
+ if mu_v0v1 * a * b < mu_v1v0:
74
+ continue
75
+
76
+ tet.spine_points[v0, v1] = _point_on_horosphere(tet.R13_vertices[v0], tet.R13_vertices[v1])
77
+
78
+ _, tet.spine_center = compute_inradius_and_incenter_from_planes(
79
+ [ tet.R13_planes[f]
80
+ for f in simplex.TwoSubsimplices ])
81
+
82
+ tet.spine_radius = correct_max(
83
+ [ distance_r13_points(tet.spine_center, p)
84
+ for e, p in tet.spine_points.items() ])
85
+
86
+ tet.inv_spine_cosh = 1 / tet.spine_radius.cosh()
87
+
88
+ tet.out_radius = correct_max(
89
+ [ distance_r13_points(tet.spine_center,
90
+ tet.out_points[(v0, v1)])
91
+ for v0 in simplex.ZeroSubsimplices
92
+ for v1 in simplex.ZeroSubsimplices
93
+ if v0 != v1 ])
94
+
95
+ tet.cosh_out_radius = tet.out_radius.cosh()
96
+ tet.sinh_out_radius = tet.out_radius.sinh()
97
+
98
+ if False:
99
+ print("out, spine =", tet.out_radius, tet.spine_radius)
100
+
101
+ mcomplex.spine_center = mcomplex.baseTet.spine_center
102
+ mcomplex.spine_radius = correct_max(
103
+ [ tet.spine_radius + distance_r13_points(
104
+ mcomplex.spine_center, tet.spine_center)
105
+ for tet in mcomplex.Tetrahedra ])
106
+
107
+ def _out_point(tet : Tetrahedron, v0 : int, v1 : int):
108
+ """
109
+ Compute one vertex of the tetrahedron truncated by a neighborhood
110
+ in the cusp or about a core curve.
111
+ """
112
+
113
+ # Recall that the vertices defining horospheres truncating the tetrahedron
114
+ # so much that it is just touching the neighborhood without intersecting
115
+ # it.
116
+ #
117
+ # We apply the scale so that the vertex is on the boundary of the
118
+ # neighborhood.
119
+
120
+ s = tet.horotriangles[v0].inverse_scale_to_be_on_tube[v0 | v1]
121
+ return _point_on_horosphere(s * tet.R13_vertices[v0], tet.R13_vertices[v1])
122
+
123
+ def _point_on_horosphere(horo_vec, pt):
124
+ """
125
+ The point that is the intersection of the horosphere defined by horo_vec
126
+ and the line from horo_vec to pt.
127
+ """
128
+ 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.")