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,270 @@
1
+ from .cusps import CuspPostDrillInfo
2
+ from .peripheral_curves import install_peripheral_curves
3
+ from .barycentric import transpositions, perm_to_index
4
+
5
+ from ..snap.t3mlite import Tetrahedron, Perm4, Mcomplex, simplex
6
+
7
+ from typing import Set, Sequence
8
+
9
+ def crush_geodesic_pieces(tetrahedra : Sequence[Tetrahedron]) -> Mcomplex:
10
+ """
11
+ Given tetrahedra produced by traverse_geodesics_to_subdivide,
12
+ compute the barycentric subdivision and crush all subtetrahedra in the
13
+ barycentric subdivision that have been marked as being adjacent to an edge
14
+ that coincides with a GeodesicPiece.
15
+
16
+ The function mark_subtetrahedra_about_geodesic_pieces marks the
17
+ subtetrahedra as described above.
18
+ """
19
+
20
+ # We call the tetrahedra in the barycentric subdivision subtetrahedra
21
+ # to distinguish them from the original tetrahedra.
22
+
23
+ # We order the vertices of a subtetrahedra such that 0 corresponds to an
24
+ # original vertex, vertex 1 to an edge center, ... of a tetrahedron.
25
+ # This means that half of the subtetrahedra have the orientation
26
+ # reversed from the tetrahedron.
27
+
28
+ # While it is conceptually easier to think of creating the barycentric
29
+ # subdivision and then doing the crushing in two steps, we actually do
30
+ # not create a separate Mcomplex for the intermediate barycentric
31
+ # subdivison.
32
+
33
+ # Recall that each subtetrahedron in the barycentric subdivision
34
+ # is given by a pair of a tetrahedron tet and a permutation p.
35
+ # Using the index i that p has in Perm4.S4, we index
36
+ # a subtetrahedron by 24 * tet.Index + i.
37
+
38
+ # The subtetrahedra that are supposed to be curshed in the barycentric
39
+ # are assumed to be marked in tet.marked_subtetrahedra.
40
+ #
41
+ # Later, we also pick a subtetrahedron for each simple closed curve to
42
+ # compute a new meridian and longitude.
43
+
44
+ # Use bit mask to create the subtetrahedra surviving the crushing.
45
+ subtetrahedra = [
46
+ Tetrahedron() if marked_subtet == 0 else None
47
+ for tet in tetrahedra
48
+ for marked_subtet in tet.marked_subtetrahedra ]
49
+
50
+ _assign_orientations(subtetrahedra)
51
+
52
+ # Now glue the subtetrahedra in the crushed complex.
53
+ # Also carry forward post drill infos and peripheral curves.
54
+ for tet in tetrahedra:
55
+ for i, perm in enumerate(Perm4.S4()):
56
+ subtet_index = 24 * tet.Index + i
57
+ subtet = subtetrahedra[subtet_index]
58
+
59
+ if subtet is None:
60
+ continue
61
+
62
+ # The gluings internal (between subtetrahedra of the
63
+ # same tetrahedron)
64
+ for face in range(3):
65
+ other_perm = perm * transpositions[face]
66
+ j = perm_to_index(other_perm)
67
+ other_subtet_index = 24 * tet.Index + j
68
+ if face == 1 and tet.marked_subtetrahedra[j] != 0:
69
+ # We are processing subtetrahedron t and its
70
+ # neighbor c is adjacent to a GeodesicPiece (=)
71
+ # and thus it and its neighbor c' get crushed.
72
+ # Thus, we need to glue t to t'.
73
+ #
74
+ # 0
75
+ # /|\
76
+ # / | \
77
+ # / | \
78
+ # / | \
79
+ # 1* | *1
80
+ # / * | * \
81
+ # / t 2 t' \
82
+ # / * | * \
83
+ # / * | * \
84
+ # / * | * \
85
+ # / * c | c' * \
86
+ # / * | * \
87
+ # 0============1============0
88
+ #
89
+ other_perm = perm * Perm4((2,1,0,3))
90
+ j = perm_to_index(other_perm)
91
+ other_subtet_index = 24 * tet.Index + j
92
+ # attach is working symmetrically also setting the Neighbors
93
+ # and Gluings of the other tetrahedron, so only call it once
94
+ # per face-pairing
95
+ if j > i:
96
+ subtet.attach(simplex.TwoSubsimplices[face],
97
+ subtetrahedra[other_subtet_index],
98
+ (0,1,2,3))
99
+
100
+ # The external gluing.
101
+ vertex = perm.image(simplex.V0)
102
+ face = perm.image(simplex.F3)
103
+ other_tet = tet.Neighbor[face]
104
+ other_perm = tet.Gluing[face] * perm
105
+ j = perm_to_index(other_perm)
106
+ other_subtet_index = 24 * other_tet.Index + j
107
+ if other_subtet_index > subtet_index:
108
+ subtet.attach(simplex.F3,
109
+ subtetrahedra[other_subtet_index],
110
+ (0,1,2,3))
111
+
112
+ # Only vertex 0 corresponds to an original vertex.
113
+ # The other vertices will actually be finite, i.e., have
114
+ # spherical vertex links.
115
+ subtet.post_drill_infos = {
116
+ simplex.V0 : tet.post_drill_infos[vertex],
117
+ simplex.V1 : CuspPostDrillInfo(),
118
+ simplex.V2 : CuspPostDrillInfo(),
119
+ simplex.V3 : CuspPostDrillInfo() }
120
+
121
+ # Transfer peripheral curves. Note that for the same reason
122
+ # this is only relevant for vertex 0.
123
+ #
124
+ # Recall that SnapPea stores the peripheral curves on the
125
+ # half-edges of the dual 1-skeleton of the cusp triangulation.
126
+ #
127
+ # tet.PeripheralCurves is a structure similar to the one in the
128
+ # SnapPea kernel (see peripheral_curves.c for more info) nested
129
+ # as follows:
130
+ # - list for meridian and longitude
131
+ # - list for sheets in orientation double-cover of cusp triangle
132
+ # - dict with key being the vertex where the cusp triangle is
133
+ # - dict with key being a face of tetrahedron. The face intersects
134
+ # the cusp triangle in an edge. The value says how often the
135
+ # dual half-edge participates in the peripheral curve.
136
+ #
137
+ # After the barycentric subdivision, the original cusp triangle
138
+ # is split as shown:
139
+ #
140
+ # 1
141
+ # /|\
142
+ # / | \
143
+ # / | \
144
+ # / | \ The six new cusp triangles
145
+ # 2* | *2
146
+ # / * | * \
147
+ # / 3 \
148
+ # / * | * \
149
+ # / * | * \
150
+ # / * | * \
151
+ # / * | * \
152
+ # / * | * \
153
+ # 1------------2------------1
154
+ #
155
+ # We first transfer the original peripheral curves to the dual
156
+ # half-edges opposite vertex 3 in the above picture.
157
+ # The resulting chain will thus temporarily fail to be a cycle.
158
+ # Later, we fix the chains to be cycles again by adding values
159
+ # to the half-edges forming a circle about vertex 3 in the
160
+ # above picture - in _fix_all_peripheral_curves.
161
+
162
+ subtet.needs_peripheral_curves_fixed = False
163
+ subtet.PeripheralCurves = [
164
+ [ { v : { f : 0 for f in simplex.TwoSubsimplices }
165
+ for v in simplex.ZeroSubsimplices }
166
+ for sheet in range(2) ]
167
+ for ml in range(2) ]
168
+ for ml in range(2): # For meridian and longitude
169
+ for sheet in range(2): # For two-sheets in orientation-double cover
170
+ p = tet.PeripheralCurves[ml][sheet][vertex][face]
171
+ # Note that in the above picture, an edge of the original
172
+ # cusp triangle is split into two. Thus, we have two triangles
173
+ # to pick from when transferring the value of an old dualf
174
+ # half-edge to the new cusp triangles.
175
+ #
176
+ # We do these choices so that the cycle condition is at least
177
+ # fulfilled for the edges coinciding with the edges of the
178
+ # original cusp triangle.
179
+ if p > 0 and perm.sign() == 0:
180
+ subtet.PeripheralCurves[ml][sheet][simplex.V0][simplex.F3] = p
181
+ subtet.needs_peripheral_curves_fixed = True
182
+ elif p < 0 and perm.sign() == 1:
183
+ subtet.PeripheralCurves[ml][1 - sheet][simplex.V0][simplex.F3] = p
184
+
185
+ _fix_all_peripheral_curves(subtetrahedra)
186
+
187
+ # Find peripheral curves for each cusps created by crushing the simple
188
+ # closed curves.
189
+ # Record which of these cusps was already processed to only do this once
190
+ # per cusp.
191
+ new_cusp_indices : Set[int] = set()
192
+ for tet in tetrahedra:
193
+ for perm, orientation in zip(Perm4.S4(), tet.marked_subtetrahedra):
194
+ # We found a subtetrahedron adjacent to a geodesic piece.
195
+ #
196
+ # Make sure its 0-1 edge is parallel and not anti-parallel to
197
+ # the geodesic piece. This way the longitude will be parallel to
198
+ # the geodesic piece.
199
+ if orientation != +1:
200
+ continue
201
+ # Check orientation of subtetrahedron so that the orientation of
202
+ # the meridian relative to the longitude matches the orientation of the
203
+ # cusp.
204
+ if perm.sign() == 1:
205
+ continue
206
+ v : int = perm.image(simplex.V0)
207
+ cusp_index : int = tet.post_drill_infos[v].index
208
+ if cusp_index is None:
209
+ raise Exception("Vertex on geodesic has no assigned cusp")
210
+ if cusp_index in new_cusp_indices:
211
+ continue
212
+ # First time we encounter this simple closed curve. Pick a base
213
+ # tet to install the meridian and longitude.
214
+ # This base tet better not be one of the subtetrahedra that is
215
+ # crushed. So pick a neighbor of the subtetrahedron adjacent
216
+ # to the geodesic piece.
217
+ other_perm = perm * transpositions[1]
218
+ subtet_index = 24 * tet.Index + perm_to_index(other_perm)
219
+ install_peripheral_curves(subtetrahedra[subtet_index])
220
+ new_cusp_indices.add(cusp_index)
221
+
222
+ # To preserve the orientation, make sure that the first subtetrahedron
223
+ # we pass to Mcomplex has the same orientation as the original tetrahedron
224
+ # - since the SnapPea kernel will use the first tetrahedron of an
225
+ # orientable triangulation to orient it.
226
+ return Mcomplex([ subtet
227
+ for s in [0, 1]
228
+ for subtet in subtetrahedra
229
+ if subtet and subtet.orientation == s ])
230
+
231
+ def _assign_orientations(subtetrahedra):
232
+ for j in range(len(subtetrahedra) // 24):
233
+ for i, perm in enumerate(Perm4.S4()):
234
+ subtet_index = 24 * j + i
235
+ subtet = subtetrahedra[subtet_index]
236
+ if subtet:
237
+ subtet.orientation = perm.sign()
238
+
239
+
240
+ def _fix_peripheral_curves(subtet):
241
+ """
242
+ Traverse the six new cusp triangles shown in one
243
+ of the figures in crush_geodesic_pieces.
244
+ """
245
+ for i in range(6):
246
+ subtet.needs_peripheral_curves_fixed = False
247
+
248
+ if i % 2 == 0:
249
+ face0, face1 = simplex.F1, simplex.F2
250
+ else:
251
+ face0, face1 = simplex.F2, simplex.F1
252
+ neighbor = subtet.Neighbor[face1]
253
+ for ml in range(2):
254
+ for sheet in range(2):
255
+ tri = subtet.PeripheralCurves[ml][sheet][simplex.V0]
256
+ p = tri[face0] + tri[simplex.F3]
257
+ tri[face1] = -p
258
+ neighbor.PeripheralCurves[ml][1-sheet][simplex.V0][face1] = p
259
+ subtet = neighbor
260
+
261
+
262
+ def _fix_all_peripheral_curves(subtetrahedra):
263
+ """
264
+ Fix peripheral curves for all subtetrahedra that require it, see
265
+ crush_geodesic_pieces where the needs_peripheral_curves_fixed flag
266
+ was raised for details.
267
+ """
268
+ for subtet in subtetrahedra:
269
+ if subtet and subtet.needs_peripheral_curves_fixed:
270
+ _fix_peripheral_curves(subtet)
@@ -0,0 +1,125 @@
1
+ from ..geometric_structure.geodesic.geodesic_start_point_info import GeodesicStartPointInfo
2
+ from ..geometric_structure import Filling, FillingMatrix
3
+
4
+ from ..snap.t3mlite import Mcomplex, simplex
5
+
6
+ from . import exceptions
7
+
8
+ from typing import Tuple, Optional, Sequence
9
+
10
+ # @dataclass
11
+
12
+
13
+ class CuspPostDrillInfo:
14
+ """
15
+ Information carried around to be applied after drilling
16
+ the manifold when re-indexing the cusps, re-applying the
17
+ Dehn-fillings or changing the peripheral curve when drilling
18
+ a core curve.
19
+
20
+ Note that we store this information sometime on a
21
+ snappy.snap.t3mlite.Vertex as post_drill_info and sometimes
22
+ as a dictionary tet.post_drill_infos on each tetrahedron assigning
23
+ a CuspPostDrillInfo to each vertex of the tetrahedron. The latter
24
+ representation is more redundant as we need to store the same
25
+ CuspPostDrillInfo to each vertex of each tetrahedron belonging to
26
+ the same vertex class - but is also more convenient in certain
27
+ circumstances.
28
+ """
29
+
30
+ def __init__(self,
31
+ # Index this vertex will have in the drilled manifold.
32
+ # None if vertex is a finite vertex.
33
+ index : Optional[int] = None,
34
+ # Filling that needs to be applied after drilling the
35
+ # manifold. (0,0) if cusps will be left unfilled.
36
+ filling : Filling = (0, 0),
37
+ # Optional adjustment of peripheral curves performed
38
+ # to drilled manifold with Manifold.set_peripheral_curves.
39
+ peripheral_matrix : Optional[FillingMatrix] = None):
40
+ self.index = index
41
+ self.filling = filling
42
+ self.peripheral_matrix = peripheral_matrix
43
+
44
+ def __eq__(self, other):
45
+ """
46
+ Used for debugging.
47
+ """
48
+ return (self.index == self.index and
49
+ self.filling == self.filling and
50
+ self.peripheral_matrix == self.peripheral_matrix)
51
+
52
+
53
+ def index_geodesics_and_add_post_drill_infos(
54
+ geodesics : Sequence[GeodesicStartPointInfo],
55
+ mcomplex : Mcomplex) -> None:
56
+
57
+ all_reindexed_verts = {
58
+ g.core_curve_cusp for g in geodesics if g.core_curve_cusp}
59
+
60
+ old_vertices = [v for v in mcomplex.Vertices
61
+ if v not in all_reindexed_verts]
62
+
63
+ for i, v in enumerate(old_vertices):
64
+ v.post_drill_info = CuspPostDrillInfo(
65
+ index=i, filling=v.filling_matrix[0])
66
+
67
+ n = len(old_vertices)
68
+
69
+ for i, g in enumerate(geodesics):
70
+ if g.core_curve_cusp:
71
+ if g.core_curve_multiplicity not in [-1, +1]:
72
+ raise exceptions.GeodesicMultipleOfCoreCurve(
73
+ g.word, g.core_curve_multiplicity)
74
+
75
+ g.core_curve_cusp.post_drill_info = CuspPostDrillInfo(
76
+ index=n + i,
77
+ peripheral_matrix=_multiply_filling_matrix(
78
+ g.core_curve_cusp.filling_matrix,
79
+ g.core_curve_multiplicity))
80
+ else:
81
+ g.index = n + i
82
+
83
+ for tet in mcomplex.Tetrahedra:
84
+ tet.post_drill_infos = {
85
+ V : tet.Class[V].post_drill_info
86
+ for V in simplex.ZeroSubsimplices }
87
+
88
+
89
+ def reorder_vertices_and_get_post_drill_infos(
90
+ mcomplex : Mcomplex) -> Sequence[CuspPostDrillInfo]:
91
+
92
+ cusp_vertices_dict = { }
93
+ finite_vertices = [ ]
94
+ for vert in mcomplex.Vertices:
95
+ c = vert.Corners[0]
96
+ post_drill_info = c.Tetrahedron.post_drill_infos[c.Subsimplex]
97
+ vert.post_drill_info = post_drill_info
98
+ if post_drill_info.index is None:
99
+ finite_vertices.append(vert)
100
+ else:
101
+ cusp_vertices_dict[post_drill_info.index] = vert
102
+
103
+ cusp_vertices = [ cusp_vertices_dict[i]
104
+ for i in range(len(cusp_vertices_dict)) ]
105
+
106
+ mcomplex.Vertices = cusp_vertices + finite_vertices
107
+
108
+ return [ v.post_drill_info for v in cusp_vertices ]
109
+
110
+
111
+ def refill_and_adjust_peripheral_curves(
112
+ manifold,
113
+ post_drill_infos : Sequence[CuspPostDrillInfo]) -> None:
114
+
115
+ manifold.dehn_fill([ info.filling for info in post_drill_infos])
116
+
117
+ for info in post_drill_infos:
118
+ if info.peripheral_matrix is not None:
119
+ manifold.set_peripheral_curves(
120
+ info.peripheral_matrix, which_cusp=info.index)
121
+
122
+
123
+ def _multiply_filling_matrix(m : FillingMatrix, s : int) -> FillingMatrix:
124
+ return ((s * m[0][0], s * m[0][1]),
125
+ (s * m[1][0], s * m[1][1]))
@@ -0,0 +1,242 @@
1
+ from ..snap.t3mlite import simplex
2
+ from ..matrix import make_identity_matrix
3
+ from ..hyperboloid import *
4
+
5
+
6
+ def _find_all_tetrahedra(tet):
7
+ result = [ ]
8
+ pending_tets = [ tet ]
9
+ visited_tets = set()
10
+ while pending_tets:
11
+ tet = pending_tets.pop()
12
+ if tet not in visited_tets:
13
+ visited_tets.add(tet)
14
+ result.append(tet)
15
+ for neighbor in tet.Neighbor.values():
16
+ pending_tets.append(neighbor)
17
+ return result
18
+
19
+
20
+ def check_peripheral_curves(tets):
21
+ for tet in tets:
22
+ for f in simplex.TwoSubsimplices:
23
+ neighbor = tet.Neighbor[f]
24
+ gluing = tet.Gluing[f]
25
+ other_f = gluing.image(f)
26
+ sgn = gluing.sign()
27
+ for v in simplex.ZeroSubsimplices:
28
+ v_comp = simplex.comp(v)
29
+ other_v = gluing.image(v)
30
+ for ml in range(2):
31
+ for sheet_index in range(2):
32
+ sheet = tet.PeripheralCurves[ml][sheet_index][v]
33
+ if f == v_comp:
34
+ if sum(sheet.values()) != 0:
35
+ raise Exception("Not adding up to zero. %r" % tet)
36
+ if sheet[v_comp] != 0:
37
+ raise Exception("Diagonal entry for peripheral curve.")
38
+ else:
39
+ if sgn == 0:
40
+ other_sheet_index = 1 - sheet_index
41
+ else:
42
+ other_sheet_index = sheet_index
43
+ a = sheet[f]
44
+ b = neighbor.PeripheralCurves[ml][other_sheet_index][other_v][other_f]
45
+ if a + b != 0:
46
+ raise Exception("Peripheral curve not adding up.")
47
+
48
+
49
+ def check_vertex_indices(tets):
50
+ for tet in tets:
51
+ for v in simplex.ZeroSubsimplices:
52
+ index = tet.post_drill_infos[v]
53
+ for f in simplex.TwoSubsimplices:
54
+ if v & f:
55
+ if tet.Neighbor[f].post_drill_infos[tet.Gluing[f].image(v)] != index:
56
+ print("tet, v face:", tet, v, f)
57
+ print("index and other index:", index, tet.Neighbor[f].post_drill_infos, [tet.Gluing[f].image(v)])
58
+ raise Exception("Neighbors don't have same vertex.")
59
+
60
+
61
+ def check_points_equal(v0, v1):
62
+ RF = v0[0].parent()
63
+
64
+ if abs(r13_dot(v0, v0)) < RF(1e-10):
65
+ if abs(r13_dot(v1, v1)) > RF(1e-10):
66
+ raise Exception("Light-like vs time-like:", v0, v1)
67
+ if abs(r13_dot(v0, v1)) > RF(1e-10):
68
+ raise Exception("Non-colinlinear light like:", v0, v1)
69
+ else:
70
+ if any(abs(x - y) > RF(1e-10) for x, y in zip(v0, v1)):
71
+ raise Exception("Different time-like:", v0, v1)
72
+
73
+
74
+ def check_points_consistency(m):
75
+ for tet in m.Tetrahedra:
76
+ for F in simplex.TwoSubsimplices:
77
+ for V in simplex.ZeroSubsimplices:
78
+ if V & F:
79
+ check_points_equal(
80
+ tet.O13_matrices[F] * tet.R13_vertices[V],
81
+ tet.Neighbor[F].R13_vertices[tet.Gluing[F].image(V)])
82
+
83
+
84
+ def check_edge_consistency(m):
85
+ RF = m.Tetrahedra[0].O13_matrices[simplex.F0].base_ring()
86
+ id_matrix = make_identity_matrix(ring=RF, n=4)
87
+
88
+ for e in m.Edges:
89
+ t = id_matrix
90
+ for tet, perm in e.embeddings():
91
+ t = tet.O13_matrices[perm.image(simplex.F2)] * t
92
+ t = t - id_matrix
93
+ for i in range(4):
94
+ for j in range(4):
95
+ if abs(t[i,j]) > RF(1e-10):
96
+ raise Exception("Edge not gluing up")
97
+
98
+
99
+ def check_geodesic1(tets):
100
+ RF = tets[0].O13_matrices[simplex.F0].base_ring()
101
+
102
+ for tet in tets:
103
+ for geodesic_segment in tet.geodesic_pieces:
104
+ if geodesic_segment.tet is not tet:
105
+ raise Exception("Geodesic tet inconsistency")
106
+
107
+ for ptInClass in geodesic_segment.endpoints:
108
+ if ptInClass.subsimplex in simplex.ZeroSubsimplices:
109
+ check_points_equal(
110
+ ptInClass.r13_point,
111
+ tet.R13_vertices[ptInClass.subsimplex])
112
+ else:
113
+ if abs(r13_dot(ptInClass.r13_point, tet.R13_planes[ptInClass.subsimplex])) > RF(1e-10):
114
+ raise Exception("Point not on plane")
115
+
116
+
117
+ def check_consistency(mcomplex):
118
+ check_edge_consistency(mcomplex)
119
+ check_points_consistency(mcomplex)
120
+ check_geodesic1(mcomplex.Tetrahedra)
121
+
122
+
123
+ def check_consistency_segments(segments):
124
+ for i in range(len(segments)):
125
+ s0 = segments[i]
126
+ s1 = segments[(i+1) % len(segments)]
127
+
128
+ if s0.tet.Class[s0.endpoints[1].subsimplex] is not s1.tet.Class[s1.endpoints[0].subsimplex]:
129
+ raise Exception("Classes of consecutive segments not matching %i" % i)
130
+
131
+ if s0.next_ is not s1:
132
+ raise Exception("Linked list broken (next)")
133
+ if s1.prev is not s0:
134
+ raise Exception("Linked list broken (prev)")
135
+
136
+ if s0.endpoints[1].subsimplex in simplex.TwoSubsimplices:
137
+ check_points_equal(
138
+ s0.tet.O13_matrices[s0.endpoints[1].subsimplex] * s0.endpoints[1].r13_point,
139
+ s1.endpoints[0].r13_point)
140
+
141
+
142
+ def print_cell(f):
143
+ if f in simplex.ZeroSubsimplices:
144
+ return "V"
145
+ if f in simplex.TwoSubsimplices:
146
+ return "F"
147
+ if f == simplex.T:
148
+ return "T"
149
+ raise Exception("BLAH")
150
+
151
+
152
+ def output_linked(x, tets_set):
153
+ y = x
154
+ while True:
155
+ # print(y)
156
+ print(print_cell(y.endpoints[0].subsimplex) + "-----" + print_cell(y.endpoints[1].subsimplex), end=" ")
157
+ y = y.next_
158
+ if x is y:
159
+ break
160
+
161
+ print()
162
+
163
+ y = x
164
+ while True:
165
+ print("%2d---%2d" % (y.endpoints[0].subsimplex, y.endpoints[1].subsimplex), end=" ")
166
+ y = y.next_
167
+ if x is y:
168
+ break
169
+
170
+ print()
171
+
172
+ y = x
173
+ while True:
174
+ if y.tet in tets_set:
175
+ print(" * ", end=" ")
176
+ else:
177
+ print(" ", end=" ")
178
+ y = y.next_
179
+ if x is y:
180
+ break
181
+
182
+ print()
183
+ print()
184
+
185
+
186
+ def flatten_link_list(x):
187
+ y = x
188
+ l = []
189
+ while True:
190
+ l.append(y)
191
+ y = y.next_
192
+ if x is y:
193
+ return l
194
+
195
+
196
+ def check_consistency_2(piece):
197
+ tets = _find_all_tetrahedra(piece.tet)
198
+
199
+ tets_set = set(tets)
200
+
201
+ to_pieces_map = { }
202
+
203
+ num_pieces = 0
204
+
205
+ for tet in tets:
206
+ for piece in tet.geodesic_pieces:
207
+
208
+ num_pieces += 1
209
+
210
+ if piece.tet is not tet:
211
+ raise Exception("Piece.tet not pointing to tet.")
212
+ if piece.next_.prev is not piece:
213
+ raise Exception("Link list broken.")
214
+ if piece.prev.next_ is not piece:
215
+ raise Exception("Link list broken.")
216
+
217
+ if piece.index != piece.next_.index:
218
+ raise Exception("Index inconsistent.")
219
+
220
+ if piece.index != piece.prev.index:
221
+ raise Exception("Index inconsistent.")
222
+
223
+ if piece.index not in to_pieces_map:
224
+ l = flatten_link_list(piece)
225
+ for i, p in enumerate(l):
226
+ if p is piece:
227
+ l == l[i:] + l[:i]
228
+ break
229
+ else:
230
+ for i, p in enumerate(l):
231
+ if p.endpoints[0].subsimplex == simplex.T:
232
+ l == l[i:] + l[:i]
233
+ break
234
+
235
+ to_pieces_map[piece.index] = l
236
+
237
+ if False:
238
+ for i, pieces in sorted(to_pieces_map.items()):
239
+ print("Component %d (length %d):" % (i, len(pieces)))
240
+ output_linked(pieces[0], tets_set)
241
+
242
+ print("Total length: %d" % num_pieces)
@@ -0,0 +1,6 @@
1
+ def compute_epsilon(RF):
2
+ return RF(0.5) ** (RF.prec() // 2)
3
+
4
+
5
+ def compute_tube_injectivity_radius_epsilon(RF):
6
+ return RF(0.5) ** (RF.prec() // 2 - 8)
@@ -0,0 +1,55 @@
1
+ class DrillGeodesicError(RuntimeError):
2
+ pass
3
+
4
+ class GeodesicSystemNotSimpleError(DrillGeodesicError):
5
+ def __init__(self, maximal_tube_radius):
6
+ self.maximal_tube_radius = maximal_tube_radius
7
+ super().__init__(
8
+ "One of the given geodesics might not simple or two of the "
9
+ "given geodesics might intersect. "
10
+ "The maximal tube radius about the given system of geodesics "
11
+ "was estimated to be: %r." % maximal_tube_radius)
12
+
13
+ class GeodesicMultipleOfCoreCurve(DrillGeodesicError):
14
+ def __init__(self, word, multiplicity):
15
+ self.word = word
16
+ self.multiplicity = multiplicity
17
+ super().__init__(
18
+ "The geodesic %s is a %d-fold multiple of a core curve." % (
19
+ word, multiplicity))
20
+
21
+ class UnfinishedTraceGeodesicError(DrillGeodesicError):
22
+ def __init__(self, steps):
23
+ self.steps = steps
24
+ super().__init__(
25
+ "The geodesic seems to have more than %d pieces in the "
26
+ "triangulation. This is probably due to a pathology, "
27
+ "e.g., the geodesic is very close to a core curve of "
28
+ "filled cusp." % steps)
29
+
30
+ class GeodesicHittingOneSkeletonError(DrillGeodesicError):
31
+ """
32
+ Base class for exceptions caused by the geodesic hitting the
33
+ 1-skeleton and that can be avoided by perturbing the geodesic.
34
+ """
35
+
36
+
37
+ class GeodesicStartPointOnTwoSkeletonError(GeodesicHittingOneSkeletonError):
38
+ """
39
+ Raised when the start point given to GeodesicStartPointInfo appears not to be in the
40
+ interior of a tetrahedron.
41
+ """
42
+
43
+
44
+ class RayHittingOneSkeletonError(GeodesicHittingOneSkeletonError):
45
+ """
46
+ Raised when the geodesic appears to intersect the 1-skeleton of the
47
+ original triangulation.
48
+ """
49
+
50
+
51
+ class RetracingRayHittingOneSkeletonError(GeodesicHittingOneSkeletonError):
52
+ """
53
+ Raised when the geodesic appears to intersect the 1-skeleton of the
54
+ subdivided triangulation.
55
+ """