snappy 3.1.1__cp39-cp39-win_amd64.whl → 3.2__cp39-cp39-win_amd64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (476) hide show
  1. snappy/CyOpenGL.cp39-win_amd64.pyd +0 -0
  2. snappy/SnapPy.cp39-win_amd64.pyd +0 -0
  3. snappy/SnapPyHP.cp39-win_amd64.pyd +0 -0
  4. snappy/__init__.py +299 -402
  5. snappy/app.py +70 -20
  6. snappy/browser.py +18 -17
  7. snappy/canonical.py +249 -0
  8. snappy/{verify/cusp_shapes.py → cusps/__init__.py} +8 -18
  9. snappy/cusps/cusp_area_matrix.py +101 -0
  10. snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +23 -39
  11. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  12. snappy/cusps/test.py +21 -0
  13. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  14. snappy/database.py +10 -9
  15. snappy/decorated_isosig.py +337 -114
  16. snappy/dev/extended_ptolemy/complexVolumesClosed.py +40 -7
  17. snappy/dev/extended_ptolemy/extended.py +3 -3
  18. snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
  19. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +1 -1
  20. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  21. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  22. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  23. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  24. snappy/doc/_sources/additional_classes.rst.txt +40 -40
  25. snappy/doc/_sources/bugs.rst.txt +14 -14
  26. snappy/doc/_sources/censuses.rst.txt +51 -51
  27. snappy/doc/_sources/credits.rst.txt +75 -75
  28. snappy/doc/_sources/development.rst.txt +259 -239
  29. snappy/doc/_sources/index.rst.txt +182 -115
  30. snappy/doc/_sources/installing.rst.txt +247 -264
  31. snappy/doc/_sources/manifold.rst.txt +6 -6
  32. snappy/doc/_sources/manifoldhp.rst.txt +46 -46
  33. snappy/doc/_sources/news.rst.txt +355 -283
  34. snappy/doc/_sources/other.rst.txt +25 -25
  35. snappy/doc/_sources/platonic_census.rst.txt +20 -20
  36. snappy/doc/_sources/plink.rst.txt +102 -102
  37. snappy/doc/_sources/ptolemy.rst.txt +66 -66
  38. snappy/doc/_sources/ptolemy_classes.rst.txt +42 -42
  39. snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -297
  40. snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -363
  41. snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -301
  42. snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -61
  43. snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -105
  44. snappy/doc/_sources/screenshots.rst.txt +21 -21
  45. snappy/doc/_sources/snap.rst.txt +87 -87
  46. snappy/doc/_sources/snappy.rst.txt +28 -28
  47. snappy/doc/_sources/spherogram.rst.txt +103 -103
  48. snappy/doc/_sources/todo.rst.txt +47 -47
  49. snappy/doc/_sources/triangulation.rst.txt +11 -11
  50. snappy/doc/_sources/tutorial.rst.txt +49 -49
  51. snappy/doc/_sources/verify.rst.txt +210 -150
  52. snappy/doc/_sources/verify_internals.rst.txt +79 -90
  53. snappy/doc/_static/basic.css +924 -902
  54. snappy/doc/_static/css/badge_only.css +1 -1
  55. snappy/doc/_static/css/theme.css +1 -1
  56. snappy/doc/_static/doctools.js +1 -1
  57. snappy/doc/_static/documentation_options.js +12 -13
  58. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  59. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  60. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  61. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  62. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  63. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  64. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  65. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  66. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  67. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  68. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  69. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  70. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  71. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  72. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  73. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  74. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  75. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  76. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  77. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  78. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  79. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  80. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  81. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  82. snappy/doc/_static/js/versions.js +228 -0
  83. snappy/doc/_static/language_data.js +199 -199
  84. snappy/doc/_static/pygments.css +74 -73
  85. snappy/doc/_static/searchtools.js +125 -71
  86. snappy/doc/_static/snappy_furo.css +33 -33
  87. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
  88. snappy/doc/_static/sphinx_highlight.js +13 -3
  89. snappy/doc/additional_classes.html +1499 -1330
  90. snappy/doc/bugs.html +131 -134
  91. snappy/doc/censuses.html +426 -445
  92. snappy/doc/credits.html +180 -183
  93. snappy/doc/development.html +383 -363
  94. snappy/doc/genindex.html +1330 -1409
  95. snappy/doc/index.html +261 -206
  96. snappy/doc/installing.html +345 -363
  97. snappy/doc/manifold.html +3451 -2839
  98. snappy/doc/manifoldhp.html +179 -182
  99. snappy/doc/news.html +387 -329
  100. snappy/doc/objects.inv +0 -0
  101. snappy/doc/other.html +160 -162
  102. snappy/doc/platonic_census.html +374 -377
  103. snappy/doc/plink.html +209 -212
  104. snappy/doc/ptolemy.html +253 -255
  105. snappy/doc/ptolemy_classes.html +1143 -1146
  106. snappy/doc/ptolemy_examples1.html +408 -410
  107. snappy/doc/ptolemy_examples2.html +470 -473
  108. snappy/doc/ptolemy_examples3.html +413 -416
  109. snappy/doc/ptolemy_examples4.html +194 -197
  110. snappy/doc/ptolemy_prelim.html +247 -250
  111. snappy/doc/py-modindex.html +164 -167
  112. snappy/doc/screenshots.html +140 -142
  113. snappy/doc/search.html +134 -137
  114. snappy/doc/searchindex.js +1 -1
  115. snappy/doc/snap.html +201 -204
  116. snappy/doc/snappy.html +180 -182
  117. snappy/doc/spherogram.html +1210 -1213
  118. snappy/doc/todo.html +165 -168
  119. snappy/doc/triangulation.html +1583 -1474
  120. snappy/doc/tutorial.html +158 -161
  121. snappy/doc/verify.html +329 -275
  122. snappy/doc/verify_internals.html +1234 -1691
  123. snappy/drilling/__init__.py +153 -235
  124. snappy/drilling/barycentric.py +103 -0
  125. snappy/drilling/constants.py +0 -2
  126. snappy/drilling/crush.py +56 -130
  127. snappy/drilling/cusps.py +12 -6
  128. snappy/drilling/debug.py +2 -1
  129. snappy/drilling/exceptions.py +7 -40
  130. snappy/drilling/moves.py +302 -243
  131. snappy/drilling/perturb.py +63 -37
  132. snappy/drilling/shorten.py +36 -0
  133. snappy/drilling/subdivide.py +0 -5
  134. snappy/drilling/test.py +23 -0
  135. snappy/drilling/test_cases.py +126 -0
  136. snappy/drilling/tracing.py +9 -37
  137. snappy/exceptions.py +18 -5
  138. snappy/exterior_to_link/barycentric_geometry.py +2 -4
  139. snappy/exterior_to_link/main.py +8 -7
  140. snappy/exterior_to_link/mcomplex_with_link.py +2 -2
  141. snappy/exterior_to_link/rational_linear_algebra.py +1 -1
  142. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
  143. snappy/exterior_to_link/test.py +21 -33
  144. snappy/geometric_structure/__init__.py +212 -0
  145. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  146. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  147. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  148. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  149. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  150. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  151. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  152. snappy/geometric_structure/geodesic/__init__.py +0 -0
  153. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  154. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  155. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  156. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  157. snappy/geometric_structure/geodesic/constants.py +6 -0
  158. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  159. snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
  160. snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
  161. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  162. snappy/geometric_structure/geodesic/line.py +30 -0
  163. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  164. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  165. snappy/geometric_structure/test.py +22 -0
  166. snappy/gui.py +23 -13
  167. snappy/horoviewer.py +7 -7
  168. snappy/hyperboloid/__init__.py +96 -31
  169. snappy/hyperboloid/distances.py +245 -0
  170. snappy/hyperboloid/horoball.py +19 -0
  171. snappy/hyperboloid/line.py +35 -0
  172. snappy/hyperboloid/point.py +9 -0
  173. snappy/hyperboloid/triangle.py +29 -0
  174. snappy/isometry_signature.py +382 -0
  175. snappy/len_spec/__init__.py +596 -0
  176. snappy/len_spec/geodesic_info.py +110 -0
  177. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  178. snappy/len_spec/geodesic_piece.py +143 -0
  179. snappy/len_spec/geometric_structure.py +182 -0
  180. snappy/len_spec/geometry.py +80 -0
  181. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  182. snappy/len_spec/spine.py +206 -0
  183. snappy/len_spec/test.py +24 -0
  184. snappy/len_spec/test_cases.py +69 -0
  185. snappy/len_spec/tile.py +275 -0
  186. snappy/len_spec/word.py +86 -0
  187. snappy/math_basics.py +39 -13
  188. snappy/matrix.py +52 -9
  189. snappy/number.py +12 -6
  190. snappy/numeric_output_checker.py +2 -3
  191. snappy/pari.py +8 -4
  192. snappy/phone_home.py +2 -1
  193. snappy/polyviewer.py +8 -8
  194. snappy/ptolemy/__init__.py +1 -1
  195. snappy/ptolemy/component.py +2 -2
  196. snappy/ptolemy/coordinates.py +25 -25
  197. snappy/ptolemy/findLoops.py +9 -9
  198. snappy/ptolemy/manifoldMethods.py +27 -29
  199. snappy/ptolemy/polynomial.py +50 -57
  200. snappy/ptolemy/processFileBase.py +60 -0
  201. snappy/ptolemy/ptolemyVariety.py +109 -41
  202. snappy/ptolemy/reginaWrapper.py +4 -4
  203. snappy/ptolemy/rur.py +1 -1
  204. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
  205. snappy/ptolemy/test.py +99 -54
  206. snappy/ptolemy/utilities.py +1 -1
  207. snappy/raytracing/__init__.py +64 -0
  208. snappy/raytracing/additional_horospheres.py +64 -0
  209. snappy/raytracing/additional_len_spec_choices.py +63 -0
  210. snappy/raytracing/cohomology_fractal.py +0 -3
  211. snappy/raytracing/eyeball.py +123 -0
  212. snappy/raytracing/finite_raytracing_data.py +17 -17
  213. snappy/raytracing/finite_viewer.py +15 -15
  214. snappy/raytracing/geodesic_tube_info.py +93 -63
  215. snappy/raytracing/geodesics.py +94 -64
  216. snappy/raytracing/geodesics_window.py +56 -34
  217. snappy/raytracing/gui_utilities.py +21 -6
  218. snappy/raytracing/hyperboloid_navigation.py +29 -4
  219. snappy/raytracing/hyperboloid_utilities.py +73 -73
  220. snappy/raytracing/ideal_raytracing_data.py +121 -91
  221. snappy/raytracing/inside_viewer.py +199 -66
  222. snappy/raytracing/pack.py +22 -0
  223. snappy/raytracing/raytracing_data.py +37 -25
  224. snappy/raytracing/raytracing_view.py +70 -65
  225. snappy/raytracing/shaders/Eye.png +0 -0
  226. snappy/raytracing/shaders/NonGeometric.png +0 -0
  227. snappy/raytracing/shaders/__init__.py +39 -3
  228. snappy/raytracing/shaders/fragment.glsl +451 -133
  229. snappy/raytracing/test.py +29 -0
  230. snappy/raytracing/tooltip.py +146 -0
  231. snappy/raytracing/upper_halfspace_utilities.py +42 -9
  232. snappy/sage_helper.py +67 -134
  233. snappy/settings.py +90 -77
  234. snappy/shell.py +2 -0
  235. snappy/snap/character_varieties.py +2 -2
  236. snappy/snap/find_field.py +4 -3
  237. snappy/snap/fundamental_polyhedron.py +2 -2
  238. snappy/snap/kernel_structures.py +5 -1
  239. snappy/snap/nsagetools.py +9 -8
  240. snappy/snap/peripheral/dual_cellulation.py +4 -3
  241. snappy/snap/peripheral/peripheral.py +2 -2
  242. snappy/snap/peripheral/surface.py +5 -5
  243. snappy/snap/peripheral/test.py +1 -1
  244. snappy/snap/polished_reps.py +8 -8
  245. snappy/snap/slice_obs_HKL.py +16 -14
  246. snappy/snap/t3mlite/arrow.py +3 -3
  247. snappy/snap/t3mlite/edge.py +3 -3
  248. snappy/snap/t3mlite/homology.py +2 -2
  249. snappy/snap/t3mlite/mcomplex.py +3 -3
  250. snappy/snap/t3mlite/simplex.py +12 -0
  251. snappy/snap/t3mlite/spun.py +18 -17
  252. snappy/snap/t3mlite/test_vs_regina.py +4 -4
  253. snappy/snap/test.py +37 -53
  254. snappy/snap/utilities.py +4 -5
  255. snappy/test.py +121 -138
  256. snappy/test_cases.py +263 -0
  257. snappy/testing.py +131 -0
  258. snappy/tiling/__init__.py +2 -0
  259. snappy/tiling/canonical_key_dict.py +59 -0
  260. snappy/tiling/dict_based_set.py +79 -0
  261. snappy/tiling/floor.py +49 -0
  262. snappy/tiling/hyperboloid_dict.py +54 -0
  263. snappy/tiling/iter_utils.py +78 -0
  264. snappy/tiling/lifted_tetrahedron.py +22 -0
  265. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  266. snappy/tiling/real_hash_dict.py +164 -0
  267. snappy/tiling/test.py +23 -0
  268. snappy/tiling/tile.py +215 -0
  269. snappy/tiling/triangle.py +33 -0
  270. snappy/tkterminal.py +113 -84
  271. snappy/twister/main.py +1 -7
  272. snappy/twister/twister_core.cp39-win_amd64.pyd +0 -0
  273. snappy/upper_halfspace/__init__.py +78 -17
  274. snappy/verify/__init__.py +3 -7
  275. snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
  276. snappy/verify/complex_volume/adjust_torsion.py +1 -2
  277. snappy/verify/complex_volume/closed.py +13 -13
  278. snappy/verify/complex_volume/cusped.py +6 -6
  279. snappy/verify/complex_volume/extended_bloch.py +5 -8
  280. snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
  281. snappy/verify/edge_equations.py +80 -0
  282. snappy/verify/exceptions.py +0 -55
  283. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
  284. snappy/verify/interval_newton_shapes_engine.py +7 -5
  285. snappy/verify/interval_tree.py +5 -5
  286. snappy/verify/krawczyk_shapes_engine.py +17 -18
  287. snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
  288. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
  289. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
  290. snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
  291. snappy/verify/shapes.py +5 -3
  292. snappy/verify/short_slopes.py +39 -41
  293. snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
  294. snappy/verify/test.py +57 -60
  295. snappy/verify/upper_halfspace/extended_matrix.py +1 -1
  296. snappy/verify/upper_halfspace/finite_point.py +3 -4
  297. snappy/verify/upper_halfspace/ideal_point.py +9 -9
  298. snappy/verify/volume.py +2 -2
  299. snappy/version.py +2 -2
  300. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +26 -11
  301. snappy-3.2.dist-info/RECORD +503 -0
  302. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  303. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  304. snappy/__pycache__/__init__.cpython-39.pyc +0 -0
  305. snappy/__pycache__/browser.cpython-39.pyc +0 -0
  306. snappy/__pycache__/cache.cpython-39.pyc +0 -0
  307. snappy/__pycache__/database.cpython-39.pyc +0 -0
  308. snappy/__pycache__/db_utilities.cpython-39.pyc +0 -0
  309. snappy/__pycache__/decorated_isosig.cpython-39.pyc +0 -0
  310. snappy/__pycache__/exceptions.cpython-39.pyc +0 -0
  311. snappy/__pycache__/export_stl.cpython-39.pyc +0 -0
  312. snappy/__pycache__/filedialog.cpython-39.pyc +0 -0
  313. snappy/__pycache__/gui.cpython-39.pyc +0 -0
  314. snappy/__pycache__/horoviewer.cpython-39.pyc +0 -0
  315. snappy/__pycache__/math_basics.cpython-39.pyc +0 -0
  316. snappy/__pycache__/matrix.cpython-39.pyc +0 -0
  317. snappy/__pycache__/number.cpython-39.pyc +0 -0
  318. snappy/__pycache__/numeric_output_checker.cpython-39.pyc +0 -0
  319. snappy/__pycache__/pari.cpython-39.pyc +0 -0
  320. snappy/__pycache__/polyviewer.cpython-39.pyc +0 -0
  321. snappy/__pycache__/sage_helper.cpython-39.pyc +0 -0
  322. snappy/__pycache__/version.cpython-39.pyc +0 -0
  323. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  324. snappy/doc/_static/jquery-3.6.0.js +0 -10881
  325. snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
  326. snappy/doc/_static/js/html5shiv.min.js +0 -4
  327. snappy/doc/_static/underscore-1.13.1.js +0 -2042
  328. snappy/doc/_static/underscore.js +0 -6
  329. snappy/doc/verify_canon.html +0 -304
  330. snappy/drilling/__pycache__/__init__.cpython-39.pyc +0 -0
  331. snappy/drilling/__pycache__/constants.cpython-39.pyc +0 -0
  332. snappy/drilling/__pycache__/crush.cpython-39.pyc +0 -0
  333. snappy/drilling/__pycache__/cusps.cpython-39.pyc +0 -0
  334. snappy/drilling/__pycache__/debug.cpython-39.pyc +0 -0
  335. snappy/drilling/__pycache__/epsilons.cpython-39.pyc +0 -0
  336. snappy/drilling/__pycache__/exceptions.cpython-39.pyc +0 -0
  337. snappy/drilling/__pycache__/fixed_points.cpython-39.pyc +0 -0
  338. snappy/drilling/__pycache__/geodesic_info.cpython-39.pyc +0 -0
  339. snappy/drilling/__pycache__/geodesic_tube.cpython-39.pyc +0 -0
  340. snappy/drilling/__pycache__/geometric_structure.cpython-39.pyc +0 -0
  341. snappy/drilling/__pycache__/line.cpython-39.pyc +0 -0
  342. snappy/drilling/__pycache__/moves.cpython-39.pyc +0 -0
  343. snappy/drilling/__pycache__/peripheral_curves.cpython-39.pyc +0 -0
  344. snappy/drilling/__pycache__/perturb.cpython-39.pyc +0 -0
  345. snappy/drilling/__pycache__/quotient_space.cpython-39.pyc +0 -0
  346. snappy/drilling/__pycache__/spatial_dict.cpython-39.pyc +0 -0
  347. snappy/drilling/__pycache__/subdivide.cpython-39.pyc +0 -0
  348. snappy/drilling/__pycache__/tracing.cpython-39.pyc +0 -0
  349. snappy/drilling/geodesic_tube.py +0 -441
  350. snappy/drilling/geometric_structure.py +0 -366
  351. snappy/drilling/line.py +0 -122
  352. snappy/drilling/quotient_space.py +0 -94
  353. snappy/drilling/spatial_dict.py +0 -128
  354. snappy/exterior_to_link/__pycache__/__init__.cpython-39.pyc +0 -0
  355. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-39.pyc +0 -0
  356. snappy/exterior_to_link/__pycache__/exceptions.cpython-39.pyc +0 -0
  357. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-39.pyc +0 -0
  358. snappy/exterior_to_link/__pycache__/link_projection.cpython-39.pyc +0 -0
  359. snappy/exterior_to_link/__pycache__/main.cpython-39.pyc +0 -0
  360. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-39.pyc +0 -0
  361. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-39.pyc +0 -0
  362. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-39.pyc +0 -0
  363. snappy/exterior_to_link/__pycache__/pl_utils.cpython-39.pyc +0 -0
  364. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-39.pyc +0 -0
  365. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-39.pyc +0 -0
  366. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-39.pyc +0 -0
  367. snappy/exterior_to_link/__pycache__/stored_moves.cpython-39.pyc +0 -0
  368. snappy/hyperboloid/__pycache__/__init__.cpython-39.pyc +0 -0
  369. snappy/manifolds/__pycache__/__init__.cpython-39.pyc +0 -0
  370. snappy/ptolemy/__pycache__/__init__.cpython-39.pyc +0 -0
  371. snappy/ptolemy/__pycache__/component.cpython-39.pyc +0 -0
  372. snappy/ptolemy/__pycache__/coordinates.cpython-39.pyc +0 -0
  373. snappy/ptolemy/__pycache__/fieldExtensions.cpython-39.pyc +0 -0
  374. snappy/ptolemy/__pycache__/findLoops.cpython-39.pyc +0 -0
  375. snappy/ptolemy/__pycache__/homology.cpython-39.pyc +0 -0
  376. snappy/ptolemy/__pycache__/manifoldMethods.cpython-39.pyc +0 -0
  377. snappy/ptolemy/__pycache__/matrix.cpython-39.pyc +0 -0
  378. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-39.pyc +0 -0
  379. snappy/ptolemy/__pycache__/polynomial.cpython-39.pyc +0 -0
  380. snappy/ptolemy/__pycache__/processComponents.cpython-39.pyc +0 -0
  381. snappy/ptolemy/__pycache__/processFileBase.cpython-39.pyc +0 -0
  382. snappy/ptolemy/__pycache__/processFileDispatch.cpython-39.pyc +0 -0
  383. snappy/ptolemy/__pycache__/processMagmaFile.cpython-39.pyc +0 -0
  384. snappy/ptolemy/__pycache__/processRurFile.cpython-39.pyc +0 -0
  385. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-39.pyc +0 -0
  386. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-39.pyc +0 -0
  387. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-39.pyc +0 -0
  388. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-39.pyc +0 -0
  389. snappy/ptolemy/__pycache__/rur.cpython-39.pyc +0 -0
  390. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-39.pyc +0 -0
  391. snappy/ptolemy/__pycache__/utilities.cpython-39.pyc +0 -0
  392. snappy/snap/__pycache__/__init__.cpython-39.pyc +0 -0
  393. snappy/snap/__pycache__/character_varieties.cpython-39.pyc +0 -0
  394. snappy/snap/__pycache__/fundamental_polyhedron.cpython-39.pyc +0 -0
  395. snappy/snap/__pycache__/interval_reps.cpython-39.pyc +0 -0
  396. snappy/snap/__pycache__/kernel_structures.cpython-39.pyc +0 -0
  397. snappy/snap/__pycache__/mcomplex_base.cpython-39.pyc +0 -0
  398. snappy/snap/__pycache__/nsagetools.cpython-39.pyc +0 -0
  399. snappy/snap/__pycache__/polished_reps.cpython-39.pyc +0 -0
  400. snappy/snap/__pycache__/shapes.cpython-39.pyc +0 -0
  401. snappy/snap/__pycache__/slice_obs_HKL.cpython-39.pyc +0 -0
  402. snappy/snap/__pycache__/utilities.cpython-39.pyc +0 -0
  403. snappy/snap/peripheral/__pycache__/__init__.cpython-39.pyc +0 -0
  404. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-39.pyc +0 -0
  405. snappy/snap/peripheral/__pycache__/link.cpython-39.pyc +0 -0
  406. snappy/snap/peripheral/__pycache__/peripheral.cpython-39.pyc +0 -0
  407. snappy/snap/peripheral/__pycache__/surface.cpython-39.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/__init__.cpython-39.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/arrow.cpython-39.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/corner.cpython-39.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/edge.cpython-39.pyc +0 -0
  412. snappy/snap/t3mlite/__pycache__/face.cpython-39.pyc +0 -0
  413. snappy/snap/t3mlite/__pycache__/files.cpython-39.pyc +0 -0
  414. snappy/snap/t3mlite/__pycache__/homology.cpython-39.pyc +0 -0
  415. snappy/snap/t3mlite/__pycache__/linalg.cpython-39.pyc +0 -0
  416. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-39.pyc +0 -0
  417. snappy/snap/t3mlite/__pycache__/perm4.cpython-39.pyc +0 -0
  418. snappy/snap/t3mlite/__pycache__/simplex.cpython-39.pyc +0 -0
  419. snappy/snap/t3mlite/__pycache__/spun.cpython-39.pyc +0 -0
  420. snappy/snap/t3mlite/__pycache__/surface.cpython-39.pyc +0 -0
  421. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-39.pyc +0 -0
  422. snappy/snap/t3mlite/__pycache__/vertex.cpython-39.pyc +0 -0
  423. snappy/togl/__init__.py +0 -3
  424. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  425. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  426. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  427. snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
  428. snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
  429. snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
  430. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  431. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  432. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  433. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  434. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  435. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  436. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  437. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  438. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  439. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  440. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  441. snappy/twister/__pycache__/__init__.cpython-39.pyc +0 -0
  442. snappy/twister/__pycache__/main.cpython-39.pyc +0 -0
  443. snappy/upper_halfspace/__pycache__/__init__.cpython-39.pyc +0 -0
  444. snappy/upper_halfspace/__pycache__/ideal_point.cpython-39.pyc +0 -0
  445. snappy/verify/__pycache__/__init__.cpython-39.pyc +0 -0
  446. snappy/verify/__pycache__/cuspCrossSection.cpython-39.pyc +0 -0
  447. snappy/verify/__pycache__/cuspTranslations.cpython-39.pyc +0 -0
  448. snappy/verify/__pycache__/cusp_areas.cpython-39.pyc +0 -0
  449. snappy/verify/__pycache__/cusp_shapes.cpython-39.pyc +0 -0
  450. snappy/verify/__pycache__/exceptions.cpython-39.pyc +0 -0
  451. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-39.pyc +0 -0
  452. snappy/verify/__pycache__/interval_tree.cpython-39.pyc +0 -0
  453. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-39.pyc +0 -0
  454. snappy/verify/__pycache__/realAlgebra.cpython-39.pyc +0 -0
  455. snappy/verify/__pycache__/shapes.cpython-39.pyc +0 -0
  456. snappy/verify/__pycache__/short_slopes.cpython-39.pyc +0 -0
  457. snappy/verify/__pycache__/squareExtensions.cpython-39.pyc +0 -0
  458. snappy/verify/__pycache__/verifyCanonical.cpython-39.pyc +0 -0
  459. snappy/verify/__pycache__/verifyHyperbolicity.cpython-39.pyc +0 -0
  460. snappy/verify/__pycache__/volume.cpython-39.pyc +0 -0
  461. snappy/verify/complex_volume/__pycache__/__init__.cpython-39.pyc +0 -0
  462. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-39.pyc +0 -0
  463. snappy/verify/complex_volume/__pycache__/closed.cpython-39.pyc +0 -0
  464. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-39.pyc +0 -0
  465. snappy/verify/complex_volume/__pycache__/cusped.cpython-39.pyc +0 -0
  466. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-39.pyc +0 -0
  467. snappy/verify/cuspCrossSection.py +0 -1422
  468. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-39.pyc +0 -0
  469. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-39.pyc +0 -0
  470. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-39.pyc +0 -0
  471. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-39.pyc +0 -0
  472. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-39.pyc +0 -0
  473. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-39.pyc +0 -0
  474. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-39.pyc +0 -0
  475. snappy-3.1.1.dist-info/RECORD +0 -575
  476. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
@@ -1,301 +1,301 @@
1
- Step-by-step examples: Part 3
2
- =============================
3
-
4
- .. _ptolemy-example-using-magma-sage:
5
-
6
- Computing solutions with magma or sage vs retrieving solutions
7
- --------------------------------------------------------------
8
-
9
- So far, we querried the database for solutions to a Ptolemy variety::
10
-
11
- >>> p = Manifold("m011").ptolemy_variety(2)
12
- >>> p.retrieve_solutions()
13
- Trying to retrieve solutions from http://ptolemy.unhyperbolic.org/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m011__sl2_c0.magma_out ...
14
- Parsing...
15
- [PtolemyCoordinates(
16
- {'c_0011_0': 1,
17
- 'c_0011_1': -1,
18
- 'c_0011_2': -1,
19
- 'c_0101_0': -1,
20
- 'c_0101_1': Mod(x^2 + x, x^3 + 2*x^2 + x + 1),
21
- ...
22
- 's_3_2': 1},
23
- is_numerical = False, ...)]
24
-
25
- We can use ``compute_solutions`` instead of ``retrieve_solutions`` to actually compute the solutions ourselves (for example, for a non-census triangulation not in the database). Currently, we support two engines:
26
-
27
- * `sage <http://www.sagemath.org/>`_ (which is free, but can only solve a fairly limited number of Ptolemy varieties)
28
- * `magma <http://magma.maths.usyd.edu.au/magma/>`_
29
-
30
- If you are inside sage::
31
-
32
- >>> p = Manifold("m011").ptolemy_variety(2)
33
- >>> p.compute_solutions(engine = 'sage')
34
- [PtolemyCoordinates(
35
- {'c_0011_0': 1,
36
- 'c_0011_1': -1,
37
- 'c_0011_2': -1,
38
- 'c_0101_0': -1,
39
- 'c_0101_1': Mod(x^2 + x, x^3 + 2*x^2 + x + 1),
40
- ...
41
- 's_3_2': 1},
42
- is_numerical = False, ...)]
43
-
44
- If you have magma installed::
45
-
46
- >>> p = Manifold("m011").ptolemy_variety(2)
47
- >>> p.compute_solutions(engine = 'magma', verbose = True)
48
- Writing to file: /tmp/tmppNSc8S/m011__sl2_c0.magma
49
- Magma's output in: /tmp/tmppNSc8S/m011__sl2_c0.magma_out
50
- Command: ulimit -m 732421; echo | magma "/tmp/tmppNSc8S/m011__sl2_c0.magma" > "/tmp/tmppNSc8S/m011__sl2_c0.magma_out"
51
- Starting magma...
52
- magma finished.
53
- Parsing magma result...
54
- [PtolemyCoordinates(
55
- {'c_0011_0': 1,
56
- 'c_0011_1': -1,
57
- 'c_0011_2': -1,
58
- 'c_0101_0': -1,
59
- 'c_0101_1': Mod(x^2 + x, x^3 + 2*x^2 + x + 1),
60
- ...
61
- 's_3_2': 1},
62
- is_numerical = False, ...)]
63
-
64
- To get an idea of what Ptolemy varieties magma can still handle, have a look at the `database <http://ptolemy.unhyperbolic.org/html/summary.html>`_: for *N* = 2, the computations up to 12 tetrahedra only took
65
-
66
- **Remark:** The magma engine is not expected to work under windows. It will also fail if magma is not installed or the magma executable cannot be found. The ptolemy module creates a temporary file (``m011__sl2_c0`` here) and also gives the command it tried to run to process the file through magma. If you believe that magma is installed correctly on your system but encounter an error, you can try to run the command yourself to understand better what is going on. Feel free to report a bug (to enischte at gmail dot com) including the temporary files (``m011__sl2_c0`` and ``m011__sl2_c0.out`` here) and any other error messages.
67
-
68
- **Remark:** If no engine is specified, it is assumed to be sage when used inside sage and magma instead.
69
-
70
- .. _ptolemy-example-complex-volume:
71
-
72
- Computing the complex volume
73
- ----------------------------
74
-
75
- Similar to ``volume_numerical``, we can compute the complex volume (volume + i Chern-Simons) for all representations (that are :ref:`generically decorated <ptolemy-generically-decorated>`).
76
-
77
- Here is an example computing the solutions to the Ptolemy variety ourselves::
78
-
79
- >>> Manifold("m011").ptolemy_variety(2,'all').compute_solutions().complex_volume_numerical()
80
- [[[-4.30211422042248 E-16 + 0.725471193740844*I,
81
- -0.942707362776931 + 0.459731436553693*I,
82
- 0.942707362776931 + 0.459731436553693*I]],
83
- [[4.64255370258293 E-15 + 0.680993020093457*I,
84
- 3.94215909915729 E-15 + 0.312682687518267*I,
85
- -2.78183391239608 - 0.496837853805869*I,
86
- 2.78183391239608 - 0.496837853805869*I]]]
87
-
88
- And here the same example retrieving solutions from the database::
89
-
90
- >>> Manifold("m011").ptolemy_variety(2,'all').retrieve_solutions().complex_volume_numerical()
91
- Trying to retrieve solutions from http://ptolemy.unhyperbolic.org/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m011__sl2_c0.magma_out ...
92
- Parsing...
93
- Trying to retrieve solutions from http://ptolemy.unhyperbolic.org/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m011__sl2_c1.magma_out ...
94
- Parsing...
95
- [[[-4.30211422042248 E-16 + 0.725471193740844*I,
96
- ...
97
- 2.78183391239608 - 0.496837853805869*I]]]
98
-
99
- .. _ptolemy-detailed-example-matrices:
100
-
101
- Computing the matrices for a different presentation
102
- ---------------------------------------------------
103
-
104
- The ``fundamental_group`` method of a SnapPy triangulation can yield different presentations by supplying optional arguments such as ``simplify_presentation`` and ``minimize_number_of_generators``. If we have a word in one of these presentations and want to evaluate its image under the representation, we need to supply the presentation as follows::
105
-
106
- >>> M=Manifold("m003")
107
- >>> sol = M.ptolemy_variety(2).retrieve_solutions()[0]
108
- >>> G = M.fundamental_group(simplify_presentation = False)
109
- >>> sol.evaluate_word('a', G)
110
-
111
- Again, we can check that the representation actually assigns the identity to all relators:
112
-
113
- >>> G
114
- Generators:
115
- a,b,c
116
- Relators:
117
- BCaC
118
- AbCbA
119
- >>> sol.evaluate_word('AbCbA', G)
120
- [[Mod(1, x^2 - x - 1), 0], [0, Mod(1, x^2 - x - 1)]]
121
- >>> for relator in G.relators():
122
- ... print(sol.evaluate_word(relator, G))
123
- [[Mod(1, x^2 - x - 1), 0], [0, Mod(1, x^2 - x - 1)]]
124
- [[Mod(1, x^2 - x - 1), 0], [0, Mod(1, x^2 - x - 1)]]
125
-
126
-
127
- .. _ptolemy-example-boundary-holonomy:
128
-
129
- Computing the images of the peripheral curves for a representation
130
- ------------------------------------------------------------------
131
-
132
- The object returned by ``fundamental_group`` also contains words for the peripheral curves of a manifold. We can compute the corresponding matrices::
133
-
134
- >>> M = Manifold("m003")
135
- >>> G = M.fundamental_group()
136
- >>> sol = M.ptolemy_variety(2,1).retrieve_solutions()[0]
137
- >>> for i, cusp_curves in enumerate(G.peripheral_curves()):
138
- ... print("Cusp %d:" % i)
139
- ... for cusp_curve in cusp_curves:
140
- ... print(sol.evaluate_word(cusp_curve, G))
141
- Cusp 0:
142
- [[Mod(2*x - 3, x^2 + x + 1), Mod(2*x, x^2 + x + 1)], [Mod(6, x^2 + x + 1), Mod(-2*x + 1, x^2 + x + 1)]]
143
- [[Mod(-2*x - 5, x^2 + x + 1), Mod(-2, x^2 + x + 1)], [Mod(6*x + 6, x^2 + x + 1), Mod(2*x + 3, x^2 + x + 1)]]
144
-
145
- **Remark:** For each cusp, we can conjugate these matrices into *P* since the representation is :ref:`boundary-unipotent <ptolemy-boundary-unipotent>`. We might implement a method returning a matrix in *P* for the longitude and meridian of a cusp in the future (simply by finding loops corresponding to a longitude and meridian as path of short edges in the truncated simplex in Figure 17 of [GGZ2012]_).
146
-
147
- .. _ptolemy-example-find-witness:
148
-
149
- Finding a witness point for a positively dimensional component of the Ptolemy variety
150
- -------------------------------------------------------------------------------------
151
-
152
- We already saw an :ref:`example of a positively dimensional component <ptolemy-non-zero-dim-comp>`. By flattening, we obtain a list of all the components of the Ptolemy varieties for all obstruction classes::
153
-
154
- >>> M=Manifold("m371")
155
- >>> sols = M.ptolemy_variety(2,'all').retrieve_solutions().flatten()
156
-
157
- We can now just look at the positively dimensional ones::
158
-
159
- >>> one_dim_sols = [ sol for sol in sols if sol.dimension > 0]
160
- >>> len(one_dim_sols)
161
- 1
162
- >>> one_dim_sols
163
- [[ PtolemyCoordinates(
164
- {'c_0011_0': 1,
165
- 'c_0011_1': -1,
166
- 'c_0011_2': -1,
167
- 'c_0011_3': Mod(-x - 1, x^2 + x + 2),
168
- ...,
169
- 's_3_4': 1},
170
- is_numerical = False, ...)
171
- (witnesses for NonZeroDimensionalComponent(dimension = 1, free_variables = ['c_0110_2'])) ]]
172
-
173
- We see that we have one such component and that each component is actually itself a list of witness points.
174
-
175
- **Remark:** Witness points are a fairly new feature and not all files in the database have been updated yet to contain them. You might instead just see ``[NonZeroDimensionalComponent(dimension = 1)]``.
176
-
177
- **Remark:** The ptolemy module also reports the `free variables` for the positively dimensional components. We can set these variables to random values and generically will obtain a new witness point.
178
-
179
- We can access the witness point(s) for each component just by iteration::
180
-
181
- >>> for component in one_dim_sols:
182
- ... print("Component:")
183
- ... for witness in component:
184
- ... print(" Witness:")
185
- ... print(" Volumes:", witness.volume_numerical())
186
- Component:
187
- Witness:
188
- Volumes: [0.E-38, 0.E-38]
189
-
190
- The different volumes in a line correspond to different Galois conjugates of the same `algebraic` witness point.
191
-
192
- .. _ptolemy-example-non-zero-dim-rep:
193
-
194
- Finding non-zero dimensional families of boundary-unipotent representations
195
- ---------------------------------------------------------------------------
196
-
197
- We now revisit the :ref:`1-dimensional component of the Ptolemy variety<ptolemy-non-zero-dim-comp>` and answer the question whether this yields a 1-dimensional family of representations or not. We pick a :ref:`witness point <ptolemy-example-find-witness>` for the component and check the :ref:`matrices for the peripheral curves <ptolemy-example-boundary-holonomy>`::
198
-
199
- >>> M = Manifold("m371")
200
- >>> G = M.fundamental_group()
201
- >>> sols = M.ptolemy_variety(2,'all').retrieve_solutions().flatten()
202
- >>> components = [ sol for sol in sols if sol.dimension > 0]
203
- >>> for component in components:
204
- ... print("Component of dimension %d" % component.dimension)
205
- ... for witness in component:
206
- ... for i, cusp_curves in enumerate(G.peripheral_curves()):
207
- ... print(" Cusp %d:" % i)
208
- ... for cusp_curve in cusp_curves:
209
- ... print(" ", witness.evaluate_word(cusp_curve, G))
210
- Component of dimension 1
211
- Cusp 0:
212
- [[Mod(1, x^2 + x + 2), 0], [0, Mod(1, x^2 + x + 2)]]
213
- [[Mod(1, x^2 + x + 2), 0], [0, Mod(1, x^2 + x + 2)]]
214
-
215
- We see that the matrices are trivial, thus this 1-dimensional component corresponds to a 1-dimensional family of :ref:`decorations <ptolemy-generically-decorated>` of the same (up to Galois conjugacy) representation. The corresponding family of representation is 0-dimensional.
216
-
217
- Let us try another manifold, ``m410``:
218
-
219
- >>> M = Manifold("m410")
220
- >>> G = M.fundamental_group()
221
- >>> sols = M.ptolemy_variety(2,'all').retrieve_solutions().flatten()
222
- >>> components = [ sol for sol in sols if sol.dimension > 0]
223
- >>> for component in components:
224
- ... print("Component of dimension %d" % component.dimension)
225
- ... for witness in component:
226
- ... for i, cusp_curves in enumerate(G.peripheral_curves()):
227
- ... print(" Cusp %d:" % i)
228
- ... for cusp_curve in cusp_curves:
229
- ... print(" ", witness.evaluate_word(cusp_curve, G))
230
- Component of dimension 1
231
- Cusp 0:
232
- [[Mod(1, x^2 + 2), 0], [0, Mod(1, x^2 + 2)]]
233
- [[Mod(1, x^2 + 2), Mod(x, x^2 + 2)], [0, Mod(1, x^2 + 2)]]
234
- Component of dimension 1
235
- Cusp 0:
236
- [[Mod(1, x^2 + 7), 0], [0, Mod(1, x^2 + 7)]]
237
- [[Mod(1, x^2 + 7), 0], [0, Mod(1, x^2 + 7)]]
238
-
239
- It has two 1-dimensional components, and for the first one, we see that the matrices are non-trivial, so this corresponds indeed to a 1-dimensional family of representations.
240
-
241
- **Remark:** The witness points are chosen so that they are not at the intersection of two positively dimensional components. This is for the following reason: it could happen that there is a 1-dimensional family of representations which contains points where the boundary holonomy becomes trivial. This yields a representation where the above matrices are trivial yet it is part of a 1-dimensional family of boundary-unipotent representations. In the ptolemy variety, however, this means that two non-zero dimensional components (one corresponding to a family of decorations, the other to a family of representations) intersect.
242
-
243
- Representations that are the same as PSL(2, **C**)-representations
244
- ------------------------------------------------------------------
245
-
246
- Let us compare the volumes of ``m009`` and ``m159``:
247
-
248
- >>> Manifold("m009").ptolemy_variety(2,'all').retrieve_solutions().volume_numerical()
249
- [[],
250
- [],
251
- [],
252
- [[2.66674478344907, -2.66674478344907, 2.66674478344907, -2.66674478344907]]]
253
- >>> Manifold("m159").ptolemy_variety(2,'all').retrieve_solutions().volume_numerical()
254
- [[[0.E-38, 0.E-37, 0.E-37],
255
- [-2.02988321281931, 2.02988321281931, -2.02988321281931, 2.02988321281931]],
256
- [[0.698544082784440, -0.698544082784440, 3.82168758617998, -3.82168758617998],
257
- [0.E-37, 0.E-37, 0.E-37, 0.E-37]]]
258
-
259
- In both cases, some volumes appear twice (2.66674... for ``m009`` and 2.02988... for ``m159``). In the case of ``m009``, these two volumes correspond to the same PSL(2, **C**)-representation and in case ``m159`` to two different boundary-unipotent SL(2, **C**)-representations that are the same as PSL(2, **C**)-representations (see :ref:`ptolemy-psl-multiplicity`). We can get the multiplicity by calling ``degree_to_shapes``::
260
-
261
- >>> Manifold("m009").ptolemy_variety(2).degree_to_shapes()
262
- 2
263
- >>> Manifold("m159").ptolemy_variety(2).degree_to_shapes()
264
- 1
265
-
266
- When we convert the Ptolemy coordinates to shapes/cross ratios for ``m009``, we also see that we see the same shape assignment appears twice (at least numerically)::
267
-
268
- >>> Manifold("m009").ptolemy_variety(2,'all').retrieve_solutions().numerical().cross_ratios()
269
- [[],
270
- [],
271
- [],
272
- [[CrossRatios(
273
- {'z_0000_0': 0.500000000000000 + 1.32287565553230*I,
274
- 'z_0000_1': 0.375000000000000 + 0.330718913883074*I,
275
- 'z_0000_2': 0.500000000000000 + 1.32287565553230*I,
276
- 'zp_0000_0': 0.250000000000000 + 0.661437827766148*I,
277
- ...},
278
- is_numerical = True, ...),
279
- CrossRatios(
280
- {'z_0000_0': 0.500000000000000 - 1.32287565553230*I,
281
- 'z_0000_1': 0.375000000000000 - 0.330718913883074*I,
282
- 'z_0000_2': 0.500000000000000 - 1.32287565553230*I,
283
- ...}
284
- is_numerical = True, ...),
285
- CrossRatios(
286
- {'z_0000_0': 0.500000000000000 + 1.32287565553230*I,
287
- 'z_0000_1': 0.375000000000000 + 0.330718913883074*I,
288
- 'z_0000_2': 0.500000000000000 + 1.32287565553230*I,
289
- ...},
290
- is_numerical = True, ...),
291
- CrossRatios(
292
- {'z_0000_0': 0.500000000000000 - 1.32287565553230*I,
293
- 'z_0000_1': 0.375000000000000 - 0.330718913883074*I,
294
- 'z_0000_2': 0.500000000000000 - 1.32287565553230*I,
295
- ...},
296
- is_numerical = True, ...)]]]
297
-
298
-
299
-
300
- **Remark:** The tables at `ptolemy.unhyperbolic.org <http://ptolemy.unhyperbolic.org/html/summary.html>`_ use the cross ratios to list representations that are the same as PSL(2, **C**)-representation only once.
301
-
1
+ Step-by-step examples: Part 3
2
+ =============================
3
+
4
+ .. _ptolemy-example-using-magma-sage:
5
+
6
+ Computing solutions with magma or sage vs retrieving solutions
7
+ --------------------------------------------------------------
8
+
9
+ So far, we querried the database for solutions to a Ptolemy variety::
10
+
11
+ >>> p = Manifold("m011").ptolemy_variety(2)
12
+ >>> p.retrieve_solutions()
13
+ Trying to retrieve solutions from http://ptolemy.unhyperbolic.org/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m011__sl2_c0.magma_out ...
14
+ Parsing...
15
+ [PtolemyCoordinates(
16
+ {'c_0011_0': 1,
17
+ 'c_0011_1': -1,
18
+ 'c_0011_2': -1,
19
+ 'c_0101_0': -1,
20
+ 'c_0101_1': Mod(x^2 + x, x^3 + 2*x^2 + x + 1),
21
+ ...
22
+ 's_3_2': 1},
23
+ is_numerical = False, ...)]
24
+
25
+ We can use ``compute_solutions`` instead of ``retrieve_solutions`` to actually compute the solutions ourselves (for example, for a non-census triangulation not in the database). Currently, we support two engines:
26
+
27
+ * `sage <http://www.sagemath.org/>`_ (which is free, but can only solve a fairly limited number of Ptolemy varieties)
28
+ * `magma <http://magma.maths.usyd.edu.au/magma/>`_
29
+
30
+ If you are inside sage::
31
+
32
+ >>> p = Manifold("m011").ptolemy_variety(2)
33
+ >>> p.compute_solutions(engine = 'sage')
34
+ [PtolemyCoordinates(
35
+ {'c_0011_0': 1,
36
+ 'c_0011_1': -1,
37
+ 'c_0011_2': -1,
38
+ 'c_0101_0': -1,
39
+ 'c_0101_1': Mod(x^2 + x, x^3 + 2*x^2 + x + 1),
40
+ ...
41
+ 's_3_2': 1},
42
+ is_numerical = False, ...)]
43
+
44
+ If you have magma installed::
45
+
46
+ >>> p = Manifold("m011").ptolemy_variety(2)
47
+ >>> p.compute_solutions(engine = 'magma', verbose = True)
48
+ Writing to file: /tmp/tmppNSc8S/m011__sl2_c0.magma
49
+ Magma's output in: /tmp/tmppNSc8S/m011__sl2_c0.magma_out
50
+ Command: ulimit -m 732421; echo | magma "/tmp/tmppNSc8S/m011__sl2_c0.magma" > "/tmp/tmppNSc8S/m011__sl2_c0.magma_out"
51
+ Starting magma...
52
+ magma finished.
53
+ Parsing magma result...
54
+ [PtolemyCoordinates(
55
+ {'c_0011_0': 1,
56
+ 'c_0011_1': -1,
57
+ 'c_0011_2': -1,
58
+ 'c_0101_0': -1,
59
+ 'c_0101_1': Mod(x^2 + x, x^3 + 2*x^2 + x + 1),
60
+ ...
61
+ 's_3_2': 1},
62
+ is_numerical = False, ...)]
63
+
64
+ To get an idea of what Ptolemy varieties magma can still handle, have a look at the `database <http://ptolemy.unhyperbolic.org/html/summary.html>`_: for *N* = 2, the computations up to 12 tetrahedra only took
65
+
66
+ **Remark:** The magma engine is not expected to work under windows. It will also fail if magma is not installed or the magma executable cannot be found. The ptolemy module creates a temporary file (``m011__sl2_c0`` here) and also gives the command it tried to run to process the file through magma. If you believe that magma is installed correctly on your system but encounter an error, you can try to run the command yourself to understand better what is going on. Feel free to report a bug (to enischte at gmail dot com) including the temporary files (``m011__sl2_c0`` and ``m011__sl2_c0.out`` here) and any other error messages.
67
+
68
+ **Remark:** If no engine is specified, it is assumed to be sage when used inside sage and magma instead.
69
+
70
+ .. _ptolemy-example-complex-volume:
71
+
72
+ Computing the complex volume
73
+ ----------------------------
74
+
75
+ Similar to ``volume_numerical``, we can compute the complex volume (volume + i Chern-Simons) for all representations (that are :ref:`generically decorated <ptolemy-generically-decorated>`).
76
+
77
+ Here is an example computing the solutions to the Ptolemy variety ourselves::
78
+
79
+ >>> Manifold("m011").ptolemy_variety(2,'all').compute_solutions().complex_volume_numerical()
80
+ [[[-4.30211422042248 E-16 + 0.725471193740844*I,
81
+ -0.942707362776931 + 0.459731436553693*I,
82
+ 0.942707362776931 + 0.459731436553693*I]],
83
+ [[4.64255370258293 E-15 + 0.680993020093457*I,
84
+ 3.94215909915729 E-15 + 0.312682687518267*I,
85
+ -2.78183391239608 - 0.496837853805869*I,
86
+ 2.78183391239608 - 0.496837853805869*I]]]
87
+
88
+ And here the same example retrieving solutions from the database::
89
+
90
+ >>> Manifold("m011").ptolemy_variety(2,'all').retrieve_solutions().complex_volume_numerical()
91
+ Trying to retrieve solutions from http://ptolemy.unhyperbolic.org/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m011__sl2_c0.magma_out ...
92
+ Parsing...
93
+ Trying to retrieve solutions from http://ptolemy.unhyperbolic.org/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m011__sl2_c1.magma_out ...
94
+ Parsing...
95
+ [[[-4.30211422042248 E-16 + 0.725471193740844*I,
96
+ ...
97
+ 2.78183391239608 - 0.496837853805869*I]]]
98
+
99
+ .. _ptolemy-detailed-example-matrices:
100
+
101
+ Computing the matrices for a different presentation
102
+ ---------------------------------------------------
103
+
104
+ The :py:meth:`~snappy.Triangulation.fundamental_group` method of a SnapPy triangulation can yield different presentations by supplying optional arguments such as ``simplify_presentation`` and ``minimize_number_of_generators``. If we have a word in one of these presentations and want to evaluate its image under the representation, we need to supply the presentation as follows::
105
+
106
+ >>> M=Manifold("m003")
107
+ >>> sol = M.ptolemy_variety(2).retrieve_solutions()[0]
108
+ >>> G = M.fundamental_group(simplify_presentation = False)
109
+ >>> sol.evaluate_word('a', G)
110
+
111
+ Again, we can check that the representation actually assigns the identity to all relators:
112
+
113
+ >>> G
114
+ Generators:
115
+ a,b,c
116
+ Relators:
117
+ BCaC
118
+ AbCbA
119
+ >>> sol.evaluate_word('AbCbA', G)
120
+ [[Mod(1, x^2 - x - 1), 0], [0, Mod(1, x^2 - x - 1)]]
121
+ >>> for relator in G.relators():
122
+ ... print(sol.evaluate_word(relator, G))
123
+ [[Mod(1, x^2 - x - 1), 0], [0, Mod(1, x^2 - x - 1)]]
124
+ [[Mod(1, x^2 - x - 1), 0], [0, Mod(1, x^2 - x - 1)]]
125
+
126
+
127
+ .. _ptolemy-example-boundary-holonomy:
128
+
129
+ Computing the images of the peripheral curves for a representation
130
+ ------------------------------------------------------------------
131
+
132
+ The object returned by :py:meth:`~snappy.Triangulation.fundamental_group` also contains words for the peripheral curves of a manifold. We can compute the corresponding matrices::
133
+
134
+ >>> M = Manifold("m003")
135
+ >>> G = M.fundamental_group()
136
+ >>> sol = M.ptolemy_variety(2,1).retrieve_solutions()[0]
137
+ >>> for i, cusp_curves in enumerate(G.peripheral_curves()):
138
+ ... print("Cusp %d:" % i)
139
+ ... for cusp_curve in cusp_curves:
140
+ ... print(sol.evaluate_word(cusp_curve, G))
141
+ Cusp 0:
142
+ [[Mod(2*x - 3, x^2 + x + 1), Mod(2*x, x^2 + x + 1)], [Mod(6, x^2 + x + 1), Mod(-2*x + 1, x^2 + x + 1)]]
143
+ [[Mod(-2*x - 5, x^2 + x + 1), Mod(-2, x^2 + x + 1)], [Mod(6*x + 6, x^2 + x + 1), Mod(2*x + 3, x^2 + x + 1)]]
144
+
145
+ **Remark:** For each cusp, we can conjugate these matrices into *P* since the representation is :ref:`boundary-unipotent <ptolemy-boundary-unipotent>`. We might implement a method returning a matrix in *P* for the longitude and meridian of a cusp in the future (simply by finding loops corresponding to a longitude and meridian as path of short edges in the truncated simplex in Figure 17 of [GGZ2012]_).
146
+
147
+ .. _ptolemy-example-find-witness:
148
+
149
+ Finding a witness point for a positively dimensional component of the Ptolemy variety
150
+ -------------------------------------------------------------------------------------
151
+
152
+ We already saw an :ref:`example of a positively dimensional component <ptolemy-non-zero-dim-comp>`. By flattening, we obtain a list of all the components of the Ptolemy varieties for all obstruction classes::
153
+
154
+ >>> M=Manifold("m371")
155
+ >>> sols = M.ptolemy_variety(2,'all').retrieve_solutions().flatten()
156
+
157
+ We can now just look at the positively dimensional ones::
158
+
159
+ >>> one_dim_sols = [ sol for sol in sols if sol.dimension > 0]
160
+ >>> len(one_dim_sols)
161
+ 1
162
+ >>> one_dim_sols
163
+ [[ PtolemyCoordinates(
164
+ {'c_0011_0': 1,
165
+ 'c_0011_1': -1,
166
+ 'c_0011_2': -1,
167
+ 'c_0011_3': Mod(-x - 1, x^2 + x + 2),
168
+ ...,
169
+ 's_3_4': 1},
170
+ is_numerical = False, ...)
171
+ (witnesses for NonZeroDimensionalComponent(dimension = 1, free_variables = ['c_0110_2'])) ]]
172
+
173
+ We see that we have one such component and that each component is actually itself a list of witness points.
174
+
175
+ **Remark:** Witness points are a fairly new feature and not all files in the database have been updated yet to contain them. You might instead just see ``[NonZeroDimensionalComponent(dimension = 1)]``.
176
+
177
+ **Remark:** The ptolemy module also reports the `free variables` for the positively dimensional components. We can set these variables to random values and generically will obtain a new witness point.
178
+
179
+ We can access the witness point(s) for each component just by iteration::
180
+
181
+ >>> for component in one_dim_sols:
182
+ ... print("Component:")
183
+ ... for witness in component:
184
+ ... print(" Witness:")
185
+ ... print(" Volumes:", witness.volume_numerical())
186
+ Component:
187
+ Witness:
188
+ Volumes: [0.E-38, 0.E-38]
189
+
190
+ The different volumes in a line correspond to different Galois conjugates of the same `algebraic` witness point.
191
+
192
+ .. _ptolemy-example-non-zero-dim-rep:
193
+
194
+ Finding non-zero dimensional families of boundary-unipotent representations
195
+ ---------------------------------------------------------------------------
196
+
197
+ We now revisit the :ref:`1-dimensional component of the Ptolemy variety<ptolemy-non-zero-dim-comp>` and answer the question whether this yields a 1-dimensional family of representations or not. We pick a :ref:`witness point <ptolemy-example-find-witness>` for the component and check the :ref:`matrices for the peripheral curves <ptolemy-example-boundary-holonomy>`::
198
+
199
+ >>> M = Manifold("m371")
200
+ >>> G = M.fundamental_group()
201
+ >>> sols = M.ptolemy_variety(2,'all').retrieve_solutions().flatten()
202
+ >>> components = [ sol for sol in sols if sol.dimension > 0]
203
+ >>> for component in components:
204
+ ... print("Component of dimension %d" % component.dimension)
205
+ ... for witness in component:
206
+ ... for i, cusp_curves in enumerate(G.peripheral_curves()):
207
+ ... print(" Cusp %d:" % i)
208
+ ... for cusp_curve in cusp_curves:
209
+ ... print(" ", witness.evaluate_word(cusp_curve, G))
210
+ Component of dimension 1
211
+ Cusp 0:
212
+ [[Mod(1, x^2 + x + 2), 0], [0, Mod(1, x^2 + x + 2)]]
213
+ [[Mod(1, x^2 + x + 2), 0], [0, Mod(1, x^2 + x + 2)]]
214
+
215
+ We see that the matrices are trivial, thus this 1-dimensional component corresponds to a 1-dimensional family of :ref:`decorations <ptolemy-generically-decorated>` of the same (up to Galois conjugacy) representation. The corresponding family of representation is 0-dimensional.
216
+
217
+ Let us try another manifold, ``m410``:
218
+
219
+ >>> M = Manifold("m410")
220
+ >>> G = M.fundamental_group()
221
+ >>> sols = M.ptolemy_variety(2,'all').retrieve_solutions().flatten()
222
+ >>> components = [ sol for sol in sols if sol.dimension > 0]
223
+ >>> for component in components:
224
+ ... print("Component of dimension %d" % component.dimension)
225
+ ... for witness in component:
226
+ ... for i, cusp_curves in enumerate(G.peripheral_curves()):
227
+ ... print(" Cusp %d:" % i)
228
+ ... for cusp_curve in cusp_curves:
229
+ ... print(" ", witness.evaluate_word(cusp_curve, G))
230
+ Component of dimension 1
231
+ Cusp 0:
232
+ [[Mod(1, x^2 + 2), 0], [0, Mod(1, x^2 + 2)]]
233
+ [[Mod(1, x^2 + 2), Mod(x, x^2 + 2)], [0, Mod(1, x^2 + 2)]]
234
+ Component of dimension 1
235
+ Cusp 0:
236
+ [[Mod(1, x^2 + 7), 0], [0, Mod(1, x^2 + 7)]]
237
+ [[Mod(1, x^2 + 7), 0], [0, Mod(1, x^2 + 7)]]
238
+
239
+ It has two 1-dimensional components, and for the first one, we see that the matrices are non-trivial, so this corresponds indeed to a 1-dimensional family of representations.
240
+
241
+ **Remark:** The witness points are chosen so that they are not at the intersection of two positively dimensional components. This is for the following reason: it could happen that there is a 1-dimensional family of representations which contains points where the boundary holonomy becomes trivial. This yields a representation where the above matrices are trivial yet it is part of a 1-dimensional family of boundary-unipotent representations. In the ptolemy variety, however, this means that two non-zero dimensional components (one corresponding to a family of decorations, the other to a family of representations) intersect.
242
+
243
+ Representations that are the same as PSL(2, **C**)-representations
244
+ ------------------------------------------------------------------
245
+
246
+ Let us compare the volumes of ``m009`` and ``m159``:
247
+
248
+ >>> Manifold("m009").ptolemy_variety(2,'all').retrieve_solutions().volume_numerical()
249
+ [[],
250
+ [],
251
+ [],
252
+ [[2.66674478344907, -2.66674478344907, 2.66674478344907, -2.66674478344907]]]
253
+ >>> Manifold("m159").ptolemy_variety(2,'all').retrieve_solutions().volume_numerical()
254
+ [[[0.E-38, 0.E-37, 0.E-37],
255
+ [-2.02988321281931, 2.02988321281931, -2.02988321281931, 2.02988321281931]],
256
+ [[0.698544082784440, -0.698544082784440, 3.82168758617998, -3.82168758617998],
257
+ [0.E-37, 0.E-37, 0.E-37, 0.E-37]]]
258
+
259
+ In both cases, some volumes appear twice (2.66674... for ``m009`` and 2.02988... for ``m159``). In the case of ``m009``, these two volumes correspond to the same PSL(2, **C**)-representation and in case ``m159`` to two different boundary-unipotent SL(2, **C**)-representations that are the same as PSL(2, **C**)-representations (see :ref:`ptolemy-psl-multiplicity`). We can get the multiplicity by calling ``degree_to_shapes``::
260
+
261
+ >>> Manifold("m009").ptolemy_variety(2).degree_to_shapes()
262
+ 2
263
+ >>> Manifold("m159").ptolemy_variety(2).degree_to_shapes()
264
+ 1
265
+
266
+ When we convert the Ptolemy coordinates to shapes/cross ratios for ``m009``, we also see that we see the same shape assignment appears twice (at least numerically)::
267
+
268
+ >>> Manifold("m009").ptolemy_variety(2,'all').retrieve_solutions().numerical().cross_ratios()
269
+ [[],
270
+ [],
271
+ [],
272
+ [[CrossRatios(
273
+ {'z_0000_0': 0.500000000000000 + 1.32287565553230*I,
274
+ 'z_0000_1': 0.375000000000000 + 0.330718913883074*I,
275
+ 'z_0000_2': 0.500000000000000 + 1.32287565553230*I,
276
+ 'zp_0000_0': 0.250000000000000 + 0.661437827766148*I,
277
+ ...},
278
+ is_numerical = True, ...),
279
+ CrossRatios(
280
+ {'z_0000_0': 0.500000000000000 - 1.32287565553230*I,
281
+ 'z_0000_1': 0.375000000000000 - 0.330718913883074*I,
282
+ 'z_0000_2': 0.500000000000000 - 1.32287565553230*I,
283
+ ...}
284
+ is_numerical = True, ...),
285
+ CrossRatios(
286
+ {'z_0000_0': 0.500000000000000 + 1.32287565553230*I,
287
+ 'z_0000_1': 0.375000000000000 + 0.330718913883074*I,
288
+ 'z_0000_2': 0.500000000000000 + 1.32287565553230*I,
289
+ ...},
290
+ is_numerical = True, ...),
291
+ CrossRatios(
292
+ {'z_0000_0': 0.500000000000000 - 1.32287565553230*I,
293
+ 'z_0000_1': 0.375000000000000 - 0.330718913883074*I,
294
+ 'z_0000_2': 0.500000000000000 - 1.32287565553230*I,
295
+ ...},
296
+ is_numerical = True, ...)]]]
297
+
298
+
299
+
300
+ **Remark:** The tables at `ptolemy.unhyperbolic.org <http://ptolemy.unhyperbolic.org/html/summary.html>`_ use the cross ratios to list representations that are the same as PSL(2, **C**)-representation only once.
301
+