snappy 3.1.1__cp312-cp312-win_amd64.whl → 3.2__cp312-cp312-win_amd64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (471) hide show
  1. snappy/CyOpenGL.cp312-win_amd64.pyd +0 -0
  2. snappy/SnapPy.cp312-win_amd64.pyd +0 -0
  3. snappy/SnapPyHP.cp312-win_amd64.pyd +0 -0
  4. snappy/__init__.py +271 -401
  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 -924
  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 -12
  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 -74
  85. snappy/doc/_static/searchtools.js +108 -62
  86. snappy/doc/_static/snappy_furo.css +33 -33
  87. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
  88. snappy/doc/additional_classes.html +1499 -1330
  89. snappy/doc/bugs.html +131 -134
  90. snappy/doc/censuses.html +426 -445
  91. snappy/doc/credits.html +180 -183
  92. snappy/doc/development.html +383 -363
  93. snappy/doc/genindex.html +1330 -1409
  94. snappy/doc/index.html +261 -206
  95. snappy/doc/installing.html +345 -363
  96. snappy/doc/manifold.html +3451 -2839
  97. snappy/doc/manifoldhp.html +179 -182
  98. snappy/doc/news.html +387 -329
  99. snappy/doc/objects.inv +0 -0
  100. snappy/doc/other.html +160 -162
  101. snappy/doc/platonic_census.html +374 -377
  102. snappy/doc/plink.html +209 -212
  103. snappy/doc/ptolemy.html +253 -255
  104. snappy/doc/ptolemy_classes.html +1143 -1146
  105. snappy/doc/ptolemy_examples1.html +408 -410
  106. snappy/doc/ptolemy_examples2.html +470 -473
  107. snappy/doc/ptolemy_examples3.html +413 -416
  108. snappy/doc/ptolemy_examples4.html +194 -197
  109. snappy/doc/ptolemy_prelim.html +247 -250
  110. snappy/doc/py-modindex.html +164 -167
  111. snappy/doc/screenshots.html +140 -142
  112. snappy/doc/search.html +134 -137
  113. snappy/doc/searchindex.js +1 -1
  114. snappy/doc/snap.html +201 -204
  115. snappy/doc/snappy.html +180 -182
  116. snappy/doc/spherogram.html +1210 -1213
  117. snappy/doc/todo.html +165 -168
  118. snappy/doc/triangulation.html +1583 -1474
  119. snappy/doc/tutorial.html +158 -161
  120. snappy/doc/verify.html +329 -275
  121. snappy/doc/verify_internals.html +1234 -1691
  122. snappy/drilling/__init__.py +153 -235
  123. snappy/drilling/barycentric.py +103 -0
  124. snappy/drilling/constants.py +0 -2
  125. snappy/drilling/crush.py +56 -130
  126. snappy/drilling/cusps.py +12 -6
  127. snappy/drilling/debug.py +2 -1
  128. snappy/drilling/exceptions.py +7 -40
  129. snappy/drilling/moves.py +302 -243
  130. snappy/drilling/perturb.py +63 -37
  131. snappy/drilling/shorten.py +36 -0
  132. snappy/drilling/subdivide.py +0 -5
  133. snappy/drilling/test.py +23 -0
  134. snappy/drilling/test_cases.py +126 -0
  135. snappy/drilling/tracing.py +9 -37
  136. snappy/exceptions.py +18 -5
  137. snappy/exterior_to_link/barycentric_geometry.py +2 -4
  138. snappy/exterior_to_link/main.py +8 -7
  139. snappy/exterior_to_link/mcomplex_with_link.py +2 -2
  140. snappy/exterior_to_link/rational_linear_algebra.py +1 -1
  141. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
  142. snappy/exterior_to_link/test.py +21 -33
  143. snappy/geometric_structure/__init__.py +212 -0
  144. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  145. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  146. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  147. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  148. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  149. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  150. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  151. snappy/geometric_structure/geodesic/__init__.py +0 -0
  152. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  153. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  154. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  155. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  156. snappy/geometric_structure/geodesic/constants.py +6 -0
  157. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  158. snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
  159. snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
  160. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  161. snappy/geometric_structure/geodesic/line.py +30 -0
  162. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  163. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  164. snappy/geometric_structure/test.py +22 -0
  165. snappy/gui.py +23 -13
  166. snappy/horoviewer.py +7 -7
  167. snappy/hyperboloid/__init__.py +96 -31
  168. snappy/hyperboloid/distances.py +245 -0
  169. snappy/hyperboloid/horoball.py +19 -0
  170. snappy/hyperboloid/line.py +35 -0
  171. snappy/hyperboloid/point.py +9 -0
  172. snappy/hyperboloid/triangle.py +29 -0
  173. snappy/isometry_signature.py +382 -0
  174. snappy/len_spec/__init__.py +596 -0
  175. snappy/len_spec/geodesic_info.py +110 -0
  176. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  177. snappy/len_spec/geodesic_piece.py +143 -0
  178. snappy/len_spec/geometric_structure.py +182 -0
  179. snappy/len_spec/geometry.py +80 -0
  180. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  181. snappy/len_spec/spine.py +206 -0
  182. snappy/len_spec/test.py +24 -0
  183. snappy/len_spec/test_cases.py +69 -0
  184. snappy/len_spec/tile.py +275 -0
  185. snappy/len_spec/word.py +86 -0
  186. snappy/math_basics.py +39 -13
  187. snappy/matrix.py +52 -9
  188. snappy/number.py +12 -6
  189. snappy/numeric_output_checker.py +2 -3
  190. snappy/pari.py +6 -3
  191. snappy/polyviewer.py +8 -8
  192. snappy/ptolemy/__init__.py +1 -1
  193. snappy/ptolemy/component.py +2 -2
  194. snappy/ptolemy/coordinates.py +25 -25
  195. snappy/ptolemy/findLoops.py +9 -9
  196. snappy/ptolemy/manifoldMethods.py +27 -29
  197. snappy/ptolemy/polynomial.py +50 -57
  198. snappy/ptolemy/processFileBase.py +60 -0
  199. snappy/ptolemy/ptolemyVariety.py +109 -41
  200. snappy/ptolemy/reginaWrapper.py +4 -4
  201. snappy/ptolemy/rur.py +1 -1
  202. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
  203. snappy/ptolemy/test.py +99 -54
  204. snappy/ptolemy/utilities.py +1 -1
  205. snappy/raytracing/__init__.py +64 -0
  206. snappy/raytracing/additional_horospheres.py +64 -0
  207. snappy/raytracing/additional_len_spec_choices.py +63 -0
  208. snappy/raytracing/cohomology_fractal.py +0 -3
  209. snappy/raytracing/eyeball.py +123 -0
  210. snappy/raytracing/finite_raytracing_data.py +17 -17
  211. snappy/raytracing/finite_viewer.py +15 -15
  212. snappy/raytracing/geodesic_tube_info.py +93 -63
  213. snappy/raytracing/geodesics.py +94 -64
  214. snappy/raytracing/geodesics_window.py +56 -34
  215. snappy/raytracing/gui_utilities.py +21 -6
  216. snappy/raytracing/hyperboloid_navigation.py +29 -4
  217. snappy/raytracing/hyperboloid_utilities.py +73 -73
  218. snappy/raytracing/ideal_raytracing_data.py +121 -91
  219. snappy/raytracing/inside_viewer.py +199 -66
  220. snappy/raytracing/pack.py +22 -0
  221. snappy/raytracing/raytracing_data.py +37 -25
  222. snappy/raytracing/raytracing_view.py +70 -65
  223. snappy/raytracing/shaders/Eye.png +0 -0
  224. snappy/raytracing/shaders/NonGeometric.png +0 -0
  225. snappy/raytracing/shaders/__init__.py +39 -3
  226. snappy/raytracing/shaders/fragment.glsl +451 -133
  227. snappy/raytracing/test.py +29 -0
  228. snappy/raytracing/tooltip.py +146 -0
  229. snappy/raytracing/upper_halfspace_utilities.py +42 -9
  230. snappy/sage_helper.py +67 -134
  231. snappy/settings.py +90 -77
  232. snappy/shell.py +2 -0
  233. snappy/snap/character_varieties.py +2 -2
  234. snappy/snap/find_field.py +4 -3
  235. snappy/snap/fundamental_polyhedron.py +2 -2
  236. snappy/snap/kernel_structures.py +5 -1
  237. snappy/snap/nsagetools.py +9 -8
  238. snappy/snap/peripheral/dual_cellulation.py +4 -3
  239. snappy/snap/peripheral/peripheral.py +2 -2
  240. snappy/snap/peripheral/surface.py +5 -5
  241. snappy/snap/peripheral/test.py +1 -1
  242. snappy/snap/polished_reps.py +8 -8
  243. snappy/snap/slice_obs_HKL.py +16 -14
  244. snappy/snap/t3mlite/arrow.py +3 -3
  245. snappy/snap/t3mlite/edge.py +3 -3
  246. snappy/snap/t3mlite/homology.py +2 -2
  247. snappy/snap/t3mlite/mcomplex.py +3 -3
  248. snappy/snap/t3mlite/simplex.py +12 -0
  249. snappy/snap/t3mlite/spun.py +18 -17
  250. snappy/snap/t3mlite/test_vs_regina.py +4 -4
  251. snappy/snap/test.py +37 -53
  252. snappy/snap/utilities.py +4 -5
  253. snappy/test.py +121 -138
  254. snappy/test_cases.py +263 -0
  255. snappy/testing.py +131 -0
  256. snappy/tiling/__init__.py +2 -0
  257. snappy/tiling/canonical_key_dict.py +59 -0
  258. snappy/tiling/dict_based_set.py +79 -0
  259. snappy/tiling/floor.py +49 -0
  260. snappy/tiling/hyperboloid_dict.py +54 -0
  261. snappy/tiling/iter_utils.py +78 -0
  262. snappy/tiling/lifted_tetrahedron.py +22 -0
  263. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  264. snappy/tiling/real_hash_dict.py +164 -0
  265. snappy/tiling/test.py +23 -0
  266. snappy/tiling/tile.py +215 -0
  267. snappy/tiling/triangle.py +33 -0
  268. snappy/tkterminal.py +113 -84
  269. snappy/twister/main.py +1 -7
  270. snappy/twister/twister_core.cp312-win_amd64.pyd +0 -0
  271. snappy/upper_halfspace/__init__.py +78 -17
  272. snappy/verify/__init__.py +3 -7
  273. snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
  274. snappy/verify/complex_volume/adjust_torsion.py +1 -2
  275. snappy/verify/complex_volume/closed.py +13 -13
  276. snappy/verify/complex_volume/cusped.py +6 -6
  277. snappy/verify/complex_volume/extended_bloch.py +5 -8
  278. snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
  279. snappy/verify/edge_equations.py +80 -0
  280. snappy/verify/exceptions.py +0 -55
  281. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
  282. snappy/verify/interval_newton_shapes_engine.py +7 -5
  283. snappy/verify/interval_tree.py +5 -5
  284. snappy/verify/krawczyk_shapes_engine.py +17 -18
  285. snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
  286. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
  287. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
  288. snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
  289. snappy/verify/shapes.py +5 -3
  290. snappy/verify/short_slopes.py +39 -41
  291. snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
  292. snappy/verify/test.py +57 -60
  293. snappy/verify/upper_halfspace/extended_matrix.py +1 -1
  294. snappy/verify/upper_halfspace/finite_point.py +3 -4
  295. snappy/verify/upper_halfspace/ideal_point.py +9 -9
  296. snappy/verify/volume.py +2 -2
  297. snappy/version.py +2 -2
  298. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +25 -11
  299. snappy-3.2.dist-info/RECORD +503 -0
  300. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  301. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  302. snappy/__pycache__/__init__.cpython-312.pyc +0 -0
  303. snappy/__pycache__/browser.cpython-312.pyc +0 -0
  304. snappy/__pycache__/cache.cpython-312.pyc +0 -0
  305. snappy/__pycache__/database.cpython-312.pyc +0 -0
  306. snappy/__pycache__/db_utilities.cpython-312.pyc +0 -0
  307. snappy/__pycache__/decorated_isosig.cpython-312.pyc +0 -0
  308. snappy/__pycache__/exceptions.cpython-312.pyc +0 -0
  309. snappy/__pycache__/export_stl.cpython-312.pyc +0 -0
  310. snappy/__pycache__/filedialog.cpython-312.pyc +0 -0
  311. snappy/__pycache__/gui.cpython-312.pyc +0 -0
  312. snappy/__pycache__/horoviewer.cpython-312.pyc +0 -0
  313. snappy/__pycache__/math_basics.cpython-312.pyc +0 -0
  314. snappy/__pycache__/matrix.cpython-312.pyc +0 -0
  315. snappy/__pycache__/number.cpython-312.pyc +0 -0
  316. snappy/__pycache__/numeric_output_checker.cpython-312.pyc +0 -0
  317. snappy/__pycache__/pari.cpython-312.pyc +0 -0
  318. snappy/__pycache__/polyviewer.cpython-312.pyc +0 -0
  319. snappy/__pycache__/sage_helper.cpython-312.pyc +0 -0
  320. snappy/__pycache__/version.cpython-312.pyc +0 -0
  321. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  322. snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
  323. snappy/doc/_static/js/html5shiv.min.js +0 -4
  324. snappy/doc/verify_canon.html +0 -304
  325. snappy/drilling/__pycache__/__init__.cpython-312.pyc +0 -0
  326. snappy/drilling/__pycache__/constants.cpython-312.pyc +0 -0
  327. snappy/drilling/__pycache__/crush.cpython-312.pyc +0 -0
  328. snappy/drilling/__pycache__/cusps.cpython-312.pyc +0 -0
  329. snappy/drilling/__pycache__/debug.cpython-312.pyc +0 -0
  330. snappy/drilling/__pycache__/epsilons.cpython-312.pyc +0 -0
  331. snappy/drilling/__pycache__/exceptions.cpython-312.pyc +0 -0
  332. snappy/drilling/__pycache__/fixed_points.cpython-312.pyc +0 -0
  333. snappy/drilling/__pycache__/geodesic_info.cpython-312.pyc +0 -0
  334. snappy/drilling/__pycache__/geodesic_tube.cpython-312.pyc +0 -0
  335. snappy/drilling/__pycache__/geometric_structure.cpython-312.pyc +0 -0
  336. snappy/drilling/__pycache__/line.cpython-312.pyc +0 -0
  337. snappy/drilling/__pycache__/moves.cpython-312.pyc +0 -0
  338. snappy/drilling/__pycache__/peripheral_curves.cpython-312.pyc +0 -0
  339. snappy/drilling/__pycache__/perturb.cpython-312.pyc +0 -0
  340. snappy/drilling/__pycache__/quotient_space.cpython-312.pyc +0 -0
  341. snappy/drilling/__pycache__/spatial_dict.cpython-312.pyc +0 -0
  342. snappy/drilling/__pycache__/subdivide.cpython-312.pyc +0 -0
  343. snappy/drilling/__pycache__/tracing.cpython-312.pyc +0 -0
  344. snappy/drilling/geodesic_tube.py +0 -441
  345. snappy/drilling/geometric_structure.py +0 -366
  346. snappy/drilling/line.py +0 -122
  347. snappy/drilling/quotient_space.py +0 -94
  348. snappy/drilling/spatial_dict.py +0 -128
  349. snappy/exterior_to_link/__pycache__/__init__.cpython-312.pyc +0 -0
  350. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-312.pyc +0 -0
  351. snappy/exterior_to_link/__pycache__/exceptions.cpython-312.pyc +0 -0
  352. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-312.pyc +0 -0
  353. snappy/exterior_to_link/__pycache__/link_projection.cpython-312.pyc +0 -0
  354. snappy/exterior_to_link/__pycache__/main.cpython-312.pyc +0 -0
  355. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-312.pyc +0 -0
  356. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-312.pyc +0 -0
  357. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-312.pyc +0 -0
  358. snappy/exterior_to_link/__pycache__/pl_utils.cpython-312.pyc +0 -0
  359. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-312.pyc +0 -0
  360. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-312.pyc +0 -0
  361. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-312.pyc +0 -0
  362. snappy/exterior_to_link/__pycache__/stored_moves.cpython-312.pyc +0 -0
  363. snappy/hyperboloid/__pycache__/__init__.cpython-312.pyc +0 -0
  364. snappy/manifolds/__pycache__/__init__.cpython-312.pyc +0 -0
  365. snappy/ptolemy/__pycache__/__init__.cpython-312.pyc +0 -0
  366. snappy/ptolemy/__pycache__/component.cpython-312.pyc +0 -0
  367. snappy/ptolemy/__pycache__/coordinates.cpython-312.pyc +0 -0
  368. snappy/ptolemy/__pycache__/fieldExtensions.cpython-312.pyc +0 -0
  369. snappy/ptolemy/__pycache__/findLoops.cpython-312.pyc +0 -0
  370. snappy/ptolemy/__pycache__/homology.cpython-312.pyc +0 -0
  371. snappy/ptolemy/__pycache__/manifoldMethods.cpython-312.pyc +0 -0
  372. snappy/ptolemy/__pycache__/matrix.cpython-312.pyc +0 -0
  373. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-312.pyc +0 -0
  374. snappy/ptolemy/__pycache__/polynomial.cpython-312.pyc +0 -0
  375. snappy/ptolemy/__pycache__/processComponents.cpython-312.pyc +0 -0
  376. snappy/ptolemy/__pycache__/processFileBase.cpython-312.pyc +0 -0
  377. snappy/ptolemy/__pycache__/processFileDispatch.cpython-312.pyc +0 -0
  378. snappy/ptolemy/__pycache__/processMagmaFile.cpython-312.pyc +0 -0
  379. snappy/ptolemy/__pycache__/processRurFile.cpython-312.pyc +0 -0
  380. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-312.pyc +0 -0
  381. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-312.pyc +0 -0
  382. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-312.pyc +0 -0
  383. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-312.pyc +0 -0
  384. snappy/ptolemy/__pycache__/rur.cpython-312.pyc +0 -0
  385. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-312.pyc +0 -0
  386. snappy/ptolemy/__pycache__/utilities.cpython-312.pyc +0 -0
  387. snappy/snap/__pycache__/__init__.cpython-312.pyc +0 -0
  388. snappy/snap/__pycache__/character_varieties.cpython-312.pyc +0 -0
  389. snappy/snap/__pycache__/fundamental_polyhedron.cpython-312.pyc +0 -0
  390. snappy/snap/__pycache__/interval_reps.cpython-312.pyc +0 -0
  391. snappy/snap/__pycache__/kernel_structures.cpython-312.pyc +0 -0
  392. snappy/snap/__pycache__/mcomplex_base.cpython-312.pyc +0 -0
  393. snappy/snap/__pycache__/nsagetools.cpython-312.pyc +0 -0
  394. snappy/snap/__pycache__/polished_reps.cpython-312.pyc +0 -0
  395. snappy/snap/__pycache__/shapes.cpython-312.pyc +0 -0
  396. snappy/snap/__pycache__/slice_obs_HKL.cpython-312.pyc +0 -0
  397. snappy/snap/__pycache__/utilities.cpython-312.pyc +0 -0
  398. snappy/snap/peripheral/__pycache__/__init__.cpython-312.pyc +0 -0
  399. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-312.pyc +0 -0
  400. snappy/snap/peripheral/__pycache__/link.cpython-312.pyc +0 -0
  401. snappy/snap/peripheral/__pycache__/peripheral.cpython-312.pyc +0 -0
  402. snappy/snap/peripheral/__pycache__/surface.cpython-312.pyc +0 -0
  403. snappy/snap/t3mlite/__pycache__/__init__.cpython-312.pyc +0 -0
  404. snappy/snap/t3mlite/__pycache__/arrow.cpython-312.pyc +0 -0
  405. snappy/snap/t3mlite/__pycache__/corner.cpython-312.pyc +0 -0
  406. snappy/snap/t3mlite/__pycache__/edge.cpython-312.pyc +0 -0
  407. snappy/snap/t3mlite/__pycache__/face.cpython-312.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/files.cpython-312.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/homology.cpython-312.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/linalg.cpython-312.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-312.pyc +0 -0
  412. snappy/snap/t3mlite/__pycache__/perm4.cpython-312.pyc +0 -0
  413. snappy/snap/t3mlite/__pycache__/simplex.cpython-312.pyc +0 -0
  414. snappy/snap/t3mlite/__pycache__/spun.cpython-312.pyc +0 -0
  415. snappy/snap/t3mlite/__pycache__/surface.cpython-312.pyc +0 -0
  416. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-312.pyc +0 -0
  417. snappy/snap/t3mlite/__pycache__/vertex.cpython-312.pyc +0 -0
  418. snappy/togl/__init__.py +0 -3
  419. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  420. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  421. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  422. snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
  423. snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
  424. snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
  425. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  426. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  427. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  428. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  429. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  430. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  431. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  432. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  433. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  434. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  435. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  436. snappy/twister/__pycache__/__init__.cpython-312.pyc +0 -0
  437. snappy/twister/__pycache__/main.cpython-312.pyc +0 -0
  438. snappy/upper_halfspace/__pycache__/__init__.cpython-312.pyc +0 -0
  439. snappy/upper_halfspace/__pycache__/ideal_point.cpython-312.pyc +0 -0
  440. snappy/verify/__pycache__/__init__.cpython-312.pyc +0 -0
  441. snappy/verify/__pycache__/cuspCrossSection.cpython-312.pyc +0 -0
  442. snappy/verify/__pycache__/cuspTranslations.cpython-312.pyc +0 -0
  443. snappy/verify/__pycache__/cusp_areas.cpython-312.pyc +0 -0
  444. snappy/verify/__pycache__/cusp_shapes.cpython-312.pyc +0 -0
  445. snappy/verify/__pycache__/exceptions.cpython-312.pyc +0 -0
  446. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-312.pyc +0 -0
  447. snappy/verify/__pycache__/interval_tree.cpython-312.pyc +0 -0
  448. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-312.pyc +0 -0
  449. snappy/verify/__pycache__/realAlgebra.cpython-312.pyc +0 -0
  450. snappy/verify/__pycache__/shapes.cpython-312.pyc +0 -0
  451. snappy/verify/__pycache__/short_slopes.cpython-312.pyc +0 -0
  452. snappy/verify/__pycache__/squareExtensions.cpython-312.pyc +0 -0
  453. snappy/verify/__pycache__/verifyCanonical.cpython-312.pyc +0 -0
  454. snappy/verify/__pycache__/verifyHyperbolicity.cpython-312.pyc +0 -0
  455. snappy/verify/__pycache__/volume.cpython-312.pyc +0 -0
  456. snappy/verify/complex_volume/__pycache__/__init__.cpython-312.pyc +0 -0
  457. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-312.pyc +0 -0
  458. snappy/verify/complex_volume/__pycache__/closed.cpython-312.pyc +0 -0
  459. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-312.pyc +0 -0
  460. snappy/verify/complex_volume/__pycache__/cusped.cpython-312.pyc +0 -0
  461. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-312.pyc +0 -0
  462. snappy/verify/cuspCrossSection.py +0 -1422
  463. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-312.pyc +0 -0
  464. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-312.pyc +0 -0
  465. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-312.pyc +0 -0
  466. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-312.pyc +0 -0
  467. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-312.pyc +0 -0
  468. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-312.pyc +0 -0
  469. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-312.pyc +0 -0
  470. snappy-3.1.1.dist-info/RECORD +0 -572
  471. {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
+ []]