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,463 @@
1
+ """
2
+ Defines the basic objects we work with in barycentric coordinates,
3
+ including the various tetrahedron embeddings used for the 2 <--> 3 and
4
+ 4 --> 4 moves.
5
+ """
6
+
7
+ from ..snap.t3mlite.simplex import *
8
+ from .rational_linear_algebra import Matrix, Vector3, Vector4, rational_round
9
+ from . import pl_utils
10
+
11
+
12
+ class Point():
13
+ """
14
+ A point in R^3. The optional ``boundary`` parameter is for
15
+ recording the label of the face of a convex polytope containing
16
+ the point.
17
+ """
18
+ def __init__(self, c0, c1, c2, boundary=None):
19
+ self.vector = Vector3([c0, c1, c2])
20
+ self._boundary_face = boundary
21
+
22
+ def __hash__(self):
23
+ return hash(self.vector)
24
+
25
+ def on_boundary(self):
26
+ return self._boundary_face is not None
27
+
28
+ def boundary_face(self):
29
+ assert self._boundary_face is not None
30
+ return self._boundary_face
31
+
32
+ def __repr__(self):
33
+ return self.vector.__repr__()
34
+
35
+ def __eq__(self, other):
36
+ return self.vector == other.vector
37
+
38
+ def __ne__(self, other):
39
+ return self.vector != other.vector
40
+
41
+ def to_3d_point(self):
42
+ return self.vector
43
+
44
+ def transform_to_R4(self, matrix):
45
+ v = Vector4(list(self.vector) + [1])
46
+ w = matrix * v
47
+ return BarycentricPoint(*w)
48
+
49
+
50
+ class Arc():
51
+ """
52
+ A line segment between two Points, often part of a linked list of
53
+ Arcs forming a PL path or loop.
54
+ """
55
+ def __init__(self, start, end, past=None, next=None):
56
+ self.start = start
57
+ self.end = end
58
+ self.past = past
59
+ self.next = next
60
+
61
+ def __hash__(self):
62
+ return hash((self.start, self.end))
63
+
64
+ def __eq__(self, other):
65
+ return (self.start == other.start) and (self.end == other.end)
66
+
67
+ def __ne__(self, other):
68
+ return not self.__eq__(other)
69
+
70
+ def is_point(self):
71
+ return self.start == self.end
72
+
73
+ def height(self):
74
+ coeffs = self.start.vector.list() + self.end.vector.list()
75
+ return max(c.height() for c in coeffs)
76
+
77
+ def to_3d_points(self):
78
+ return (self.start.to_3d_point(), self.end.to_3d_point())
79
+
80
+ def transform_to_R4(self, matrix):
81
+ new_start = self.start.transform_to_R4(matrix)
82
+ new_end = self.end.transform_to_R4(matrix)
83
+ return BarycentricArc(new_start, new_end)
84
+
85
+ def glue_to(self, next_arc):
86
+ """
87
+ Helper method used when concatenating two linked lists of Arcs.
88
+
89
+ Assumes self.end == next_arc.start and then makes them the
90
+ same object.
91
+ """
92
+ self.next = next_arc
93
+ next_arc.past = self
94
+ next_arc.start = self.end
95
+
96
+ def max_denom(self):
97
+ rationals = list(self.start.vector) + list(self.end.vector)
98
+ return max([q.denominator() for q in rationals])
99
+
100
+
101
+ class BarycentricPoint(Point):
102
+ """
103
+ A quadruple of Sage rational numbers whose sum is 1.
104
+ """
105
+ def __init__(self, c0, c1, c2, c3):
106
+ self.vector = Vector4([c0, c1, c2, c3])
107
+ self._zero_coordinates = [i for i in range(4) if self.vector[i] == 0]
108
+
109
+ if sum(self.vector) != 1:
110
+ raise Exception("Barycentric point doesn't sum to 1")
111
+
112
+ def __repr__(self):
113
+ return self.vector.__repr__()
114
+
115
+ def __eq__(self, other):
116
+ return self.vector == other.vector
117
+
118
+ def __ne__(self, other):
119
+ return self.vector != other.vector
120
+
121
+ def __hash__(self):
122
+ return hash(self.vector)
123
+
124
+ def has_negative_coordinate(self):
125
+ for l in self.vector:
126
+ if l < 0:
127
+ return True
128
+ return False
129
+
130
+ def negative_coordinates(self):
131
+ return [l for l in self.vector if l < 0]
132
+
133
+ def zero_coordinates(self):
134
+ return self._zero_coordinates
135
+
136
+ def on_boundary(self):
137
+ return len(self._zero_coordinates) > 0
138
+
139
+ def boundary_face(self):
140
+ zeros = self._zero_coordinates
141
+ if len(zeros) != 1:
142
+ raise GeneralPositionError('Not a generic point on a face')
143
+ return zeros[0]
144
+
145
+ def is_interior(self):
146
+ return len(self._zero_coordinates) == 0
147
+
148
+ def convex_combination(self, other, t):
149
+ c0,c1,c2,c3 = (1-t)*self.vector + t*other.vector
150
+ return BarycentricPoint(c0, c1, c2, c3)
151
+
152
+ def transform_to_R3(self, matrix, bdry_map=None):
153
+ v = self.vector
154
+ new_v = matrix*v
155
+ boundary_face = None
156
+ if bdry_map is not None and self.on_boundary():
157
+ face = self.zero_coordinates()[0]
158
+ boundary_face = bdry_map[face]
159
+ return Point(new_v[0], new_v[1], new_v[2], boundary_face)
160
+
161
+ def min_nonzero(self):
162
+ return min([c for c in self.vector if c > 0])
163
+
164
+ def to_3d_point(self):
165
+ return self.vector[0:3]
166
+
167
+ def permute(self, perm):
168
+ """
169
+ Start with a permutation perm, which represents a map from the
170
+ vertices of a tetrahedron T in which a point lies, to the
171
+ vertices of another tetrahedron S which is glued to T. Then,
172
+ translate the barycentric coordinates of the point in T to the
173
+ corresponding barycentric coordinates of the point in S. On
174
+ the interior, this doesn't make much sense; it really should
175
+ be used for points on the common boundary triangle.
176
+ """
177
+ v = self.vector
178
+ new_v = [0]*4
179
+ for i in range(4):
180
+ new_v[perm[i]] = v[i]
181
+ return BarycentricPoint(*new_v)
182
+
183
+ def round(self, max_denom=2**32, force=False):
184
+ if force or max(x.denominator() for x in self.vector) > max_denom:
185
+ v = []
186
+ for y in max_denom * self.vector:
187
+ if y != 0:
188
+ y = max(rational_round(y), 1)
189
+ v.append(y)
190
+
191
+ # Should be just Vector4(v)/sum(v)
192
+ self.vector = Vector4(Vector4(v)/sum(v))
193
+ self._zero_coordinates = [i for i in range(4) if self.vector[i] == 0]
194
+
195
+
196
+ class BarycentricArc(Arc):
197
+ """
198
+ A line segment between two endpoints in barycentric coordinates.
199
+ """
200
+ def __init__(self, start, end, past=None, next=None, tet=None):
201
+ self.start = start
202
+ self.end = end
203
+ self.past = past
204
+ self.next = next
205
+ self.tet = tet
206
+
207
+ def __hash__(self):
208
+ return hash((self.start, self.end, self.tet))
209
+
210
+ def __eq__(self, other):
211
+ return ((self.start == other.start)
212
+ and (self.end == other.end)
213
+ and (self.tet == other.tet))
214
+
215
+ def trim(self):
216
+ """
217
+ Given an arc in R^4 lying in the slice x0 + x1 + x2 + x3 = 1,
218
+ return its intersection with the standard three-simplex.
219
+ """
220
+
221
+ t0, t1 = 0, 1
222
+ u, v = self.start.vector, self.end.vector
223
+ for i in range(4):
224
+ if u[i] < 0 and v[i] < 0:
225
+ return None
226
+ elif u[i] >= 0 and v[i] >= 0:
227
+ continue
228
+ else:
229
+ t = u[i]/(u[i] - v[i])
230
+ assert (1 - t)*u[i] + t*v[i] == 0
231
+ if u[i] < 0:
232
+ t0 = max(t0, t)
233
+ else:
234
+ t1 = min(t1, t)
235
+
236
+ if t1 < t0:
237
+ return None
238
+ x = (1 - t0)*u + t0*v
239
+ y = (1 - t1)*u + t1*v
240
+ return BarycentricArc(BarycentricPoint(*x), BarycentricPoint(*y))
241
+
242
+ def __repr__(self):
243
+ return '[{},{}]'.format(self.start, self.end)
244
+
245
+ def transform_to_R3(self, matrix, bdry_map=None):
246
+ new_start = self.start.transform_to_R3(matrix, bdry_map)
247
+ new_end = self.end.transform_to_R3(matrix, bdry_map)
248
+ return BarycentricArc(new_start, new_end)
249
+
250
+ def is_nongeneric(self):
251
+ zeros_s = self.start.zero_coordinates()
252
+ zeros_e = self.end.zero_coordinates()
253
+ if len(zeros_s) > 1 or len(zeros_e) > 1:
254
+ return True
255
+ return bool(set(zeros_s) & set(zeros_e))
256
+
257
+ def max_denom(self):
258
+ rationals = list(self.start.vector) + list(self.end.vector)
259
+ return max(q.denominator() for q in rationals)
260
+
261
+
262
+ class InfinitesimalArc(Arc):
263
+ """
264
+ A length 0 arc corresponding to moving across a face from one
265
+ tetrahedron to the adjacent one.
266
+ """
267
+ def __init__(self, start, end, start_tet, end_tet, past=None, next=None):
268
+ self.start, self.end = start, end
269
+ self.start_tet, self.end_tet = start_tet, end_tet
270
+ self.past, self.next = past, next
271
+
272
+ def __repr__(self):
273
+ v, i = self.start, self.start_tet
274
+ w, j = self.end, self.end_tet
275
+ return f'InfArc({i}:{v}; {j}:{w})'
276
+
277
+
278
+ # We consider a bipyramid with a triangular base, i.e. the union of
279
+ # two tetrahedra sharing a face, with vertices A, B, C around the
280
+ # equator and poles N and S. The orientation convention is that
281
+ # looking down at N the equator is A, B, C in anticlockwise order.
282
+ #
283
+ # Here are Malik's original choices:
284
+
285
+ # A = vector(QQ, [ 1, 0, 0])
286
+ # B = vector(QQ, [-1, 1, 0])
287
+ # C = vector(QQ, [-1, -1, 0])
288
+ # N = vector(QQ, [ 0, 0, 1])
289
+ # S = vector(QQ, [ 0, 0, -1])
290
+
291
+ # One subtly is given a second bipyramid (A', B', C', N', S') there
292
+ # are two simple PL homeos between it and (A, B, C, N, S): you can
293
+ # divide them into to two tetrahedra sharing a face, or three
294
+ # tetrahedra around the line joining N to S, and then use the unique
295
+ # affine map between each pair of tetrahedra. These two PL maps are
296
+ # typically different unless there is a global affine map taking one
297
+ # bipyramid to the other. It is thus convenient to us a standard
298
+ # bipyramid which is symmetric with respect to affine maps.
299
+ A = Vector3([ 3, 0, 0])
300
+ B = Vector3([ 0, 0, 3])
301
+ C = Vector3([ 0, 3, 0])
302
+ N = Vector3([ 0, 0, 0])
303
+ S = Vector3([ 2, 2, 2])
304
+
305
+
306
+ class TetrahedronEmbedding():
307
+ """
308
+ A map from a tetrahedron with PL arcs in barycentric coordinates
309
+ into R^3. The map is described by choosing where the vertices of
310
+ the given arrow go, in the standard order::
311
+
312
+ (tail, head, opp_tail, opp_head)
313
+
314
+ The optional boundary information is for recording which faces
315
+ (if any) of the tetrahedron correspond particular faces of some
316
+ larger convex polytope.
317
+ """
318
+ def __init__(self, arrow, vertex_images, bdry_map=None):
319
+ opp_arrow = arrow.copy().opposite()
320
+ to_arrow = {arrow.tail():0, arrow.head():1,
321
+ opp_arrow.tail():2, opp_arrow.head():3}
322
+ self.vertex_images = [vertex_images[to_arrow[V]] for V in ZeroSubsimplices]
323
+ if bdry_map is not None:
324
+ bdry_map = {i:bdry_map[to_arrow[V]] for i, V in enumerate(ZeroSubsimplices)}
325
+ self.bdry_map = bdry_map
326
+ assert [len(v) for v in vertex_images] == 4*[3]
327
+ R4_images = [list(v) + [1] for v in self.vertex_images]
328
+ self.matrix = Matrix(R4_images).transpose()
329
+ self.inverse_matrix = self.matrix.inverse()
330
+ # assert self.matrix.det() > 0 # disabled for speed
331
+
332
+ def transfer_arcs_to_R3(self, arcs):
333
+ return [arc.transform_to_R3(self.matrix, bdry_map=self.bdry_map) for arc in arcs]
334
+
335
+ def transfer_arcs_from_R3(self, arcs):
336
+ return [arc.transform_to_R4(self.inverse_matrix) for arc in arcs]
337
+
338
+ def info(self):
339
+ self.tetrahedron.info()
340
+ print(self.matrix)
341
+
342
+
343
+ class TetrahedronEmbeddingCache():
344
+ def __init__(self):
345
+ self.cache = {}
346
+
347
+ def __call__(self, arrow, vertex_images, bdry_map=None):
348
+ if bdry_map is None:
349
+ bdry_map_key = None
350
+ else:
351
+ bdry_map_key = tuple(bdry_map)
352
+ key = (arrow.Edge, arrow.Face, tuple(vertex_images), bdry_map_key)
353
+ if key not in self.cache:
354
+ self.cache[key] = TetrahedronEmbedding(arrow, vertex_images, bdry_map)
355
+ return self.cache[key]
356
+
357
+
358
+ tetrahedron_embedding = TetrahedronEmbeddingCache()
359
+
360
+
361
+ def barycentric_face_embedding(arrow, north_pole=None):
362
+ """
363
+ The arrow here is a directed edge in a specified tetrahedron. It
364
+ also specifies a face (the face which is disjoint from the arrow,
365
+ except for the head). This helper function takes the arrow and
366
+ embeds the face of the arrow in the xy-plane, with the two
367
+ tetrahedra on either side of the face embedded in the upper and
368
+ lower half-spaces. The specific coordinates are labeled below; A,
369
+ B, and C are the vertices of the image of the face in the
370
+ xy-plane, and N and S are images of the vertices of the two
371
+ tetrahedron not in the face.
372
+ """
373
+ if north_pole is None:
374
+ north_pole = N
375
+ next_arrow = arrow.glued()
376
+ top_bdry = [None, 't1', 't2', 't3']
377
+ bottom_brdy = ['b1', None, 'b2', 'b3']
378
+
379
+ emb_top = tetrahedron_embedding(arrow, [north_pole, A, C, B], top_bdry)
380
+ emb_bottom = tetrahedron_embedding(next_arrow, [A, S, C, B], bottom_brdy)
381
+
382
+ return [(arrow.Tetrahedron, emb_top),
383
+ (next_arrow.Tetrahedron, emb_bottom)]
384
+
385
+
386
+ def barycentric_edge_embedding(arrow, north_pole=None):
387
+ """
388
+ Take the arrow corresponding to an edge of valence 3. This
389
+ function then creates an embedding of the three tetrahedra glued
390
+ in pairs around the edge into R^3. The embedding is defined so
391
+ that the edge goes from N to S, as labeled below, The arrow goes
392
+ from A to B; A, B, and C form a triangle in the xy-plane.
393
+
394
+ Note that this arrangement has the same image in R^3 as the
395
+ barycentric_face_embedding above -- that's by design, so that we
396
+ can use these two maps to transfer the arcs in barycentric
397
+ coordinates under two-three and two-three moves.
398
+ """
399
+ if north_pole is None:
400
+ north_pole = N
401
+ assert len(arrow.linking_cycle()) == 3
402
+ arrow = arrow.copy()
403
+ verts = [A, B, C, A]
404
+ ans = []
405
+ for i in range(3):
406
+ tet_verts = [verts[i], verts[i+1], S, north_pole]
407
+ bdry_map = [None, None, f't{i+1}', f'b{i+1}']
408
+ ans.append((arrow.Tetrahedron,
409
+ tetrahedron_embedding(arrow, tet_verts, bdry_map)))
410
+ arrow.next()
411
+ return ans
412
+
413
+
414
+ # arrow, tail, head, opp_tail, opp_head
415
+ def barycentric_quad_embedding0(arrow, north_pole=None):
416
+ """
417
+ Take an arrow with 4 valent axis, then build embedding of the
418
+ surrounding four tetrahedra forming an octahedron in R^3 using the
419
+ arrows running around the valence 4 edge in xy plane.
420
+ """
421
+ n = Vector3([ 0, 0, 1]) if north_pole is None else north_pole
422
+ e = Vector3([ 1, 0, 0])
423
+ s = Vector3([ 0, 0,-1])
424
+ w = Vector3([-1, 0, 0])
425
+ a = Vector3([ 0,-1, 0])
426
+ b = Vector3([ 0, 1, 0])
427
+
428
+ arrow = arrow.copy()
429
+ ans = []
430
+ verts = [e, b, w, a, e]
431
+ for i in range(4):
432
+ bdry_map = [None, None, f'x{i}', f'y{i}']
433
+ tet_verts = [verts[i], verts[i + 1], s, n]
434
+ ans.append((arrow.Tetrahedron,
435
+ tetrahedron_embedding(arrow, tet_verts, bdry_map)))
436
+ arrow.next()
437
+
438
+ return ans
439
+
440
+
441
+ # arrow, tail, head, opp_tail, opp_head
442
+ def barycentric_quad_embedding1(arrow, north_pole=None):
443
+ """
444
+ Take an arrow with 4 valent axis, then build embedding of the
445
+ surrounding four tetrahedra forming an octahedron in R^3 using the
446
+ arrows running around the valence 4 edge in zy plane.
447
+ """
448
+ n = Vector3([ 0, 0, 1]) if north_pole is None else north_pole
449
+ e = Vector3([ 1, 0, 0])
450
+ s = Vector3([ 0, 0,-1])
451
+ w = Vector3([-1, 0, 0])
452
+ a = Vector3([ 0,-1, 0])
453
+ b = Vector3([ 0, 1, 0])
454
+
455
+ arrow = arrow.copy()
456
+ ans = []
457
+ verts = [e, s, w, n, e]
458
+ for i in range(4):
459
+ ans.append((arrow.Tetrahedron,
460
+ tetrahedron_embedding(arrow, [verts[i], verts[i+1], a, b])))
461
+ arrow.next()
462
+
463
+ return ans
@@ -0,0 +1,6 @@
1
+ class GeneralPositionError(Exception):
2
+ pass
3
+
4
+
5
+ class ExteriorToLinkError(Exception):
6
+ pass