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,96 @@
1
+ from ..math_basics import correct_min, is_RealIntervalFieldElement, lower, upper
2
+
3
+ __all__ = ['unbiased_cusp_areas_from_cusp_area_matrix',
4
+ 'greedy_cusp_areas_from_cusp_area_matrix']
5
+
6
+ def unbiased_cusp_areas_from_cusp_area_matrix(cusp_area_matrix):
7
+ """
8
+
9
+ Examples::
10
+
11
+ sage: from sage.all import matrix, RIF
12
+ sage: unbiased_cusp_areas_from_cusp_area_matrix(
13
+ ... matrix([[RIF(9.0,9.0005),RIF(6.0, 6.001)],
14
+ ... [RIF(6.0,6.001 ),RIF(4.0, 4.001)]]))
15
+ [3.000?, 2.001?]
16
+
17
+ >>> from snappy.number import Number, number_to_native_number
18
+ >>> def N(x): return number_to_native_number(Number(x))
19
+ >>> from snappy.matrix import make_matrix
20
+ >>> unbiased_cusp_areas_from_cusp_area_matrix(
21
+ ... make_matrix([[N(10.0), N(40.0)],
22
+ ... [N(40.0), N(20.0)]])) # doctest: +NUMERIC9
23
+ [3.1622776601683795, 4.47213595499958]
24
+
25
+ """
26
+
27
+ verified = is_RealIntervalFieldElement(cusp_area_matrix[0, 0])
28
+ RIF = cusp_area_matrix[0,0].parent()
29
+
30
+ n = cusp_area_matrix.dimensions()[0]
31
+
32
+ sqrts = [ [ cusp_area_matrix[i, j].sqrt()
33
+ for j in range(n) ]
34
+ for i in range(n) ]
35
+
36
+ result = n * [ None ]
37
+
38
+ for _ in range(n):
39
+ lower_t_next, i = min(
40
+ ( lower(
41
+ sqrts[i][j]
42
+ if result[j] is None
43
+ else cusp_area_matrix[i, j] / result[j]),
44
+ i)
45
+ for i in range(n) if result[i] is None
46
+ for j in range(n) )
47
+ if verified:
48
+ lower_t_next_interval = RIF(lower_t_next)
49
+ upper_t_next = min(
50
+ upper(
51
+ sqrts[i][i]
52
+ if j == i
53
+ else cusp_area_matrix[i, j] / (
54
+ lower_t_next_interval
55
+ if result[j] is None
56
+ else result[j]))
57
+ for j in range(n) )
58
+ result[i] = RIF(lower_t_next, upper_t_next)
59
+ else:
60
+ result[i] = lower_t_next
61
+
62
+ return result
63
+
64
+ def greedy_cusp_areas_from_cusp_area_matrix(cusp_area_matrix, first_cusps=[]):
65
+ """
66
+
67
+ sage: from sage.all import matrix, RIF
68
+ sage: greedy_cusp_areas_from_cusp_area_matrix(
69
+ ... matrix([[RIF(9.0,9.0005),RIF(6.0, 6.001)],
70
+ ... [RIF(6.0,6.001 ),RIF(10.0, 10.001)]]))
71
+ [3.0001?, 2.000?]
72
+
73
+ >>> from snappy.number import Number, number_to_native_number
74
+ >>> def N(x): return number_to_native_number(Number(x))
75
+ >>> from snappy.matrix import make_matrix
76
+ >>> greedy_cusp_areas_from_cusp_area_matrix(
77
+ ... make_matrix([[N(10.0), N(40.0)],
78
+ ... [N(40.0), N(20.0)]])) # doctest: +NUMERIC9
79
+ [3.1622776601683795, 4.47213595499958]
80
+
81
+ """
82
+ num_cusps = cusp_area_matrix.dimensions()[0]
83
+
84
+ result = list(range(num_cusps)) # Make space for range; initial values irrelevant
85
+
86
+ # Cusp permutation given in Cayley notation
87
+ sigma = first_cusps + [ i for i in range(num_cusps) if i not in first_cusps ]
88
+
89
+ for i in range(num_cusps):
90
+ stoppers = [ cusp_area_matrix[sigma[i], sigma[j]] / result[sigma[j]]
91
+ for j in range(i) ]
92
+ self_stopper = cusp_area_matrix[sigma[i], sigma[i]].sqrt()
93
+
94
+ result[sigma[i]] = correct_min(stoppers + [ self_stopper ])
95
+
96
+ return result
@@ -0,0 +1,136 @@
1
+ from ..geometric_structure.cusp_neighborhood.tiles_for_cusp_neighborhood import (
2
+ mcomplex_for_tiling_cusp_neighborhoods)
3
+ from ..tiling.tile import Tile
4
+
5
+ from ..matrix import make_matrix
6
+ from ..sage_helper import _within_sage
7
+ from ..math_basics import correct_min, is_RealIntervalFieldElement, lower
8
+
9
+ from ..hyperboloid.distances import distance_r13_horoballs
10
+
11
+ if _within_sage:
12
+ from ..sage_helper import Infinity
13
+
14
+ def maximal_cusp_area_matrix(manifold, bits_prec, verified):
15
+ """
16
+ A test case that hits both the tiling case and the early bail case
17
+ (using v.exp_self_distance_along_edges):
18
+
19
+ >>> from snappy import Manifold
20
+ >>> M = Manifold("o9_44206")
21
+ >>> maximal_cusp_area_matrix(M, bits_prec=53, verified=False) # doctest: +NUMERIC9
22
+ [88.4588035788544 14.3590180492058 11.4136568679715 9.67661682098105]
23
+ [14.3590180492058 88.4588035788533 9.67661682098102 11.4136568679705]
24
+ [11.4136568679715 9.67661682098102 88.4588035788541 14.3590180492042]
25
+ [9.67661682098105 11.4136568679705 14.3590180492042 88.4588035788038]
26
+
27
+ sage: from snappy import Manifold
28
+ sage: M = Manifold("o9_44206")
29
+ sage: maximal_cusp_area_matrix(M, bits_prec=80, verified=True) # doctest: +NUMERIC6
30
+ [ 88.458803578854197094? 14.3590180492058335371? 11.4136568679715291317? 9.6766168209810445566?]
31
+ [14.3590180492058335371? 88.4588035789? 9.676616820981044? 11.4136568680?]
32
+ [11.4136568679715291317? 9.676616820981044? 88.45880357885420? 14.35901804921?]
33
+ [ 9.6766168209810445566? 11.4136568680? 14.35901804921? 88.458803578?]
34
+ """
35
+
36
+ mcomplex = mcomplex_for_tiling_cusp_neighborhoods(
37
+ manifold, bits_prec=bits_prec, verified=verified)
38
+
39
+ n = len(mcomplex.Vertices)
40
+
41
+ lower_entries = [
42
+ [ _entry(mcomplex, i, j) for j in range(i + 1) ]
43
+ for i in range(n) ]
44
+
45
+ return make_matrix(
46
+ [[ lower_entries[i][j] if j < i else lower_entries[j][i]
47
+ for j in range(n) ]
48
+ for i in range(n) ])
49
+
50
+ def _entry(mcomplex, i, j):
51
+ p = mcomplex.Vertices[i].cusp_area * mcomplex.Vertices[j].cusp_area
52
+
53
+ if i == j:
54
+ return p * _diagonal_scale(mcomplex, i)
55
+ else:
56
+ return p * _non_diagonal_scale(mcomplex, i, j)
57
+
58
+ def _diagonal_scale(mcomplex, i):
59
+ v = mcomplex.Vertices[i]
60
+ e = v.exp_self_distance_along_edges
61
+ if not e is None:
62
+ if e < v.scale_for_std_form ** 2:
63
+ return e ** 2
64
+
65
+ if mcomplex.verified:
66
+ d = mcomplex.RF(Infinity)
67
+ else:
68
+ d = mcomplex.RF(1e20)
69
+
70
+ tet_to_lifts = [ [] for tet in mcomplex.Tetrahedra ]
71
+
72
+ for tile in v.tiles():
73
+ if tile.lower_bound_distance > d / 2:
74
+ return (2 * d).exp() # Area, so need square
75
+
76
+ new_lift = tile.inverse_lifted_geometric_object.defining_vec
77
+
78
+ tet_index = tile.lifted_tetrahedron.tet.Index
79
+
80
+ lifts = tet_to_lifts[tet_index]
81
+ for lift in lifts:
82
+ d = correct_min([d,
83
+ distance_r13_horoballs(new_lift, lift)])
84
+ lifts.append(new_lift)
85
+
86
+ def _non_diagonal_scale(mcomplex, i, j):
87
+ v0 = mcomplex.Vertices[i]
88
+ v1 = mcomplex.Vertices[j]
89
+ c = mcomplex.real_cusp_cross_section
90
+ e = c.exp_distance_neighborhoods_measured_along_edges(i, j)
91
+ if not e is None:
92
+ if e < v0.scale_for_std_form * v1.scale_for_std_form:
93
+ return e ** 2
94
+
95
+ if mcomplex.verified:
96
+ d = mcomplex.RF(Infinity)
97
+ else:
98
+ d = mcomplex.RF(1e20)
99
+
100
+ obj_to_tet_to_lifts = [ [ [] for tet in mcomplex.Tetrahedra ]
101
+ for i in range(2) ]
102
+
103
+ for tile in _merge_tiles([v0.tiles(), v1.tiles()]):
104
+ if tile.lower_bound_distance > d:
105
+ return (2 * d).exp()
106
+
107
+ new_lift = tile.inverse_lifted_geometric_object.defining_vec
108
+ tet_index = tile.lifted_tetrahedron.tet.Index
109
+
110
+ for lift in obj_to_tet_to_lifts[1 - tile.object_index][tet_index]:
111
+ d = correct_min([d,
112
+ distance_r13_horoballs(new_lift, lift)])
113
+ obj_to_tet_to_lifts[tile.object_index][tet_index].append(new_lift)
114
+
115
+ def _merge_tiles(streams_of_tiles):
116
+
117
+ iters = [ iter(s) for s in streams_of_tiles ]
118
+ tiles = [ next(iter) for iter in iters ]
119
+
120
+ while True:
121
+ i = _argmin(*(lower(tile.lower_bound_distance) for tile in tiles))
122
+ tile = tiles[i]
123
+ yield Tile(
124
+ # Relying on -inf + x = -inf
125
+ sum(t.lower_bound_distance for t in tiles),
126
+ tile.inverse_lifted_geometric_object,
127
+ tile.lifted_tetrahedron,
128
+ i)
129
+
130
+ tiles[i] = next(iters[i])
131
+
132
+ def _argmin(v0, v1):
133
+ if v0 < v1:
134
+ return 0
135
+ else:
136
+ return 1
@@ -0,0 +1,217 @@
1
+ from ..sage_helper import _within_sage
2
+ from ..exceptions import InsufficientPrecisionError
3
+ from ..math_basics import is_RealIntervalFieldElement, is_ComplexIntervalFieldElement
4
+
5
+ import math
6
+
7
+ if _within_sage:
8
+ from ..sage_helper import gcd
9
+ else:
10
+ # Python 3 has gcd in math
11
+ from math import gcd
12
+
13
+ # Reject computing short slopes if intervals for translations
14
+ # are too wide (error is more than 1%).
15
+ _min_diameter_translations = 0.01
16
+
17
+ def short_slopes_from_cusp_shape_and_area(
18
+ cusp_shape, cusp_area, length=6):
19
+ """
20
+ cusp_shape is longitude over meridian (conjugate).
21
+ l/m
22
+
23
+ sage: from sage.all import RIF, CIF
24
+ sage: short_slopes_from_cusp_shape_and_area(CIF(RIF(1.0),RIF(1.3333,1.3334)), RIF(12.0))
25
+ [(1, 0), (-2, 1), (-1, 1), (0, 1)]
26
+
27
+ >>> from snappy import number
28
+ >>> cusp_shape = number.number_to_native_number(number.Number(1.0+1.3333j))
29
+ >>> short_slopes_from_cusp_shape_and_area(cusp_shape, 12.0)
30
+ [(1, 0), (-2, 1), (-1, 1), (0, 1)]
31
+
32
+ """
33
+
34
+ return short_slopes_from_translations(
35
+ translations_from_cusp_shape_and_area(cusp_shape, cusp_area),
36
+ length)
37
+
38
+
39
+ def translations_from_cusp_shape_and_area(
40
+ cusp_shape, cusp_area, kernel_convention=False):
41
+ """
42
+ Unfortunately, the short_slopes_from_translations uses the convention
43
+ that the longitude translation is real whereas the SnapPea kernel and
44
+ M.cusp_translations uses the convention that the meridian translation
45
+ is real. Thus, we have a flag here.
46
+
47
+ Ideally, we would rewrite below short_slopes_from_translations to
48
+ use the same convention.
49
+ """
50
+
51
+ if kernel_convention:
52
+ inv_cusp_shape = 1 / cusp_shape.conjugate()
53
+ scale = (cusp_area / _imag(inv_cusp_shape)).sqrt()
54
+ return (scale * inv_cusp_shape, scale)
55
+ else:
56
+ scale = (cusp_area / _imag(cusp_shape)).sqrt()
57
+ return (scale, cusp_shape * scale)
58
+
59
+ def short_slopes_from_translations(translations, length=6):
60
+
61
+ m_tran, l_tran = translations
62
+
63
+ if is_ComplexIntervalFieldElement(m_tran):
64
+ raise Exception("Meridian translation expected to be real")
65
+ if is_RealIntervalFieldElement(l_tran):
66
+ raise Exception("Longitude translation expected to be complex")
67
+
68
+ is_interval_1 = is_RealIntervalFieldElement(m_tran)
69
+ is_interval_2 = is_ComplexIntervalFieldElement(l_tran)
70
+
71
+ if is_interval_1 != is_interval_2:
72
+ raise Exception("Mismatch of non-intervals and intervals.")
73
+
74
+ if is_interval_1:
75
+ return _verified_short_slopes_from_translations(translations, length)
76
+
77
+ return _unverified_short_slopes_from_translations(translations, length)
78
+
79
+ _safety_factor = 1.001
80
+
81
+ def _unverified_short_slopes_from_translations(translations, length=6):
82
+ m_tran, l_tran = translations
83
+
84
+ if m_tran.imag() != 0.0:
85
+ raise Exception("Expected real meridian translation")
86
+
87
+ if not m_tran > 0:
88
+ raise Exception("Expected positive meridian translation")
89
+
90
+ RF = l_tran.real().parent()
91
+
92
+ length = RF(length * RF(_safety_factor))
93
+
94
+ result = []
95
+ max_abs_l = _floor(length / abs(_imag(l_tran)))
96
+
97
+ for l in range(max_abs_l + 1):
98
+ total_l_tran = l * l_tran
99
+
100
+ max_real_range_sqr = length ** 2 - _imag(total_l_tran) ** 2
101
+
102
+ if max_real_range_sqr >= 0:
103
+ max_real_range = max_real_range_sqr.sqrt()
104
+
105
+ if l == 0:
106
+ min_m = 1
107
+ else:
108
+ min_m = _ceil(
109
+ (- _real(total_l_tran) - max_real_range) / m_tran)
110
+
111
+ max_m = _floor(
112
+ (- _real(total_l_tran) + max_real_range) / m_tran)
113
+
114
+ for m in range(min_m, max_m + 1):
115
+ if gcd(m, l) in [-1, +1]:
116
+ result.append((m, l))
117
+
118
+ return result
119
+
120
+
121
+ def _verified_short_slopes_from_translations(translations, length=6):
122
+ m_tran, l_tran = translations
123
+
124
+ if not m_tran > 0:
125
+ raise Exception("Expected positive meridian translation.")
126
+
127
+ if not l_tran.imag() != 0:
128
+ raise InsufficientPrecisionError(
129
+ "Could not verify that longitude meridian translation "
130
+ "has non-trivial imaginary part.")
131
+
132
+ if m_tran.diameter() > _min_diameter_translations:
133
+ raise InsufficientPrecisionError(
134
+ "Meridian translation has insufficient precision to compute "
135
+ "a reasonable set of short slopes.")
136
+
137
+ if l_tran.diameter() > _min_diameter_translations:
138
+ raise InsufficientPrecisionError(
139
+ "Longitude translation has insufficient precision to compute "
140
+ "a reasonable set of short slopes.")
141
+
142
+ RIF = m_tran.parent()
143
+
144
+ length = RIF(length)
145
+
146
+ result = []
147
+
148
+ max_abs_l = _max_int_in_interval(length / abs(l_tran.imag()))
149
+
150
+ for l in range(max_abs_l + 1):
151
+ total_l_tran = l * l_tran
152
+
153
+ max_real_range_sqr = (length ** 2 - total_l_tran.imag() ** 2).upper()
154
+
155
+ if max_real_range_sqr >= 0:
156
+ max_real_range = RIF(max_real_range_sqr).sqrt()
157
+
158
+ if l == 0:
159
+ min_m = 1
160
+ else:
161
+ min_m = _min_int_in_interval(
162
+ (- total_l_tran.real() - max_real_range) / m_tran)
163
+
164
+ max_m = _max_int_in_interval(
165
+ (- total_l_tran.real() + max_real_range) / m_tran)
166
+
167
+ for m in range(min_m, max_m + 1):
168
+ if gcd(m, l) in [+1, -1]:
169
+ result.append((m, l))
170
+
171
+ return result
172
+
173
+
174
+ def _max_int_in_interval(i):
175
+ return i.upper().floor()
176
+
177
+
178
+ def _min_int_in_interval(i):
179
+ return i.lower().ceil()
180
+
181
+
182
+ def _real(x):
183
+ if isinstance(x, complex):
184
+ return x.real
185
+ return x.real()
186
+
187
+
188
+ def _imag(x):
189
+ if isinstance(x, complex):
190
+ return x.imag
191
+ return x.imag()
192
+
193
+
194
+ def _floor(x):
195
+ if isinstance(x, float):
196
+ return math.floor(x)
197
+ return int(x.floor())
198
+
199
+
200
+ def _ceil(x):
201
+ if isinstance(x, float):
202
+ return math.ceil(x)
203
+ return int(x.ceil())
204
+
205
+ def _dummy_for_tests():
206
+ """
207
+ >>> M = Manifold("m004")
208
+ >>> M.short_slopes()
209
+ [[(1, 0), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]
210
+
211
+ >>> M.high_precision().short_slopes()
212
+ [[(1, 0), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]
213
+
214
+ sage: M.short_slopes(verified=True)
215
+ [[(1, 0), (-4, 1), (-3, 1), (-2, 1), (-1, 1), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]
216
+
217
+ """
snappy/cusps/test.py ADDED
@@ -0,0 +1,22 @@
1
+ from snappy import testing
2
+ import snappy
3
+
4
+ from snappy import cusps
5
+
6
+ modules = [
7
+ cusps,
8
+ cusps.maximal_cusp_area_matrix,
9
+ cusps.cusp_areas_from_matrix
10
+ ]
11
+
12
+ def run_doctests(verbose=False, print_info=True):
13
+ globs = {'Manifold': snappy.Manifold}
14
+ return testing.doctest_modules(modules,
15
+ verbose=verbose,
16
+ print_info=print_info,
17
+ extraglobs=globs)
18
+
19
+ run_doctests.__name__ = cusps.__name__
20
+
21
+ if __name__ == '__main__':
22
+ testing.run_doctests_as_main(run_doctests)
@@ -0,0 +1,63 @@
1
+ from ..geometric_structure.cusp_neighborhood.real_cusp_cross_section import RealCuspCrossSection
2
+ from ..math_basics import correct_min
3
+ from ..verify.shapes import compute_hyperbolic_shapes
4
+ from ..matrix import make_matrix
5
+
6
+ __all__ = ['triangulation_dependent_cusp_area_matrix',
7
+ 'triangulation_dependent_cusp_area_matrix_from_cusp_cross_section']
8
+
9
+ def triangulation_dependent_cusp_area_matrix(
10
+ snappy_manifold, bits_prec, verified):
11
+ """
12
+ Interesting case: t12521
13
+
14
+ Maximal cusp area matrix:
15
+
16
+ [ 77.5537626509970512653317518641810890989543820290380458409? 11.40953140648583915022197187043644048603871960228564151087?]
17
+ [11.40953140648583915022197187043644048603871960228564151087? 91.1461442179608339668518063027198489593908228325190920?]
18
+
19
+ This result:
20
+
21
+ [ 77.553762651? 11.409531407?]
22
+ [ 11.409531407? 5.508968850234?]
23
+
24
+ After M.canonize:
25
+
26
+ [ 62.42018359? 11.409531407?]
27
+ [ 11.409531407? 15.1140644993?]
28
+ """
29
+ # Get shapes, as intervals if requested
30
+ shapes = compute_hyperbolic_shapes(
31
+ snappy_manifold, verified=verified, bits_prec=bits_prec)
32
+
33
+ # Compute cusp cross section, the code is agnostic about whether
34
+ # the numbers are floating-point or intervals.
35
+ #
36
+ # Note that the constructed cusp cross section will always be too "large"
37
+ # and we need to scale them down (since during construction the
38
+ # cross-section of each cusp will have one edge of length 1, the
39
+ # corresponding tetrahedron does not intersect in "standard" form.)
40
+
41
+ return triangulation_dependent_cusp_area_matrix_from_cusp_cross_section(
42
+ RealCuspCrossSection.fromManifoldAndShapes(snappy_manifold, shapes))
43
+
44
+ def triangulation_dependent_cusp_area_matrix_from_cusp_cross_section(c):
45
+
46
+ # Scale (up or down) all the cusps so that they are in standard form.
47
+ c.ensure_std_form(allow_scaling_up=True)
48
+
49
+ areas = c.cusp_areas()
50
+ RIF = areas[0].parent()
51
+
52
+ def entry(i, j):
53
+ result = areas[i] * areas[j]
54
+
55
+ d = c.exp_distance_neighborhoods_measured_along_edges(i, j)
56
+ if d is not None:
57
+ result *= correct_min([ RIF(1), d ]) ** 2
58
+ return result
59
+
60
+ n = len(areas)
61
+
62
+ return make_matrix([[entry(i, j) for i in range(n)]
63
+ for j in range(n)])