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,320 @@
1
+ # t3m - software for studying triangulated 3-manifolds
2
+ # Copyright (C) 2002 Marc Culler, Nathan Dunfield and others
3
+ #
4
+ # This program is distributed under the terms of the
5
+ # GNU General Public License, version 2 or later, as published by
6
+ # the Free Software Foundation. See the file GPL.txt for details.
7
+
8
+ from operator import inv
9
+
10
+
11
+ def _make_opp_dict():
12
+ def swap(t):
13
+ return (t[1], t[0])
14
+ dic = {(0, 1): (2, 3), (2, 0): (1, 3), (1, 2): (0, 3)}
15
+ for k in list(dic):
16
+ dic[dic[k]] = k
17
+ dic[swap(dic[k])] = swap(k)
18
+ dic[swap(k)] = swap(dic[k])
19
+ return dic
20
+
21
+
22
+ # opposite[(i,j)] = (k,l), where i,j,k,l are distinct and the permutation
23
+ # 0->i,1->j,2->k,3->l is even.
24
+
25
+ opposite = _make_opp_dict()
26
+
27
+
28
+ class Perm4Basic:
29
+ """
30
+ Class Perm4Basic: A permutation of {0,1,2,3}.
31
+
32
+ A permutation can be initialized with a length 4 dictionary or a
33
+ 4-tuple or a length 2 dictionary; in the latter case the sign of
34
+ the permutation can be specified by setting "sign=0" (even) or
35
+ "sign=1" (odd). The default sign is odd, since odd permutations
36
+ describe orientation-preserving gluings.
37
+
38
+ This is the original version of Perm4, which was tablized for
39
+ speed reasons.
40
+ """
41
+
42
+ def __init__(self, init, sign=1):
43
+ self.dict = {}
44
+ if isinstance(init, Perm4Basic) or len(init) == 4:
45
+ for i in range(4):
46
+ self.dict[i] = init[i]
47
+ else:
48
+ self.dict = init
49
+ v = list(init.items())
50
+ x = opposite[(v[0][0],v[1][0])]
51
+ y = opposite[(v[0][1],v[1][1])]
52
+ self.dict[x[0]] = y[sign]
53
+ self.dict[x[1]] = y[1-sign]
54
+
55
+ def image(self, bitmap):
56
+ """
57
+ A subset of {0,1,2,3} can be represented by a bitmap. This
58
+ computes the bitmap of the image subset.
59
+
60
+ >>> Perm4Basic([2, 3, 1, 0]).image(10)
61
+ 9
62
+ """
63
+ image = 0
64
+ for i in range(4):
65
+ if bitmap & (1 << i):
66
+ image = image | (1 << self.dict[i])
67
+ return image
68
+
69
+ def __repr__(self):
70
+ return str(self.tuple())
71
+
72
+ def __call__(self, a_tuple):
73
+ """
74
+ P((i, ... ,j)) returns the image tuple (P(i), ... , P(j))
75
+ """
76
+ image = []
77
+ for i in a_tuple:
78
+ image.append(self.dict[i])
79
+ return tuple(image)
80
+
81
+ def __getitem__(self, index):
82
+ """
83
+ P[i] returns the image of i, P(i)
84
+
85
+ >>> Perm4Basic([2, 3, 1, 0])[3]
86
+ 0
87
+ """
88
+ return self.dict[index]
89
+
90
+ def __mul__(self, other):
91
+ """
92
+ P*Q is the composition P*Q(i) = P(Q(i))
93
+
94
+ >>> P = Perm4Basic((2, 3, 1, 0))
95
+ >>> Q = Perm4Basic((1, 0, 2, 3))
96
+ >>> P * Q
97
+ (3, 2, 1, 0)
98
+ >>> Q * P
99
+ (2, 3, 0, 1)
100
+ """
101
+ composition = {}
102
+ for i in range(4):
103
+ composition[i] = self.dict[other.dict[i]]
104
+ return Perm4Basic(composition)
105
+
106
+ def __invert__(self):
107
+ """
108
+ inv(P) is the inverse permutation
109
+
110
+ >>> inv(Perm4Basic([2, 1, 3, 0]))
111
+ (3, 1, 0, 2)
112
+ """
113
+ inverse = {}
114
+ for i in range(4):
115
+ inverse[self.dict[i]] = i
116
+ return Perm4Basic(inverse)
117
+
118
+ def sign(self):
119
+ """
120
+ sign(P) is the sign: 0 for even, 1 for odd
121
+
122
+ >>> Perm4Basic([0, 1, 3, 2]).sign()
123
+ 1
124
+ >>> Perm4Basic([1, 0, 3, 2]).sign()
125
+ 0
126
+ """
127
+ sign = 0
128
+ for (i,j) in [(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)]:
129
+ sign = sign ^ (self.dict[i] < self.dict[j])
130
+ return sign
131
+
132
+ def tuple(self):
133
+ """
134
+ P.tuple() returns a tuple representing the permutation P
135
+
136
+ >>> Perm4Basic([1, 2, 0, 3]).tuple()
137
+ (1, 2, 0, 3)
138
+ """
139
+ return tuple(self.dict[i] for i in range(4))
140
+
141
+
142
+ S4_tuples = [(0,1,2,3), (0,1,3,2), (0,2,1,3), (0,2,3,1), (0,3,1,2), (0,3,2,1),
143
+ (1,0,2,3), (1,0,3,2), (1,2,0,3), (1,2,3,0), (1,3,0,2), (1,3,2,0),
144
+ (2,0,1,3), (2,0,3,1), (2,1,0,3), (2,1,3,0), (2,3,0,1), (2,3,1,0),
145
+ (3,0,1,2), (3,0,2,1), (3,1,0,2), (3,1,2,0), (3,2,0,1), (3,2,1,0)]
146
+
147
+ A4_tuples = [(0,1,2,3), (0,2,3,1), (0,3,1,2), (1,0,3,2), (1,2,0,3), (1,3,2,0),
148
+ (2,0,1,3), (2,1,3,0), (2,3,0,1), (3,0,2,1), (3,1,0,2), (3,2,1,0)]
149
+
150
+ KleinFour_tuples = [(0,1,2,3), # Id
151
+ (1,0,3,2), # (01)(23)
152
+ (2,3,0,1), # (02)(13)
153
+ (3,2,1,0) ] # (03)(12)
154
+
155
+ perm_tuple_to_index = {t:i for i, t in enumerate(S4_tuples)}
156
+ perm_basic_by_index = [Perm4Basic(t) for t in S4_tuples]
157
+
158
+
159
+ def perm_basic_to_index(perm):
160
+ return perm_tuple_to_index[perm.tuple()]
161
+
162
+
163
+ perm_signs_by_index = {i: perm.sign()
164
+ for i, perm in enumerate(perm_basic_by_index)}
165
+
166
+ bitmap_images = {(i, bitmap): perm.image(bitmap)
167
+ for bitmap in range(16)
168
+ for i, perm in enumerate(perm_basic_by_index)}
169
+
170
+ index_of_inverse_by_index = {i: perm_basic_to_index(inv(perm))
171
+ for i, perm in enumerate(perm_basic_by_index)}
172
+
173
+ index_mult_table_by_index = {(i, j): perm_basic_to_index(P * Q)
174
+ for i, P in enumerate(perm_basic_by_index)
175
+ for j, Q in enumerate(perm_basic_by_index)}
176
+
177
+
178
+ class Perm4():
179
+ """
180
+ Class Perm4: A permutation of {0,1,2,3}.
181
+
182
+ A permutation can be initialized with a length 4 dictionary or a
183
+ 4-tuple or a length 2 dictionary; in the latter case the sign of
184
+ the permutation can be specified by setting "sign=0" (even) or
185
+ "sign=1" (odd). The default sign is odd, since odd permutations
186
+ describe orientation-preserving gluings.
187
+ """
188
+
189
+ def __init__(self, init, sign=1):
190
+ if isinstance(init, int):
191
+ self._index = init
192
+ self._tuple = S4_tuples[init]
193
+ elif isinstance(init, Perm4):
194
+ self._index = init._index
195
+ self._tuple = init._tuple
196
+ elif len(init) == 4:
197
+ self._tuple = tuple(init[i] for i in range(4))
198
+ self._index = perm_tuple_to_index[self._tuple]
199
+ else:
200
+ self._tuple = Perm4Basic(init, sign).tuple()
201
+ self._index = perm_tuple_to_index[self._tuple]
202
+
203
+ def image(self, bitmap):
204
+ """
205
+ A subset of {0,1,2,3} can be represented by a bitmap. This
206
+ computes the bitmap of the image subset.
207
+
208
+ >>> Perm4([2, 3, 1, 0]).image(10)
209
+ 9
210
+ """
211
+ return bitmap_images[self._index, bitmap]
212
+
213
+ def __repr__(self):
214
+ return str(self._tuple)
215
+
216
+ def __call__(self, a_tuple):
217
+ """
218
+ P((i, ... ,j)) returns the image tuple (P(i), ... , P(j))
219
+
220
+ >>> Perm4([2, 3, 1, 0])(range(3))
221
+ (2, 3, 1)
222
+ """
223
+ image = []
224
+ for i in a_tuple:
225
+ image.append(self._tuple[i])
226
+ return tuple(image)
227
+
228
+ def __getitem__(self, index):
229
+ """
230
+ P[i] returns the image of i, P(i)
231
+
232
+ >>> Perm4([2, 3, 1, 0])[3]
233
+ 0
234
+ """
235
+ return self._tuple[index]
236
+
237
+ def __mul__(self, other):
238
+ """
239
+ P*Q is the composition P*Q(i) = P(Q(i))
240
+
241
+ >>> P = Perm4((2, 3, 1, 0))
242
+ >>> Q = Perm4((1, 0, 2, 3))
243
+ >>> P * Q
244
+ (3, 2, 1, 0)
245
+ >>> Q * P
246
+ (2, 3, 0, 1)
247
+ """
248
+ return mult_table_by_index[self._index, other._index]
249
+
250
+ def __invert__(self):
251
+ """
252
+ inv(P) is the inverse permutation
253
+
254
+ >>> inv(Perm4([2, 1, 3, 0]))
255
+ (3, 1, 0, 2)
256
+ """
257
+ return inverse_by_index[self._index]
258
+
259
+ def sign(self):
260
+ """
261
+ sign(P) is the sign: 0 for even, 1 for odd
262
+
263
+ >>> Perm4([0, 1, 3, 2]).sign()
264
+ 1
265
+ >>> Perm4([1, 0, 3, 2]).sign()
266
+ 0
267
+ """
268
+ return perm_signs_by_index[self._index]
269
+
270
+ def tuple(self):
271
+ """
272
+ P.tuple() returns a tuple representing the permutation P
273
+
274
+ >>> Perm4([1, 2, 0, 3]).tuple()
275
+ (1, 2, 0, 3)
276
+ """
277
+ return self._tuple
278
+
279
+ @staticmethod
280
+ def S4():
281
+ """"
282
+ All permutations in S4
283
+
284
+ >>> len(list(Perm4.S4()))
285
+ 24
286
+ """
287
+ for p in S4_tuples:
288
+ yield Perm4(p)
289
+
290
+ @staticmethod
291
+ def A4():
292
+ """
293
+ All even permutations in A4
294
+
295
+ >>> len(list(Perm4.A4()))
296
+ 12
297
+ """
298
+ for p in A4_tuples:
299
+ yield Perm4(p)
300
+
301
+ @staticmethod
302
+ def KleinFour():
303
+ """
304
+ Z/2 x Z/2 as a subgroup of A4.
305
+
306
+ >>> len(list(Perm4.KleinFour()))
307
+ 4
308
+ """
309
+ for p in KleinFour_tuples:
310
+ yield Perm4(p)
311
+
312
+
313
+ inverse_by_index = {k:Perm4(v) for k, v in index_of_inverse_by_index.items()}
314
+ mult_table_by_index = {k:Perm4(v) for k, v in index_mult_table_by_index.items()}
315
+
316
+ __all__ = ["Perm4", "inv"]
317
+
318
+ if __name__ == '__main__':
319
+ import doctest
320
+ doctest.testmod()
@@ -0,0 +1,12 @@
1
+ from distutils.core import setup
2
+
3
+ setup(
4
+ name="t3m",
5
+ version="",
6
+ description="Tinker toys for topologists",
7
+ author="Marc Culler and Nathan Dunfield",
8
+ author_email="culler@math.uic.edu, dunfield@caltech.edu",
9
+ url="http://www.math.uic.edu/~t3m",
10
+ packages=['t3m'],
11
+ package_dir={'t3m': ''}
12
+ )
@@ -0,0 +1,199 @@
1
+ # $Id: simplex.py,v 1.4 2010/07/12 21:14:01 t3m Exp $
2
+ # t3m - software for studying triangulated 3-manifolds
3
+ # Copyright (C) 2002 Marc Culler, Nathan Dunfield and others
4
+ #
5
+ # This program is distributed under the terms of the
6
+ # GNU General Public License, version 2 or later, as published by
7
+ # the Free Software Foundation. See the file GPL.txt for details.
8
+
9
+ # Global definitions dealing with simplices
10
+ SimplexError = 'Error'
11
+
12
+ # The subsimplices of a 3-simplex correspond to the subsets of a 4
13
+ # element set. A subset of a 4-element set is represented as a bitmap
14
+ # by a binary number between 0 and 15. We name the subsets as
15
+ # follows:
16
+
17
+ N = 0 # 0000
18
+ V0 = 1 # 0001
19
+ V1 = 2 # 0010
20
+ E01 = 3 # 0011 <-----|
21
+ V2 = 4 # 0100 |
22
+ E02 = 5 # 0101 <---| |
23
+ E21 = 6 # 0110 <-| | |
24
+ F3 = 7 # 0111 | | |
25
+ V3 = 8 # 1000 | | | Opposite edges
26
+ E03 = 9 # 1001 <-| | |
27
+ E13 = 10 # 1010 <---| |
28
+ F2 = 11 # 1011 |
29
+ E32 = 12 # 1100 <-----|
30
+ F1 = 13 # 1101
31
+ F0 = 14 # 1110
32
+ T = 15 # 1111
33
+
34
+ # User-friendly?
35
+
36
+ E10 = 3
37
+ E20 = 5
38
+ E12 = 6
39
+ E30 = 9
40
+ E31 = 10
41
+ E23 = 12
42
+
43
+ # Generate a bitmap from a tuple of vertices.
44
+
45
+
46
+ def bitmap(tuple):
47
+ bmap = 0
48
+ for i in tuple:
49
+ bmap = bmap | (1 << i)
50
+ return bmap
51
+
52
+ # This list of subsimplex names can be used for printing.
53
+
54
+
55
+ SubsimplexName = ('N', 'V0', 'V1', 'E01', 'V2', 'E02', 'E12', 'F3',
56
+ 'V3', 'E03', 'E31', 'F2', 'E23', 'F1', 'F0', 'T')
57
+
58
+ # A simplex is oriented like this:
59
+ # 1
60
+ # /|\
61
+ # / | \
62
+ # / | \
63
+ # 2---|---3
64
+ # \ | /
65
+ # \ | /
66
+ # \|/
67
+ # 0
68
+ #
69
+ # This is the same as SnapPea's default right_handed orientation.
70
+ #
71
+ # Each edge has a default orientation. The edge directions are chosen
72
+ # so that vertex 0 is a source and so that a simplex looks like this
73
+ # when viewed from any edge:
74
+ # *
75
+ # /|\
76
+ # / ^ \
77
+ # / | \
78
+ # *-<-|---*
79
+ # \ | /
80
+ # \ | /
81
+ # \|/
82
+ # *
83
+
84
+ # These dictionaries associate to each edge its initial vertex, terminal
85
+ # vertex, or a tuple containing both.
86
+
87
+ Tail = { E01:V0 , E02:V0 , E21:V2 , E03:V0 , E13:V1 , E32:V3 }
88
+ Head = { E01:V1 , E02:V2 , E21:V1 , E03:V3 , E13:V3 , E32:V2 }
89
+ EdgeTuple = { E01:(0,1), E02:(0,2), E21:(2,1), E03:(0,3), E13:(1,3), E32:(3,2)}
90
+
91
+ # These dictionaries associate to each edge a face containing it. If
92
+ # the terminal vertex of the edge is on top then the associated face
93
+ # is to the right (left, top, bottom) of the edge.
94
+
95
+ # ^
96
+ # /|\
97
+ # / | \ <-T
98
+ # / | \
99
+ # -L-|-R-
100
+ # \ | /
101
+ # \ | / <-B
102
+ # \|/
103
+
104
+
105
+ RightFace = { E01:F2 , E02:F3 , E21:F3 , E03:F1 , E13:F2 , E32:F1 }
106
+ LeftFace = { E01:F3 , E02:F1 , E21:F0 , E03:F2 , E13:F0 , E32:F0 }
107
+ TopFace = { E01:F0 , E02:F0 , E21:F2 , E03:F0 , E13:F1 , E32:F3 }
108
+ BottomFace = { E01:F1 , E02:F2 , E21:F1 , E03:F3 , E13:F3 , E32:F2 }
109
+
110
+ # This dictionary associates to each face an edge contained in it.
111
+
112
+ PickAnEdge = { F0:E21 , F1:E23, F2:E03, F3:E01}
113
+
114
+ # This dictionary associates to each edge its opposite edge.
115
+ OppositeEdge = { E01:E23, E02:E13, E03:E12, E12:E03, E13:E02, E23:E01 }
116
+
117
+ # This dictionary associates to each edge a list of the edges which
118
+ # are not opposite to it.
119
+
120
+ AdjacentEdges = { E01:(E02,E03,E12,E13),
121
+ E02:(E01,E03,E12,E23),
122
+ E03:(E01,E02,E13,E23),
123
+ E12:(E01,E02,E13,E23),
124
+ E13:(E01,E03,E12,E23),
125
+ E23:(E02,E03,E12,E13) }
126
+
127
+ # Loops that run through all subsimplices of a given dimension
128
+ # can use these lists of bitmaps as index sets.
129
+
130
+ # A list of all faces:
131
+ TwoSubsimplices = (F0,F1,F2,F3)
132
+
133
+ # A list of all edges:
134
+ OneSubsimplices = (E01,E02,E21,E03,E13,E32)
135
+
136
+ # A list of all vertices:
137
+ ZeroSubsimplices = (V0,V1,V2,V3)
138
+
139
+ # This dictionary maps the bitmap of a face to its index.
140
+ FaceIndex = {F0: 0, F1: 1, F2: 2, F3: 3}
141
+
142
+ # This dictionary maps a directed edge to the tail of its opposite.
143
+
144
+ OppTail = {(V0,V1):V3,(V0,V2):V1,(V0,V3):V2,(V1,V2):V3,(V1,V3):V0,(V2,V3):V1,
145
+ (V1,V0):V2,(V2,V0):V3,(V3,V0):V1,(V2,V1):V0,(V3,V1):V2,(V3,V2):V0}
146
+
147
+ # This dictionary maps each vertex to the three adjacent faces in
148
+ # counter-clockwise order
149
+ FacesAroundVertexCounterclockwise = {
150
+ V0: (F1, F2, F3),
151
+ V1: (F0, F3, F2),
152
+ V2: (F0, F1, F3),
153
+ V3: (F0, F2, F1)
154
+ }
155
+
156
+ # This dictionary maps each faces to the three adjacent vertices in
157
+ # counter-clockwise order
158
+ VerticesOfFaceCounterclockwise = {
159
+ F0: (V3, V2, V1),
160
+ F1: (V2, V3, V0),
161
+ F2: (V3, V1, V0),
162
+ F3: (V1, V2, V0)
163
+ }
164
+
165
+ # Dimension of a subsimplex
166
+ def dimension(x):
167
+ if x in ZeroSubsimplices:
168
+ return 0
169
+ if x in OneSubsimplices:
170
+ return 1
171
+ if x in TwoSubsimplices:
172
+ return 2
173
+ if x == T:
174
+ return 3
175
+ raise Exception("%r is not a subsimplex" % x)
176
+
177
+ # Decide if the bitmap x represents a subset of the bitmap y
178
+
179
+
180
+ def is_subset(x, y):
181
+ if (x & y == x):
182
+ return 1
183
+ return 0
184
+
185
+ # Return the complement of a subsimplex
186
+
187
+
188
+ def comp(subsimplex):
189
+ return ~subsimplex & 0xf
190
+
191
+
192
+ EdgeFacePairs = [(edge, face) for face in TwoSubsimplices
193
+ for edge in OneSubsimplices
194
+ if is_subset(edge, face)]
195
+
196
+ # Given and edge and a face, return the other face that meets the edge.
197
+
198
+ flip_face = {(edge, face):(edge | ~face & 0xf)
199
+ for edge, face in EdgeFacePairs}