snappy 3.1.1__cp38-cp38-win_amd64.whl → 3.2__cp38-cp38-win_amd64.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 (476) hide show
  1. snappy/CyOpenGL.cp38-win_amd64.pyd +0 -0
  2. snappy/SnapPy.cp38-win_amd64.pyd +0 -0
  3. snappy/SnapPyHP.cp38-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.cp38-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 +14 -10
  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-38.pyc +0 -0
  305. snappy/__pycache__/browser.cpython-38.pyc +0 -0
  306. snappy/__pycache__/cache.cpython-38.pyc +0 -0
  307. snappy/__pycache__/database.cpython-38.pyc +0 -0
  308. snappy/__pycache__/db_utilities.cpython-38.pyc +0 -0
  309. snappy/__pycache__/decorated_isosig.cpython-38.pyc +0 -0
  310. snappy/__pycache__/exceptions.cpython-38.pyc +0 -0
  311. snappy/__pycache__/export_stl.cpython-38.pyc +0 -0
  312. snappy/__pycache__/filedialog.cpython-38.pyc +0 -0
  313. snappy/__pycache__/gui.cpython-38.pyc +0 -0
  314. snappy/__pycache__/horoviewer.cpython-38.pyc +0 -0
  315. snappy/__pycache__/math_basics.cpython-38.pyc +0 -0
  316. snappy/__pycache__/matrix.cpython-38.pyc +0 -0
  317. snappy/__pycache__/number.cpython-38.pyc +0 -0
  318. snappy/__pycache__/numeric_output_checker.cpython-38.pyc +0 -0
  319. snappy/__pycache__/pari.cpython-38.pyc +0 -0
  320. snappy/__pycache__/polyviewer.cpython-38.pyc +0 -0
  321. snappy/__pycache__/sage_helper.cpython-38.pyc +0 -0
  322. snappy/__pycache__/version.cpython-38.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-38.pyc +0 -0
  331. snappy/drilling/__pycache__/constants.cpython-38.pyc +0 -0
  332. snappy/drilling/__pycache__/crush.cpython-38.pyc +0 -0
  333. snappy/drilling/__pycache__/cusps.cpython-38.pyc +0 -0
  334. snappy/drilling/__pycache__/debug.cpython-38.pyc +0 -0
  335. snappy/drilling/__pycache__/epsilons.cpython-38.pyc +0 -0
  336. snappy/drilling/__pycache__/exceptions.cpython-38.pyc +0 -0
  337. snappy/drilling/__pycache__/fixed_points.cpython-38.pyc +0 -0
  338. snappy/drilling/__pycache__/geodesic_info.cpython-38.pyc +0 -0
  339. snappy/drilling/__pycache__/geodesic_tube.cpython-38.pyc +0 -0
  340. snappy/drilling/__pycache__/geometric_structure.cpython-38.pyc +0 -0
  341. snappy/drilling/__pycache__/line.cpython-38.pyc +0 -0
  342. snappy/drilling/__pycache__/moves.cpython-38.pyc +0 -0
  343. snappy/drilling/__pycache__/peripheral_curves.cpython-38.pyc +0 -0
  344. snappy/drilling/__pycache__/perturb.cpython-38.pyc +0 -0
  345. snappy/drilling/__pycache__/quotient_space.cpython-38.pyc +0 -0
  346. snappy/drilling/__pycache__/spatial_dict.cpython-38.pyc +0 -0
  347. snappy/drilling/__pycache__/subdivide.cpython-38.pyc +0 -0
  348. snappy/drilling/__pycache__/tracing.cpython-38.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-38.pyc +0 -0
  355. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-38.pyc +0 -0
  356. snappy/exterior_to_link/__pycache__/exceptions.cpython-38.pyc +0 -0
  357. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-38.pyc +0 -0
  358. snappy/exterior_to_link/__pycache__/link_projection.cpython-38.pyc +0 -0
  359. snappy/exterior_to_link/__pycache__/main.cpython-38.pyc +0 -0
  360. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-38.pyc +0 -0
  361. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-38.pyc +0 -0
  362. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-38.pyc +0 -0
  363. snappy/exterior_to_link/__pycache__/pl_utils.cpython-38.pyc +0 -0
  364. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-38.pyc +0 -0
  365. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-38.pyc +0 -0
  366. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-38.pyc +0 -0
  367. snappy/exterior_to_link/__pycache__/stored_moves.cpython-38.pyc +0 -0
  368. snappy/hyperboloid/__pycache__/__init__.cpython-38.pyc +0 -0
  369. snappy/manifolds/__pycache__/__init__.cpython-38.pyc +0 -0
  370. snappy/ptolemy/__pycache__/__init__.cpython-38.pyc +0 -0
  371. snappy/ptolemy/__pycache__/component.cpython-38.pyc +0 -0
  372. snappy/ptolemy/__pycache__/coordinates.cpython-38.pyc +0 -0
  373. snappy/ptolemy/__pycache__/fieldExtensions.cpython-38.pyc +0 -0
  374. snappy/ptolemy/__pycache__/findLoops.cpython-38.pyc +0 -0
  375. snappy/ptolemy/__pycache__/homology.cpython-38.pyc +0 -0
  376. snappy/ptolemy/__pycache__/manifoldMethods.cpython-38.pyc +0 -0
  377. snappy/ptolemy/__pycache__/matrix.cpython-38.pyc +0 -0
  378. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-38.pyc +0 -0
  379. snappy/ptolemy/__pycache__/polynomial.cpython-38.pyc +0 -0
  380. snappy/ptolemy/__pycache__/processComponents.cpython-38.pyc +0 -0
  381. snappy/ptolemy/__pycache__/processFileBase.cpython-38.pyc +0 -0
  382. snappy/ptolemy/__pycache__/processFileDispatch.cpython-38.pyc +0 -0
  383. snappy/ptolemy/__pycache__/processMagmaFile.cpython-38.pyc +0 -0
  384. snappy/ptolemy/__pycache__/processRurFile.cpython-38.pyc +0 -0
  385. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-38.pyc +0 -0
  386. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-38.pyc +0 -0
  387. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-38.pyc +0 -0
  388. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
  389. snappy/ptolemy/__pycache__/rur.cpython-38.pyc +0 -0
  390. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
  391. snappy/ptolemy/__pycache__/utilities.cpython-38.pyc +0 -0
  392. snappy/snap/__pycache__/__init__.cpython-38.pyc +0 -0
  393. snappy/snap/__pycache__/character_varieties.cpython-38.pyc +0 -0
  394. snappy/snap/__pycache__/fundamental_polyhedron.cpython-38.pyc +0 -0
  395. snappy/snap/__pycache__/interval_reps.cpython-38.pyc +0 -0
  396. snappy/snap/__pycache__/kernel_structures.cpython-38.pyc +0 -0
  397. snappy/snap/__pycache__/mcomplex_base.cpython-38.pyc +0 -0
  398. snappy/snap/__pycache__/nsagetools.cpython-38.pyc +0 -0
  399. snappy/snap/__pycache__/polished_reps.cpython-38.pyc +0 -0
  400. snappy/snap/__pycache__/shapes.cpython-38.pyc +0 -0
  401. snappy/snap/__pycache__/slice_obs_HKL.cpython-38.pyc +0 -0
  402. snappy/snap/__pycache__/utilities.cpython-38.pyc +0 -0
  403. snappy/snap/peripheral/__pycache__/__init__.cpython-38.pyc +0 -0
  404. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-38.pyc +0 -0
  405. snappy/snap/peripheral/__pycache__/link.cpython-38.pyc +0 -0
  406. snappy/snap/peripheral/__pycache__/peripheral.cpython-38.pyc +0 -0
  407. snappy/snap/peripheral/__pycache__/surface.cpython-38.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/__init__.cpython-38.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/arrow.cpython-38.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/corner.cpython-38.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/edge.cpython-38.pyc +0 -0
  412. snappy/snap/t3mlite/__pycache__/face.cpython-38.pyc +0 -0
  413. snappy/snap/t3mlite/__pycache__/files.cpython-38.pyc +0 -0
  414. snappy/snap/t3mlite/__pycache__/homology.cpython-38.pyc +0 -0
  415. snappy/snap/t3mlite/__pycache__/linalg.cpython-38.pyc +0 -0
  416. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-38.pyc +0 -0
  417. snappy/snap/t3mlite/__pycache__/perm4.cpython-38.pyc +0 -0
  418. snappy/snap/t3mlite/__pycache__/simplex.cpython-38.pyc +0 -0
  419. snappy/snap/t3mlite/__pycache__/spun.cpython-38.pyc +0 -0
  420. snappy/snap/t3mlite/__pycache__/surface.cpython-38.pyc +0 -0
  421. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-38.pyc +0 -0
  422. snappy/snap/t3mlite/__pycache__/vertex.cpython-38.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-38.pyc +0 -0
  442. snappy/twister/__pycache__/main.cpython-38.pyc +0 -0
  443. snappy/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
  444. snappy/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
  445. snappy/verify/__pycache__/__init__.cpython-38.pyc +0 -0
  446. snappy/verify/__pycache__/cuspCrossSection.cpython-38.pyc +0 -0
  447. snappy/verify/__pycache__/cuspTranslations.cpython-38.pyc +0 -0
  448. snappy/verify/__pycache__/cusp_areas.cpython-38.pyc +0 -0
  449. snappy/verify/__pycache__/cusp_shapes.cpython-38.pyc +0 -0
  450. snappy/verify/__pycache__/exceptions.cpython-38.pyc +0 -0
  451. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-38.pyc +0 -0
  452. snappy/verify/__pycache__/interval_tree.cpython-38.pyc +0 -0
  453. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-38.pyc +0 -0
  454. snappy/verify/__pycache__/realAlgebra.cpython-38.pyc +0 -0
  455. snappy/verify/__pycache__/shapes.cpython-38.pyc +0 -0
  456. snappy/verify/__pycache__/short_slopes.cpython-38.pyc +0 -0
  457. snappy/verify/__pycache__/squareExtensions.cpython-38.pyc +0 -0
  458. snappy/verify/__pycache__/verifyCanonical.cpython-38.pyc +0 -0
  459. snappy/verify/__pycache__/verifyHyperbolicity.cpython-38.pyc +0 -0
  460. snappy/verify/__pycache__/volume.cpython-38.pyc +0 -0
  461. snappy/verify/complex_volume/__pycache__/__init__.cpython-38.pyc +0 -0
  462. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-38.pyc +0 -0
  463. snappy/verify/complex_volume/__pycache__/closed.cpython-38.pyc +0 -0
  464. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-38.pyc +0 -0
  465. snappy/verify/complex_volume/__pycache__/cusped.cpython-38.pyc +0 -0
  466. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-38.pyc +0 -0
  467. snappy/verify/cuspCrossSection.py +0 -1422
  468. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-38.pyc +0 -0
  469. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-38.pyc +0 -0
  470. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-38.pyc +0 -0
  471. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
  472. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-38.pyc +0 -0
  473. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-38.pyc +0 -0
  474. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-38.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,363 +1,363 @@
1
- Step-by-step examples: Part 2
2
- =============================
3
-
4
- .. _ptolemy-example-smart-lists:
5
-
6
- The Ptolemy list type
7
- ---------------------
8
-
9
- Recall that ``ptolemy_variety`` with ``obstruction_class='all'`` returns a list of varieties, one for each obstruction class::
10
-
11
- >>> M = Manifold("m003")
12
- >>> M.ptolemy_variety(2, obstruction_class = 'all')
13
- [Ptolemy Variety for m003, N = 2, obstruction_class = 0
14
- c_0011_0 * c_0101_0 + c_0011_0^2 - c_0101_0^2
15
- c_0011_0 * c_0101_0 + c_0011_0^2 - c_0101_0^2
16
- - 1 + c_0011_0,
17
- Ptolemy Variety for m003, N = 2, obstruction_class = 1
18
- - c_0011_0 * c_0101_0 - c_0011_0^2 - c_0101_0^2
19
- - c_0011_0 * c_0101_0 - c_0011_0^2 - c_0101_0^2
20
- - 1 + c_0011_0]
21
-
22
- Also recall that ``retrieve_solutions`` was a method of a ``PtolemyVariety``. Assume we want to call ``retrieve_solutions`` for each Ptolemy variety. As in the previous example, we could write a loop such as::
23
-
24
- >>> [p.retrieve_solutions(verbose=False) for p in M.ptolemy_variety(2, 'all')]
25
-
26
- The ptolemy module allows to do this in a much shorter way::
27
-
28
- >>> M.ptolemy_variety(2, 'all').retrieve_solutions(verbose=False)
29
- [[PtolemyCoordinates(
30
- {'c_0011_0': 1,
31
- 'c_0011_1': -1,
32
- 'c_0101_0': Mod(x, x^2 - x - 1),
33
- ...,
34
- 's_3_1': 1},
35
- is_numerical = False, ...)],
36
- [PtolemyCoordinates(
37
- {'c_0011_0': 1,
38
- 'c_0011_1': -1,
39
- 'c_0101_0': Mod(x, x^2 + x + 1),
40
- ...,
41
- 's_3_1': 1},
42
- is_numerical = False, ...)]]
43
-
44
- This behavior is specific to the ptolemy module. It works with many methods of the ptolemy module that
45
- can potentially return more than one object. These methods return a special kind of list (usually
46
- ``MethodMappingList``, a subclass of python ``list``) that tries to call the method of the given name (here ``retrieve_solutions``) with
47
- the given arguments (here ``verbose=False``) on each element in the list (here the two Ptolemy varieties).
48
-
49
- Since ``retrieve_solutions`` itself actually returns a list, the result is a list of lists of solutions which are of type ``PtolemyCoordinates``. The first level groups the solutions by obstruction class. The inner lists contain the different (non-Galois conjugate) solutions for each obstruction class (here, for ``m003``, each inner lists contains only one element).
50
-
51
- Using the Ptolemy list type recursively
52
- ---------------------------------------
53
-
54
- The list type described in the previous example works recursively. Recall that an algebraic solution to a Ptolemy variety (of type ``PtolemyCoordinates``) has a method ``volume_numerical`` that returns a list of volumes::
55
-
56
- >>> M=Manifold("m003")
57
- >>> p=M.ptolemy_variety(2,1)
58
- >>> sol=p.retrieve_solutions(verbose=False)[0]
59
- >>> sol.volume_numerical()
60
- [0.E-19, 1.88267370443418 E-14]
61
-
62
- We can chain these commands together to retrieve the volumes of all boundary-unipotent PSL(2, **C**) (that are :ref:`generically decorated <ptolemy-generically-decorated>` with respect to the triangulation) in just one line::
63
-
64
- >>> Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical()
65
- [[[0.E-19, 1.88267370443418 E-14]], [[2.02988321281931, -2.02988321281931]]]
66
-
67
- Note that the volumes of the representations are in a list of lists of lists. At the first level the volumes are grouped by obstruction class, then by Galois conjugacy.
68
-
69
- **Remark:** There might be an extra level for witness points.
70
-
71
- **Remark:** Unfortunately, this is not compatible with tab-autocompletion, see :ref:`later <ptolemy-example-missing-auto-completion>`.
72
-
73
- A comparison of ``m003`` and ``m004``
74
- -------------------------------------
75
-
76
- We can now compare the set of volumes of ``m003`` and ``m004``:
77
-
78
- >>> Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical()
79
- [[[0.E-19, 1.88267370443418 E-14]], [[2.02988321281931, -2.02988321281931]]]
80
- >>> Manifold("m004").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical()
81
- [[], [[-2.02988321281931, 2.02988321281931]]]
82
-
83
- We see that the two manifolds are distinguished by their volumes of boundary-unipotent representations: ``m004`` has no representation with trivial volume (this is not a proof as in theory, there could be such a representation which is not :ref:`generically decorated <ptolemy-generically-decorated>` with respect to the given triangulation) and no representation that can be lifted to a boundary-unipotent SL(2, **C**)-representation.
84
-
85
- A non-hyperbolic example
86
- ------------------------
87
-
88
- We can also compute the volumes for a manifold that might be non-hyperbolic, here the complement of the 5\ :sub:`1` knot::
89
-
90
- >>> Manifold("5_1").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical()
91
- [[], [[1.52310839130992 E-14, 0.E-37]]]
92
-
93
- Note that one of the Ptolemy varieties is non-empty which proves that all edges of the triangulation are essential. We also see that all volumes are 0 and thus smaller than the volume 2.029883... of the figure-eight knot complement that is proven to be the smallest volume of any orientable cusped manifold. Thus, it follows from Theorem 1.3 and Remark 1.4 of [GGZ2014]_ that 5\ :sub:`1` is not hyperbolic.
94
-
95
- **Remark:** The ptolemy module does not (yet) support interval arithmetics, otherwise, this would be a proof that 5\ :sub:`1` is not hyperbolic.
96
-
97
-
98
- Flattening nested structures
99
- ----------------------------
100
-
101
- If we want to loose some of the grouping, we can call ``flatten`` on the results. Here the grouping by obstruction class is lost::
102
-
103
- >>> Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical().flatten()
104
- [[0.E-19, 1.88267370443418 E-14], [2.02988321281931, -2.02988321281931]]
105
-
106
- And now, the grouping by Galois conjugacy is lost as well, resulting in a flat list::
107
-
108
- >>> Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical().flatten(2)
109
- [0.E-19, 1.88267370443418 E-14, 2.02988321281931, -2.02988321281931]
110
-
111
- So the result is just a flat list.
112
-
113
- **Remark:** We cannot `overflatten`. If we give an even larger argument to flatten, the result will just stay a flat list.
114
-
115
- .. _ptolemy-example-missing-auto-completion:
116
-
117
- Lack of tab-autocompletion for nested structures
118
- -------------------------------------------------
119
-
120
- Unfortunately, the autocompletion does not list all the desired results when we have a nested structure. For example::
121
-
122
- >>> sols = Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False)
123
- >>> sols.
124
-
125
- When we now hit the tab key::
126
-
127
- >>> sols.
128
- sols.append sols.extend sols.index sols.pop sols.reverse
129
- sols.count sols.flatten sols.insert sols.remove sols.sort
130
-
131
- ... we only get ``list`` methods, but not the desired ``volume_numerical``. One way to discover the available methods is to pick a leaf of the nested structure and hit the tab key::
132
-
133
- >>> sol = sols.flatten(100)[0]
134
- >>> sol.
135
- sol.N sol.keys
136
- sol.check_against_manifold sol.long_edge
137
- ...
138
- sol.itervalues sol.volume_numerical
139
-
140
- The overview diagram might also be helpful.
141
-
142
- Converting exact solutions into numerical solutions
143
- ---------------------------------------------------
144
-
145
- We can turn exact solutions into numerical solutions by calling ``numerical``::
146
-
147
- >>> sol = Manifold("m003").ptolemy_variety(2, 1).retrieve_solutions()[0]
148
- >>> sol
149
- PtolemyCoordinates(
150
- {'c_0011_0': 1,
151
- 'c_0011_1': -1,
152
- 'c_0101_0': Mod(x, x^2 + x + 1),
153
- ...
154
- 's_3_1': 1},
155
- is_numerical = False, ...)
156
- >>> sol.numerical()
157
- [PtolemyCoordinates(
158
- {'c_0011_0': 1,
159
- 'c_0011_1': -1,
160
- 'c_0101_0': -0.500000000000000 - 0.866025403784439*I,
161
- ...,
162
- 's_3_1': 1},
163
- is_numerical = True, ...),
164
- PtolemyCoordinates(
165
- {'c_0011_0': 1,
166
- 'c_0011_1': -1,
167
- 'c_0101_0': -0.500000000000000 + 0.866025403784439*I,
168
- ...,
169
- 's_3_1': 1},
170
- is_numerical = True, ...)]
171
-
172
- Note that the one exact (algebraic) solution turns into a list of numerical solutions which are Galois conjugates.
173
-
174
- **Remark:** This uses the current pari precision. See the :ref:`above example <ptolemy-example-increase-precision>`, in particular, the comment about interval arithmetics.
175
-
176
- **Remark:** Calling ``numerical()`` on a numerical solution does nothing.
177
-
178
- **Remark:** ``CrossRatios`` also support ``numerical``.
179
-
180
- .. _ptolemy-example-numerical-matrix:
181
-
182
- Working with exact vs numerical solutions
183
- -----------------------------------------
184
-
185
- Most methods such as ``evaluate_word`` or ``cross_ratios`` work just the same way on an exact solution::
186
-
187
- >>> exact_sol = Manifold("m004").ptolemy_variety(2, 1).retrieve_solutions()[0]
188
- >>> exact_sol
189
- PtolemyCoordinates(
190
- {'c_0011_0': 1,
191
- 'c_0011_1': -1,
192
- 'c_0101_0': 1,
193
- 'c_0101_1': Mod(x, x^2 + x + 1),
194
- ...,
195
- 's_3_1': -1},
196
- is_numerical = False, ...)
197
- >>> exact_sol.evaluate_word('a')
198
- [[Mod(-2*x, x^2 + x + 1), Mod(-x - 1, x^2 + x + 1)],
199
- [Mod(x, x^2 + x + 1), Mod(x + 1, x^2 + x + 1)]]
200
-
201
- ... as they do on a numerical solution::
202
-
203
- >>> numerical_sol = sol.numerical()[0]
204
- >>> numerical_sol
205
- PtolemyCoordinates(
206
- {'c_0011_0': 1,
207
- 'c_0011_1': -1,
208
- 'c_0101_0': 1,
209
- 'c_0101_1': -0.500000000000000 - 0.866025403784439*I,
210
- ...,
211
- 's_3_1': -1},
212
- is_numerical = False, ...)
213
- >>> numerical_sol.evaluate_word('a')
214
- [[1.00000000000000 + 1.73205080756888*I,
215
- -0.500000000000000 + 0.866025403784439*I],
216
- [-0.500000000000000 - 0.866025403784439*I,
217
- 0.500000000000000 - 0.866025403784439*I]]
218
-
219
- Methods with postfix ``_numerical`` are special: when applied to an exact solution, they implicitly convert it to a list
220
- of Galois conjugate numerical solutions first. ``volume_numerical`` is an example (because volume is a transcendental function)::
221
-
222
- >>> exact_sol.volume_numerical()
223
- [-2.02988321281931, 2.02988321281931]
224
- >>> numerical_sol.volume_numerical()
225
- -2.02988321281931
226
-
227
- .. _ptolemy-example-retrieve-numerical-solutions:
228
-
229
- Computing numerical solutions directly
230
- --------------------------------------
231
-
232
- We can also directly compute numerical solutions::
233
-
234
- >>> M = Manifold("m004")
235
- >>> sols = M.ptolemy_variety(2,'all').retrieve_solutions(numerical = True)
236
- [[],
237
- [[PtolemyCoordinates(
238
- {'c_0011_0': 1.00000000000000 + 0.E-19*I,
239
- 'c_0011_1': -1.00000000000000 + 0.E-19*I,
240
- 'c_0101_0': 1.00000000000000 + 0.E-19*I,
241
- 'c_0101_1': -0.500000000000000 - 0.866025403784439*I,
242
- ...,
243
- 's_3_1': -1},
244
- is_numerical = True, ...),
245
- PtolemyCoordinates(
246
- {'c_0011_0': 1.00000000000000 + 0.E-19*I,
247
- 'c_0011_1': -1.00000000000000 + 0.E-19*I,
248
- 'c_0101_0': 1.00000000000000 + 0.E-19*I,
249
- 'c_0101_1': -0.500000000000000 + 0.866025403784439*I,
250
- ...,
251
- 's_3_1': -1},
252
- is_numerical = True, ...)]]]
253
-
254
- The structure is as described earlier, a list of lists of lists: first solutions are grouped by obstruction class, then by Galois conjugacy.
255
-
256
- The advantage over going through the exact solutions is that it might be much faster
257
- (because it can avoid computing the number field from the lexicographic Groebner basis, see later). For example, many PSL(3, **C**) examples only work when using ``numerical = True``.
258
-
259
- .. _ptolemy-example-cross-ratios:
260
-
261
- Computing cross ratios from Ptolemy coordinates
262
- -----------------------------------------------
263
-
264
- Given exact or numerical solutions to the Ptolemy variety, we can also compute the cross ratios/shape parameters::
265
-
266
- >>> sols = Manifold("m004").ptolemy_variety(2,'all').retrieve_solutions(verbose=False)
267
- >>> zs=sols.cross_ratios()
268
- >>> zs
269
- [[],
270
- [CrossRatios({'z_0000_0': Mod(x + 1, x^2 + x + 1),
271
- 'z_0000_1': Mod(x + 1, x^2 + x + 1),
272
- 'zp_0000_0': Mod(x + 1, x^2 + x + 1),
273
- 'zp_0000_1': Mod(x + 1, x^2 + x + 1),
274
- 'zpp_0000_0': Mod(x + 1, x^2 + x + 1),
275
- 'zpp_0000_1': Mod(x + 1, x^2 + x + 1)},
276
- is_numerical = False, ...)]]
277
-
278
- **Remark**: The shapes will be given as element in the Ptolemy field with defining polynomial being the second argument to ``Mod(..., ...)``, here, x\ :sup:`2`\ +x+1. The Ptolemy field is a (possibly trivial) extension of the shape field. For *N* =2, the Ptolemy field is the trace field [GGZ2014]_ and an iterated square extension of the shape field which is the invariant trace field for a cusped manifold.
279
-
280
- And numerically, so that we can compare to SnapPy's shapes::
281
-
282
- >>> zs.numerical()
283
- [[],
284
- [[CrossRatios(
285
- {'z_0000_0': 0.500000000000000 - 0.866025403784439*I,
286
- 'z_0000_1': 0.500000000000000 - 0.866025403784439*I,
287
- 'zp_0000_0': 0.500000000000000 - 0.866025403784439*I,
288
- 'zp_0000_1': 0.500000000000000 - 0.866025403784439*I,
289
- 'zpp_0000_0': 0.500000000000000 - 0.866025403784439*I,
290
- 'zpp_0000_1': 0.500000000000000 - 0.866025403784439*I},
291
- is_numerical = True, ...),
292
- CrossRatios(
293
- {'z_0000_0': 0.500000000000000 + 0.866025403784439*I,
294
- 'z_0000_1': 0.500000000000000 + 0.866025403784439*I,
295
- 'zp_0000_0': 0.500000000000000 + 0.866025403784439*I,
296
- 'zp_0000_1': 0.500000000000000 + 0.866025403784439*I,
297
- 'zpp_0000_0': 0.500000000000000 + 0.866025403784439*I,
298
- 'zpp_0000_1': 0.500000000000000 + 0.866025403784439*I},
299
- is_numerical = True, ...)]]]
300
- >>> Manifold("m004").tetrahedra_shapes('rect')
301
- [0.5000000000 + 0.8660254038*I, 0.5000000000 + 0.8660254038*I]
302
-
303
- The result is of type ``CrossRatios`` and assigns z as well as z'=1/(1-z) and z''=1-1/z a value.
304
-
305
- .. _ptolemy-non-zero-dim-comp:
306
-
307
- The dimension of a component
308
- ----------------------------
309
-
310
- A Ptolemy variety might have positively dimensional components (note that this might or might not be a positively dimensional family of representations, see :ref:`here <ptolemy-generically-decorated>`). For example, the Ptolemy variety for ``m371`` and the trivial obstruction class has a 1-dimensional component. This is indicated by::
311
-
312
- >>> M.ptolemy_variety(2).retrieve_solutions()
313
- [NonZeroDimensionalComponent(dimension = 1)]
314
-
315
- Or::
316
-
317
- >>> M=Manifold("m371")
318
- >>> M.ptolemy_variety(2).retrieve_solutions()
319
- [[ PtolemyCoordinates(
320
- {'c_0011_0': 1,
321
- 'c_0011_1': -1,
322
- 'c_0011_2': -1,
323
- 'c_0011_3': Mod(-x - 1, x^2 + x + 2),
324
- ...,
325
- 's_3_4': 1},
326
- is_numerical = False, ...)
327
- (witnesses for NonZeroDimensionalComponent(dimension = 1, free_variables = ['c_0110_2'])) ]]
328
-
329
- The latter actually also provides a sample point (:ref:`witness <ptolemy-example-find-witness>` which we will use :ref:`later <ptolemy-example-non-zero-dim-rep>` to determine whether this corresponds to a 1-dimensional family of representations or not) on the 1-dimensional component. A ``NonZeroDimensionalComponent`` as well as ``PtolemyCoordinates`` (that correspond to 0-dimensional components of the Ptolemy variety)) has a ``dimension`` attribute, so we can do::
330
-
331
- >>> M=Manifold("m371")
332
- >>> sols = M.ptolemy_variety(2,'all').retrieve_solutions()
333
- >>> sols.dimension
334
- [[1], [], [0], []]
335
-
336
- This means that the Ptolemy variety for the trivial obstruction class has a 1-dimensional component and that the Ptolemy variety of one of the other obstruction classes a 0-dimensional component.
337
-
338
- A ``NonZeroDimensionalComponent`` is actually again a list whose elements will be witness points if witnesses have been computed for this Ptolemy variety.
339
-
340
- **Warning:** This implies that if we ``flatten`` too much, the reported dimension becomes 0 which is the dimension of the witness point instead of 1::
341
-
342
- >>> sols.flatten()
343
- [1, 0]
344
-
345
- Too much ``flatten``::
346
-
347
- >>> sols.flatten()
348
- [0, 0]
349
-
350
- The advantage is that we can still call methods such as ``volume_numerical`` and actually see the volume of a witness point (it is known that the volume stays constant on a component of boundary-unipotent representations, so one witness point can tell us the volume of all representation in that component)::
351
-
352
- >>> sols.volume_numerical()
353
- [[[ [0.E-38, 0.E-38] (witnesses for NonZeroDimensionalComponent(dimension = 1, free_variables = ['c_0110_2'])) ]],
354
- [],
355
- [[4.75170196551790,
356
- -4.75170196551790,
357
- 4.75170196551790,
358
- -4.75170196551790,
359
- 1.17563301006556,
360
- -1.17563301006556,
361
- 1.17563301006556,
362
- -1.17563301006556]],
363
- []]
1
+ Step-by-step examples: Part 2
2
+ =============================
3
+
4
+ .. _ptolemy-example-smart-lists:
5
+
6
+ The Ptolemy list type
7
+ ---------------------
8
+
9
+ Recall that ``ptolemy_variety`` with ``obstruction_class='all'`` returns a list of varieties, one for each obstruction class::
10
+
11
+ >>> M = Manifold("m003")
12
+ >>> M.ptolemy_variety(2, obstruction_class = 'all')
13
+ [Ptolemy Variety for m003, N = 2, obstruction_class = 0
14
+ c_0011_0 * c_0101_0 + c_0011_0^2 - c_0101_0^2
15
+ c_0011_0 * c_0101_0 + c_0011_0^2 - c_0101_0^2
16
+ - 1 + c_0011_0,
17
+ Ptolemy Variety for m003, N = 2, obstruction_class = 1
18
+ - c_0011_0 * c_0101_0 - c_0011_0^2 - c_0101_0^2
19
+ - c_0011_0 * c_0101_0 - c_0011_0^2 - c_0101_0^2
20
+ - 1 + c_0011_0]
21
+
22
+ Also recall that ``retrieve_solutions`` was a method of a ``PtolemyVariety``. Assume we want to call ``retrieve_solutions`` for each Ptolemy variety. As in the previous example, we could write a loop such as::
23
+
24
+ >>> [p.retrieve_solutions(verbose=False) for p in M.ptolemy_variety(2, 'all')]
25
+
26
+ The ptolemy module allows to do this in a much shorter way::
27
+
28
+ >>> M.ptolemy_variety(2, 'all').retrieve_solutions(verbose=False)
29
+ [[PtolemyCoordinates(
30
+ {'c_0011_0': 1,
31
+ 'c_0011_1': -1,
32
+ 'c_0101_0': Mod(x, x^2 - x - 1),
33
+ ...,
34
+ 's_3_1': 1},
35
+ is_numerical = False, ...)],
36
+ [PtolemyCoordinates(
37
+ {'c_0011_0': 1,
38
+ 'c_0011_1': -1,
39
+ 'c_0101_0': Mod(x, x^2 + x + 1),
40
+ ...,
41
+ 's_3_1': 1},
42
+ is_numerical = False, ...)]]
43
+
44
+ This behavior is specific to the ptolemy module. It works with many methods of the ptolemy module that
45
+ can potentially return more than one object. These methods return a special kind of list (usually
46
+ ``MethodMappingList``, a subclass of python ``list``) that tries to call the method of the given name (here ``retrieve_solutions``) with
47
+ the given arguments (here ``verbose=False``) on each element in the list (here the two Ptolemy varieties).
48
+
49
+ Since ``retrieve_solutions`` itself actually returns a list, the result is a list of lists of solutions which are of type ``PtolemyCoordinates``. The first level groups the solutions by obstruction class. The inner lists contain the different (non-Galois conjugate) solutions for each obstruction class (here, for ``m003``, each inner lists contains only one element).
50
+
51
+ Using the Ptolemy list type recursively
52
+ ---------------------------------------
53
+
54
+ The list type described in the previous example works recursively. Recall that an algebraic solution to a Ptolemy variety (of type ``PtolemyCoordinates``) has a method ``volume_numerical`` that returns a list of volumes::
55
+
56
+ >>> M=Manifold("m003")
57
+ >>> p=M.ptolemy_variety(2,1)
58
+ >>> sol=p.retrieve_solutions(verbose=False)[0]
59
+ >>> sol.volume_numerical()
60
+ [0.E-19, 1.88267370443418 E-14]
61
+
62
+ We can chain these commands together to retrieve the volumes of all boundary-unipotent PSL(2, **C**) (that are :ref:`generically decorated <ptolemy-generically-decorated>` with respect to the triangulation) in just one line::
63
+
64
+ >>> Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical()
65
+ [[[0.E-19, 1.88267370443418 E-14]], [[2.02988321281931, -2.02988321281931]]]
66
+
67
+ Note that the volumes of the representations are in a list of lists of lists. At the first level the volumes are grouped by obstruction class, then by Galois conjugacy.
68
+
69
+ **Remark:** There might be an extra level for witness points.
70
+
71
+ **Remark:** Unfortunately, this is not compatible with tab-autocompletion, see :ref:`later <ptolemy-example-missing-auto-completion>`.
72
+
73
+ A comparison of ``m003`` and ``m004``
74
+ -------------------------------------
75
+
76
+ We can now compare the set of volumes of ``m003`` and ``m004``:
77
+
78
+ >>> Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical()
79
+ [[[0.E-19, 1.88267370443418 E-14]], [[2.02988321281931, -2.02988321281931]]]
80
+ >>> Manifold("m004").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical()
81
+ [[], [[-2.02988321281931, 2.02988321281931]]]
82
+
83
+ We see that the two manifolds are distinguished by their volumes of boundary-unipotent representations: ``m004`` has no representation with trivial volume (this is not a proof as in theory, there could be such a representation which is not :ref:`generically decorated <ptolemy-generically-decorated>` with respect to the given triangulation) and no representation that can be lifted to a boundary-unipotent SL(2, **C**)-representation.
84
+
85
+ A non-hyperbolic example
86
+ ------------------------
87
+
88
+ We can also compute the volumes for a manifold that might be non-hyperbolic, here the complement of the 5\ :sub:`1` knot::
89
+
90
+ >>> Manifold("5_1").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical()
91
+ [[], [[1.52310839130992 E-14, 0.E-37]]]
92
+
93
+ Note that one of the Ptolemy varieties is non-empty which proves that all edges of the triangulation are essential. We also see that all volumes are 0 and thus smaller than the volume 2.029883... of the figure-eight knot complement that is proven to be the smallest volume of any orientable cusped manifold. Thus, it follows from Theorem 1.3 and Remark 1.4 of [GGZ2014]_ that 5\ :sub:`1` is not hyperbolic.
94
+
95
+ **Remark:** The ptolemy module does not (yet) support interval arithmetics, otherwise, this would be a proof that 5\ :sub:`1` is not hyperbolic.
96
+
97
+
98
+ Flattening nested structures
99
+ ----------------------------
100
+
101
+ If we want to loose some of the grouping, we can call ``flatten`` on the results. Here the grouping by obstruction class is lost::
102
+
103
+ >>> Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical().flatten()
104
+ [[0.E-19, 1.88267370443418 E-14], [2.02988321281931, -2.02988321281931]]
105
+
106
+ And now, the grouping by Galois conjugacy is lost as well, resulting in a flat list::
107
+
108
+ >>> Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False).volume_numerical().flatten(2)
109
+ [0.E-19, 1.88267370443418 E-14, 2.02988321281931, -2.02988321281931]
110
+
111
+ So the result is just a flat list.
112
+
113
+ **Remark:** We cannot `overflatten`. If we give an even larger argument to flatten, the result will just stay a flat list.
114
+
115
+ .. _ptolemy-example-missing-auto-completion:
116
+
117
+ Lack of tab-autocompletion for nested structures
118
+ -------------------------------------------------
119
+
120
+ Unfortunately, the autocompletion does not list all the desired results when we have a nested structure. For example::
121
+
122
+ >>> sols = Manifold("m003").ptolemy_variety(2,'all').retrieve_solutions(verbose=False)
123
+ >>> sols.
124
+
125
+ When we now hit the tab key::
126
+
127
+ >>> sols.
128
+ sols.append sols.extend sols.index sols.pop sols.reverse
129
+ sols.count sols.flatten sols.insert sols.remove sols.sort
130
+
131
+ ... we only get ``list`` methods, but not the desired ``volume_numerical``. One way to discover the available methods is to pick a leaf of the nested structure and hit the tab key::
132
+
133
+ >>> sol = sols.flatten(100)[0]
134
+ >>> sol.
135
+ sol.N sol.keys
136
+ sol.check_against_manifold sol.long_edge
137
+ ...
138
+ sol.itervalues sol.volume_numerical
139
+
140
+ The overview diagram might also be helpful.
141
+
142
+ Converting exact solutions into numerical solutions
143
+ ---------------------------------------------------
144
+
145
+ We can turn exact solutions into numerical solutions by calling ``numerical``::
146
+
147
+ >>> sol = Manifold("m003").ptolemy_variety(2, 1).retrieve_solutions()[0]
148
+ >>> sol
149
+ PtolemyCoordinates(
150
+ {'c_0011_0': 1,
151
+ 'c_0011_1': -1,
152
+ 'c_0101_0': Mod(x, x^2 + x + 1),
153
+ ...
154
+ 's_3_1': 1},
155
+ is_numerical = False, ...)
156
+ >>> sol.numerical()
157
+ [PtolemyCoordinates(
158
+ {'c_0011_0': 1,
159
+ 'c_0011_1': -1,
160
+ 'c_0101_0': -0.500000000000000 - 0.866025403784439*I,
161
+ ...,
162
+ 's_3_1': 1},
163
+ is_numerical = True, ...),
164
+ PtolemyCoordinates(
165
+ {'c_0011_0': 1,
166
+ 'c_0011_1': -1,
167
+ 'c_0101_0': -0.500000000000000 + 0.866025403784439*I,
168
+ ...,
169
+ 's_3_1': 1},
170
+ is_numerical = True, ...)]
171
+
172
+ Note that the one exact (algebraic) solution turns into a list of numerical solutions which are Galois conjugates.
173
+
174
+ **Remark:** This uses the current pari precision. See the :ref:`above example <ptolemy-example-increase-precision>`, in particular, the comment about interval arithmetics.
175
+
176
+ **Remark:** Calling ``numerical()`` on a numerical solution does nothing.
177
+
178
+ **Remark:** ``CrossRatios`` also support ``numerical``.
179
+
180
+ .. _ptolemy-example-numerical-matrix:
181
+
182
+ Working with exact vs numerical solutions
183
+ -----------------------------------------
184
+
185
+ Most methods such as ``evaluate_word`` or ``cross_ratios`` work just the same way on an exact solution::
186
+
187
+ >>> exact_sol = Manifold("m004").ptolemy_variety(2, 1).retrieve_solutions()[0]
188
+ >>> exact_sol
189
+ PtolemyCoordinates(
190
+ {'c_0011_0': 1,
191
+ 'c_0011_1': -1,
192
+ 'c_0101_0': 1,
193
+ 'c_0101_1': Mod(x, x^2 + x + 1),
194
+ ...,
195
+ 's_3_1': -1},
196
+ is_numerical = False, ...)
197
+ >>> exact_sol.evaluate_word('a')
198
+ [[Mod(-2*x, x^2 + x + 1), Mod(-x - 1, x^2 + x + 1)],
199
+ [Mod(x, x^2 + x + 1), Mod(x + 1, x^2 + x + 1)]]
200
+
201
+ ... as they do on a numerical solution::
202
+
203
+ >>> numerical_sol = sol.numerical()[0]
204
+ >>> numerical_sol
205
+ PtolemyCoordinates(
206
+ {'c_0011_0': 1,
207
+ 'c_0011_1': -1,
208
+ 'c_0101_0': 1,
209
+ 'c_0101_1': -0.500000000000000 - 0.866025403784439*I,
210
+ ...,
211
+ 's_3_1': -1},
212
+ is_numerical = False, ...)
213
+ >>> numerical_sol.evaluate_word('a')
214
+ [[1.00000000000000 + 1.73205080756888*I,
215
+ -0.500000000000000 + 0.866025403784439*I],
216
+ [-0.500000000000000 - 0.866025403784439*I,
217
+ 0.500000000000000 - 0.866025403784439*I]]
218
+
219
+ Methods with postfix ``_numerical`` are special: when applied to an exact solution, they implicitly convert it to a list
220
+ of Galois conjugate numerical solutions first. ``volume_numerical`` is an example (because volume is a transcendental function)::
221
+
222
+ >>> exact_sol.volume_numerical()
223
+ [-2.02988321281931, 2.02988321281931]
224
+ >>> numerical_sol.volume_numerical()
225
+ -2.02988321281931
226
+
227
+ .. _ptolemy-example-retrieve-numerical-solutions:
228
+
229
+ Computing numerical solutions directly
230
+ --------------------------------------
231
+
232
+ We can also directly compute numerical solutions::
233
+
234
+ >>> M = Manifold("m004")
235
+ >>> sols = M.ptolemy_variety(2,'all').retrieve_solutions(numerical = True)
236
+ [[],
237
+ [[PtolemyCoordinates(
238
+ {'c_0011_0': 1.00000000000000 + 0.E-19*I,
239
+ 'c_0011_1': -1.00000000000000 + 0.E-19*I,
240
+ 'c_0101_0': 1.00000000000000 + 0.E-19*I,
241
+ 'c_0101_1': -0.500000000000000 - 0.866025403784439*I,
242
+ ...,
243
+ 's_3_1': -1},
244
+ is_numerical = True, ...),
245
+ PtolemyCoordinates(
246
+ {'c_0011_0': 1.00000000000000 + 0.E-19*I,
247
+ 'c_0011_1': -1.00000000000000 + 0.E-19*I,
248
+ 'c_0101_0': 1.00000000000000 + 0.E-19*I,
249
+ 'c_0101_1': -0.500000000000000 + 0.866025403784439*I,
250
+ ...,
251
+ 's_3_1': -1},
252
+ is_numerical = True, ...)]]]
253
+
254
+ The structure is as described earlier, a list of lists of lists: first solutions are grouped by obstruction class, then by Galois conjugacy.
255
+
256
+ The advantage over going through the exact solutions is that it might be much faster
257
+ (because it can avoid computing the number field from the lexicographic Groebner basis, see later). For example, many PSL(3, **C**) examples only work when using ``numerical = True``.
258
+
259
+ .. _ptolemy-example-cross-ratios:
260
+
261
+ Computing cross ratios from Ptolemy coordinates
262
+ -----------------------------------------------
263
+
264
+ Given exact or numerical solutions to the Ptolemy variety, we can also compute the cross ratios/shape parameters::
265
+
266
+ >>> sols = Manifold("m004").ptolemy_variety(2,'all').retrieve_solutions(verbose=False)
267
+ >>> zs=sols.cross_ratios()
268
+ >>> zs
269
+ [[],
270
+ [CrossRatios({'z_0000_0': Mod(x + 1, x^2 + x + 1),
271
+ 'z_0000_1': Mod(x + 1, x^2 + x + 1),
272
+ 'zp_0000_0': Mod(x + 1, x^2 + x + 1),
273
+ 'zp_0000_1': Mod(x + 1, x^2 + x + 1),
274
+ 'zpp_0000_0': Mod(x + 1, x^2 + x + 1),
275
+ 'zpp_0000_1': Mod(x + 1, x^2 + x + 1)},
276
+ is_numerical = False, ...)]]
277
+
278
+ **Remark**: The shapes will be given as element in the Ptolemy field with defining polynomial being the second argument to ``Mod(..., ...)``, here, x\ :sup:`2`\ +x+1. The Ptolemy field is a (possibly trivial) extension of the shape field. For *N* =2, the Ptolemy field is the trace field [GGZ2014]_ and an iterated square extension of the shape field which is the invariant trace field for a cusped manifold.
279
+
280
+ And numerically, so that we can compare to SnapPy's shapes::
281
+
282
+ >>> zs.numerical()
283
+ [[],
284
+ [[CrossRatios(
285
+ {'z_0000_0': 0.500000000000000 - 0.866025403784439*I,
286
+ 'z_0000_1': 0.500000000000000 - 0.866025403784439*I,
287
+ 'zp_0000_0': 0.500000000000000 - 0.866025403784439*I,
288
+ 'zp_0000_1': 0.500000000000000 - 0.866025403784439*I,
289
+ 'zpp_0000_0': 0.500000000000000 - 0.866025403784439*I,
290
+ 'zpp_0000_1': 0.500000000000000 - 0.866025403784439*I},
291
+ is_numerical = True, ...),
292
+ CrossRatios(
293
+ {'z_0000_0': 0.500000000000000 + 0.866025403784439*I,
294
+ 'z_0000_1': 0.500000000000000 + 0.866025403784439*I,
295
+ 'zp_0000_0': 0.500000000000000 + 0.866025403784439*I,
296
+ 'zp_0000_1': 0.500000000000000 + 0.866025403784439*I,
297
+ 'zpp_0000_0': 0.500000000000000 + 0.866025403784439*I,
298
+ 'zpp_0000_1': 0.500000000000000 + 0.866025403784439*I},
299
+ is_numerical = True, ...)]]]
300
+ >>> Manifold("m004").tetrahedra_shapes('rect')
301
+ [0.5000000000 + 0.8660254038*I, 0.5000000000 + 0.8660254038*I]
302
+
303
+ The result is of type ``CrossRatios`` and assigns z as well as z'=1/(1-z) and z''=1-1/z a value.
304
+
305
+ .. _ptolemy-non-zero-dim-comp:
306
+
307
+ The dimension of a component
308
+ ----------------------------
309
+
310
+ A Ptolemy variety might have positively dimensional components (note that this might or might not be a positively dimensional family of representations, see :ref:`here <ptolemy-generically-decorated>`). For example, the Ptolemy variety for ``m371`` and the trivial obstruction class has a 1-dimensional component. This is indicated by::
311
+
312
+ >>> M.ptolemy_variety(2).retrieve_solutions()
313
+ [NonZeroDimensionalComponent(dimension = 1)]
314
+
315
+ Or::
316
+
317
+ >>> M=Manifold("m371")
318
+ >>> M.ptolemy_variety(2).retrieve_solutions()
319
+ [[ PtolemyCoordinates(
320
+ {'c_0011_0': 1,
321
+ 'c_0011_1': -1,
322
+ 'c_0011_2': -1,
323
+ 'c_0011_3': Mod(-x - 1, x^2 + x + 2),
324
+ ...,
325
+ 's_3_4': 1},
326
+ is_numerical = False, ...)
327
+ (witnesses for NonZeroDimensionalComponent(dimension = 1, free_variables = ['c_0110_2'])) ]]
328
+
329
+ The latter actually also provides a sample point (:ref:`witness <ptolemy-example-find-witness>` which we will use :ref:`later <ptolemy-example-non-zero-dim-rep>` to determine whether this corresponds to a 1-dimensional family of representations or not) on the 1-dimensional component. A ``NonZeroDimensionalComponent`` as well as ``PtolemyCoordinates`` (that correspond to 0-dimensional components of the Ptolemy variety)) has a ``dimension`` attribute, so we can do::
330
+
331
+ >>> M=Manifold("m371")
332
+ >>> sols = M.ptolemy_variety(2,'all').retrieve_solutions()
333
+ >>> sols.dimension
334
+ [[1], [], [0], []]
335
+
336
+ This means that the Ptolemy variety for the trivial obstruction class has a 1-dimensional component and that the Ptolemy variety of one of the other obstruction classes a 0-dimensional component.
337
+
338
+ A ``NonZeroDimensionalComponent`` is actually again a list whose elements will be witness points if witnesses have been computed for this Ptolemy variety.
339
+
340
+ **Warning:** This implies that if we ``flatten`` too much, the reported dimension becomes 0 which is the dimension of the witness point instead of 1::
341
+
342
+ >>> sols.flatten()
343
+ [1, 0]
344
+
345
+ Too much ``flatten``::
346
+
347
+ >>> sols.flatten()
348
+ [0, 0]
349
+
350
+ The advantage is that we can still call methods such as ``volume_numerical`` and actually see the volume of a witness point (it is known that the volume stays constant on a component of boundary-unipotent representations, so one witness point can tell us the volume of all representation in that component)::
351
+
352
+ >>> sols.volume_numerical()
353
+ [[[ [0.E-38, 0.E-38] (witnesses for NonZeroDimensionalComponent(dimension = 1, free_variables = ['c_0110_2'])) ]],
354
+ [],
355
+ [[4.75170196551790,
356
+ -4.75170196551790,
357
+ 4.75170196551790,
358
+ -4.75170196551790,
359
+ 1.17563301006556,
360
+ -1.17563301006556,
361
+ 1.17563301006556,
362
+ -1.17563301006556]],
363
+ []]