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,129 @@
1
+ from ..geometric_structure.geodesic.fixed_points import r13_fixed_line_of_psl2c_matrix
2
+ from ..geometric_structure.geodesic.geodesic_start_point_info import sample_line, GeodesicStartPointInfo
3
+ from ..geometric_structure.geodesic.line import R13LineWithMatrix
4
+ from ..hyperboloid.line import R13Line
5
+ from ..hyperboloid import so13_to_psl2c
6
+ from ..upper_halfspace import complex_length_of_psl2c_matrix
7
+ from ..math_basics import lower # type: ignore
8
+ from ..snap.t3mlite import Mcomplex
9
+
10
+ from typing import List, Optional
11
+
12
+ class GeodesicStreamInfoBase:
13
+ """
14
+ Base class for intermediates, core curves and (non-core curve)
15
+ geodesics in the length spectrum stream. Also used for the
16
+ data structures used by the length spectrum algorithm such as
17
+ the priority queue or the dictionary to de-duplicate geodesics.
18
+ """
19
+ def __init__(self, length):
20
+ self.length = length
21
+
22
+ class GeodesicIntermediateInfo(GeodesicStreamInfoBase):
23
+ """
24
+ Intermediate indicating that all geodesics up to this point
25
+ have been enumerated.
26
+ """
27
+ pass
28
+
29
+ class GeodesicInfoBase(GeodesicStreamInfoBase):
30
+ """
31
+ Basic information about a geodesic, consisting of word and matrix.
32
+
33
+ Used intermediately during the computation of the length spectrum.
34
+ Ordered by (lower bound of) real length.
35
+
36
+ After de-duplication, it is converted to the user-facing
37
+ LengthSpectrumGeodesicInfo.
38
+ """
39
+ def __init__(self,
40
+ word : List[int],
41
+ o13_matrix):
42
+ self.word = word
43
+ self.o13_matrix = o13_matrix
44
+ self.psl2c_matrix = so13_to_psl2c(self.o13_matrix)
45
+
46
+ super().__init__(
47
+ length=complex_length_of_psl2c_matrix(self.psl2c_matrix))
48
+
49
+ self._key = lower(self.length.real())
50
+
51
+ def __lt__(self, other):
52
+ """
53
+ Ordering <.
54
+ """
55
+ return self._key < other._key
56
+
57
+ class CoreCurveGeodesicInfo(GeodesicInfoBase):
58
+ """
59
+ Information for a known core curve. That is, we go through each
60
+ filled cusp and compute this information before starting to compute
61
+ the length spectrum.
62
+
63
+ It contains the index of the corresponding (filled) cusp.
64
+ """
65
+ def __init__(self,
66
+ word : List[int],
67
+ o13_matrix,
68
+ core_curve : int):
69
+ super().__init__(word, o13_matrix)
70
+ self.core_curve = core_curve
71
+
72
+ class GeodesicKeyInfo(GeodesicInfoBase):
73
+ """
74
+ Information for a geodesic which might potentially a multiple of another
75
+ geodesic or even a core curve.
76
+
77
+ Via geodesic_start_point_info, we can determine whether this geodesic
78
+ corresponds to a multiple of a core curve.
79
+
80
+ Given two geodesics that are not core curves, we can also use this
81
+ information here to determine whether one is a conjugate of a multiple of
82
+ the other.
83
+
84
+ Also see get_geodesic_key_info_dict and get_geodesic_key_info_set.
85
+ """
86
+ def __init__(self,
87
+ mcomplex : Mcomplex,
88
+ word : List[int],
89
+ o13_matrix):
90
+ super().__init__(word, o13_matrix)
91
+ self.mcomplex = mcomplex
92
+
93
+ self._r13_line_with_matrix : Optional[R13LineWithMatrix] = None
94
+ self._info : Optional[GeodesicStartPointInfo] = None
95
+
96
+ def r13_line_with_matrix(self) -> R13LineWithMatrix:
97
+ """
98
+ The actual line in H^3 with the matrix corresponding to the
99
+ geodesic.
100
+ """
101
+ if self._r13_line_with_matrix is None:
102
+ self._r13_line_with_matrix = (
103
+ r13_fixed_line_of_psl2c_matrix(self.psl2c_matrix))
104
+
105
+ return self._r13_line_with_matrix
106
+
107
+ def r13_line(self) -> R13Line:
108
+ """
109
+ The actually line in H^3 corresponding to the geodesic.
110
+ """
111
+ return self.r13_line_with_matrix().r13_line
112
+
113
+ def geodesic_start_point_info(self) -> GeodesicStartPointInfo:
114
+ """
115
+ Information to start developing about the geodesic.
116
+ """
117
+ if self._info is None:
118
+ start_point = sample_line(self.r13_line())
119
+
120
+ self._info = GeodesicStartPointInfo(
121
+ mcomplex=self.mcomplex,
122
+ word=self.word,
123
+ trace=self.psl2c_matrix.trace(),
124
+ unnormalised_start_point = start_point,
125
+ unnormalised_end_point=self.o13_matrix * start_point,
126
+ line=self.r13_line_with_matrix())
127
+ self._info.find_tet_or_core_curve()
128
+
129
+ return self._info
@@ -0,0 +1,116 @@
1
+ from .geodesic_piece import GeodesicPiece, get_geodesic_piece_dict
2
+ from .geodesic_info import GeodesicKeyInfo
3
+
4
+ from ..tiling.quotient_dict import QuotientDict
5
+ from ..tiling.dict_based_set import DictBasedSet
6
+ from ..geometric_structure.geodesic.tiles_for_geodesic import compute_tiles_for_geodesic
7
+ from ..geometric_structure.geodesic.geodesic_start_point_info import GeodesicStartPointInfo
8
+ from ..hyperboloid import o13_inverse, r13_to_klein
9
+ from ..snap.t3mlite import Mcomplex
10
+ from ..exceptions import InsufficientPrecisionError
11
+
12
+ from typing import List, Sequence
13
+
14
+ def get_geodesic_key_info_dict(mcomplex : Mcomplex):
15
+ """
16
+ Given a triangulation with a geometric structure, gives an (empty)
17
+ dictionary where keys are GeodesicKeyInfo's not corresponding to
18
+ core curves.
19
+
20
+ Two keys are regarded the same if they give the same geodesic in the
21
+ manifold up to multiplicity and orientation of the geodesic.
22
+
23
+ Note that the same caveat from get_geodesic_piece_dict about this not
24
+ being an equivalence relationship applies.
25
+
26
+ In particular, it assumed that we insert the primitive geodesic before
27
+ we insert a multiple of that primitive geodesic.
28
+ """
29
+ return QuotientDict(
30
+ get_geodesic_piece_dict(mcomplex),
31
+ _canonical_representatives)
32
+
33
+ def get_geodesic_key_info_set(mcomplex : Mcomplex):
34
+ """
35
+ Analogous to get_geodesic_key_info_dict, gives a set where the
36
+ elements are GeodesicKeyInfo's not corresponding to core curves.
37
+
38
+ The same caveats apply.
39
+ """
40
+ return DictBasedSet(get_geodesic_key_info_dict(mcomplex))
41
+
42
+ def _canonical_representatives(key_info : GeodesicKeyInfo) -> List[GeodesicPiece]:
43
+ """
44
+ To see whether two geodesics are the same, we compute the intersection
45
+ of the geodesic with each tetrahedron and store the information in
46
+ GeodesicPiece's.
47
+
48
+ If a part of the geodesic is so close to the skeleton that it cannot be
49
+ decided whether it intersects a tetrahedron or not, we conservatively add
50
+ the GeodesicPiece. In particular, if a geodesic is going through a face
51
+ of a tetrahedron, we add the two tetrahedra neighboring that face.
52
+
53
+ We obtain the GeodesicPieces by developing a tube about the geodesic until
54
+ we can verify that the tube has positive radius.
55
+ """
56
+
57
+ if key_info.geodesic_start_point_info().core_curve_cusp:
58
+ raise ValueError(
59
+ "Expected a non-core curve geodesic as key for dictionary of "
60
+ "GeodesicKeyInfo's.")
61
+
62
+ # Note that geodesic_start_point_info might compute a transform of
63
+ # the given geodesic. This is to ensure that it can find a lifted
64
+ # tetrahedron in the fundamental domain containing the point about which
65
+ # we start developing (or a pair of two lifted tetrahedra where one
66
+ # is in the fundamental domain).
67
+
68
+ return _compute_geodesic_pieces(
69
+ key_info.mcomplex,
70
+ key_info.geodesic_start_point_info(),
71
+ key_info.length.real())
72
+
73
+ def _compute_geodesic_pieces(
74
+ mcomplex : Mcomplex,
75
+ info : GeodesicStartPointInfo,
76
+ real_length) -> Sequence[GeodesicPiece]:
77
+
78
+ g = info.line.o13_matrix
79
+
80
+ for tile in compute_tiles_for_geodesic(
81
+ mcomplex, info, avoid_core_curves = True):
82
+ if tile.lower_bound_distance > 0:
83
+ break
84
+
85
+ h = tile.lifted_tetrahedron.o13_matrix
86
+
87
+ # Compute the matrix corresponding to line given by
88
+ # tile.inverse_lifted_geometric_object.
89
+ #
90
+ # Ideally, compute_tiles_for_geodesic could work with
91
+ # both types, R13Line and R13LineWithMatrix and do the
92
+ # appropriate thing.
93
+ #
94
+ m0 = o13_inverse(h) * g * h
95
+
96
+ # Also compute the inverse
97
+ m1 = o13_inverse(m0)
98
+
99
+ pt0, pt1 = tile.inverse_lifted_geometric_object.points
100
+
101
+ # We do not know which of pt0 and pt1 is the attracting fixed point
102
+ # of m0 or m1.
103
+ # Check and switch around if necessary.
104
+
105
+ if (m0 * pt0)[0] > pt0[0]:
106
+ pass
107
+ elif (m0 * pt1)[0] > pt1[0]:
108
+ pt1, pt0 = pt0, pt1
109
+ else:
110
+ raise InsufficientPrecisionError(
111
+ "Could not determine which fixed point is attracting. "
112
+ "Increasing the precision should fix this.")
113
+
114
+ # Emit a GeodesicPiece for both orientations of the geodesic.
115
+ for pt, m in ((pt0, m0), (pt1, m1)):
116
+ yield GeodesicPiece(r13_to_klein(pt), m, real_length)
@@ -0,0 +1,146 @@
1
+ from ..tiling.real_hash_dict import RealHashDict
2
+ from ..hyperboloid import o13_inverse
3
+ from ..hyperboloid.distances import distance_r13_points
4
+ from ..snap.t3mlite import Mcomplex
5
+ from ..exceptions import InsufficientPrecisionError
6
+
7
+ from typing import Optional
8
+
9
+ class GeodesicPiece:
10
+ """
11
+ For a hyperbolic manifold given through context, this class stores enough
12
+ information about a loxodromic Decktransformation of H^3 to determine
13
+ whether one loxodromic is a positive multiple of another one.
14
+
15
+ This can be used as keys in a dictionary constructed with
16
+ get_geodesic_piece_dict.
17
+
18
+ The information consists of the attracting fixed point encoded as 3-vector
19
+ in S^2 (as boundary of the Klein or Poincare ball model), the associated
20
+ matrix and the real part of the translation length.
21
+
22
+ Note that intervals for the attracing fixed point can be used to verify
23
+ two loxodromics apart up to multiplicity (and are good for hashing).
24
+ But we need the matrix to verify that two loxodromics are the same - or
25
+ that one is a multiple of another.
26
+ """
27
+
28
+ def __init__(self,
29
+ klein_endpoint, # 3-vector in S^2
30
+ o13_matrix,
31
+ real_length):
32
+ self.klein_endpoint = klein_endpoint
33
+ self.o13_matrix = o13_matrix
34
+ self.real_length = real_length
35
+
36
+ def get_geodesic_piece_dict(mcomplex : Mcomplex):
37
+ """
38
+ Returns a dictionary where the keys can be GeodesicPiece's.
39
+ The GeodesicPiece's have to be for loxodromics coming from the given
40
+ triangulation with a geometric structure.
41
+
42
+ Two keys are regarded as the same if the matrix of one is a multiple
43
+ of the matrix of the other key.
44
+
45
+ Note that this is not quite an equivalence relation: if B and C are
46
+ multiples of A, then B is not necessarily a multiple of C.
47
+
48
+ It is assumed that we insert the primitive matrix before we insert a
49
+ multiple of that primitive matrix.
50
+ """
51
+ return RealHashDict(
52
+ _equality_predicate(mcomplex),
53
+ _hash(mcomplex.RF),
54
+ _epsilon_inverse,
55
+ mcomplex.verified)
56
+
57
+ _epsilon_inverse = 1024
58
+
59
+ def _hash(RF):
60
+ weights = [ RF(1.2003), RF(0.94533), RF(1.431112) ]
61
+
62
+ def result(piece : GeodesicPiece):
63
+ """
64
+ Use attracting fixed point for computing the hash.
65
+ """
66
+ return (piece.klein_endpoint[0] * weights[0] +
67
+ piece.klein_endpoint[1] * weights[1] +
68
+ piece.klein_endpoint[2] * weights[2])
69
+
70
+ return result
71
+
72
+ def _equality_predicate(mcomplex):
73
+ def unsymmetrized_result(piece_0 : GeodesicPiece,
74
+ piece_1 : GeodesicPiece) -> bool:
75
+ """
76
+ Check whether the matrix of piece_1 is a multiple of
77
+ the matrix of piece_0.
78
+
79
+ Raise an exception if this could not be decided.
80
+ """
81
+
82
+ candidate_multiplicity = piece_1.real_length / piece_0.real_length
83
+
84
+ multiplicity = _int_or_none(
85
+ candidate_multiplicity, mcomplex.verified)
86
+ if multiplicity is None:
87
+ return False
88
+
89
+ # Compute translates of base points.
90
+ base = mcomplex.R13_baseTetInCenter
91
+
92
+ base_0 = base
93
+ for i in range(multiplicity):
94
+ base_0 = piece_0.o13_matrix * base_0
95
+
96
+ base_1 = piece_1.o13_matrix * base
97
+
98
+ # And then use the distance to see whether one matrix is
99
+ # a multiple of the other.
100
+ d = distance_r13_points(base_1, base_0)
101
+ if d < mcomplex.baseTetInRadius:
102
+ return True
103
+ if d > mcomplex.baseTetInRadius:
104
+ return False
105
+ raise InsufficientPrecisionError(
106
+ "Could not determine whether two pieces of a geodesic are the "
107
+ "same.\n"
108
+ "Distance of images of basepoints: %r.\n"
109
+ "Base tetrahedron in radius: %r.\n"
110
+ "Increasing precision should fix this." % (
111
+ d, mcomplex.baseTetInRadius))
112
+
113
+ def result(piece_0 : GeodesicPiece,
114
+ piece_1 : GeodesicPiece) -> bool:
115
+ """
116
+ Check whether the matrix of piece_0 is a multiple of
117
+ the matrix of piece_1 or vice versa.
118
+ """
119
+ if piece_0.real_length > piece_1.real_length:
120
+ return unsymmetrized_result(piece_1, piece_0)
121
+ else:
122
+ return unsymmetrized_result(piece_0, piece_1)
123
+
124
+ return result
125
+
126
+ _is_int_epsilon = 0.001
127
+
128
+ def _int_or_none(r, verified) -> Optional[int]:
129
+ if verified:
130
+ if r.floor() < r:
131
+ # We have verified that r contains no integer
132
+ # (r.floor() is an interval).
133
+ return None
134
+ is_int, r_int = r.is_int()
135
+ if is_int:
136
+ # We have verified that r contains a unique integer.
137
+ return r_int
138
+
139
+ # We get here for, e.g., RIF(0.5, 2.5).is_int()
140
+ raise InsufficientPrecisionError(
141
+ "Interval for multiplicity of geodesic contains multiple integers.")
142
+ else:
143
+ r_int = r.round()
144
+ if abs(r_int -r) < _is_int_epsilon:
145
+ return int(r_int)
146
+ return None
@@ -0,0 +1,182 @@
1
+ from .spine import add_spine
2
+
3
+ from ..geometric_structure import add_r13_geometry, add_filling_information
4
+ from ..geometric_structure.geodesic.add_core_curves import add_r13_core_curves
5
+ from ..geometric_structure.cusp_neighborhood.complex_cusp_cross_section import ComplexCuspCrossSection
6
+ from ..geometric_structure.cusp_neighborhood.vertices import scale_vertices_from_horotriangles
7
+
8
+ from ..cusps.trig_cusp_area_matrix import triangulation_dependent_cusp_area_matrix_from_cusp_cross_section
9
+ from ..cusps.cusp_areas_from_matrix import unbiased_cusp_areas_from_cusp_area_matrix
10
+ from ..tiling.triangle import add_triangles_to_tetrahedra
11
+ from ..math_basics import correct_min
12
+ from ..matrix import make_matrix
13
+ from ..snap.t3mlite import Mcomplex
14
+
15
+ from typing import Optional
16
+
17
+ def mcomplex_for_len_spec(
18
+ manifold, bits_prec : Optional[int], verified : bool) -> Mcomplex:
19
+ """
20
+ Convert a SnapPy manifold (wrapping a SnapPea kernel C triangulation) to
21
+ an Mcomplex (a python triangulation) and a geometric structures to the
22
+ Mcomplex necessary to compute the length spectrum.
23
+
24
+ The basic geometric structures are:
25
+ - the shapes of the ideal tetrahedra in tet.ShapeParameters
26
+ - the position of the vertices when developing the fundamental domain
27
+ in R13 in tet.R13_vertices (scaled to define a cusp neighborhood or
28
+ tube about a core curve, see later for details)
29
+ - the O13 face-pairing matrices between the tetrahedra in tet.O13_matrices
30
+ - to what (possibly trivial) generate a face-pairing belongs
31
+ in tet.GeneratorsInfo
32
+ - the plane equations for the faces (with normal facing outward)
33
+ in tet in tet.R13_planes and tet.R13_unnormalised_planes
34
+ - ideal triangles for each face in tet.R13_triangles
35
+ - the (possibly trivial) filling of each cusp as matrix tet.filling_matrix
36
+ encoding the filling curve as well as a cure parallel to the core curve.
37
+ - the core curves in tet.core_curve as R13LineWithMatrix
38
+
39
+ Furthermore, we also pick disjoint and embedded cusp neighborhoods (for
40
+ complete cusps) or tubes (for filled cusps) about the core curve for all
41
+ cusps.
42
+
43
+ We always work with horotriangles to truncate tetrahedra. That is, if we
44
+ have a tube about a core curve, we pick the horotriangles large
45
+ enough that they are fully outside the tube. Through a scale factor, we
46
+ also (indirectly) specify the horotriangles small enough that they are
47
+ fully inside the tube. So for a core curve, the truncated tetrahedra look
48
+ like a triangular version of the Giant's Causeway in Northern Ireland.
49
+
50
+ The picked horotriangles are such that the regions of a
51
+ tetrahedron they cut off are disjoint and do not cut-off the incenter of
52
+ the tetrahedron.
53
+
54
+ We use the cusp neighborhood choices and horotriangles to compute:
55
+ - the radius of the tube about the core curve in
56
+ cusp.core_curve_tube_radius so that if a geodesic goes through a
57
+ core curve, we can avoid developing the geodesic inside this tube
58
+ (which would require infinitely many pieces to reach the core curve)
59
+ by calling replace_piece_in_core_curve_tube.
60
+ - scale the tet.R13_vertices so that they define the horosphere that
61
+ cuts the tetrahedron in the picked horotriangle.
62
+
63
+ Recall that a spine of the triangulation has the key property that each
64
+ geodesic that is not a core curve is intersecting the spine.
65
+
66
+ We also use the cusp neighborhood choices and horotriangles to compute:
67
+ - use the tetrahedron's incenter as its spine center tet.spine_center.
68
+ - compute tet.out_radius, the radius (about the spine center) of a
69
+ tetrahedron truncated by the smaller horotriangles given by the scale
70
+ factor.
71
+ - tet.spine_radius is the radius of a ball about tet.spine_center
72
+ containing the restriction of the spine to the tetrahedron.
73
+ - tet.inv_spine_cosh = 1 / cosh(r) where r is the tet.spine_radius
74
+ - The spine center of the base tetrahedron is stored in
75
+ mcomplex.spine_center. We regard it as center for the lift of the
76
+ entire spine to H^3 and restricted to a fundamental domain.
77
+ mcomplex.spine_radius is the radius of a ball about this spine
78
+ center that contains the entire spine.
79
+ """
80
+
81
+ mcomplex = Mcomplex(manifold)
82
+
83
+ # Add shapes, vertex positions, face-pairings, plane equations,
84
+ # generator info
85
+ add_r13_geometry(mcomplex,
86
+ manifold,
87
+ verified=verified, bits_prec=bits_prec)
88
+ # Add tet.filling_matrix
89
+ add_filling_information(mcomplex, manifold)
90
+ # Add tet.core_curve
91
+ add_r13_core_curves(mcomplex, manifold)
92
+ # Add ideal triangles in tet.R13_triangles
93
+ add_triangles_to_tetrahedra(mcomplex)
94
+
95
+ # Pick disjoint/embedded cusp neighborhoods and tubes about core curves
96
+ # avoiding the incenter of each tetrahedron.
97
+ _add_and_scale_cusp_cross_section(mcomplex)
98
+
99
+ # Scale tet.R13_vertices to correspond to the just chosen horotriangles
100
+ scale_vertices_from_horotriangles(mcomplex)
101
+
102
+ # Construct spine.
103
+ add_spine(mcomplex)
104
+
105
+ return mcomplex
106
+
107
+ def _add_and_scale_cusp_cross_section(mcomplex : Mcomplex):
108
+ """
109
+ Pick disjoint/embedded cusp neighborhoods and tubes about core curves
110
+ avoiding the incenter of each tetrahedron.
111
+
112
+ Also store scaling factor for a horotriangle to be inside the chosen
113
+ tube about a core curve in inverse_scale_to_be_inside_tube.
114
+ """
115
+
116
+ c = ComplexCuspCrossSection(mcomplex)
117
+ c.add_structures(one_cocycle='develop')
118
+
119
+ # Develop vertices in C for incomplete cusps.
120
+ c.add_vertex_positions_to_horotriangles()
121
+ # The similarities about some point in C. But we want to work with
122
+ # similarities of C^*, so move.
123
+ c.move_fixed_point_to_zero()
124
+
125
+ c.scale_triangles_to_avoid_standard_tubes()
126
+
127
+ _scale_cusp_cross_section(c)
128
+
129
+ def _scale_cusp_cross_section(c : ComplexCuspCrossSection):
130
+ """
131
+ Scale horotriangles. That is scale all horotriangles belonging to
132
+ the same (complete or filled) cusp by the same factor.
133
+
134
+ We scale them such that the regions the horotriangles cut off a
135
+ particular tetrahedron are disjoint and don't cut-off the incenter.
136
+
137
+ Also compute the radius of the corresponding tube about the core curve
138
+ (that is contained inside the the regions we cut off and thus embedded
139
+ and disjoint from the other tubes or cusp neighborhoods).
140
+ """
141
+
142
+ # Cusp areas we start with. For a filled cusp, this is the area of the
143
+ # horotriangles that touch a standard tube about the core curve.
144
+ original_cusp_areas = c.cusp_areas()
145
+ # Maximal areas to avoid incenters of the tetrahedra
146
+ max_areas = [ area * (c.compute_scale_to_avoid_incenter(v) ** 2)
147
+ for v, area in zip(c.mcomplex.Vertices, original_cusp_areas) ]
148
+ cusp_area_matrix = (
149
+ triangulation_dependent_cusp_area_matrix_from_cusp_cross_section(c))
150
+ # Adjust the diagonal entries so that the incenter of a tetrahedron
151
+ # cannot be in a cusp neighborhoods/ horotriangles outside a tube about
152
+ # a core curve.
153
+ incenter_cusp_area_matrix = _min_matrix(cusp_area_matrix, max_areas)
154
+ cusp_areas = (
155
+ unbiased_cusp_areas_from_cusp_area_matrix(incenter_cusp_area_matrix))
156
+ c.normalize_cusps(cusp_areas)
157
+
158
+ # Compute (lower bound) on radius of tubes about core curves that are
159
+ # embedded/disjoint from the cusp neighborhoods.
160
+ for i, cusp in enumerate(c.mcomplex.Vertices):
161
+ if cusp.is_complete:
162
+ continue
163
+ cusp_area_scale = cusp_areas[i] / original_cusp_areas[i]
164
+ cusp_scale = cusp_area_scale.sqrt()
165
+ cusp.core_curve_tube_radius = cusp_scale.arcsinh()
166
+
167
+ def _min_matrix(m, diag_sqrt):
168
+ """
169
+ Compute new matrix by replacing the diagonal.
170
+
171
+ A new diagonal entry will be computed by taking the minimum of the
172
+ old entry and the square of the corresponding entry in diag_sqrt.
173
+ """
174
+
175
+ n = len(diag_sqrt)
176
+
177
+ return make_matrix(
178
+ [ [
179
+ m[i,j] if i != j
180
+ else correct_min([diag_sqrt[i] ** 2, m[i, j]])
181
+ for j in range(n)]
182
+ for i in range(n)])