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,219 @@
1
+ """
2
+ The dual cellulation to a triangulation of an oriented surface.
3
+ """
4
+
5
+ from ... import sage_helper
6
+ from .. import t3mlite as t3m
7
+
8
+ if sage_helper._within_sage:
9
+ from ...sage_helper import ZZ, matrix, vector, ChainComplex
10
+ from sage.graphs.graph import Graph
11
+
12
+
13
+ class DualCell():
14
+ """
15
+ A cell in the dual cellulation
16
+ """
17
+ def __init__(self, dual_cell):
18
+ self.dual_cell = dual_cell
19
+ self.index = dual_cell.index
20
+
21
+
22
+ class Vertex(DualCell):
23
+ """
24
+ A vertex of the dual cellulation.
25
+ """
26
+
27
+
28
+ class Edge(DualCell):
29
+ """
30
+ An oriented edge of the dual cellulation. The orientation
31
+ convention is that if e is the original edge and d is the dual
32
+ edge then one rotates from d to e anticlockwise.
33
+ """
34
+ def __init__(self, dual_cell):
35
+ DualCell.__init__(self, dual_cell)
36
+ self.vertices = [None, None]
37
+
38
+
39
+ class Face(DualCell):
40
+ """
41
+ A face of the dual cellulation, which is just an n-gon. The
42
+ vertices are numbered range(n) in an anti-clockwise orientation.
43
+
44
+ Oriented edges of the face are specified by their initial vertex.
45
+ """
46
+ def __init__(self, dual_cell):
47
+ DualCell.__init__(self, dual_cell)
48
+ self.n = len(dual_cell.corners)
49
+ self.edges_with_orientations = self.n*[None]
50
+
51
+ def __repr__(self):
52
+ return "<Face: %s>" % self.index
53
+
54
+
55
+ class DualCellulation():
56
+ """
57
+ The dual cellulation to a triangulation of a surface.
58
+ """
59
+ def __init__(self, triangulation):
60
+ self.dual_triangulation = triangulation
61
+ self.from_original = {}
62
+ self.vertices = []
63
+ self.edges = []
64
+ self.faces = []
65
+ self._B1 = None
66
+ self._B2 = None
67
+ self._chain_complex = None
68
+ for vertex in triangulation.vertices:
69
+ face = Face(vertex)
70
+ self.faces.append(face)
71
+ self.from_original[vertex] = face
72
+ for edge in triangulation.edges:
73
+ dual_edge = Edge(edge)
74
+ self.edges.append(dual_edge)
75
+ self.from_original[edge] = dual_edge
76
+ for triangle in triangulation.triangles:
77
+ vertex = Vertex(triangle)
78
+ self.vertices.append(vertex)
79
+ self.from_original[triangle] = vertex
80
+
81
+ for vertex in triangulation.vertices:
82
+ face = self.from_original[vertex]
83
+ for i, corner in enumerate(vertex.corners):
84
+ edge, orient = corner.edge_with_orientation()
85
+ dual_edge = self.from_original[edge]
86
+ face.edges_with_orientations[i] = (dual_edge, -orient)
87
+ if orient > 0:
88
+ dual_edge.vertices = [self.from_original[side.triangle] for side in edge.sides]
89
+
90
+ def euler(self):
91
+ """
92
+ sage: N = t3m.Mcomplex('o9_12345')
93
+ sage: D = DualCellulation(LinkSurface(N))
94
+ sage: D.euler()
95
+ 0
96
+ sage: N = t3m.Mcomplex('jLLvQPQcdfhghigiihshhgfifme')
97
+ sage: D = DualCellulation(LinkSurface(N))
98
+ sage: D.euler()
99
+ 2
100
+ """
101
+ return len(self.vertices) - len(self.edges) + len(self.faces)
102
+
103
+ def B1(self):
104
+ """
105
+ The matrix describing the boundary map C_1 -> C_0
106
+ """
107
+ if self._B1 is None:
108
+ V, E = len(self.vertices), len(self.edges)
109
+ assert list(range(V)) == sorted(v.index for v in self.vertices)
110
+ assert list(range(E)) == sorted(e.index for e in self.edges)
111
+
112
+ D = matrix(ZZ, V, E, sparse=True)
113
+ for e in self.edges:
114
+ v_init = e.vertices[0].index
115
+ v_term = e.vertices[1].index
116
+ D[v_term, e.index] += 1
117
+ D[v_init, e.index] += -1
118
+ self._B1 = D
119
+
120
+ return self._B1
121
+
122
+ def B2(self):
123
+ """
124
+ The matrix describing the boundary map C_2 -> C_1
125
+
126
+ Does *not* assume that the faces are numbered like
127
+ range(len(faces)).
128
+ """
129
+ if self._B2 is None:
130
+ E, F = len(self.edges), len(self.faces)
131
+ assert list(range(E)) == sorted(e.index for e in self.edges)
132
+ D = matrix(ZZ, E, F, sparse=True)
133
+ for i, face in enumerate(self.faces):
134
+ for edge, sign in face.edges_with_orientations:
135
+ D[edge.index, i] += sign
136
+ self._B2 = D
137
+
138
+ return self._B2
139
+
140
+ def chain_complex(self):
141
+ if self._chain_complex is None:
142
+ self._chain_complex = ChainComplex({1:self.B1(), 2:self.B2()}, degree=-1)
143
+ return self._chain_complex
144
+
145
+ def integral_cohomology_basis(self, dimension=1):
146
+ assert dimension == 1
147
+ return [OneCocycle(self, list(c.weights))
148
+ for c in self.dual_triangulation.integral_homology_basis(dimension)]
149
+
150
+ def homology_test(self):
151
+ T = self.dual_triangulation
152
+ B1, B2 = self.B1(), self.B2()
153
+ assert B1*B2 == 0
154
+ assert T.euler() == self.euler()
155
+ CD = self.chain_complex()
156
+ CT = T.chain_complex()
157
+ assert CD.homology() == CT.homology()
158
+
159
+
160
+ class OneCycle():
161
+ """
162
+ A cycle on the 1-skeleton of a DualCellulation.
163
+ """
164
+
165
+ def __init__(self, cellulation, weights):
166
+ self.cellulation, self.weights = cellulation, weights
167
+ assert sorted(edge.index for edge in cellulation.edges) == list(range(len(weights)))
168
+ assert cellulation.B1() * vector(weights) == 0
169
+
170
+ def components(self):
171
+ """
172
+ Returns a list of the connected components of the multicurve
173
+ corresponding to the 1-cycle, each given as a OneCycle.
174
+
175
+ Assumes for simplicity that the weights are at most one and
176
+ the support of the cycle is a simple multicurve.
177
+ """
178
+ assert all(abs(w) <= 1 for w in self.weights)
179
+ D = self.cellulation
180
+ G = Graph(multiedges=True)
181
+ for edge in D.edges:
182
+ if self.weights[edge.index] != 0:
183
+ i, j = (v.index for v in edge.vertices)
184
+ G.add_edge(i, j, edge.index)
185
+
186
+ assert G.num_verts() == G.num_edges()
187
+
188
+ ans = []
189
+ for H in G.connected_components_subgraphs():
190
+ weights = len(self.weights) * [0]
191
+ for i in H.edge_labels():
192
+ weights[i] = self.weights[i]
193
+ ans.append(OneCycle(self.cellulation, weights))
194
+ return ans
195
+
196
+
197
+ class OneCocycle():
198
+ """
199
+ A cocycle on the 1-skeleton of a DualCellulation.
200
+ """
201
+
202
+ def __init__(self, cellulation, weights):
203
+ self.cellulation, self.weights = cellulation, weights
204
+ assert sorted(edge.index for edge in cellulation.edges) == list(range(len(weights)))
205
+ assert cellulation.B2().transpose() * vector(weights) == 0
206
+
207
+ def __call__(self, other):
208
+ if isinstance(other, OneCycle):
209
+ return sum(a*b for a, b in zip(self.weights, other.weights))
210
+
211
+
212
+ def doctest_globals():
213
+ import link
214
+ return {'LinkSurface':link.LinkSurface}
215
+
216
+
217
+ if __name__ == '__main__':
218
+ import doctest
219
+ doctest.testmod(extraglobs=doctest_globals())
@@ -0,0 +1,127 @@
1
+ r"""
2
+ Studying the vertex links of triangulations of 3-manifolds.
3
+
4
+ Recall that in t3m and SnapPea, a 3-simplex is oriented like this::
5
+
6
+ 1
7
+ /|\
8
+ / | \
9
+ / | \
10
+ 2---|---3
11
+ \ | /
12
+ \ | /
13
+ \|/
14
+ 0
15
+
16
+ Now consider the truncated tetrahedron; there, each vertex gives rise to a
17
+ small triangular face whose vertices correspond to edges of the original
18
+ tetrahedron. We orient each small triangle so that its boundary rotates
19
+ anticlockwise when viewed from outside.
20
+ """
21
+
22
+ import networkx as nx
23
+ from .. import t3mlite as t3m
24
+ from ..t3mlite.simplex import *
25
+ from . import surface
26
+
27
+ # The vertices of the small triangular faces of the truncated tetrahedron
28
+
29
+ TruncatedSimplexCorners = {
30
+ V0 : (E01, E02, E03),
31
+ V1 : (E10, E13, E12),
32
+ V2 : (E23, E20, E21),
33
+ V3 : (E32, E31, E30)}
34
+
35
+ # Oriented clockwise when viewed from *outside*, so that the induced
36
+ # orientation of the hexagons in the truncated tetrahedron has the following
37
+ # property: The orientation of each hexagon's edges is compatible with the
38
+ # preferred orientation on the small triangular faces.
39
+
40
+ VerticesOfFace = { F0 : (V1, V2, V3), F1 : (V0, V3, V2),
41
+ F2 : (V0, V1, V3), F3 : (V0, V2, V1) }
42
+
43
+
44
+ def cusp_corner_label(v, w):
45
+ return TruncatedSimplexCorners[v].index( v | w )
46
+
47
+
48
+ class LinkSurface(surface.Surface):
49
+ def __init__(self, t3m_triangulation):
50
+ self.parent_triangulation = t3m_triangulation
51
+ N = t3m_triangulation
52
+ triangles = []
53
+ for T in N.Tetrahedra:
54
+ new_tris = [surface.Triangle() for i in range(4)]
55
+ triangles += new_tris
56
+ T.CuspCorners = {V0:new_tris[0], V1:new_tris[1], V2:new_tris[2], V3:new_tris[3]}
57
+
58
+ surface.Surface.__init__(self, triangles)
59
+
60
+ for F in N.Faces:
61
+ F0 = F.Corners[0]
62
+ T0 = F0.Tetrahedron
63
+ f0 = F0.Subsimplex
64
+ v0 = comp(f0)
65
+
66
+ F1 = F.Corners[1]
67
+ T1 = F1.Tetrahedron
68
+ f1 = F1.Subsimplex
69
+ v1 = comp(f1)
70
+
71
+ for v in VerticesOfFace[f0]:
72
+ w = T0.Gluing[f0].image(v)
73
+ C0, C1 = T0.CuspCorners[v], T1.CuspCorners[w]
74
+ x0 = cusp_corner_label(v, v0)
75
+ x1 = cusp_corner_label(w, v1)
76
+ E = self.glue_triangles(C0, x0, C1, x1)
77
+ E.face_index = F.Index
78
+ E.reversed = False
79
+
80
+ self.build()
81
+ self.label_vertices()
82
+
83
+ def label_vertices(self):
84
+ N = self.parent_triangulation
85
+ for vert in self.vertices:
86
+ vert.index = None
87
+ for edge in N.Edges:
88
+ corner = edge.Corners[0]
89
+ tet = corner.Tetrahedron
90
+ a = Head[corner.Subsimplex]
91
+ b = Tail[corner.Subsimplex]
92
+ sign = edge.orientation_with_respect_to(tet, a, b)
93
+ for (v, s) in [(a, sign), (b, -sign)]:
94
+ label = s*(edge.Index + 1)
95
+ i = TruncatedSimplexCorners[v].index(a | b)
96
+ tri = tet.CuspCorners[v]
97
+ tri.vertices[i].index = label
98
+
99
+ def edge_graph(self):
100
+ G = nx.Graph()
101
+ G.add_edges_from([[v.index for v in e.vertices] for e in self.edges])
102
+ return G
103
+
104
+
105
+ class LinkSphere(LinkSurface):
106
+ """
107
+ >>> T = Mcomplex('kLLLLQMkbcghgihijjjtsmnonnkddl') # m004(1, 2)
108
+ >>> L = LinkSphere(T)
109
+ >>> L.edge_graph().number_of_nodes()
110
+ 22
111
+ >>> 2 * len(T.Edges)
112
+ 22
113
+ """
114
+ def __init__(self, t3m_triangulation):
115
+ N = t3m_triangulation
116
+ assert len(N.Vertices) == 1 and N.Vertices[0].link_genus() == 0
117
+ LinkSurface.__init__(self, N)
118
+
119
+
120
+ def doctest_globals():
121
+ import snappy.snap.t3mlite
122
+ return {'Mcomplex': snappy.snap.t3mlite.Mcomplex}
123
+
124
+
125
+ if __name__ == '__main__':
126
+ import doctest
127
+ doctest.testmod(extraglobs=doctest_globals())
@@ -0,0 +1,159 @@
1
+ from ... import sage_helper
2
+ from .. import t3mlite as t3m
3
+ from . import link, dual_cellulation
4
+
5
+ if sage_helper._within_sage:
6
+ from ...sage_helper import matrix, vector, ZZ
7
+
8
+
9
+ def peripheral_curve_from_snappy(dual_cell, snappy_data):
10
+ D = dual_cell
11
+ T = D.dual_triangulation
12
+ M = T.parent_triangulation
13
+ data = snappy_data
14
+ weights = len(D.edges)*[0]
15
+ for tet_index, tet in enumerate(M.Tetrahedra):
16
+ for vert_index, V in enumerate(t3m.ZeroSubsimplices):
17
+ triangle = tet.CuspCorners[V]
18
+ sides = triangle.oriented_sides()
19
+ for tri_edge_index, tet_edge in enumerate(link.TruncatedSimplexCorners[V]):
20
+ tet_face_index = t3m.ZeroSubsimplices.index(tet_edge ^ V)
21
+ side = sides[tri_edge_index]
22
+ global_edge = side.edge()
23
+ if global_edge.orientation_with_respect_to(side) > 0:
24
+ dual_edge = D.from_original[global_edge]
25
+ weight = data[tet_index][4*vert_index + tet_face_index]
26
+ weights[dual_edge.index] = -weight
27
+
28
+ # Sanity check
29
+ total_raw_weights = sum([sum(abs(x) for x in row) for row in data])
30
+ assert 2*sum(abs(w) for w in weights) == total_raw_weights
31
+ return dual_cellulation.OneCycle(D, weights)
32
+
33
+
34
+ def peripheral_curve_package(snappy_manifold):
35
+ """
36
+ Given a 1-cusped snappy_manifold M, this function returns
37
+
38
+ 1. A t3m MComplex of M, and
39
+
40
+ 2. the induced cusp triangulation, and
41
+
42
+ 3. the dual to the cusp triangulation, and
43
+
44
+ 4. two 1-cocycles on the dual cellulation which are
45
+ *algebraically* dual to the peripheral framing of M.
46
+
47
+ sage: M = peripheral_curve_package(Manifold('t00000'))[0]
48
+ sage: len(M)
49
+ 8
50
+ sage: T, D = M.cusp_triangulation, M.cusp_dual_cellulation
51
+ sage: T.homology_test()
52
+ sage: D.euler()
53
+ 0
54
+ sage: D.slope(D.meridian)
55
+ (1, 0)
56
+ sage: D.slope(D.longitude)
57
+ (0, 1)
58
+ """
59
+ M = snappy_manifold
60
+ assert M.num_cusps() == 1
61
+ N = t3m.Mcomplex(M)
62
+ C = link.LinkSurface(N)
63
+ D = dual_cellulation.DualCellulation(C)
64
+ cusp_indices, data = M._get_cusp_indices_and_peripheral_curve_data()
65
+ meridian = peripheral_curve_from_snappy(D, [data[i] for i in range(0, len(data), 4)])
66
+ longitude = peripheral_curve_from_snappy(D, [data[i] for i in range(2, len(data), 4)])
67
+ alpha, beta = D.integral_cohomology_basis()
68
+ A = matrix([[alpha(meridian), beta(meridian)], [alpha(longitude), beta(longitude)]])
69
+ assert abs(A.det()) == 1
70
+ Ainv = A.inverse().change_ring(ZZ)
71
+ B = Ainv.transpose() * matrix(ZZ, [alpha.weights, beta.weights])
72
+ mstar = dual_cellulation.OneCocycle(D, list(B[0]))
73
+ lstar = dual_cellulation.OneCocycle(D, list(B[1]))
74
+ AA = matrix([[mstar(meridian), lstar(meridian)], [mstar(longitude), lstar(longitude)]])
75
+ assert AA == 1
76
+
77
+ # Now add references to C, D, etc. to N for easy of use later
78
+ N.cusp_triangulation = C
79
+ N.cusp_dual_cellulation = D
80
+ D.meridian, D.longitude = meridian, longitude
81
+ D.meridian_star, D.longitude_star = mstar, lstar
82
+
83
+ def slope(onecycle):
84
+ return vector([D.meridian_star(onecycle), D.longitude_star(onecycle)])
85
+ D.slope = slope
86
+ return N, C, D, (mstar, lstar)
87
+
88
+
89
+ class PeripheralOneCocycle():
90
+ """
91
+ Let M be an ideal triangulation with one cusp, and consider the
92
+ induced triangulation T of the cusp torus. This object is a
93
+ 1-cocycles on T, whose weights are accessed via
94
+
95
+ self[tet_num, face_index, vertex_in_face].
96
+ """
97
+ def __init__(self, dual_cellulation_cocycle):
98
+ self.cocycle = dual_cellulation_cocycle
99
+ self.dual_cellulation = D = dual_cellulation_cocycle.cellulation
100
+ self.cusp_triangulation = T = D.dual_triangulation
101
+ self.mcomplex = T.parent_triangulation
102
+
103
+ def __getitem__(self, tet_face_vertex):
104
+ tet_num, F, V = tet_face_vertex
105
+ tet = self.mcomplex.Tetrahedra[tet_num]
106
+ triangle = tet.CuspCorners[V]
107
+ for side in triangle.oriented_sides():
108
+ E0, E1 = (link.TruncatedSimplexCorners[V][v] for v in side.vertices)
109
+ if E0 | E1 == F:
110
+ break
111
+ assert E0 | E1 == F
112
+ global_edge = side.edge()
113
+ dual_edge = self.dual_cellulation.from_original[global_edge]
114
+ w = self.cocycle.weights[dual_edge.index]
115
+ s = global_edge.orientation_with_respect_to(side)
116
+ return w*s
117
+
118
+
119
+ def peripheral_cohomology_basis(manifold):
120
+ """
121
+ TESTS::
122
+
123
+ sage: M = Manifold('v0000')
124
+ sage: m, l = peripheral_cohomology_basis(M)
125
+ sage: face_corners = [(t, f, v) for t in range(7) for f in t3m.TwoSubsimplices for v in t3m.ZeroSubsimplices if f & v ]
126
+ sage: [m[fc] for fc in face_corners] # doctest: +SKIP
127
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
128
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
129
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
130
+ 0, 0, -1, 0, -1, -1, 0, -1, 0, 0, -1, 0, 1, 0, 1, 0, 1, 0]
131
+ """
132
+ assert manifold.is_orientable() and manifold.num_cusps() == 1
133
+ N, T, D, (m, l) = peripheral_curve_package(manifold)
134
+ return PeripheralOneCocycle(m), PeripheralOneCocycle(l)
135
+
136
+
137
+ def test_peripheral_curves(n=100, progress=True):
138
+ """
139
+ TESTS::
140
+
141
+ sage: test_peripheral_curves(5, False)
142
+ """
143
+ import snappy
144
+ census = snappy.OrientableCuspedCensus(cusps=1)
145
+ for i in range(n):
146
+ M = census.random()
147
+ if progress:
148
+ print(M.name())
149
+ peripheral_curve_package(M)
150
+
151
+
152
+ def doctest_globals():
153
+ import snappy
154
+ return {'Manifold':snappy.Manifold}
155
+
156
+
157
+ if __name__ == '__main__':
158
+ import doctest
159
+ doctest.testmod(extraglobs=doctest_globals())