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,109 @@
1
+ # $Id: tetrahedron.py,v 1.2 2002/09/20 03:52:16 culler 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
+ from .simplex import *
10
+ from .perm4 import Perm4, inv
11
+
12
+ import sys
13
+
14
+
15
+ class Tetrahedron:
16
+ def __init__(self, name=''):
17
+ self.Index = -1
18
+ self.Name = name
19
+ self.Neighbor = {F0:None,F1:None,F2:None,F3:None} # Tetrahedra
20
+ self.Gluing = {F0:None,F1:None,F2:None,F3:None} # Permutations
21
+ self.Class = [None]*16 # list of equivalence classes
22
+ self.Checked = 0 # flag
23
+
24
+ def __repr__(self):
25
+ if self.Index != -1:
26
+ return ( 'tet' + str(self.Index) )
27
+ else:
28
+ return '< floating tetrahedron ' + ' at ' + str(id(self)) + '>'
29
+
30
+ def attach(self, two_subsimplex, tet, perm_data):
31
+ if tet is None:
32
+ self.Neighbor[two_subsimplex] = None
33
+ self.Gluing[two_subsimplex] = None
34
+ else:
35
+ perm = Perm4(perm_data)
36
+ self.Neighbor[two_subsimplex] = tet
37
+ self.Gluing[two_subsimplex] = perm
38
+ tet.Neighbor[perm.image(two_subsimplex)] = self
39
+ tet.Gluing[perm.image(two_subsimplex)] = inv(self.Gluing[two_subsimplex])
40
+
41
+ # Reverse the orientation. Vertices are relabelled by a transposition
42
+ # and gluings are adjusted.
43
+ def reverse(self):
44
+ transpo = Perm4((1, 0, 2, 3))
45
+ nhbr = self.Neighbor.copy()
46
+ gluing = self.Gluing.copy()
47
+ for two_subsimplex in TwoSubsimplices:
48
+ relabeled = transpo.image(two_subsimplex)
49
+ if nhbr[two_subsimplex] is not None:
50
+ perm = (gluing[two_subsimplex] * transpo).tuple()
51
+ else:
52
+ perm = None
53
+ self.attach(relabeled, nhbr[two_subsimplex], perm)
54
+
55
+ # Unglues and removes references to self from neighbor.
56
+ def detach(self, two_subsimplex):
57
+ neighbor = self.Neighbor[two_subsimplex]
58
+ if neighbor is None:
59
+ return
60
+ neighbors_subsimplex = self.Gluing[two_subsimplex].image(two_subsimplex)
61
+ self.Neighbor[two_subsimplex] = None
62
+ self.Gluing[two_subsimplex] = None
63
+ if (neighbor.Neighbor and
64
+ neighbor.Neighbor[neighbors_subsimplex] == self):
65
+ neighbor.Neighbor[neighbors_subsimplex] = None
66
+ neighbor.Gluing[neighbors_subsimplex] = None
67
+
68
+ def erase(self):
69
+ for two_subsimplex in TwoSubsimplices:
70
+ self.detach(two_subsimplex)
71
+ self.Index = -1
72
+ self.Neighbor = None
73
+ self.Gluing = None
74
+ self.clear_Class()
75
+
76
+ def clear_Class(self):
77
+ self.Class = [None]*16 # list of equivalence classes
78
+
79
+ def info(self, out=sys.stdout):
80
+ if len(self.Name) == 0:
81
+ out.write(repr(self) + "\t%s\n" %
82
+ ([self.Neighbor.get(s) for s in TwoSubsimplices]))
83
+ else:
84
+ out.write(repr(self) + " ( " + self.Name + " )\n")
85
+ out.write("\t%s\n" % ([self.Neighbor.get(s) for s in TwoSubsimplices]))
86
+
87
+ out.write("\t%s\n" % ([self.Gluing.get(s) for s in TwoSubsimplices]))
88
+
89
+ out.write("\tVertices: " + repr(self.Class[V0])
90
+ + repr(self.Class[V1])
91
+ + repr(self.Class[V2])
92
+ + repr(self.Class[V3]) + '\n')
93
+
94
+ if self.Index > -1:
95
+ s = ""
96
+ for edge in OneSubsimplices[:3]:
97
+ s = (s + "%s : %-10s " %
98
+ (SubsimplexName[edge], self.Class[edge]))
99
+ out.write("\tEdges: " + s + '\n')
100
+ s = ""
101
+ for edge in OneSubsimplices[3:]:
102
+ s = (s + "%s : %-10s " %
103
+ (SubsimplexName[edge], self.Class[edge]))
104
+ out.write("\t " + s + '\n')
105
+
106
+ # Below added 7/12/99 by NMD
107
+
108
+ def get_orientation_of_edge(self, a, b):
109
+ return self.Class[a | b].orientation_with_respect_to(self, a, b)
@@ -0,0 +1,42 @@
1
+ # $Id: vertex.py,v 1.3 2003/03/07 17:29:28 culler 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
+ class Vertex:
10
+ def __init__(self):
11
+ self.Index = -1
12
+ self.IntOrBdry = ''
13
+ self.Corners = [] # Corners of type "0-simplex in Tetrahedron"
14
+ self.Edges = [] # incident Edges
15
+ # An Edge will appear twice if both its endpoints
16
+ # are equal to this Vertex
17
+
18
+ def __repr__(self):
19
+ if self.Index > -1:
20
+ return ('v' + str(self.Index)
21
+ + ' (' + self.IntOrBdry + ') ')
22
+ else:
23
+ return '< floating vertex' + str(id(self)) + ' >'
24
+
25
+ def erase(self):
26
+ for corner in self.Corners:
27
+ corner.Tetrahedron.Class[corner.Subsimplex] = None
28
+ for edge in self.Edges:
29
+ try:
30
+ edge.Vertices.remove(self)
31
+ except:
32
+ pass
33
+ self.Index = -1
34
+
35
+ def link_genus(self):
36
+ # The link of a vertex in an Mcomplex is a surface
37
+ # of arbitrary genus, possibly with non-empty boundary.
38
+ # For now I am pretending that links are closed and orientable
39
+ sum = 12
40
+ for edge in self.Edges:
41
+ sum = sum - 6 + edge.valence()
42
+ return sum//12
snappy/snap/test.py ADDED
@@ -0,0 +1,139 @@
1
+ from snappy import testing
2
+ import snappy
3
+
4
+ from snappy.sage_helper import _within_sage
5
+ from snappy.pari import pari
6
+
7
+ from snappy import snap
8
+
9
+ modules = [
10
+ snap,
11
+ snap.t3mlite.linalg,
12
+ snap.t3mlite.mcomplex,
13
+ snap.t3mlite.perm4,
14
+ snap.t3mlite.spun,
15
+ snap.character_varieties,
16
+ snap.nsagetools,
17
+ snap.slice_obs_HKL.basics,
18
+ snap.slice_obs_HKL.poly_norm,
19
+ snap.slice_obs_HKL.rep_theory,
20
+ snap.slice_obs_HKL.direct,
21
+ snap.slice_obs_HKL,
22
+ snap.fox_milnor,
23
+ snap.polished_reps,
24
+ snap.interval_reps,
25
+ snap.fundamental_polyhedron,
26
+ snap.peripheral.dual_cellulation,
27
+ snap.peripheral.link,
28
+ snap.peripheral.peripheral
29
+ ]
30
+
31
+ def run_doctests(verbose=False, print_info=True):
32
+ globs = {'Manifold':snappy.Manifold,
33
+ 'ManifoldHP':snappy.ManifoldHP,
34
+ 'Triangulation':snappy.Triangulation,
35
+ 'Mcomplex':snappy.snap.t3mlite.Mcomplex,
36
+ 'LinkSurface':snappy.snap.peripheral.link.LinkSurface}
37
+ return testing.doctest_modules(modules,
38
+ verbose=verbose,
39
+ print_info=print_info,
40
+ extraglobs=globs)
41
+
42
+ run_doctests.__name__ = snap.__name__
43
+
44
+ def _test_gluing_equations(manifold, shapes):
45
+ """
46
+ Given a manifold and exact shapes, test whether the rectangular gluing
47
+ equations are fulfilled.
48
+ """
49
+ one_minus_shapes = [1 - shape for shape in shapes]
50
+ for A, B, c in manifold.gluing_equations('rect'):
51
+ val = c
52
+ for a, shape in zip(A, shapes):
53
+ val *= shape ** a
54
+ for b, one_minus_shape in zip(B, one_minus_shapes):
55
+ val *= one_minus_shape ** b
56
+ if not val == 1:
57
+ return False
58
+ return True
59
+
60
+
61
+ def test_polished(dec_prec=200):
62
+ def test_manifold(manifold):
63
+ eqns = manifold.gluing_equations('rect')
64
+ shapes = manifold.tetrahedra_shapes('rect', dec_prec=dec_prec)
65
+ return snap.shapes.gluing_equation_error(eqns, shapes)
66
+
67
+ def test_census(name, census):
68
+ manifolds = list(census)
69
+ print('Checking gluing equations for %d %s manifolds' % (len(manifolds), name))
70
+ max_error = pari(0)
71
+ for i, M in enumerate(manifolds):
72
+ max_error = max(max_error, test_manifold(M))
73
+ print('\r ' + repr( (i, M) ).ljust(35) + ' Max error so far: %.2g' % float(max_error), end='')
74
+ print()
75
+
76
+ test_census('cusped census', snappy.OrientableCuspedCensus(filter='cusps>1')[-100:])
77
+ test_census('closed census', snappy.OrientableClosedCensus()[-100:])
78
+ test_census('4-component links', [M for M in snappy.LinkExteriors(num_cusps=4) if M.solution_type() == 'all tetrahedra positively oriented'])
79
+
80
+
81
+ def test_holonomy(dec_prec=200):
82
+ def test_manifold(manifold):
83
+ # This has several internal checks which raise exceptions
84
+ # if something is amiss
85
+ G = snap.polished_holonomy(manifold, dec_prec=dec_prec)
86
+
87
+ for census in [snappy.OrientableCuspedCensus, snappy.OrientableClosedCensus]:
88
+ print('Testing holonomy of 100 manifolds in ', census)
89
+ for manifold in census()[-100:]:
90
+ test_manifold(manifold)
91
+
92
+
93
+ def test_fields(bits_prec=200, degree=20):
94
+ for census in [snappy.OrientableCuspedCensus, snappy.OrientableClosedCensus]:
95
+ print('Fields of 100 manifolds in ', census)
96
+ for manifold in census()[:100]:
97
+ S = snap.tetrahedra_field_gens(manifold)
98
+ Tr = snap.trace_field_gens(manifold)
99
+ InvTr = snap.trace_field_gens(manifold)
100
+ hol = snap.holonomy_matrix_entries(manifold)
101
+ for kind, X in [('shapes', S),
102
+ ('trace', Tr),
103
+ ('invtrace', InvTr),
104
+ ('hol', hol)]:
105
+ K = X.find_field(bits_prec, degree)
106
+ if K is None:
107
+ print('Problem with', manifold, kind)
108
+ else:
109
+ if kind == 'shapes':
110
+ # Field is a sage number field, shapes are polynomials
111
+ field, numerical_root, shapes = K
112
+ # Turn the polynomials expressing the shapes in the
113
+ # root of the number field into expressions in the
114
+ # number field
115
+ shapes = [ field(shape) for shape in shapes ]
116
+ if not _test_gluing_equations(manifold, shapes):
117
+ print('Problem with', manifold,
118
+ '(gluing equations violated)')
119
+
120
+
121
+ def test_ZHS(bits_prec=500, degree=20):
122
+ for manifold in snappy.OrientableClosedCensus:
123
+ if manifold.homology().order() == 1:
124
+ T = snap.trace_field_gens(manifold)
125
+ ans = T.find_field(bits_prec, degree, True)
126
+ if ans:
127
+ print(manifold, ans[0].polynomial())
128
+ else:
129
+ print(manifold, ans)
130
+
131
+
132
+ def big_test():
133
+ test_polished()
134
+ if _within_sage:
135
+ test_holonomy()
136
+ test_fields()
137
+
138
+ if __name__ == '__main__':
139
+ testing.run_doctests_as_main(run_doctests)
@@ -0,0 +1,288 @@
1
+ """A collection of Python classes and objects which emulate various
2
+ features of Sage; the purpose of these is to allow some of the
3
+ snappy.snap tools to be used in an environment where Sage is not
4
+ available, such as in the SnapPy GUI or in a Windows python
5
+ interpreter.
6
+
7
+ """
8
+
9
+ from ..sage_helper import _within_sage
10
+ from snappy.number import SnapPyNumbers, Number
11
+ from itertools import chain
12
+ from ..pari import pari, PariError
13
+ from .fundamental_polyhedron import Infinity
14
+ if _within_sage:
15
+ from ..sage_helper import matrix as sage_matrix, vector as sage_vector
16
+ from ..sage_helper import RealField_class, ComplexField_class
17
+
18
+ def is_field(R):
19
+ return isinstance(R, (SnapPyNumbers, RealField_class,
20
+ ComplexField_class))
21
+ else:
22
+ def is_field(R):
23
+ return isinstance(R, SnapPyNumbers)
24
+
25
+
26
+ class MatrixBase():
27
+ """Base class for Vector2 and Matrix2x2. Do not instantiate."""
28
+ _base_ring = None
29
+
30
+ def __len__(self):
31
+ return 2
32
+
33
+ def _pari_(self):
34
+ # force left multiplication by Numbers to use rmul
35
+ raise PariError
36
+
37
+ def base_ring(self):
38
+ """If a base ring was set when initializing the matrix, then this
39
+ method will return that ring. Otherwise, the base ring is a
40
+ SnapPyNumbers object whose precision is the maximum precision
41
+ of the elements. If a new Number is created using the computed
42
+ base ring and combined with the entries of this matrix, then the
43
+ precision of the result will be determined by the precisions of
44
+ the entries.
45
+ """
46
+ if self._base_ring:
47
+ return self._base_ring
48
+ else:
49
+ precision = max([x.prec() for x in self.list()])
50
+ return SnapPyNumbers(precision=precision)
51
+
52
+ def list(self):
53
+ # Override this
54
+ return []
55
+
56
+
57
+ class Vector2(MatrixBase):
58
+ """A 2-dimensional vector whose entries are snappy Numbers."""
59
+ def __init__(self, *args):
60
+ if is_field(args[0]):
61
+ self._base_ring = number = SnapPyNumbers(args[0].precision())
62
+ args = args[1:]
63
+ else:
64
+ self._base_ring = None
65
+ number = Number
66
+ if len(args) == 1:
67
+ args = args[0]
68
+ if len(args) == 2:
69
+ self.x, self.y = (number(t) for t in args)
70
+ else:
71
+ raise ValueError('Invalid initialization for a Vector2.')
72
+
73
+ def __getitem__(self, index):
74
+ if index == 0:
75
+ return self.x
76
+ elif index == 1:
77
+ return self.y
78
+ else:
79
+ raise IndexError('Invalid Vector2 index.')
80
+
81
+ def __repr__(self):
82
+ entries = [str(e) for e in self.list()]
83
+ size = max(map(len, entries))
84
+ entries = tuple(('%%-%d.%ds' % (size, size)) % x for x in entries)
85
+ return '[ %s ]\n[ %s ]' % entries
86
+
87
+ def __add__(self, other):
88
+ return Vector2(self.x + other.x, self.y + other.y)
89
+
90
+ def __sub__(self, other):
91
+ return Vector2(self.x - other.x, self.y - other.y)
92
+
93
+ def __mul__(self, other):
94
+ if isinstance(other, Matrix2x2):
95
+ return Vector2(self.x * other.a + self.y * other.c,
96
+ self.x * other.b + self.y * other.d)
97
+ if isinstance(other, Number):
98
+ return Vector2(self.x * other, self.y * other)
99
+ try:
100
+ return self * self.base_ring()(other)
101
+ except (TypeError, ValueError):
102
+ return NotImplemented
103
+
104
+ def __rmul__(self, other):
105
+ return Vector2(self.x * other, self.y * other)
106
+
107
+ def __div__(self, other):
108
+ return Vector2(self.x / other, self.y / other)
109
+
110
+ def __truediv__(self, other):
111
+ return Vector2(self.x / other, self.y / other)
112
+
113
+ def __neg__(self):
114
+ return Vector2(-self.x, -self.y)
115
+
116
+ def list(self):
117
+ return [self.x, self.y]
118
+
119
+ def sage(self):
120
+ return sage_vector([self.x.sage(), self.y.sage()])
121
+
122
+ def norm(self, p=2):
123
+ if p == 1:
124
+ return self.x.abs() + self.y.abs()
125
+ if p == 2:
126
+ return ((self.x * self.x).abs() + (self.y * self.y).abs()).sqrt()
127
+ if p == Infinity:
128
+ return max(self.x.abs(), self.y.abs())
129
+
130
+
131
+ class Matrix2x2(MatrixBase):
132
+ """A 2x2 matrix class whose entries are snappy Numbers."""
133
+ def __init__(self, *args):
134
+ if is_field(args[0]):
135
+ self._base_ring = number = SnapPyNumbers(args[0].precision())
136
+ args = args[1:]
137
+ else:
138
+ self._base_ring = None
139
+ number = Number
140
+ if len(args) == 1:
141
+ args = tuple(chain(*args[0]))
142
+ if len(args) == 4:
143
+ self.a, self.b, self.c, self.d = (number(x) for x in args)
144
+ else:
145
+ raise ValueError('Invalid initialization for a Matrix2x2.')
146
+
147
+ def __repr__(self):
148
+ entries = [str(e) for e in self.list()]
149
+ size = max(map(len, entries))
150
+ entries = tuple(('%%-%d.%ds' % (size, size)) % x for x in entries)
151
+ return '[ %s %s ]\n[ %s %s ]' % entries
152
+
153
+ def __getitem__(self, index):
154
+ if isinstance(index, int):
155
+ if index == 0:
156
+ return [self.a, self.b]
157
+ if index == 1:
158
+ return [self.c, self.d]
159
+ elif isinstance(index, tuple) and len(index) == 2:
160
+ i, j = index
161
+ if i == 0:
162
+ return self.a if j == 0 else self.b
163
+ if i == 1:
164
+ return self.c if j == 0 else self.d
165
+ raise IndexError('Invalid 2x2 matrix index.')
166
+
167
+ def __add__(self, other):
168
+ return Matrix2x2(self.a + other.a,
169
+ self.b + other.b,
170
+ self.c + other.c,
171
+ self.d + other.d)
172
+
173
+ def __sub__(self, other):
174
+ return Matrix2x2(self.a - other.a,
175
+ self.b - other.b,
176
+ self.c - other.c,
177
+ self.d - other.d)
178
+
179
+ def __mul__(self, other):
180
+ if isinstance(other, Matrix2x2):
181
+ return Matrix2x2(self.a * other.a + self.b * other.c,
182
+ self.a * other.b + self.b * other.d,
183
+ self.c * other.a + self.d * other.c,
184
+ self.c * other.b + self.d * other.d)
185
+ if isinstance(other, Vector2):
186
+ return Vector2(self.a * other.x + self.b * other.y,
187
+ self.c * other.x + self.d * other.y)
188
+ if isinstance(other, Number):
189
+ return Matrix2x2(self.a * other, self.b * other,
190
+ self.c * other, self.d * other)
191
+ try:
192
+ return self * self.base_ring()(other)
193
+ except (TypeError, ValueError):
194
+ return NotImplemented
195
+
196
+ def __rmul__(self, other):
197
+ # Assumes that other is a scalar. This will not be
198
+ # called when left multiplying by a Matrix2x2
199
+ return Matrix2x2(self.a * other, self.b * other,
200
+ self.c * other, self.d * other)
201
+
202
+ def __div__(self, other):
203
+ # Assumes that other is a scalar.
204
+ return Matrix2x2(self.a / other, self.b / other,
205
+ self.c / other, self.d / other)
206
+
207
+ def __truediv__(self, other):
208
+ # Assumes that other is a scalar.
209
+ return Matrix2x2(self.a / other, self.b / other,
210
+ self.c / other, self.d / other)
211
+
212
+ def __neg__(self):
213
+ return Matrix2x2(-self.a, -self.b, -self.c, -self.d)
214
+
215
+ def __invert__(self):
216
+ try:
217
+ D = 1 / self.det()
218
+ except ZeroDivisionError:
219
+ raise ZeroDivisionError('matrix %s is not invertible.' % self)
220
+ return Matrix2x2(self.d * D, -self.b * D, -self.c * D, self.a * D)
221
+
222
+ def adjoint(self):
223
+ return Matrix2x2(self.d, -self.b, -self.c, self.a)
224
+
225
+ def determinant(self):
226
+ return self.a * self.d - self.b * self.c
227
+
228
+ det = determinant
229
+
230
+ def trace(self):
231
+ return self.a + self.d
232
+
233
+ def eigenvalues(self):
234
+ # WARNING: This can take infinitely long!!!! (WHY???)
235
+ R = self.base_ring()
236
+ x = pari('x')
237
+ a, b, c, d = map(pari, self.list())
238
+ p = x * x - (a + d) * x + (a * d - b * c)
239
+ roots = p.polroots(precision=R.precision())
240
+ return map(R, roots)
241
+
242
+ def norm(self, p=2):
243
+ if p == 1:
244
+ return max(self.a.abs() + self.c.abs(), self.b.abs() + self.d.abs())
245
+ if p == 'frob':
246
+ return sum([x * x for x in self.list()]).sqrt()
247
+ if p == Infinity:
248
+ return max(self.a.abs() + self.b.abs(), self.c.abs() + self.d.abs())
249
+ if p == 2:
250
+ return max([x.abs() for x in self.eigenvalues()])
251
+
252
+ def list(self):
253
+ return [self.a, self.b, self.c, self.d]
254
+
255
+ def rows(self):
256
+ return [Vector2(self.base_ring(), self.a, self.b),
257
+ Vector2(self.base_ring(), self.a, self.b)]
258
+
259
+ def sage(self):
260
+ return sage_matrix(2, 2, [x.sage() for x in self.list()])
261
+
262
+
263
+ def indexset(n):
264
+ """The orders of the non-zero bits in the binary expansion of n."""
265
+ i = 0
266
+ result = []
267
+ while True:
268
+ mask = 1 << i
269
+ if n & mask:
270
+ result.append(i)
271
+ if n < mask:
272
+ break
273
+ i += 1
274
+ return result
275
+
276
+
277
+ def powerset(X):
278
+ """Iterator for all finite subsequences of the iterable X"""
279
+ n = 0
280
+ segment = []
281
+ for x in X:
282
+ segment.append(x)
283
+ while True:
284
+ try:
285
+ yield [segment[i] for i in indexset(n)]
286
+ except IndexError:
287
+ break
288
+ n += 1