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,332 @@
1
+ from .neighborhood import Neighborhood
2
+ from .geodesic_neighborhood import GeodesicNeighborhood
3
+ from .cusp_neighborhood_neighborhood import CuspNeighborhoodNeighborhood
4
+ from .mu_from_neighborhood_pair import mu_from_neighborhood_pair
5
+ from .margulis_info import MargulisInfo
6
+
7
+ from ..verify.shapes import compute_hyperbolic_shapes
8
+ from ..geometric_structure.cusp_neighborhood.tiles_for_cusp_neighborhood import (
9
+ mcomplex_for_tiling_cusp_neighborhoods)
10
+ from ..geometric_structure.cusp_neighborhood.complex_cusp_cross_section import (
11
+ ComplexCuspCrossSection)
12
+ from ..geometric_structure.geodesic.add_core_curves import add_r13_core_curves
13
+ from ..geometric_structure import (
14
+ add_r13_geometry, add_filling_information)
15
+ from ..hyperboloid.distances import (
16
+ distance_r13_horoballs, distance_r13_lines, distance_r13_horoball_line)
17
+ from ..hyperboloid.horoball import R13Horoball
18
+ from ..hyperboloid.line import R13Line
19
+ from ..math_basics import correct_min
20
+ from ..len_spec.length_spectrum_geodesic_info import LengthSpectrumGeodesicInfo
21
+ from ..snap.t3mlite import Mcomplex
22
+ from ..tiling.tile import Tile
23
+ from ..sage_helper import _within_sage
24
+
25
+ if _within_sage:
26
+ from ..sage_helper import Infinity
27
+
28
+ import heapq
29
+
30
+ from typing import Iterable, Union, List, Tuple, Optional
31
+
32
+ def distance_r13_objects(object1 : Union[R13Line, R13Horoball],
33
+ object2 : Union[R13Line, R13Horoball]):
34
+ is_horoball1 = isinstance(object1, R13Horoball)
35
+ is_horoball2 = isinstance(object2, R13Horoball)
36
+ if is_horoball1:
37
+ if is_horoball2:
38
+ return distance_r13_horoballs(
39
+ object1.defining_vec, object2.defining_vec)
40
+ else:
41
+ return distance_r13_horoball_line(
42
+ object1.defining_vec, object2)
43
+ else:
44
+ if is_horoball2:
45
+ return distance_r13_horoball_line(
46
+ object2.defining_vec, object1)
47
+ else:
48
+ return distance_r13_lines(
49
+ object1, object2)
50
+
51
+ def distance_tiles(tile1 : Tile, tile2 : Tile):
52
+ return distance_r13_objects(
53
+ tile1.inverse_lifted_geometric_object,
54
+ tile2.inverse_lifted_geometric_object)
55
+
56
+ class NeighborhoodPair:
57
+ def __init__(self, infinity):
58
+ self.distance_lifts = infinity
59
+ self.finished : bool = False
60
+ self.mu = None
61
+
62
+ class Neighborhoods:
63
+ def __init__(self, mcomplex : Mcomplex, stopper):
64
+ if stopper:
65
+ self.mu = mcomplex.RF(stopper)
66
+ else:
67
+ self.mu = mcomplex.infinity
68
+ self.neighborhoods : List[Neighborhood] = []
69
+ self._indices_to_neighborhood_pair : List[List[NeighborhoodPair]] = []
70
+ self.mcomplex : Mcomplex = mcomplex
71
+
72
+ def add_neighborhood(
73
+ self,
74
+ neighborhood : Neighborhood
75
+ ) -> None:
76
+ self.neighborhoods.append(neighborhood)
77
+ self._indices_to_neighborhood_pair.append(
78
+ [ NeighborhoodPair(self.mcomplex.infinity)
79
+ for index in range(len(self.neighborhoods)) ])
80
+
81
+ def get_neighborhood_pair(
82
+ self,
83
+ neighborhood1 : Neighborhood,
84
+ neighborhood2 : Neighborhood
85
+ ) -> NeighborhoodPair:
86
+ i = neighborhood1.index
87
+ j = neighborhood2.index
88
+ if i >= j:
89
+ return self._indices_to_neighborhood_pair[i][j]
90
+ else:
91
+ return self._indices_to_neighborhood_pair[j][i]
92
+
93
+ def thin_part(self) -> List[MargulisInfo]:
94
+ return [ neighborhood.info_for_epsilon(self.mu)
95
+ for neighborhood in self.neighborhoods ]
96
+
97
+ def collisions(self) -> List[Tuple[int, int]]:
98
+ if self.mcomplex.verified:
99
+ err_epsilon = 0
100
+ else:
101
+ err_epsilon = self.mcomplex.RF(1e-6)
102
+
103
+ result = []
104
+ for neighborhood1, neighborhood_pairs in zip(
105
+ self.neighborhoods, self._indices_to_neighborhood_pair):
106
+ for neighborhood2, neighborhood_pair in zip(
107
+ self.neighborhoods, neighborhood_pairs):
108
+ if neighborhood_pair.mu is None:
109
+ continue
110
+ if neighborhood_pair.mu > self.mu + err_epsilon:
111
+ continue
112
+ result.append((neighborhood2.index,neighborhood1.index))
113
+ return result
114
+
115
+ def compute_cusp_shapes(M, *, bits_prec, verified):
116
+ shapes = compute_hyperbolic_shapes(
117
+ M, verified=verified, bits_prec=bits_prec)
118
+ c = ComplexCuspCrossSection.fromManifoldAndShapes(M, shapes)
119
+ return [
120
+ ComplexCuspCrossSection.cusp_shape(v) if v.is_complete else None
121
+ for v in c.mcomplex.Vertices ]
122
+
123
+ def mcomplex_for_margulis_number(M, bits_prec, *, verified):
124
+ mcomplex = mcomplex_for_tiling_cusp_neighborhoods(
125
+ M, bits_prec=bits_prec, verified=verified)
126
+ add_filling_information(mcomplex, M)
127
+ add_r13_core_curves(mcomplex, M)
128
+
129
+ if verified:
130
+ mcomplex.infinity = mcomplex.RF(Infinity)
131
+ else:
132
+ mcomplex.infinity = mcomplex.RF(1e20)
133
+
134
+ return mcomplex
135
+
136
+ def add_cusp_to_queue_and_neighborhoods(
137
+ neighborhood_queue : List[Neighborhood],
138
+ neighborhoods : Neighborhoods,
139
+ vertex,
140
+ cusp_shape
141
+ ) -> None:
142
+ index = len(neighborhoods.neighborhoods)
143
+ neighborhood = CuspNeighborhoodNeighborhood(
144
+ neighborhoods.mcomplex, index, vertex, cusp_shape)
145
+ heapq.heappush(neighborhood_queue, neighborhood)
146
+ neighborhoods.add_neighborhood(neighborhood)
147
+
148
+ def add_geodesic_to_queue(
149
+ neighborhood_queue : List[Neighborhood],
150
+ neighborhoods : Neighborhoods,
151
+ geodesic_info : LengthSpectrumGeodesicInfo
152
+ ) -> None:
153
+ index = len(neighborhoods.neighborhoods)
154
+ neighborhood = GeodesicNeighborhood(
155
+ neighborhoods.mcomplex, index, geodesic_info)
156
+ heapq.heappush(neighborhood_queue, neighborhood)
157
+
158
+ def expand_next_neighborhood(
159
+ neighborhood_queue : List[Neighborhood],
160
+ neighborhoods : Neighborhoods,
161
+ len_spec : Iterable[LengthSpectrumGeodesicInfo]
162
+ ) -> bool:
163
+
164
+ neighborhood = heapq.heappop(neighborhood_queue)
165
+
166
+ if neighborhoods.mcomplex.verified:
167
+ err_epsilon = 0
168
+ else:
169
+ err_epsilon = neighborhoods.mcomplex.RF(1e-6)
170
+
171
+ if neighborhood.epsilon > neighborhoods.mu + err_epsilon:
172
+ return False
173
+
174
+ if isinstance(neighborhood, GeodesicNeighborhood):
175
+ if neighborhood.geodesic_info._is_intermediate:
176
+ neighborhood.geodesic_info = next(len_spec)
177
+ neighborhood.epsilon = neighborhood.geodesic_info.length.real()
178
+ heapq.heappush(neighborhood_queue, neighborhood)
179
+ return True
180
+
181
+ if not neighborhood.added:
182
+ neighborhoods.add_neighborhood(neighborhood)
183
+ neighborhood.added = True
184
+ add_geodesic_to_queue(
185
+ neighborhood_queue, neighborhoods, next(len_spec))
186
+
187
+ next_tile : Tile = neighborhood.get_next_tile()
188
+ neighborhood.update_radius_and_epsilon(next_tile)
189
+ tet_index = next_tile.lifted_tetrahedron.tet.Index
190
+
191
+ for other_neighborhood in neighborhoods.neighborhoods:
192
+ neighborhood_pair = neighborhoods.get_neighborhood_pair(
193
+ neighborhood, other_neighborhood)
194
+ if neighborhood_pair.finished:
195
+ continue
196
+
197
+ for other_tile in other_neighborhood.tet_to_tiles[tet_index]:
198
+ neighborhood_pair.distance_lifts = correct_min([
199
+ neighborhood_pair.distance_lifts,
200
+ distance_tiles(next_tile, other_tile)])
201
+
202
+ total_radius = neighborhood.radius + other_neighborhood.radius
203
+
204
+ if total_radius < neighborhood_pair.distance_lifts:
205
+ continue
206
+
207
+ if neighborhoods.mcomplex.verified:
208
+ distance_objects = neighborhoods.mcomplex.RF(
209
+ min(total_radius.lower(),
210
+ neighborhood_pair.distance_lifts.lower()),
211
+ neighborhood_pair.distance_lifts.upper())
212
+ else:
213
+ distance_objects = neighborhood_pair.distance_lifts
214
+
215
+ neighborhood_pair.mu = mu_from_neighborhood_pair(
216
+ neighborhood, other_neighborhood,
217
+ distance_objects,
218
+ verified=neighborhoods.mcomplex.verified)
219
+ neighborhoods.mu = correct_min(
220
+ [neighborhoods.mu, neighborhood_pair.mu])
221
+
222
+ neighborhood_pair.finished = True
223
+
224
+ neighborhood.add_next_tile(next_tile)
225
+ heapq.heappush(neighborhood_queue, neighborhood)
226
+
227
+ return True
228
+
229
+ def margulis(
230
+ M,
231
+ bits_prec:Optional[int]=None,
232
+ verified:bool=False,
233
+ include_thin_part:bool=False,
234
+ stopper=None):
235
+ """
236
+ Returns the optimal Margulis number :math:`\\mu(M)`::
237
+
238
+ >>> Manifold("m004").margulis() # doctest: +NUMERIC9
239
+ 0.962423650119202
240
+
241
+ If :attr:`include_thin_part=True`, returns a triple
242
+ (:math:`\\mu(M)`, :math:`\\mu(M)`-thin part, collisions). Recall that the
243
+ :math:`\\mu(M)`-thin part is the union of all essential loops of length
244
+ less than :math:`\\mu(M)`. It is a disjoint union of embedded cusp
245
+ neighborhoods and embedded tubes about geodesics. We encode it as list
246
+ of objects pertaining information about each component. The collisions are
247
+ pairs of indices into the thin part indicating which cusp neighborhoods and
248
+ tubes are touching::
249
+
250
+ >>> Manifold("m003").margulis(include_thin_part=True) # doctest: +SKIP
251
+ (0.962423650119189,
252
+ [Cusp Neighborhood for cusp 0 of area 0.866025403784405,
253
+ Tube about geodesic aC of radius 0.211824465096784,
254
+ Tube about geodesic a of radius 0.211824465096782,
255
+ Tube about geodesic bC of radius 0.211824465096782,
256
+ Tube about geodesic b of radius 0.211824465096782],
257
+ [(2, 3), (1, 4)])
258
+
259
+ Note that the method fails on some manifolds with incomplete cusps
260
+ such as ``s479(-3,1)`` where the boundary of the thin part is intersecting
261
+ a core curve. In such cases (or in order to improve performance), we can
262
+ use :attr:`stopper` to show that :math:`\\mu(M)` is larger than a given
263
+ number. Here is an example to prove that :math:`\\mu(M)>0.8`::
264
+
265
+ sage: M=ManifoldHP("s479(-3,1)")
266
+ sage: from sage.all import RealIntervalField
267
+ sage: M.margulis(verified=True, stopper=0.9)>RealIntervalField()('0.8')
268
+ True
269
+
270
+ **Verified computations**
271
+
272
+ The method also supports :ref:`verified computations <verify-primer>`::
273
+
274
+ sage: Manifold("m003").margulis(verified=True,bits_prec=100) # doctest: +NUMERIC15
275
+ 0.9624236501192068949955?
276
+
277
+ If :attr:`verified=True` and :attr:`include_thin_part=True` are used
278
+ together, the method returns (not necessarily proper) supersets for the
279
+ true thin part and the true collisions. For example, assume there is a
280
+ geodesic of real length equal to (or really close to) :math:`\\mu(M)`.
281
+ Numerically, we cannot decide whether the limiting constituent of
282
+ :math:`\\mu(M)` is the geodesic or some other neighborhood or pair of
283
+ neighborhoods. In such a case, we conservatively add the tube about the
284
+ geodesic to the thin part (with lower bound on the radius being 0) and to
285
+ the collisions.
286
+
287
+ :param bits_prec:
288
+ Precision used for the computation. Increase if computation did
289
+ not succeed.
290
+ :param verified:
291
+ Use :ref:`verified computation <verify-primer>`.
292
+ :param include_thin_part:
293
+ Return triple
294
+ (:math:`\\mu(M)`, :math:`\\mu(M)`-thin part, collisions) instead
295
+ of only the optimal Margulis number :math:`\\mu(M)`.
296
+ :param stopper:
297
+ Return the minimum of :attr:`stopper` and the optimal Margulis
298
+ number :math:`\\mu(M)` (and the corresponding thin part if
299
+ :attr:`include_thin_part=True`).
300
+ :return:
301
+ Optimal Margulis number :math:`\\mu(M)` or triple
302
+ (:math:`\\mu(M)`, :math:`\\mu(M)`-thin part, collisions).
303
+ """
304
+
305
+ mcomplex = mcomplex_for_margulis_number(
306
+ M, bits_prec=bits_prec, verified=verified)
307
+
308
+ neighborhoods = Neighborhoods(mcomplex, stopper)
309
+ neighborhood_queue : List[Neighborhood] = []
310
+
311
+ cusp_shapes = compute_cusp_shapes(
312
+ M, bits_prec = bits_prec, verified = verified)
313
+
314
+ for vertex, cusp_shape in zip(mcomplex.Vertices, cusp_shapes):
315
+ if vertex.is_complete:
316
+ add_cusp_to_queue_and_neighborhoods(
317
+ neighborhood_queue, neighborhoods, vertex, cusp_shape)
318
+
319
+ len_spec = M.length_spectrum_alt_gen(
320
+ bits_prec=bits_prec, verified=verified, include_intermediates=True)
321
+ add_geodesic_to_queue(neighborhood_queue, neighborhoods, next(len_spec))
322
+
323
+ while expand_next_neighborhood(
324
+ neighborhood_queue, neighborhoods, len_spec):
325
+ pass
326
+
327
+ if include_thin_part:
328
+ return (neighborhoods.mu,
329
+ neighborhoods.thin_part(),
330
+ neighborhoods.collisions())
331
+ else:
332
+ return neighborhoods.mu
@@ -0,0 +1,66 @@
1
+ from .neighborhood import Neighborhood
2
+ from .margulis_info import MargulisCuspNeighborhoodInfo
3
+
4
+ from ..snap.t3mlite import Mcomplex
5
+ from ..tiling.tile import Tile
6
+ from ..tiling.floor import floor_as_integers
7
+ from ..math_basics import correct_min
8
+
9
+ import itertools
10
+
11
+ from typing import Iterable
12
+
13
+ class CuspNeighborhoodNeighborhood(Neighborhood):
14
+ def __init__(self, mcomplex : Mcomplex, index : int, vertex, cusp_shape):
15
+ super().__init__(mcomplex, index)
16
+ self.vertex = vertex
17
+ self.euclidean_length = length_shortest_slope_from_cusp_area_and_shape(
18
+ self.vertex.cusp_area, cusp_shape)
19
+ self.epsilon = mcomplex.RF(0)
20
+
21
+ def epsilon_from_radius(self, radius):
22
+ h = self.euclidean_length * radius.exp()
23
+ return 2 * (h/2).arcsinh()
24
+
25
+ def _get_tile_stream(self) -> Iterable[Tile]:
26
+ return iter(self.vertex.tiles())
27
+
28
+ def radius_from_epsilon(self, epsilon):
29
+ h = 2 * (epsilon/2).sinh()
30
+ return (h / self.euclidean_length).log()
31
+
32
+ def radius_derivative_from_epsilon(self, epsilon):
33
+ return 1 / (2 * (epsilon/2).tanh())
34
+
35
+ def radius_and_derivative_from_epsilon(self, epsilon):
36
+ return (
37
+ self.radius_from_epsilon(epsilon),
38
+ self.radius_derivative_from_epsilon(epsilon))
39
+
40
+ def info_for_epsilon(self, epsilon) -> MargulisCuspNeighborhoodInfo:
41
+ radius = self.radius_from_epsilon(epsilon)
42
+ area = self.vertex.cusp_area * (2 * radius).exp()
43
+ return MargulisCuspNeighborhoodInfo(
44
+ cusp_index=self.vertex.Index,
45
+ cusp_area=area)
46
+
47
+ def __repr__(self):
48
+ return "Cusp neighborhood neighborhood with Euclidean length %r" % self.euclidean_length
49
+
50
+ def length_shortest_slope_from_cusp_shape(cusp_shape):
51
+ RF = cusp_shape.real().parent()
52
+
53
+ one = RF(1)
54
+ half = one / 2
55
+
56
+ result = one
57
+ for q in itertools.count(start=1):
58
+ if abs(q * cusp_shape.imag()) > result:
59
+ return result
60
+ z = q * cusp_shape
61
+ for p in floor_as_integers(z.real() + half):
62
+ result = correct_min([result, (z - p).abs()])
63
+
64
+ def length_shortest_slope_from_cusp_area_and_shape(cusp_area, cusp_shape):
65
+ l = length_shortest_slope_from_cusp_shape(cusp_shape)
66
+ return (cusp_area / cusp_shape.imag()).sqrt() * l
@@ -0,0 +1,152 @@
1
+ from .neighborhood import Neighborhood
2
+ from .margulis_info import MargulisTubeInfo
3
+
4
+ from ..snap.t3mlite import Mcomplex
5
+ from ..geometric_structure.geodesic.tiles_for_geodesic import (
6
+ compute_tiles_for_geodesic, compute_tiles_for_core_curve)
7
+ from ..geometric_structure.geodesic.geodesic_start_point_info import (
8
+ GeodesicStartPointInfo, compute_geodesic_start_point_info)
9
+ from ..math_basics import correct_min, correct_max, is_RealIntervalFieldElement
10
+ from ..len_spec.length_spectrum_geodesic_info import LengthSpectrumGeodesicInfo
11
+ from ..tiling.tile import Tile
12
+
13
+ from typing import Iterable
14
+ import itertools
15
+
16
+ class GeodesicNeighborhood(Neighborhood):
17
+ def __init__(self, mcomplex : Mcomplex,
18
+ index : int,
19
+ geodesic_info : LengthSpectrumGeodesicInfo):
20
+ super().__init__(mcomplex, index)
21
+ self.mcomplex = mcomplex
22
+ self.geodesic_info = geodesic_info
23
+ self.epsilon = geodesic_info.length.real()
24
+ self.added = False
25
+
26
+ def _get_tile_stream(self) -> Iterable[Tile]:
27
+ if self.geodesic_info.core_curve is None:
28
+ return compute_tiles_for_geodesic(
29
+ self.mcomplex,
30
+ compute_geodesic_start_point_info(
31
+ self.mcomplex, self.geodesic_info.word))
32
+ else:
33
+ return compute_tiles_for_core_curve(
34
+ self.mcomplex,
35
+ self.geodesic_info.core_curve)
36
+
37
+ def epsilon_from_radius(self, radius):
38
+ return epsilon_from_tube_radius(
39
+ radius,
40
+ self.geodesic_info.length)
41
+
42
+ def radius_from_epsilon(self, epsilon):
43
+ return tube_radius_and_derivative_from_epsilon(
44
+ epsilon,
45
+ self.geodesic_info.length,
46
+ include_derivative=False,
47
+ verified=self.mcomplex.verified)[0]
48
+
49
+ def radius_derivative_from_epsilon(self, epsilon):
50
+ return tube_radius_and_derivative_from_epsilon(
51
+ epsilon,
52
+ self.geodesic_info.length,
53
+ include_derivative=True,
54
+ verified=self.mcomplex.verified)[1]
55
+
56
+ def radius_and_derivative_from_epsilon(self, epsilon):
57
+ return tube_radius_and_derivative_from_epsilon(
58
+ epsilon,
59
+ self.geodesic_info.length,
60
+ include_derivative=True,
61
+ verified=self.mcomplex.verified)
62
+
63
+ def info_for_epsilon(self, epsilon) -> MargulisTubeInfo:
64
+ radius = self.radius_from_epsilon(epsilon)
65
+ return MargulisTubeInfo(
66
+ word=self.geodesic_info.word,
67
+ radius=radius,
68
+ core_curve=self.geodesic_info.core_curve,
69
+ type_='tube')
70
+
71
+ def __repr__(self):
72
+ return "Geodesic tube with length %r" % self.geodesic_info.length
73
+
74
+ def epsilon_from_tube_radius(radius, lambda_):
75
+ if radius < 0:
76
+ return lambda_.real()
77
+
78
+ RF = radius.parent()
79
+ sqr_cosh_radius = correct_max([RF(0), radius]).cosh() ** 2
80
+
81
+ min_cosh_candidate = None
82
+ for n in itertools.count(1):
83
+ nlambda = n * lambda_
84
+ cos_term = nlambda.imag().cos()
85
+ cosh_term = nlambda.real().cosh()
86
+
87
+ cosh_candidate = ((cosh_term - cos_term) * sqr_cosh_radius) + cos_term
88
+ if min_cosh_candidate is None:
89
+ min_cosh_candidate = cosh_candidate
90
+ else:
91
+ min_cosh_candidate = correct_min([min_cosh_candidate, cosh_candidate])
92
+ if min_cosh_candidate < ((cosh_term - 1) * sqr_cosh_radius) + 1:
93
+ return min_cosh_candidate.arccosh()
94
+
95
+ def candidate_tube_radius_from_cosh_epsilon(cosh_epsilon, lambda_):
96
+ cos_term = lambda_.imag().cos()
97
+ f = ((cosh_epsilon - cos_term) /
98
+ (lambda_.real().cosh() - cos_term))
99
+ RIF = f.parent()
100
+ return correct_max([f, RIF(1)]).sqrt().arccosh()
101
+
102
+ def candidate_derivative_tube_radius_from_cosh_sinh_epsilon(cosh_epsilon, sinh_epsilon, lambda_):
103
+ cos_term = lambda_.imag().cos()
104
+ n = cosh_epsilon - cos_term
105
+ d = lambda_.real().cosh() - cos_term
106
+ f = n / d
107
+ ff = f * (f - 1)
108
+
109
+ RF = ff.parent()
110
+
111
+ safe_ff = correct_max([RF(0), ff])
112
+ try:
113
+ return sinh_epsilon / (2 * safe_ff.sqrt() * d)
114
+ except Exception as e:
115
+ print("lambda_", lambda_)
116
+ raise e
117
+
118
+ def _floor(v):
119
+ if is_RealIntervalFieldElement(v):
120
+ return v.floor().upper().round()
121
+ else:
122
+ return int(v.floor())
123
+
124
+ def tube_radius_and_derivative_from_epsilon(epsilon, lambda_, include_derivative, verified):
125
+ cosh_epsilon = epsilon.cosh()
126
+ sinh_epsilon = epsilon.sinh()
127
+ max_power = _floor(epsilon / lambda_.real())
128
+
129
+ candidates = [
130
+ candidate_tube_radius_from_cosh_epsilon(cosh_epsilon, n * lambda_)
131
+ for n in range(1, max_power + 1) ]
132
+
133
+ radius = correct_max(candidates)
134
+
135
+ if not include_derivative:
136
+ return radius, None
137
+
138
+ indices = [ i + 1
139
+ for i in range(0, max_power)
140
+ if not candidates[i] < radius ]
141
+
142
+ index = indices[0]
143
+ d = candidate_derivative_tube_radius_from_cosh_sinh_epsilon(
144
+ cosh_epsilon, sinh_epsilon, index * lambda_)
145
+
146
+ if verified:
147
+ for index in indices[1:]:
148
+ d = d.union(
149
+ candidate_derivative_tube_radius_from_cosh_sinh_epsilon(
150
+ cosh_epsilon, sinh_epsilon, index * lambda_))
151
+
152
+ return radius, d
@@ -0,0 +1,21 @@
1
+ from ..SnapPy import Info
2
+
3
+ from typing import Optional
4
+
5
+ class MargulisInfo(Info):
6
+ pass
7
+
8
+ class MargulisTubeInfo(MargulisInfo):
9
+ def __repr__(self):
10
+ return "Tube about geodesic %s%s of radius %r" % (
11
+ self.word, _format_core_curve(self.core_curve), self.radius)
12
+
13
+ class MargulisCuspNeighborhoodInfo(MargulisInfo):
14
+ def __repr__(self):
15
+ return "Cusp Neighborhood for cusp %d of area %r" % (
16
+ self.cusp_index, self.cusp_area)
17
+
18
+ def _format_core_curve(core_curve : Optional[int]):
19
+ if core_curve is None:
20
+ return ''
21
+ return ' (Core curve of cusp %d)' % core_curve