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,130 @@
1
+ from .truncatedComplex import TruncatedComplex
2
+
3
+ from snappy.snap import t3mlite as t3m
4
+
5
+ from .verificationError import *
6
+
7
+ class GimbalLoopFinder:
8
+ def __init__(self, truncated_complex, vertex, approx_edges):
9
+ self.truncated_complex = truncated_complex
10
+ self.vertex = vertex
11
+ self.approx_edges = approx_edges
12
+
13
+ self.uncovered_edge_ends = set()
14
+ for tet_and_perm in TruncatedComplex.get_tet_and_odd_perms_for_vertex(
15
+ vertex):
16
+ edge_index_and_end = (
17
+ truncated_complex.get_edge_index_and_end_from_tet_and_perm(
18
+ tet_and_perm))
19
+ if edge_index_and_end[0] in approx_edges:
20
+ self.uncovered_edge_ends.add(edge_index_and_end)
21
+
22
+ self.loop = truncated_complex.get_edges_of_small_hexagon(tet_and_perm)
23
+
24
+ self.used_hexagons = set()
25
+
26
+ self.mark_hexagon_as_used(self.loop)
27
+ self.insert_edge_loops()
28
+
29
+ def mark_hexagon_as_used(self, edges):
30
+ for edge in edges:
31
+ if edge.subcomplex_type == 'beta':
32
+ tet_index, p = edge.tet_and_perm
33
+ self.used_hexagons.add((tet_index, p.tuple()))
34
+
35
+ def insert_edge_loops(self):
36
+ position = 0
37
+ for i in range(len(self.loop)):
38
+ position = self.insert_edge_loop(position)
39
+ position += 1
40
+
41
+ def insert_edge_loop(self, position):
42
+ edge = self.loop[position]
43
+ if edge.subcomplex_type != 'gamma':
44
+ return position
45
+
46
+ edge_index_and_end = (
47
+ self.truncated_complex.get_edge_index_and_end_from_tet_and_perm(
48
+ edge.tet_and_perm))
49
+ if edge_index_and_end not in self.uncovered_edge_ends:
50
+ return position
51
+
52
+ self.uncovered_edge_ends.remove(edge_index_and_end)
53
+ self.loop.insert(
54
+ position,
55
+ TruncatedComplex.EdgeLoop(
56
+ edge.tet_and_perm, edge_index_and_end[0]))
57
+ return position + 1
58
+
59
+ def expand(self):
60
+ next_edge = 0
61
+ while self.uncovered_edge_ends:
62
+ next_edge = self.expand_at(next_edge)
63
+ next_edge = (next_edge + 1) % len(self.loop)
64
+
65
+ def expand_at(self, position):
66
+ edge = self.loop[position]
67
+ if edge.subcomplex_type != 'beta':
68
+ return position
69
+
70
+ other_tet_index, glued_perm = (
71
+ self.truncated_complex.get_glued_tet_and_perm(
72
+ edge.tet_and_perm))
73
+
74
+ other_perm = glued_perm * t3m.Perm4([0,2,1,3])
75
+
76
+ if (other_tet_index, other_perm.tuple()) in self.used_hexagons:
77
+ return position
78
+
79
+ hex = self.truncated_complex.get_edges_of_small_hexagon(
80
+ (other_tet_index, other_perm))
81
+ self.mark_hexagon_as_used(hex)
82
+
83
+ for i, new_edge in enumerate(hex[1:]):
84
+ if i == 0:
85
+ self.loop[position] = new_edge
86
+ else:
87
+ position += 1
88
+ self.loop.insert(position, new_edge)
89
+
90
+ position = self.insert_edge_loop(position)
91
+
92
+ return position
93
+
94
+
95
+ def shift_loop_to_start_with_edge_loop(self):
96
+ for i, edge in enumerate(self.loop):
97
+ if edge.subcomplex_type == 'edgeLoop':
98
+ self.loop = self.loop[i:] + self.loop[:i]
99
+ return
100
+
101
+ raise VertexHasNoApproxEdgeError("Vertex has no approx edge")
102
+
103
+ def compute_loop(self):
104
+ self.expand()
105
+ self.shift_loop_to_start_with_edge_loop()
106
+
107
+ self.truncated_complex.check_loop(self.loop)
108
+
109
+ return self.loop
110
+
111
+ def compute_grouped_loop(self):
112
+ return _group_loop(self.compute_loop())
113
+
114
+ def __repr__(self):
115
+ return repr(self.edges)
116
+
117
+
118
+ def _group_loop(loop):
119
+ indices = [i for i, edge in enumerate(loop)
120
+ if edge.subcomplex_type == 'edgeLoop'] + [len(loop)]
121
+ if 0 not in indices:
122
+ raise Exception("Missing edgeLoop")
123
+ result = [
124
+ [loop[indices[i]], loop[indices[i]+1:indices[i+1]]]
125
+ for i in range(len(indices) - 1) ]
126
+
127
+ if not sum([ [a] + b for a, b in result ], []) == loop:
128
+ raise Exception("Error in _group_loop")
129
+
130
+ return result
@@ -0,0 +1,313 @@
1
+ from .verificationError import *
2
+
3
+ from snappy.snap import t3mlite as t3m
4
+
5
+ from sage.all import vector, matrix, prod, exp, RealDoubleField, sqrt
6
+ import sage.all
7
+
8
+ __all__ = ['HyperbolicStructure']
9
+
10
+ class HyperbolicStructure:
11
+ def __init__(self, mcomplex, edge_lengths,
12
+ exact_edges = None, var_edges = None):
13
+ """
14
+ mcomplex is an Mcomplex.
15
+ edge_lengths are really the edge parameters.
16
+ exact_edges and var_edges are indices of edges (#edges - 3 * #vertices).
17
+ They are forming the subsystem of equations that
18
+ has full rank we use when polishing or applying the Krawczyk test.
19
+ var_edges correspond to the variables and exact_edges for the sum of dihedral
20
+ angles we are solving for.
21
+ """
22
+
23
+ self.mcomplex = mcomplex
24
+ self.edge_lengths = edge_lengths
25
+ self.exact_edges = exact_edges
26
+ self.var_edges = var_edges
27
+
28
+ self.vertex_gram_matrices = [
29
+ _compute_vertex_gram_matrix(tet, edge_lengths)
30
+ for tet in mcomplex.Tetrahedra ]
31
+
32
+ self.vertex_gram_adjoints = [
33
+ m.adjugate() for m in self.vertex_gram_matrices ]
34
+
35
+ self.dihedral_angles = [
36
+ [ [ _dihedral_angle(vertex_gram_adjoint, i, j)
37
+ for i in range(4) ] for j in range(4) ]
38
+ for vertex_gram_adjoint in self.vertex_gram_adjoints ]
39
+
40
+ self.angle_sums = [
41
+ self._angle_sum(edge) for edge in mcomplex.Edges ]
42
+
43
+ def _angle_at_corner(self, corner):
44
+ i, j = [ k for k, z in enumerate(t3m.ZeroSubsimplices)
45
+ if not z & corner.Subsimplex ]
46
+ return self.dihedral_angles[corner.Tetrahedron.Index][i][j]
47
+
48
+ def _angle_sum(self, edge):
49
+ return sum([self._angle_at_corner(corner)
50
+ for corner in edge.Corners])
51
+
52
+ def jacobian(self):
53
+ s = len(self.mcomplex.Edges)
54
+ result = matrix(self.vertex_gram_matrices[0].base_ring(), s, s)
55
+
56
+ for tet in self.mcomplex.Tetrahedra:
57
+ cofactor_matrices = _cofactor_matrices_for_submatrices(
58
+ self.vertex_gram_matrices[tet.Index])
59
+ vga = self.vertex_gram_adjoints[tet.Index]
60
+
61
+ for angle_edge, (i, j) in _OneSubsimplicesWithVertexIndices:
62
+ cii = vga[i,i]
63
+ cij = vga[i,j]
64
+ cjj = vga[j,j]
65
+
66
+ dcij = - 1 / sqrt(cii * cjj - cij**2)
67
+ tmp = -dcij * cij / 2
68
+ dcii = tmp / cii
69
+ dcjj = tmp / cjj
70
+
71
+ a = tet.Class[t3m.comp(angle_edge)].Index
72
+
73
+ for length_edge, (m, n) in _OneSubsimplicesWithVertexIndices:
74
+ l = tet.Class[length_edge].Index
75
+
76
+ result[a, l] += (
77
+ dcij * _cofactor_derivative(
78
+ cofactor_matrices, i, j, m, n) +
79
+ dcii * _cofactor_derivative(
80
+ cofactor_matrices, i, i, m, n) +
81
+ dcjj * _cofactor_derivative(
82
+ cofactor_matrices, j, j, m, n))
83
+ return result
84
+
85
+ def full_rank_jacobian_submatrix(self):
86
+ return self.jacobian().matrix_from_rows_and_columns(
87
+ self.exact_edges, self.var_edges)
88
+
89
+ def derivative_of_single_dihedral_angle(self, tetIndex, i, j):
90
+ """
91
+ Gives the derivative of the single dihedral angle between face i and j
92
+ of tetrahedron tetIndex with respect to the edge parameters.
93
+ """
94
+
95
+ s = len(self.mcomplex.Edges)
96
+ result = vector(self.vertex_gram_matrices[0].base_ring(), s)
97
+
98
+ tet = self.mcomplex.Tetrahedra[tetIndex]
99
+
100
+ cofactor_matrices = _cofactor_matrices_for_submatrices(
101
+ self.vertex_gram_matrices[tetIndex])
102
+ vga = self.vertex_gram_adjoints[tetIndex]
103
+
104
+ cii = vga[i,i]
105
+ cij = vga[i,j]
106
+ cjj = vga[j,j]
107
+
108
+ dcij = - 1 / sqrt(cii * cjj - cij**2)
109
+ tmp = -dcij * cij / 2
110
+ dcii = tmp / cii
111
+ dcjj = tmp / cjj
112
+
113
+ for length_edge, (m, n) in _OneSubsimplicesWithVertexIndices:
114
+ l = tet.Class[length_edge].Index
115
+
116
+ result[l] += (
117
+ dcij * _cofactor_derivative(
118
+ cofactor_matrices, i, j, m, n) +
119
+ dcii * _cofactor_derivative(
120
+ cofactor_matrices, i, i, m, n) +
121
+ dcjj * _cofactor_derivative(
122
+ cofactor_matrices, j, j, m, n))
123
+
124
+ return result
125
+
126
+ def pick_exact_and_var_edges(self):
127
+ num_edges = len(self.mcomplex.Edges)
128
+ num_verts = len(self.mcomplex.Vertices)
129
+
130
+ J = self.jacobian().change_ring(RealDoubleField())
131
+
132
+ self.exact_edges, self.var_edges = _find_rows_and_columns_for_full_rank_submatrix(
133
+ J, num_edges - 3 * num_verts)
134
+
135
+ def pgl2_matrix_for_edge(self, e):
136
+ """
137
+ e is a TruncatedComplex.Edge
138
+ """
139
+
140
+ RF = self.vertex_gram_matrices[0].base_ring()
141
+ CF = RF.complex_field()
142
+
143
+ if e.subcomplex_type == 'alpha':
144
+ tet_index, perm = e.tet_and_perm
145
+ v = self.vertex_gram_matrices[tet_index][perm[0], perm[1]]
146
+ return matrix(CF, [[0, (v**2 - 1).sqrt() - v], [1, 0]])
147
+
148
+ if e.subcomplex_type == 'beta':
149
+ etaHalf = self._compute_eta(e.tet_and_perm) / 2
150
+ c = etaHalf.cos()
151
+ s = etaHalf.sin()
152
+
153
+ return matrix(CF, [[-c, s], [s, c]])
154
+
155
+ if e.subcomplex_type == 'gamma':
156
+ theta = self._compute_theta(e.tet_and_perm)
157
+ return matrix(CF, [[(theta * sage.all.I).exp(), 0],[0,1]])
158
+
159
+ raise Exception("Unsupported edge type")
160
+
161
+ def so3_matrix_for_edge(self, e):
162
+ """
163
+ e is a TruncatedComplex.Edge
164
+ """
165
+ if e.subcomplex_type == 'beta':
166
+ eta = self._compute_eta(e.tet_and_perm)
167
+ c = eta.cos()
168
+ s = eta.sin()
169
+
170
+ return matrix([[-c, 0, s], [0, -1, 0], [s, 0, c]])
171
+
172
+ if e.subcomplex_type == 'gamma':
173
+ theta = self._compute_theta(e.tet_and_perm)
174
+ return HyperbolicStructure.so3_matrix_for_z_rotation(theta)
175
+
176
+ raise Exception("Unsupported edge type")
177
+
178
+ def pgl2_matrix_for_path(self, p):
179
+ if p:
180
+ return prod([self.pgl2_matrix_for_edge(e) for e in p[::-1]])
181
+ else:
182
+ RF = self.vertex_gram_matrices[0].base_ring()
183
+ CF = RF.complex_field()
184
+ return matrix.identity(CF, 2)
185
+
186
+ def so3_matrix_for_path(self, p):
187
+ if p:
188
+ return prod([self.so3_matrix_for_edge(e) for e in p[::-1]])
189
+ else:
190
+ RF = self.vertex_gram_matrices[0].base_ring()
191
+ return matrix.identity(RF, 3)
192
+
193
+ @staticmethod
194
+ def so3_matrix_for_z_rotation(angle):
195
+ c = angle.cos()
196
+ s = angle.sin()
197
+
198
+ return matrix([[c, -s, 0], [s, c, 0], [0, 0, 1]])
199
+
200
+ @staticmethod
201
+ def so3_matrix_and_derivative_for_z_rotation(angle):
202
+ c = angle.cos()
203
+ s = angle.sin()
204
+
205
+ return (
206
+ matrix([[ c, -s, 0], [s, c, 0], [0, 0, 1]]),
207
+ matrix([[-s, -c, 0], [c, -s, 0], [0, 0, 0]]))
208
+
209
+ def _compute_theta(self, tet_and_perm):
210
+ tet_index, perm = tet_and_perm
211
+ angle = self.dihedral_angles[tet_index][perm[2]][perm[3]]
212
+
213
+ if perm.sign() == 0:
214
+ return -angle
215
+ else:
216
+ return angle
217
+
218
+ def _compute_eta(self, tet_and_perm):
219
+ tet_index, perm = tet_and_perm
220
+ vertex_gram_matrix = self.vertex_gram_matrices[tet_index]
221
+ vij = vertex_gram_matrix[perm[0], perm[1]]
222
+ vik = vertex_gram_matrix[perm[0], perm[2]]
223
+ vjk = vertex_gram_matrix[perm[1], perm[2]]
224
+
225
+ t = (vij * vik + vjk) / ( (vij ** 2 - 1) * (vik ** 2 - 1) ).sqrt()
226
+
227
+ return t.arccos()
228
+
229
+ def _compute_vertex_gram_matrix(tet, edge_lengths):
230
+ def entry(i, j):
231
+ if i == j:
232
+ return -1
233
+ e = t3m.ZeroSubsimplices[i] | t3m.ZeroSubsimplices[j]
234
+ edge = tet.Class[e]
235
+ return edge_lengths[edge.Index]
236
+
237
+ return matrix([ [ entry(i,j) for j in range(4) ] for i in range(4) ])
238
+
239
+ def _dihedral_angle(vertex_gram_adjoint, i, j):
240
+ if i == j:
241
+ return 0
242
+
243
+ cij = vertex_gram_adjoint[i][j]
244
+ cii = vertex_gram_adjoint[i][i]
245
+ cjj = vertex_gram_adjoint[j][j]
246
+
247
+ ciicjj = cii * cjj
248
+ if not (ciicjj > 0):
249
+ raise BadDihedralAngleError("cii*cjj not positive")
250
+
251
+ t = cij / ciicjj.sqrt()
252
+ if not (abs(t) < 1):
253
+ raise BadDihedralAngleError("|cos(angle)| not < 1")
254
+
255
+ return t.arccos()
256
+
257
+ def _find_max(m, rows_left, cols_left):
258
+ v = -1
259
+ for r in rows_left:
260
+ for c in cols_left:
261
+ a = abs(m[r,c])
262
+ if a > v:
263
+ v, row, col = a, r, c
264
+
265
+ return row, col
266
+
267
+ def _find_rows_and_columns_for_full_rank_submatrix(m, expected_rank):
268
+ num_rows, num_cols = m.dimensions()
269
+
270
+ rows_left = set(range(num_rows))
271
+ cols_left = set(range(num_cols))
272
+
273
+ for i in range(expected_rank):
274
+ row, col = _find_max(m, rows_left, cols_left)
275
+
276
+ rows_left.remove(row)
277
+ cols_left.remove(col)
278
+
279
+ for r in rows_left:
280
+ m.add_multiple_of_row( r, row, -m[r, col] / m[row, col])
281
+ for c in cols_left:
282
+ m.add_multiple_of_column(c, col, -m[row, c ] / m[row, col])
283
+
284
+ return ([row for row in range(num_rows) if row not in rows_left],
285
+ [col for col in range(num_cols) if col not in cols_left])
286
+
287
+
288
+ def _cofactor_matrices_for_submatrices(m):
289
+ def cofactor_matrix(r, c):
290
+ submatrix = m.matrix_from_rows_and_columns(
291
+ [k for k in range(4) if k != r],
292
+ [k for k in range(4) if k != c])
293
+ return submatrix.adjugate().transpose() * (-1) ** (r + c)
294
+
295
+ return [[ cofactor_matrix(r, c) for c in range(4) ] for r in range(4) ]
296
+
297
+ def _one_cofactor_derivative(cofactor_matrices, i, j, m, n):
298
+ if i == m or j == n:
299
+ return 0
300
+ return cofactor_matrices[i][j][
301
+ m if m < i else m - 1, n if n < j else n - 1]
302
+
303
+ def _cofactor_derivative(cofactor_matrices, i, j, m, n):
304
+ return (
305
+ _one_cofactor_derivative(cofactor_matrices, i, j, m, n) +
306
+ _one_cofactor_derivative(cofactor_matrices, i, j, n, m))
307
+
308
+ _OneSubsimplicesWithVertexIndices = [
309
+ (oneSubsimplex, [ index
310
+ for index, zeroSubsimplex
311
+ in enumerate(t3m.ZeroSubsimplices)
312
+ if zeroSubsimplex & oneSubsimplex ])
313
+ for oneSubsimplex in t3m.OneSubsimplices ]
@@ -0,0 +1,165 @@
1
+ from .hyperbolicStructure import *
2
+ from .verificationError import *
3
+
4
+ from sage.all import RealDoubleField, RealIntervalField, vector, matrix, pi
5
+
6
+ __all__ = ['KrawczykCertifiedEdgeLengthsEngine']
7
+
8
+ class KrawczykCertifiedEdgeLengthsEngine:
9
+ """
10
+ Performs Step I of the algorithm.
11
+
12
+ The input is an instance of HyperbolicStructure where the unverified edge
13
+ lengths are in SageMath's RealDoubleField or RealField - and where the
14
+ exact_edges (E^= in the notation of the paper) and var_edges (E^var) are
15
+ set (using HyperbolicStructure.pick_exact_and_var_edges).
16
+
17
+ The output are intervals (in RealIntervalField) for the edge lengths
18
+ verified to contain a solution to the equations indexed by exact_edges.
19
+ To obtain an instance of HyperbolicStructure based on these edge lengths,
20
+ call
21
+ KrawczykCertifiedEdgeLengthsEngine.partially_verified_hyperbolic_structure
22
+
23
+ Note: We say edge lengths when we really mean the edge parameter, i.e.,
24
+ -cosh(hyperbolic length of an edge).
25
+ """
26
+
27
+
28
+ def __init__(self, approx_hyperbolic_structure, bits_prec = 53):
29
+
30
+ if not (approx_hyperbolic_structure.exact_edges and
31
+ approx_hyperbolic_structure.var_edges):
32
+ raise Exception(
33
+ "Did not pick exact/var edges: "
34
+ "call HyperbolicStructure.pick_exact_and_var_edges.")
35
+
36
+ self.mcomplex = approx_hyperbolic_structure.mcomplex
37
+ self.exact_edges = approx_hyperbolic_structure.exact_edges
38
+ self.var_edges = approx_hyperbolic_structure.var_edges
39
+ self.bits_prec = bits_prec
40
+ self.RIF = RealIntervalField(bits_prec)
41
+ self.twoPi = self.RIF(2 * pi)
42
+
43
+ self.initial_edge_lengths = vector(
44
+ [ self.RIF(e) for e in approx_hyperbolic_structure.edge_lengths ])
45
+
46
+ self.approx_inverse = (
47
+ approx_hyperbolic_structure.full_rank_jacobian_submatrix()
48
+ .change_ring(RealDoubleField())
49
+ .inverse()
50
+ .change_ring(self.RIF))
51
+
52
+ self.identity = matrix.identity(self.RIF, len(self.var_edges))
53
+
54
+ self.certified_edge_lengths = None
55
+
56
+ def krawczyk_iteration(self, edge_lengths):
57
+
58
+ try:
59
+ h = HyperbolicStructure(
60
+ self.mcomplex, edge_lengths, self.exact_edges, self.var_edges)
61
+ except BadDihedralAngleError as e:
62
+ raise KrawczykFailedWithBadDihedralAngleError("During iteration", e)
63
+
64
+ error = [ h.angle_sums[e] - self.twoPi for e in self.var_edges ]
65
+ jacobian = h.full_rank_jacobian_submatrix()
66
+
67
+ diffs = vector(
68
+ self.RIF,
69
+ [ edge_lengths[var_edge] - self.initial_edge_lengths[var_edge]
70
+ for var_edge in self.var_edges])
71
+
72
+ var_edge_lengths = (
73
+ self.first_term
74
+ + (self.identity - self.approx_inverse * jacobian) * diffs)
75
+
76
+ result = [ edge_length for edge_length in edge_lengths ]
77
+ for var_edge, edge_length in zip(self.var_edges, var_edge_lengths):
78
+ result[var_edge] = edge_length
79
+
80
+ return vector(self.RIF, result)
81
+
82
+ @staticmethod
83
+ def interval_vector_union(vecA, vecB):
84
+ """
85
+ Given two vectors of intervals, return the vector of their unions,
86
+ i.e., the smallest interval containing both intervals.
87
+ """
88
+
89
+ return vector([ a.union(b) for a, b in zip(vecA, vecB) ])
90
+
91
+ @staticmethod
92
+ def interval_vector_is_contained_in(vecA, vecB):
93
+ """
94
+ Given two vectors of intervals, return whether the first one
95
+ is contained in the second one. Examples::
96
+
97
+ sage: RIF = RealIntervalField(80)
98
+ sage: CIF = ComplexIntervalField(80)
99
+ sage: box = CIF(RIF(-1,1),RIF(-1,1))
100
+ sage: a = [ CIF(0.1), CIF(1) + box ]
101
+ sage: b = [ CIF(0) + box, CIF(1) + 2 * box ]
102
+ sage: c = [ CIF(0), CIF(1) + 3 * box ]
103
+
104
+ sage: KrawczykCertifiedShapesEngine.interval_vector_is_contained_in(a, b)
105
+ True
106
+ sage: KrawczykCertifiedShapesEngine.interval_vector_is_contained_in(a, c)
107
+ False
108
+ sage: KrawczykCertifiedShapesEngine.interval_vector_is_contained_in(b, a)
109
+ False
110
+ sage: KrawczykCertifiedShapesEngine.interval_vector_is_contained_in(b, c)
111
+ False
112
+ sage: KrawczykCertifiedShapesEngine.interval_vector_is_contained_in(c, a)
113
+ False
114
+ sage: KrawczykCertifiedShapesEngine.interval_vector_is_contained_in(c, b)
115
+ False
116
+ """
117
+ return all([(a in b) for a, b in zip(vecA, vecB)])
118
+
119
+ def expand_until_certified(self, verbose = False):
120
+ try:
121
+ h = HyperbolicStructure(
122
+ self.mcomplex, self.initial_edge_lengths,
123
+ self.exact_edges, self.var_edges)
124
+ except BadDihedralAngleError as e:
125
+ raise KrawczykFailedWithBadDihedralAngleError("When preparing for certification", e)
126
+
127
+ error_at_initial_edge_lengths = vector(
128
+ self.RIF,
129
+ [ h.angle_sums[e] - self.twoPi for e in self.var_edges ])
130
+
131
+ self.first_term = (vector(self.RIF,[self.initial_edge_lengths[c] for c in self.var_edges])
132
+ - self.approx_inverse * error_at_initial_edge_lengths)
133
+
134
+ edge_lengths = self.initial_edge_lengths
135
+
136
+ num_iterations = (25 if self.bits_prec > 53 else 11)
137
+
138
+ for i in range(num_iterations + 1):
139
+ old_edge_lengths = edge_lengths
140
+
141
+ edge_lengths = self.krawczyk_iteration(edge_lengths)
142
+
143
+ if KrawczykCertifiedEdgeLengthsEngine.interval_vector_is_contained_in(
144
+ edge_lengths, old_edge_lengths):
145
+ self.certified_edge_lengths = edge_lengths
146
+
147
+ if verbose:
148
+ print("Certified in iteration", i)
149
+
150
+ return True
151
+
152
+ edge_lengths = KrawczykCertifiedEdgeLengthsEngine.interval_vector_union(
153
+ edge_lengths, old_edge_lengths)
154
+
155
+ raise KrawczykFailedToFinishError("Failed after iterations", num_iterations)
156
+
157
+ def partially_verified_hyperbolic_structure(self, verbose = False):
158
+
159
+ self.expand_until_certified(verbose)
160
+
161
+ return HyperbolicStructure(
162
+ self.mcomplex,
163
+ self.certified_edge_lengths,
164
+ self.exact_edges,
165
+ self.var_edges)