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,210 @@
1
+ from ..snap.t3mlite import Mcomplex
2
+ from ..snap.t3mlite import simplex, Tetrahedron
3
+
4
+ from collections import deque
5
+
6
+ from typing import Dict
7
+
8
+
9
+ def install_peripheral_curves(start_tet : Tetrahedron) -> None:
10
+ """
11
+ Given a suitable base tetrahedron in the complex obtained by
12
+ crushing edges in the barycentric subdivision, compute a new
13
+ meridian and longitude.
14
+ """
15
+
16
+ # Also see notes about orientation below.
17
+ _install_meridian(start_tet)
18
+
19
+ # Longitude computed as curve intersecting meridian once, so
20
+ # we need to compute meridian first.
21
+ _install_longitude(start_tet)
22
+
23
+
24
+ def _walk_face(tet : Tetrahedron, ml : int, f : int) -> Tetrahedron:
25
+ """
26
+ Input is a tetrahedron, a number ml saying whether we want to
27
+ set the meridian or longitude and a t3mlite.simplex-style
28
+ face not equal to simplex.F0.
29
+
30
+ Add piece to peripheral curve to cusp triangle about vertex 0
31
+ corresponding to walking across the given face. Returns
32
+ tetrahedron after crossing the given face.
33
+ """
34
+
35
+ tet.PeripheralCurves[ml][tet.orientation][simplex.V0][f] = +1
36
+ tet = tet.Neighbor[f]
37
+ tet.PeripheralCurves[ml][tet.orientation][simplex.V0][f] = -1
38
+
39
+ return tet
40
+
41
+
42
+ def _install_meridian(start_tet : Tetrahedron) -> None:
43
+ # Before the barycentric subdivision, we can just pick a loop
44
+ # about one of the edges making up the geodesic (or closed
45
+ # simple curve isotopic to the geodesic) as meridian.
46
+ #
47
+ # Imagine a cusp triangle at one end of the edge in a tetrahedron
48
+ # adjacent to the edge. After the barycentric subdivision, the
49
+ # cusp triangle will be divided like this:
50
+ #
51
+ # 1
52
+ # /|\
53
+ # / | \
54
+ # / | \
55
+ # / | \
56
+ # 2* | *2
57
+ # / * | * \
58
+ # / c 3 \
59
+ # / * | * \
60
+ # / * | * \
61
+ # / * | * \
62
+ # / * c | b * \
63
+ # / * | * \
64
+ # 1------------2------------1
65
+ #
66
+ # The subtriangles c are crushed, but crush_geodesic_pieces has
67
+ # given us the subtetrahedron associated with subtriangle b. Thus,
68
+ # we can trace a meridian by going around the crushed subtriangles.
69
+ # That is, starting from the given subtetrahedron, we go through
70
+ # face 2, then 1, then 2, and then 3 (crossing to what used to be
71
+ # the next tetrahedron about the crushed edge) and so on until we
72
+ # are back at the given subtetrahedron.
73
+
74
+ tet = start_tet
75
+ while True:
76
+ for f in [ simplex.F2, simplex.F1, simplex.F2, simplex.F3 ]:
77
+ tet = _walk_face(tet, 0, f)
78
+ if tet is start_tet:
79
+ break
80
+
81
+
82
+ def _has_meridian(tet : Tetrahedron) -> bool:
83
+ for sheet in tet.PeripheralCurves[0]:
84
+ for v in sheet[simplex.V0].values():
85
+ if v != 0:
86
+ return True
87
+ return False
88
+
89
+
90
+ def _walk_tet_to_face(start_tet : Tetrahedron,
91
+ tet_to_face : Dict[Tetrahedron, int]) -> None:
92
+ tet = start_tet
93
+ while True:
94
+ tet = _walk_face(tet, 1, tet_to_face[tet])
95
+ if tet is start_tet:
96
+ break
97
+
98
+
99
+ def _install_longitude(start_tet : Tetrahedron):
100
+ """
101
+ Uses the meridian installed with _install_meridian to
102
+ find a curve crossing the meridian once.
103
+ """
104
+
105
+ # The following figure shows the meridian installed by
106
+ # _install_meridian in the vertex link.
107
+ # M denotes the meridian and tet1 is the peripheral
108
+ # base subtetetrahedron.
109
+ #
110
+ # 1
111
+ # / \
112
+ # / \
113
+ # / \
114
+ # / M \
115
+ # / M \
116
+ # / M \
117
+ # / M \
118
+ # 2---------------3---------------1
119
+ # / \ M tet1 / \ /
120
+ # / \ M / \ /
121
+ # / \ L M / \ /
122
+ # / L\ L/LM \ /
123
+ # / L \ / LML \ /
124
+ # / \ / M \ /
125
+ # / tet2 \ / tet0 M \ /
126
+ # 3---------------1---------------2
127
+ # / \ M /
128
+ # / \ M /
129
+ # / \ M /
130
+ # / \ M /
131
+ # / M \ /
132
+ # / M \ /
133
+ # / M \ /
134
+ # 2---------------3
135
+ #
136
+ # We start our longitude by traversing tet0, tet1 and tet2.
137
+ #
138
+ # To close it to a loop, we look for a path out from tet0 to tet2
139
+ # traversing only those cusp triangles not containing the meridian
140
+ # (maybe we should say: we are allowed to jump into a cusp triangle
141
+ # if it does not contain the meridian to go from tet0 to tet2 -
142
+ # since the very first piece of the path from tet0 to tet2 is in
143
+ # a cusp triangle that the meridian crosses).
144
+ #
145
+ # We find that path trough breadth-first search.
146
+
147
+ tet0 = start_tet
148
+ tet1 = start_tet.Neighbor[simplex.F2]
149
+ tet2 = tet1.Neighbor[simplex.F3]
150
+
151
+ if not _has_meridian(tet0):
152
+ raise Exception(
153
+ "start_tet expected to have meridian.")
154
+ if not _has_meridian(tet1):
155
+ raise Exception(
156
+ "F2-neighbor of start_tet expected to have meridian.")
157
+ if _has_meridian(tet2):
158
+ raise Exception(
159
+ "F3-enighbor of F2-neighbor of start_tet not expected to have "
160
+ "meridian.")
161
+
162
+ # For a tetrahedron stores the face through which this face was
163
+ # first reached. Thus, we can later trace back a path to the starting
164
+ # tetrahedron.
165
+ visited_tet_to_face = { tet1 : simplex.F3 }
166
+ pending_tets = deque([( tet0, simplex.F2)])
167
+ while True:
168
+ tet, entry_f = pending_tets.popleft()
169
+ if tet in visited_tet_to_face:
170
+ continue
171
+ visited_tet_to_face[tet] = entry_f
172
+ if tet is tet2:
173
+ break
174
+ for f in [ simplex.F1, simplex.F2, simplex.F3 ]:
175
+ neighbor = tet.Neighbor[f]
176
+ if f != entry_f and not _has_meridian(neighbor):
177
+ pending_tets.append((neighbor, f))
178
+
179
+ _walk_tet_to_face(start_tet, visited_tet_to_face)
180
+
181
+ # Notes on orientation
182
+ #
183
+ # We want to pick a longitude that is parallel (vs anti-parallel) to the
184
+ # drilled curve. That is, when embedding the drilled manifold into the
185
+ # undrilled manifold, the longitude is isotopic to the given geodesic.
186
+ #
187
+ # We also want to pick a meridian such that the orientations of the meridian,
188
+ # longitude and manifold are consistent according to the SnapPea kernel
189
+ # conventions (ideally, but not strictly necessary: if we flipped the
190
+ # meridian, the SnapPea kernel would actually flip it back).
191
+ #
192
+ # An important piece of achieving this is in crush.py where a subtetrahedron
193
+ # is picked as peripheral base. Picking that subtetrahedron both checks
194
+ # the orientation of the subtetrahedron with respect to the manifold and
195
+ # the orientation of its 0-1 edge with respect to the drilled geodesic
196
+ # are consistent. See _find_perm_for_piece.
197
+ #
198
+ # Several tests check that the orientation of the longitude is indeed correct.
199
+ #
200
+ # Checking that the meridian is picked correctly here cannot be done through
201
+ # tests since the SnapPea kernel can flip the meridian to make its orientation
202
+ # consistent with the longitude and manifold.
203
+ #
204
+ # To check the meridian, it is thus necessary to add printf's into the kernel
205
+ # and exercise Manifold.drill_word. The two if-branches where the kernel is
206
+ # flipping the meridian and that should not be executed are:
207
+ #
208
+ # "if (tet->cusp[v]->intersection_number[L][M] == -1)" in orient.c and
209
+ # "if (tet->cusp[i]->intersection_number[L][M] == -1)" in peripheral_curves.c
210
+ #
@@ -0,0 +1,188 @@
1
+ from . import constants
2
+ from . import epsilons
3
+ from . import exceptions
4
+
5
+ from ..geometric_structure.geodesic.tiles_for_geodesic import compute_tiles_for_geodesic
6
+ from ..geometric_structure.geodesic.geodesic_start_point_info import GeodesicStartPointInfo
7
+ from ..geometric_structure.geodesic.check_away_from_core_curve import check_away_from_core_curve_iter
8
+ from ..hyperboloid import ( # type: ignore
9
+ unit_time_vector_to_o13_hyperbolic_translation,
10
+ r13_dot,
11
+ time_r13_normalise)
12
+ from ..hyperboloid.line import R13Line
13
+ from ..hyperboloid.distances import distance_r13_lines, distance_r13_points
14
+ from ..tiling.triangle import add_triangles_to_tetrahedra
15
+ from ..snap.t3mlite import Mcomplex # type: ignore
16
+ from ..exceptions import InsufficientPrecisionError # type: ignore
17
+ from ..matrix import make_vector # type: ignore
18
+ from ..math_basics import correct_min # type: ignore
19
+
20
+ from typing import Sequence, Tuple, List, Any
21
+
22
+ # For perturbing, it is sufficient to just find some non-trivial
23
+ # lower bound for the embedding radius of a tube about a geodesic.
24
+ # To just any such bound, set _tube_developing_radius = 0.
25
+ # This will develop the tube just to the point where we can verify
26
+ # that it has positive radius.
27
+ #
28
+ # To stress-test our code, we can develop the tube further, by
29
+ # setting _tube_developing_radius > 0. The isotopy type of
30
+ # the drilled curve will not change no matter how large
31
+ # _tube_developing_radius is. In other words, we still compute
32
+ # a lower bound for the embedding radius which eventually will
33
+ # be the embedding radius up to rounding errors as
34
+ # _tube_developing_radius increases.
35
+ #
36
+ _tube_developing_radius = 0
37
+
38
+ def perturb_geodesics(
39
+ mcomplex : Mcomplex,
40
+ geodesics : Sequence[GeodesicStartPointInfo],
41
+ verbose=False):
42
+ """
43
+ Given a triangulation with structures added by add_r13_geometry
44
+ and GeodesicStartPointInfo's with start points on the line that is a lift
45
+ of the closed geodesic, perturbs the start point away from the line
46
+ and computes a new end point (as image of the new start point under
47
+ the matrix associated to the geodesic line). The line segment
48
+ from the start point to the end point forms a simple closed
49
+ curve in the manifold which is guaranteed to be isotopic to the
50
+ closed geodesic.
51
+
52
+ If several GeodesicStartPointInfo's are given and/or there are filled
53
+ cusps with core curves, the system of simple closed curves
54
+ resulting from the perturbation together with the core curves
55
+ is guaranteed to be isotopic to the original system of closed
56
+ geodesics together with the core curves.
57
+
58
+ Through the perturbation, the simple closed curve should avoid
59
+ the 1-skeleton (more precision might be required to see this).
60
+ In particular, the start point should be in the interior of
61
+ a tetrahedron and trace_geodesic should succeed.
62
+ An example where trace_geodesic would not succeed without
63
+ perturbation is e.g., the geodesic 'a' in m125 which lies entirely
64
+ in the 2-skeleton.
65
+ """
66
+
67
+ if mcomplex.verified:
68
+ epsilon = 0
69
+ else:
70
+ epsilon = epsilons.compute_tube_injectivity_radius_epsilon(mcomplex.RF)
71
+
72
+ # Compute a lower bound for the maximal distance we can
73
+ # perturb the start points before we might change the isotopy class.
74
+ #
75
+ r = compute_lower_bound_injectivity_radius(mcomplex, geodesics)
76
+
77
+ if verbose:
78
+ print("Tubes lower bound injectivity radius:", r)
79
+
80
+ # If the distance between two different closed geodesics or
81
+ # between two different lifts of the same geodesic (that is the
82
+ # closed geodesic is not simple) or between
83
+ # a closed geodesic and a core curve is zero, raise exception that
84
+ # the system is not simple.
85
+ if not r > epsilon:
86
+ raise exceptions.GeodesicSystemNotSimpleError(r)
87
+
88
+ # Perturb each geodesic using above amount
89
+ for g in geodesics:
90
+ perturb_geodesic(g, r, mcomplex.verified)
91
+
92
+ def compute_lower_bound_injectivity_radius(
93
+ mcomplex : Mcomplex,
94
+ geodesics : Sequence[GeodesicStartPointInfo]):
95
+
96
+ if len(geodesics) == 0:
97
+ raise Exception("No geodesic tubes given")
98
+
99
+ add_triangles_to_tetrahedra(mcomplex)
100
+
101
+ min_radius = mcomplex.RF(_tube_developing_radius)
102
+
103
+ distances = []
104
+
105
+ tet_to_lines : List[List[R13Line]] = [[] for tet in mcomplex.Tetrahedra ]
106
+
107
+ core_curve_epsilon = _compute_core_curve_epsilon(mcomplex)
108
+
109
+ for geodesic in geodesics:
110
+ for tile in (
111
+ check_away_from_core_curve_iter(
112
+ compute_tiles_for_geodesic(mcomplex, geodesic),
113
+ epsilon=core_curve_epsilon,
114
+ obj_name='Geodesic %s' % geodesic.word)):
115
+ if tile.lower_bound_distance > min_radius:
116
+ distances.append(tile.lower_bound_distance)
117
+ break
118
+ tet_index = tile.lifted_tetrahedron.tet.Index
119
+ tet_to_lines[tet_index].append(
120
+ tile.inverse_lifted_geometric_object)
121
+
122
+ for tet in mcomplex.Tetrahedra:
123
+ for curve in tet.core_curves.values():
124
+ tet_to_lines[tet.Index].append(curve.r13_line)
125
+
126
+ for r13_lines in tet_to_lines:
127
+ for i, r13_line0 in enumerate(r13_lines):
128
+ for r13_line1 in r13_lines[:i]:
129
+ distances.append(distance_r13_lines(r13_line0, r13_line1))
130
+
131
+ return correct_min(distances) / 2
132
+
133
+
134
+ def perturb_geodesic(geodesic : GeodesicStartPointInfo,
135
+ injectivity_radius,
136
+ verified : bool):
137
+ if geodesic.line is None:
138
+ raise ValueError("GeodesicStartPointInfo needs line to be perturbed.")
139
+
140
+ perturbed_point = perturb_unit_time_point(
141
+ time_r13_normalise(geodesic.unnormalised_start_point),
142
+ max_amt=injectivity_radius,
143
+ verified=verified)
144
+
145
+ m = geodesic.line.o13_matrix
146
+
147
+ geodesic.unnormalised_start_point = perturbed_point
148
+ geodesic.unnormalised_end_point = m * perturbed_point
149
+ geodesic.line = None
150
+
151
+ geodesic.find_tet_or_core_curve()
152
+
153
+
154
+ def perturb_unit_time_point(point, max_amt, verified : bool):
155
+
156
+ RF = point.base_ring()
157
+
158
+ amt = RF(0.5) * max_amt
159
+ direction = make_vector(
160
+ [RF(x) for x in constants.point_perturbation_direction])
161
+ perturbed_origin = make_vector(
162
+ [ amt.cosh() ] + list(amt.sinh() * direction.normalized()))
163
+
164
+ m = unit_time_vector_to_o13_hyperbolic_translation(point)
165
+ perturbed_point = m * perturbed_origin
166
+
167
+ if not verified:
168
+ return perturbed_point
169
+
170
+ space_coords = [ RF(x.center()) for x in perturbed_point[1:4] ]
171
+ time_coord = sum((x**2 for x in space_coords), RF(1)).sqrt()
172
+ perturbed_point = make_vector([time_coord] + space_coords)
173
+
174
+ d = distance_r13_points(point, perturbed_point)
175
+ if not d < RF(0.75) * max_amt:
176
+ raise InsufficientPrecisionError(
177
+ "Could not verify perturbed point is close enough to original "
178
+ "start point. "
179
+ "Increasing the precision will probably fix this.")
180
+
181
+ return perturbed_point
182
+
183
+ def _compute_core_curve_epsilon(mcomplex):
184
+ if mcomplex.verified:
185
+ return 0
186
+ else:
187
+ RF = mcomplex.RF
188
+ return RF(0.5) ** (RF.prec() // 2 - 8)
@@ -0,0 +1,36 @@
1
+ from .cusps import CuspPostDrillInfo
2
+ from .barycentric import transpositions, perm_to_index, mark_subtetrahedra_about_edge
3
+
4
+ from ..snap.t3mlite import Tetrahedron, Perm4, simplex
5
+
6
+
7
+ def shorten_in_barycentric_subdivision(tetrahedra, verbose : bool = False):
8
+ while shorten_one_in_barycentric_subdivision(tetrahedra):
9
+ if verbose:
10
+ print("Shortening geodesic by sweeping across triangle.")
11
+
12
+ def shorten_one_in_barycentric_subdivision(tetrahedra):
13
+ for tet in tetrahedra:
14
+ for perm, orientation in zip(Perm4.S4(), tet.marked_subtetrahedra):
15
+ if orientation != +1:
16
+ continue
17
+ other_perm = perm * transpositions[1]
18
+ j = perm_to_index(other_perm)
19
+ if tet.marked_subtetrahedra[j] == 0:
20
+ continue
21
+ mark_subtetrahedra_about_edge(tet, perm, 0)
22
+ mark_subtetrahedra_about_edge(tet, other_perm, 0)
23
+ new_perm = perm * Perm4((1,2,0,3))
24
+ mark_subtetrahedra_about_edge(tet, new_perm)
25
+ _remove_post_drill_info_from_vertex(tet, perm.image(simplex.V0))
26
+ return True
27
+ return False
28
+
29
+ def _remove_post_drill_info_from_vertex(tet, v):
30
+ if tet.post_drill_infos[v].index is None:
31
+ return
32
+ tet.post_drill_infos[v] = CuspPostDrillInfo()
33
+ for f in simplex.FacesAroundVertexCounterclockwise[v]:
34
+ _remove_post_drill_info_from_vertex(
35
+ tet.Neighbor[f],
36
+ tet.Gluing[f].image(v))