snappy 3.1__cp311-cp311-macosx_11_0_arm64.whl → 3.2__cp311-cp311-macosx_11_0_arm64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (465) hide show
  1. snappy/CyOpenGL.cpython-311-darwin.so +0 -0
  2. snappy/SnapPy.cpython-311-darwin.so +0 -0
  3. snappy/SnapPyHP.cpython-311-darwin.so +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/credits.rst.txt +6 -1
  25. snappy/doc/_sources/development.rst.txt +66 -46
  26. snappy/doc/_sources/index.rst.txt +72 -5
  27. snappy/doc/_sources/installing.rst.txt +145 -162
  28. snappy/doc/_sources/news.rst.txt +73 -1
  29. snappy/doc/_sources/ptolemy_examples1.rst.txt +8 -7
  30. snappy/doc/_sources/ptolemy_examples3.rst.txt +2 -2
  31. snappy/doc/_sources/triangulation.rst.txt +2 -2
  32. snappy/doc/_sources/verify.rst.txt +89 -29
  33. snappy/doc/_sources/verify_internals.rst.txt +5 -16
  34. snappy/doc/_static/basic.css +23 -1
  35. snappy/doc/_static/css/badge_only.css +1 -1
  36. snappy/doc/_static/css/theme.css +1 -1
  37. snappy/doc/_static/doctools.js +1 -1
  38. snappy/doc/_static/documentation_options.js +2 -3
  39. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  40. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  41. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  42. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  43. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  44. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  45. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  46. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  47. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  48. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  49. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  50. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  51. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  52. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  53. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  54. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  55. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  56. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  57. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  58. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  59. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  60. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  61. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  62. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  63. snappy/doc/_static/js/versions.js +228 -0
  64. snappy/doc/_static/language_data.js +2 -2
  65. snappy/doc/_static/pygments.css +1 -0
  66. snappy/doc/_static/searchtools.js +125 -71
  67. snappy/doc/_static/sphinx_highlight.js +13 -3
  68. snappy/doc/additional_classes.html +291 -122
  69. snappy/doc/bugs.html +17 -20
  70. snappy/doc/censuses.html +34 -53
  71. snappy/doc/credits.html +22 -22
  72. snappy/doc/development.html +88 -68
  73. snappy/doc/genindex.html +66 -145
  74. snappy/doc/index.html +86 -31
  75. snappy/doc/installing.html +164 -182
  76. snappy/doc/manifold.html +1168 -556
  77. snappy/doc/manifoldhp.html +18 -21
  78. snappy/doc/news.html +91 -33
  79. snappy/doc/objects.inv +0 -0
  80. snappy/doc/other.html +20 -22
  81. snappy/doc/platonic_census.html +31 -34
  82. snappy/doc/plink.html +19 -22
  83. snappy/doc/ptolemy.html +20 -22
  84. snappy/doc/ptolemy_classes.html +102 -105
  85. snappy/doc/ptolemy_examples1.html +34 -36
  86. snappy/doc/ptolemy_examples2.html +28 -31
  87. snappy/doc/ptolemy_examples3.html +26 -29
  88. snappy/doc/ptolemy_examples4.html +20 -23
  89. snappy/doc/ptolemy_prelim.html +25 -28
  90. snappy/doc/py-modindex.html +16 -19
  91. snappy/doc/screenshots.html +22 -24
  92. snappy/doc/search.html +15 -18
  93. snappy/doc/searchindex.js +1 -1
  94. snappy/doc/snap.html +18 -21
  95. snappy/doc/snappy.html +18 -20
  96. snappy/doc/spherogram.html +84 -87
  97. snappy/doc/todo.html +17 -20
  98. snappy/doc/triangulation.html +324 -215
  99. snappy/doc/tutorial.html +17 -20
  100. snappy/doc/verify.html +100 -46
  101. snappy/doc/verify_internals.html +106 -563
  102. snappy/drilling/__init__.py +153 -235
  103. snappy/drilling/barycentric.py +103 -0
  104. snappy/drilling/constants.py +0 -2
  105. snappy/drilling/crush.py +56 -130
  106. snappy/drilling/cusps.py +12 -6
  107. snappy/drilling/debug.py +2 -1
  108. snappy/drilling/exceptions.py +7 -40
  109. snappy/drilling/moves.py +302 -243
  110. snappy/drilling/perturb.py +63 -37
  111. snappy/drilling/shorten.py +36 -0
  112. snappy/drilling/subdivide.py +0 -5
  113. snappy/drilling/test.py +23 -0
  114. snappy/drilling/test_cases.py +126 -0
  115. snappy/drilling/tracing.py +9 -37
  116. snappy/exceptions.py +18 -5
  117. snappy/exterior_to_link/barycentric_geometry.py +2 -4
  118. snappy/exterior_to_link/main.py +8 -7
  119. snappy/exterior_to_link/mcomplex_with_link.py +2 -2
  120. snappy/exterior_to_link/rational_linear_algebra.py +1 -1
  121. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
  122. snappy/exterior_to_link/test.py +21 -33
  123. snappy/geometric_structure/__init__.py +212 -0
  124. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  125. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  126. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  127. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  128. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  129. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  130. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  131. snappy/geometric_structure/geodesic/__init__.py +0 -0
  132. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  133. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  134. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  135. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  136. snappy/geometric_structure/geodesic/constants.py +6 -0
  137. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  138. snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
  139. snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
  140. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  141. snappy/geometric_structure/geodesic/line.py +30 -0
  142. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  143. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  144. snappy/geometric_structure/test.py +22 -0
  145. snappy/gui.py +23 -13
  146. snappy/horoviewer.py +7 -7
  147. snappy/hyperboloid/__init__.py +96 -31
  148. snappy/hyperboloid/distances.py +245 -0
  149. snappy/hyperboloid/horoball.py +19 -0
  150. snappy/hyperboloid/line.py +35 -0
  151. snappy/hyperboloid/point.py +9 -0
  152. snappy/hyperboloid/triangle.py +29 -0
  153. snappy/isometry_signature.py +382 -0
  154. snappy/len_spec/__init__.py +596 -0
  155. snappy/len_spec/geodesic_info.py +110 -0
  156. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  157. snappy/len_spec/geodesic_piece.py +143 -0
  158. snappy/len_spec/geometric_structure.py +182 -0
  159. snappy/len_spec/geometry.py +80 -0
  160. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  161. snappy/len_spec/spine.py +206 -0
  162. snappy/len_spec/test.py +24 -0
  163. snappy/len_spec/test_cases.py +69 -0
  164. snappy/len_spec/tile.py +275 -0
  165. snappy/len_spec/word.py +86 -0
  166. snappy/math_basics.py +39 -13
  167. snappy/matrix.py +52 -9
  168. snappy/number.py +12 -6
  169. snappy/numeric_output_checker.py +2 -3
  170. snappy/pari.py +8 -4
  171. snappy/phone_home.py +2 -1
  172. snappy/polyviewer.py +8 -8
  173. snappy/ptolemy/__init__.py +1 -1
  174. snappy/ptolemy/component.py +2 -2
  175. snappy/ptolemy/coordinates.py +25 -25
  176. snappy/ptolemy/findLoops.py +9 -9
  177. snappy/ptolemy/manifoldMethods.py +27 -29
  178. snappy/ptolemy/polynomial.py +50 -57
  179. snappy/ptolemy/processFileBase.py +60 -0
  180. snappy/ptolemy/ptolemyVariety.py +109 -41
  181. snappy/ptolemy/reginaWrapper.py +4 -4
  182. snappy/ptolemy/rur.py +1 -1
  183. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
  184. snappy/ptolemy/test.py +99 -54
  185. snappy/ptolemy/utilities.py +1 -1
  186. snappy/raytracing/__init__.py +64 -0
  187. snappy/raytracing/additional_horospheres.py +64 -0
  188. snappy/raytracing/additional_len_spec_choices.py +63 -0
  189. snappy/raytracing/cohomology_fractal.py +0 -3
  190. snappy/raytracing/eyeball.py +123 -0
  191. snappy/raytracing/finite_raytracing_data.py +17 -17
  192. snappy/raytracing/finite_viewer.py +15 -15
  193. snappy/raytracing/geodesic_tube_info.py +93 -63
  194. snappy/raytracing/geodesics.py +94 -64
  195. snappy/raytracing/geodesics_window.py +56 -34
  196. snappy/raytracing/gui_utilities.py +21 -6
  197. snappy/raytracing/hyperboloid_navigation.py +29 -4
  198. snappy/raytracing/hyperboloid_utilities.py +73 -73
  199. snappy/raytracing/ideal_raytracing_data.py +121 -91
  200. snappy/raytracing/inside_viewer.py +199 -66
  201. snappy/raytracing/pack.py +22 -0
  202. snappy/raytracing/raytracing_data.py +37 -25
  203. snappy/raytracing/raytracing_view.py +70 -65
  204. snappy/raytracing/shaders/Eye.png +0 -0
  205. snappy/raytracing/shaders/NonGeometric.png +0 -0
  206. snappy/raytracing/shaders/__init__.py +39 -3
  207. snappy/raytracing/shaders/fragment.glsl +451 -133
  208. snappy/raytracing/test.py +29 -0
  209. snappy/raytracing/tooltip.py +146 -0
  210. snappy/raytracing/upper_halfspace_utilities.py +42 -9
  211. snappy/sage_helper.py +67 -134
  212. snappy/settings.py +90 -77
  213. snappy/shell.py +2 -0
  214. snappy/snap/character_varieties.py +2 -2
  215. snappy/snap/find_field.py +4 -3
  216. snappy/snap/fundamental_polyhedron.py +2 -2
  217. snappy/snap/kernel_structures.py +5 -1
  218. snappy/snap/nsagetools.py +9 -8
  219. snappy/snap/peripheral/dual_cellulation.py +4 -3
  220. snappy/snap/peripheral/peripheral.py +2 -2
  221. snappy/snap/peripheral/surface.py +5 -5
  222. snappy/snap/peripheral/test.py +1 -1
  223. snappy/snap/polished_reps.py +8 -8
  224. snappy/snap/slice_obs_HKL.py +16 -14
  225. snappy/snap/t3mlite/arrow.py +3 -3
  226. snappy/snap/t3mlite/edge.py +3 -3
  227. snappy/snap/t3mlite/homology.py +2 -2
  228. snappy/snap/t3mlite/mcomplex.py +3 -3
  229. snappy/snap/t3mlite/simplex.py +12 -0
  230. snappy/snap/t3mlite/spun.py +18 -17
  231. snappy/snap/t3mlite/test_vs_regina.py +4 -4
  232. snappy/snap/test.py +37 -53
  233. snappy/snap/utilities.py +4 -5
  234. snappy/test.py +121 -138
  235. snappy/test_cases.py +263 -0
  236. snappy/testing.py +131 -0
  237. snappy/tiling/__init__.py +2 -0
  238. snappy/tiling/canonical_key_dict.py +59 -0
  239. snappy/tiling/dict_based_set.py +79 -0
  240. snappy/tiling/floor.py +49 -0
  241. snappy/tiling/hyperboloid_dict.py +54 -0
  242. snappy/tiling/iter_utils.py +78 -0
  243. snappy/tiling/lifted_tetrahedron.py +22 -0
  244. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  245. snappy/tiling/real_hash_dict.py +164 -0
  246. snappy/tiling/test.py +23 -0
  247. snappy/tiling/tile.py +215 -0
  248. snappy/tiling/triangle.py +33 -0
  249. snappy/tkterminal.py +116 -86
  250. snappy/twister/main.py +1 -7
  251. snappy/twister/twister_core.cpython-311-darwin.so +0 -0
  252. snappy/upper_halfspace/__init__.py +78 -17
  253. snappy/verify/__init__.py +3 -7
  254. snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
  255. snappy/verify/complex_volume/adjust_torsion.py +1 -2
  256. snappy/verify/complex_volume/closed.py +13 -13
  257. snappy/verify/complex_volume/cusped.py +6 -6
  258. snappy/verify/complex_volume/extended_bloch.py +5 -8
  259. snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
  260. snappy/verify/edge_equations.py +80 -0
  261. snappy/verify/exceptions.py +0 -55
  262. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
  263. snappy/verify/interval_newton_shapes_engine.py +7 -5
  264. snappy/verify/interval_tree.py +5 -5
  265. snappy/verify/krawczyk_shapes_engine.py +17 -18
  266. snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
  267. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
  268. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
  269. snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
  270. snappy/verify/shapes.py +5 -3
  271. snappy/verify/short_slopes.py +39 -41
  272. snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
  273. snappy/verify/test.py +57 -60
  274. snappy/verify/upper_halfspace/extended_matrix.py +1 -1
  275. snappy/verify/upper_halfspace/finite_point.py +3 -4
  276. snappy/verify/upper_halfspace/ideal_point.py +9 -9
  277. snappy/verify/volume.py +2 -2
  278. snappy/version.py +2 -2
  279. {snappy-3.1.dist-info → snappy-3.2.dist-info}/METADATA +26 -11
  280. snappy-3.2.dist-info/RECORD +503 -0
  281. {snappy-3.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  282. {snappy-3.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  283. snappy/__pycache__/__init__.cpython-311.pyc +0 -0
  284. snappy/__pycache__/browser.cpython-311.pyc +0 -0
  285. snappy/__pycache__/cache.cpython-311.pyc +0 -0
  286. snappy/__pycache__/database.cpython-311.pyc +0 -0
  287. snappy/__pycache__/db_utilities.cpython-311.pyc +0 -0
  288. snappy/__pycache__/decorated_isosig.cpython-311.pyc +0 -0
  289. snappy/__pycache__/exceptions.cpython-311.pyc +0 -0
  290. snappy/__pycache__/export_stl.cpython-311.pyc +0 -0
  291. snappy/__pycache__/filedialog.cpython-311.pyc +0 -0
  292. snappy/__pycache__/gui.cpython-311.pyc +0 -0
  293. snappy/__pycache__/horoviewer.cpython-311.pyc +0 -0
  294. snappy/__pycache__/infowindow.cpython-311.pyc +0 -0
  295. snappy/__pycache__/math_basics.cpython-311.pyc +0 -0
  296. snappy/__pycache__/matrix.cpython-311.pyc +0 -0
  297. snappy/__pycache__/number.cpython-311.pyc +0 -0
  298. snappy/__pycache__/numeric_output_checker.cpython-311.pyc +0 -0
  299. snappy/__pycache__/pari.cpython-311.pyc +0 -0
  300. snappy/__pycache__/polyviewer.cpython-311.pyc +0 -0
  301. snappy/__pycache__/sage_helper.cpython-311.pyc +0 -0
  302. snappy/__pycache__/version.cpython-311.pyc +0 -0
  303. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  304. snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
  305. snappy/doc/_static/js/html5shiv.min.js +0 -4
  306. snappy/doc/verify_canon.html +0 -304
  307. snappy/drilling/__pycache__/__init__.cpython-311.pyc +0 -0
  308. snappy/drilling/__pycache__/constants.cpython-311.pyc +0 -0
  309. snappy/drilling/__pycache__/crush.cpython-311.pyc +0 -0
  310. snappy/drilling/__pycache__/cusps.cpython-311.pyc +0 -0
  311. snappy/drilling/__pycache__/debug.cpython-311.pyc +0 -0
  312. snappy/drilling/__pycache__/epsilons.cpython-311.pyc +0 -0
  313. snappy/drilling/__pycache__/exceptions.cpython-311.pyc +0 -0
  314. snappy/drilling/__pycache__/fixed_points.cpython-311.pyc +0 -0
  315. snappy/drilling/__pycache__/geodesic_info.cpython-311.pyc +0 -0
  316. snappy/drilling/__pycache__/geodesic_tube.cpython-311.pyc +0 -0
  317. snappy/drilling/__pycache__/geometric_structure.cpython-311.pyc +0 -0
  318. snappy/drilling/__pycache__/line.cpython-311.pyc +0 -0
  319. snappy/drilling/__pycache__/moves.cpython-311.pyc +0 -0
  320. snappy/drilling/__pycache__/peripheral_curves.cpython-311.pyc +0 -0
  321. snappy/drilling/__pycache__/perturb.cpython-311.pyc +0 -0
  322. snappy/drilling/__pycache__/quotient_space.cpython-311.pyc +0 -0
  323. snappy/drilling/__pycache__/spatial_dict.cpython-311.pyc +0 -0
  324. snappy/drilling/__pycache__/subdivide.cpython-311.pyc +0 -0
  325. snappy/drilling/__pycache__/tracing.cpython-311.pyc +0 -0
  326. snappy/drilling/geodesic_tube.py +0 -441
  327. snappy/drilling/geometric_structure.py +0 -366
  328. snappy/drilling/line.py +0 -122
  329. snappy/drilling/quotient_space.py +0 -94
  330. snappy/drilling/spatial_dict.py +0 -128
  331. snappy/exterior_to_link/__pycache__/__init__.cpython-311.pyc +0 -0
  332. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-311.pyc +0 -0
  333. snappy/exterior_to_link/__pycache__/exceptions.cpython-311.pyc +0 -0
  334. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-311.pyc +0 -0
  335. snappy/exterior_to_link/__pycache__/link_projection.cpython-311.pyc +0 -0
  336. snappy/exterior_to_link/__pycache__/main.cpython-311.pyc +0 -0
  337. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-311.pyc +0 -0
  338. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-311.pyc +0 -0
  339. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-311.pyc +0 -0
  340. snappy/exterior_to_link/__pycache__/pl_utils.cpython-311.pyc +0 -0
  341. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-311.pyc +0 -0
  342. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-311.pyc +0 -0
  343. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-311.pyc +0 -0
  344. snappy/exterior_to_link/__pycache__/stored_moves.cpython-311.pyc +0 -0
  345. snappy/hyperboloid/__pycache__/__init__.cpython-311.pyc +0 -0
  346. snappy/manifolds/__pycache__/__init__.cpython-311.pyc +0 -0
  347. snappy/ptolemy/__pycache__/__init__.cpython-311.pyc +0 -0
  348. snappy/ptolemy/__pycache__/component.cpython-311.pyc +0 -0
  349. snappy/ptolemy/__pycache__/coordinates.cpython-311.pyc +0 -0
  350. snappy/ptolemy/__pycache__/fieldExtensions.cpython-311.pyc +0 -0
  351. snappy/ptolemy/__pycache__/findLoops.cpython-311.pyc +0 -0
  352. snappy/ptolemy/__pycache__/homology.cpython-311.pyc +0 -0
  353. snappy/ptolemy/__pycache__/manifoldMethods.cpython-311.pyc +0 -0
  354. snappy/ptolemy/__pycache__/matrix.cpython-311.pyc +0 -0
  355. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-311.pyc +0 -0
  356. snappy/ptolemy/__pycache__/polynomial.cpython-311.pyc +0 -0
  357. snappy/ptolemy/__pycache__/processComponents.cpython-311.pyc +0 -0
  358. snappy/ptolemy/__pycache__/processFileBase.cpython-311.pyc +0 -0
  359. snappy/ptolemy/__pycache__/processFileDispatch.cpython-311.pyc +0 -0
  360. snappy/ptolemy/__pycache__/processMagmaFile.cpython-311.pyc +0 -0
  361. snappy/ptolemy/__pycache__/processRurFile.cpython-311.pyc +0 -0
  362. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-311.pyc +0 -0
  363. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-311.pyc +0 -0
  364. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-311.pyc +0 -0
  365. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-311.pyc +0 -0
  366. snappy/ptolemy/__pycache__/rur.cpython-311.pyc +0 -0
  367. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-311.pyc +0 -0
  368. snappy/ptolemy/__pycache__/utilities.cpython-311.pyc +0 -0
  369. snappy/raytracing/__pycache__/__init__.cpython-311.pyc +0 -0
  370. snappy/raytracing/__pycache__/finite_raytracing_data.cpython-311.pyc +0 -0
  371. snappy/raytracing/__pycache__/gui_utilities.cpython-311.pyc +0 -0
  372. snappy/raytracing/__pycache__/hyperboloid_navigation.cpython-311.pyc +0 -0
  373. snappy/raytracing/__pycache__/hyperboloid_utilities.cpython-311.pyc +0 -0
  374. snappy/raytracing/__pycache__/ideal_raytracing_data.cpython-311.pyc +0 -0
  375. snappy/raytracing/__pycache__/inside_viewer.cpython-311.pyc +0 -0
  376. snappy/raytracing/__pycache__/raytracing_data.cpython-311.pyc +0 -0
  377. snappy/raytracing/__pycache__/raytracing_view.cpython-311.pyc +0 -0
  378. snappy/raytracing/__pycache__/upper_halfspace_utilities.cpython-311.pyc +0 -0
  379. snappy/raytracing/__pycache__/view_scale_controller.cpython-311.pyc +0 -0
  380. snappy/raytracing/zoom_slider/__pycache__/__init__.cpython-311.pyc +0 -0
  381. snappy/snap/__pycache__/__init__.cpython-311.pyc +0 -0
  382. snappy/snap/__pycache__/character_varieties.cpython-311.pyc +0 -0
  383. snappy/snap/__pycache__/fundamental_polyhedron.cpython-311.pyc +0 -0
  384. snappy/snap/__pycache__/interval_reps.cpython-311.pyc +0 -0
  385. snappy/snap/__pycache__/kernel_structures.cpython-311.pyc +0 -0
  386. snappy/snap/__pycache__/mcomplex_base.cpython-311.pyc +0 -0
  387. snappy/snap/__pycache__/nsagetools.cpython-311.pyc +0 -0
  388. snappy/snap/__pycache__/polished_reps.cpython-311.pyc +0 -0
  389. snappy/snap/__pycache__/shapes.cpython-311.pyc +0 -0
  390. snappy/snap/__pycache__/slice_obs_HKL.cpython-311.pyc +0 -0
  391. snappy/snap/__pycache__/utilities.cpython-311.pyc +0 -0
  392. snappy/snap/peripheral/__pycache__/__init__.cpython-311.pyc +0 -0
  393. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-311.pyc +0 -0
  394. snappy/snap/peripheral/__pycache__/link.cpython-311.pyc +0 -0
  395. snappy/snap/peripheral/__pycache__/peripheral.cpython-311.pyc +0 -0
  396. snappy/snap/peripheral/__pycache__/surface.cpython-311.pyc +0 -0
  397. snappy/snap/t3mlite/__pycache__/__init__.cpython-311.pyc +0 -0
  398. snappy/snap/t3mlite/__pycache__/arrow.cpython-311.pyc +0 -0
  399. snappy/snap/t3mlite/__pycache__/corner.cpython-311.pyc +0 -0
  400. snappy/snap/t3mlite/__pycache__/edge.cpython-311.pyc +0 -0
  401. snappy/snap/t3mlite/__pycache__/face.cpython-311.pyc +0 -0
  402. snappy/snap/t3mlite/__pycache__/files.cpython-311.pyc +0 -0
  403. snappy/snap/t3mlite/__pycache__/homology.cpython-311.pyc +0 -0
  404. snappy/snap/t3mlite/__pycache__/linalg.cpython-311.pyc +0 -0
  405. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-311.pyc +0 -0
  406. snappy/snap/t3mlite/__pycache__/perm4.cpython-311.pyc +0 -0
  407. snappy/snap/t3mlite/__pycache__/simplex.cpython-311.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/spun.cpython-311.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/surface.cpython-311.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-311.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/vertex.cpython-311.pyc +0 -0
  412. snappy/togl/__init__.py +0 -3
  413. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  414. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  415. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  416. snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
  417. snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
  418. snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
  419. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  420. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  421. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  422. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  423. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  424. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  425. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  426. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  427. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  428. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  429. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  430. snappy/twister/__pycache__/__init__.cpython-311.pyc +0 -0
  431. snappy/twister/__pycache__/main.cpython-311.pyc +0 -0
  432. snappy/upper_halfspace/__pycache__/__init__.cpython-311.pyc +0 -0
  433. snappy/upper_halfspace/__pycache__/ideal_point.cpython-311.pyc +0 -0
  434. snappy/verify/__pycache__/__init__.cpython-311.pyc +0 -0
  435. snappy/verify/__pycache__/cuspCrossSection.cpython-311.pyc +0 -0
  436. snappy/verify/__pycache__/cuspTranslations.cpython-311.pyc +0 -0
  437. snappy/verify/__pycache__/cusp_areas.cpython-311.pyc +0 -0
  438. snappy/verify/__pycache__/cusp_shapes.cpython-311.pyc +0 -0
  439. snappy/verify/__pycache__/exceptions.cpython-311.pyc +0 -0
  440. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-311.pyc +0 -0
  441. snappy/verify/__pycache__/interval_tree.cpython-311.pyc +0 -0
  442. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-311.pyc +0 -0
  443. snappy/verify/__pycache__/realAlgebra.cpython-311.pyc +0 -0
  444. snappy/verify/__pycache__/shapes.cpython-311.pyc +0 -0
  445. snappy/verify/__pycache__/short_slopes.cpython-311.pyc +0 -0
  446. snappy/verify/__pycache__/squareExtensions.cpython-311.pyc +0 -0
  447. snappy/verify/__pycache__/verifyCanonical.cpython-311.pyc +0 -0
  448. snappy/verify/__pycache__/verifyHyperbolicity.cpython-311.pyc +0 -0
  449. snappy/verify/__pycache__/volume.cpython-311.pyc +0 -0
  450. snappy/verify/complex_volume/__pycache__/__init__.cpython-311.pyc +0 -0
  451. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-311.pyc +0 -0
  452. snappy/verify/complex_volume/__pycache__/closed.cpython-311.pyc +0 -0
  453. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-311.pyc +0 -0
  454. snappy/verify/complex_volume/__pycache__/cusped.cpython-311.pyc +0 -0
  455. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-311.pyc +0 -0
  456. snappy/verify/cuspCrossSection.py +0 -1422
  457. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-311.pyc +0 -0
  458. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-311.pyc +0 -0
  459. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-311.pyc +0 -0
  460. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-311.pyc +0 -0
  461. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-311.pyc +0 -0
  462. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-311.pyc +0 -0
  463. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-311.pyc +0 -0
  464. snappy-3.1.dist-info/RECORD +0 -585
  465. {snappy-3.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
@@ -18,12 +18,12 @@ from ..pari import pari
18
18
 
19
19
  # This is broken down in three steps.
20
20
 
21
- # Step 1: Split into extensions and assingments
21
+ # Step 1: Split into extensions and assignments
22
22
  # extensions, assignments = extensions_and_assignments(polys)
23
23
 
24
24
  # Split the list of polynomials into two lists, the first list
25
25
  # contains triples (poly, var, degree) forming a tower of
26
- # field extensons and the second group is a dictionary assigning
26
+ # field extensions and the second group is a dictionary assigning
27
27
  # all remaining variables polynomials in the variables in the tower.
28
28
 
29
29
  # Example:
@@ -151,12 +151,12 @@ def update_assignments_and_merge(assignments, d):
151
151
  variables = sorted(set(
152
152
  sum([poly.variables() for poly in assignments.values()], [])))
153
153
 
154
- monomial_to_value = { (): pari(1) }
154
+ monomial_to_value = {(): pari(1)}
155
155
 
156
156
  for var in variables:
157
157
  max_degree = max([poly.degree(var) for poly in assignments.values()])
158
158
 
159
- old_keys = list(monomial_to_value.keys())
159
+ old_keys = list(monomial_to_value)
160
160
 
161
161
  v = d[var]
162
162
  power_of_v = pari(1)
@@ -180,8 +180,8 @@ def update_assignments_and_merge(assignments, d):
180
180
  [eval_monomial(m) for m in poly.get_monomials()],
181
181
  pari(0))
182
182
 
183
- new_assignments = dict([(key, substitute(poly))
184
- for key, poly in assignments.items()])
183
+ new_assignments = {key: substitute(poly)
184
+ for key, poly in assignments.items()}
185
185
 
186
186
  # Merge all the assignments of variables
187
187
  new_assignments.update(d)
@@ -227,9 +227,9 @@ def _process_extensions(extensions):
227
227
  # The new number field is again in x but the assignments
228
228
  # are assigning polynomials in the old x.
229
229
  # Need to update.
230
- ext_assignments = dict(
231
- [(key, poly.substitute({'x' : old_x_in_new_x}))
232
- for key, poly in ext_assignments.items()])
230
+ ext_assignments = {
231
+ key: poly.substitute({'x' : old_x_in_new_x})
232
+ for key, poly in ext_assignments.items()}
233
233
 
234
234
  # And compute what the root of the last polynomial was
235
235
  # to assign it.
snappy/ptolemy/test.py CHANGED
@@ -13,20 +13,25 @@
13
13
  # python test.py --compute
14
14
 
15
15
  from snappy import Manifold, pari, ptolemy
16
+ from snappy import ptolemy
16
17
  from snappy.ptolemy import solutions_from_magma, Flattenings, parse_solutions
17
18
  from snappy.ptolemy.processFileBase import get_manifold
18
19
  from snappy.ptolemy import __path__ as ptolemy_paths
19
20
  from snappy.ptolemy.coordinates import PtolemyCannotBeCheckedError
20
- from snappy.sage_helper import _within_sage, doctest_modules
21
+ from snappy.sage_helper import _within_sage
22
+ from snappy.testing import doctest_modules
21
23
  from snappy.pari import pari
22
24
  import bz2
23
25
  import os
24
26
  import sys
27
+ import doctest
28
+ import traceback
25
29
 
26
30
  if _within_sage:
27
31
  from sage.misc.sage_eval import sage_eval
28
32
 
29
33
  test_regina = '--regina' in sys.argv
34
+ compute_solutions = '--compute' in sys.argv
30
35
 
31
36
  base_path = ptolemy_paths[0]
32
37
  if test_regina:
@@ -208,7 +213,8 @@ def testSolutionsForManifold(M, N, solutions, baseline_cvolumes=None,
208
213
  def testComputeSolutionsForManifold(manifold, N,
209
214
  compute_solutions=False,
210
215
  baseline_cvolumes=None,
211
- expect_non_zero_dimensional=None):
216
+ expect_non_zero_dimensional=None,
217
+ print_info=True):
212
218
 
213
219
  varieties = manifold.ptolemy_variety(N, obstruction_class="all_original")
214
220
 
@@ -226,10 +232,10 @@ def testComputeSolutionsForManifold(manifold, N,
226
232
  baseline_cvolumes, expect_non_zero_dimensional)
227
233
 
228
234
  if manifold.name() == 't00000':
229
- testMatrixMethods(manifold, solutions)
235
+ testMatrixMethods(manifold, solutions, print_info=print_info)
230
236
 
231
237
 
232
- def testMatrixMethods(manifold, solutions):
238
+ def testMatrixMethods(manifold, solutions, print_info=True):
233
239
 
234
240
  def matrix_is_diagonal(m):
235
241
  return (
@@ -241,7 +247,8 @@ def testMatrixMethods(manifold, solutions):
241
247
  return matrix_is_diagonal(m) and (
242
248
  m[0][0] + 1 == 0 or m[0][0] - 1 == 0)
243
249
 
244
- print("Testing matrix methods...")
250
+ if print_info:
251
+ print("Testing matrix methods...")
245
252
 
246
253
  G = manifold.fundamental_group(simplify_presentation=True)
247
254
  Graw = manifold.fundamental_group(simplify_presentation=False)
@@ -302,9 +309,14 @@ def test_flattenings_from_tetrahedra_shapes_of_manifold():
302
309
 
303
310
  from snappy import OrientableCuspedCensus
304
311
 
305
- for M in (list(OrientableCuspedCensus()[0:10]) +
306
- list(OrientableCuspedCensus()[10000:10010])):
312
+ for M_database in (list(OrientableCuspedCensus()[0:10]) +
313
+ list(OrientableCuspedCensus()[10000:10010])):
307
314
 
315
+ # The manifold returned by OrientableCuspedCensus is
316
+ # a SnapPy.Manifold, not a snappy.Manifold (as is overridden
317
+ # in python/test.py).
318
+ M = Manifold(M_database)
319
+
308
320
  flattening = Flattenings.from_tetrahedra_shapes_of_manifold(M)
309
321
  flattening.check_against_manifold(M, epsilon=1e-80)
310
322
 
@@ -447,7 +459,7 @@ def testComputeSolutionsForManifoldGeneralizedObstructionClass(
447
459
  manifold, N, baseline_volumes, baseline_dimensions)
448
460
 
449
461
 
450
- def testGeneralizedObstructionClass(compute_solutions):
462
+ def testGeneralizedObstructionClass(compute_solutions, print_info = True):
451
463
 
452
464
  vols = [
453
465
  pari('0'),
@@ -484,7 +496,8 @@ def testGeneralizedObstructionClass(compute_solutions):
484
496
 
485
497
  for manifold, N, vols, dims in test_cases:
486
498
 
487
- print("Checking for", manifold.name(), "N = %d" % N)
499
+ if print_info:
500
+ print("Checking for", manifold.name(), "N = %d" % N)
488
501
 
489
502
  testComputeSolutionsForManifoldGeneralizedObstructionClass(
490
503
  manifold, N, compute_solutions, vols, dims)
@@ -647,7 +660,7 @@ def testNumericalSolutions():
647
660
  check_volumes(allCVolumes, expected_cvolumes)
648
661
 
649
662
 
650
- def testGeometricRep(compute_solutions):
663
+ def testGeometricRep(compute_solutions, print_info=False):
651
664
 
652
665
  from snappy.ptolemy import geometricRep
653
666
 
@@ -657,13 +670,14 @@ def testGeometricRep(compute_solutions):
657
670
  else:
658
671
  from urllib.request import pathname2url
659
672
  url = pathname2url(os.path.abspath(testing_files_directory))
660
- sol = geometricRep.retrieve_geometric_solution(M, data_url=url)
673
+ sol = geometricRep.retrieve_geometric_solution(
674
+ M, data_url=url, verbose = print_info)
661
675
 
662
676
  # Make sure this is of type Ptolemy
663
677
  sol['c_0011_2']
664
678
 
665
679
  assert any(
666
- [ abs(vol - 2.9441064867) < 1e-9 for vol in sol.volume_numerical()])
680
+ abs(vol - 2.9441064867) < 1e-9 for vol in sol.volume_numerical())
667
681
 
668
682
 
669
683
  def testSageCommandLine():
@@ -809,79 +823,66 @@ def test_num_obstruction_class_match():
809
823
  for i in range(2,6):
810
824
  assert len(M.ptolemy_generalized_obstruction_classes(i)) == len(N.ptolemy_generalized_obstruction_classes(i))
811
825
 
826
+ def run_ptolemy_tests_raising_exceptions(print_info=True):
827
+ if print_info:
828
+ print("Testing in sage:", _within_sage)
812
829
 
813
- modules = [ptolemy.component, ptolemy.coordinates, ptolemy.manifoldMethods,
814
- ptolemy.matrix, ptolemy.polynomial, ptolemy.processMagmaFile,
815
- ptolemy.ptolemyObstructionClass, ptolemy.ptolemyVariety,
816
- ptolemy.ptolemyVariety, ptolemy.processFileBase, ptolemy.processRurFile,
817
- ptolemy.rur, ptolemy.utilities]
818
- if test_regina:
819
- modules.append(ptolemy.reginaWrapper)
820
-
821
-
822
- def run_doctests(verbose=False, print_info=True):
823
- return doctest_modules(modules, verbose, print_info)
824
-
825
-
826
- def main(verbose=False, doctest=True):
827
- print("Testing in sage:", _within_sage)
828
-
829
- print("Testing in regina:", test_regina)
830
-
831
- if doctest:
832
- print("Running doctests...")
833
- run_doctests(verbose)
834
- print()
830
+ print("Testing in regina:", test_regina)
835
831
 
836
832
  if test_regina:
837
- print("Testing that regina agrees with snappy obstruction classes")
833
+ if print_info:
834
+ print("Testing that regina agrees with snappy obstruction classes")
838
835
  test_num_obstruction_class_match()
839
836
 
840
837
  if not test_regina:
841
- print("Testing Flattenings.from_tetrahedra_shapes_of_manifold...")
838
+ if print_info:
839
+ print("Testing Flattenings.from_tetrahedra_shapes_of_manifold...")
842
840
 
843
841
  test_flattenings_from_tetrahedra_shapes_of_manifold()
844
842
 
845
- compute_solutions = False
846
-
847
- if '--compute' in sys.argv:
848
- compute_solutions = True
849
-
850
843
  if test_regina and not compute_solutions:
851
844
  print("regina testing requires --compute")
852
845
  sys.exit(1)
853
846
 
854
847
  old_precision = pari.set_real_precision(100)
855
848
 
856
- print("Testing induced representation...")
849
+ if print_info:
850
+ print("Testing induced representation...")
857
851
 
858
852
  test_induced_representation()
859
853
 
860
- print("Testing induced SL(4,C) representation...")
854
+ if print_info:
855
+ print("Testing induced SL(4,C) representation...")
861
856
 
862
857
  test_induced_sl4_representation()
863
858
 
864
- print("Running manifold tests for generalized obstruction class...")
859
+ if print_info:
860
+ print("Running manifold tests for generalized obstruction class...")
865
861
 
866
- testGeneralizedObstructionClass(compute_solutions)
862
+ testGeneralizedObstructionClass(compute_solutions, print_info=print_info)
867
863
 
868
864
  if not test_regina:
869
- print("Testing RUR for m052__sl3_c0.rur")
865
+ if print_info:
866
+ print("Testing RUR for m052__sl3_c0.rur")
870
867
 
871
868
  testMapleLikeRur()
872
869
 
873
- print("Testing numerical solution retrieval method...")
870
+ if print_info:
871
+ print("Testing numerical solution retrieval method...")
874
872
 
875
873
  testNumericalSolutions()
876
874
 
877
- print("Testing geometricRep...")
878
- testGeometricRep(compute_solutions)
875
+ if print_info:
876
+ print("Testing geometricRep...")
877
+ testGeometricRep(compute_solutions, print_info=print_info)
879
878
 
880
879
  if _within_sage:
881
- print("Testing in sage command line...")
880
+ if print_info:
881
+ print("Testing in sage command line...")
882
882
  testSageCommandLine()
883
883
 
884
- print("Running manifold tests...")
884
+ if print_info:
885
+ print("Running manifold tests...")
885
886
 
886
887
  # Test for a non-hyperbolic manifold
887
888
 
@@ -1068,14 +1069,58 @@ def main(verbose=False, doctest=True):
1068
1069
 
1069
1070
  for manifold, N, cvols, expect_non_zero_dim in test_cases:
1070
1071
 
1071
- print("Checking for", manifold.name(), "N = %d" % N)
1072
+ if print_info:
1073
+ print("Checking for", manifold.name(), "N = %d" % N)
1072
1074
 
1073
1075
  testComputeSolutionsForManifold(
1074
1076
  manifold, N,
1075
1077
  compute_solutions=compute_solutions,
1076
1078
  baseline_cvolumes=cvols,
1077
- expect_non_zero_dimensional=expect_non_zero_dim)
1079
+ expect_non_zero_dimensional=expect_non_zero_dim,
1080
+ print_info=print_info)
1078
1081
 
1082
+ def run_ptolemy_tests(verbose=False, print_info=True):
1083
+ try:
1084
+ run_ptolemy_tests_raising_exceptions(
1085
+ print_info=print_info)
1086
+ return doctest.TestResults(failed=0, attempted=1)
1087
+ except Exception as e:
1088
+ print()
1089
+ print("FAILED TEST in Ptolemy. Exception is:")
1090
+ traceback.print_exc()
1091
+ print()
1092
+ return doctest.TestResults(failed=1, attempted=1)
1093
+
1094
+ run_ptolemy_tests.__name__ = ptolemy.__name__ + ' (non-doc tests)'
1095
+
1096
+ modules = [ptolemy.component,
1097
+ ptolemy.coordinates,
1098
+ ptolemy.manifoldMethods,
1099
+ ptolemy.matrix,
1100
+ ptolemy.polynomial,
1101
+ ptolemy.processFileBase,
1102
+ ptolemy.processMagmaFile,
1103
+ ptolemy.processRurFile,
1104
+ ptolemy.ptolemyObstructionClass,
1105
+ ptolemy.ptolemyVariety,
1106
+ ptolemy.rur,
1107
+ ptolemy.utilities]
1108
+ if test_regina:
1109
+ modules.append(ptolemy.reginaWrapper)
1110
+
1111
+ def run_doctests(verbose=False, print_info=True):
1112
+ return doctest_modules(
1113
+ modules,
1114
+ verbose=verbose, print_info=print_info)
1115
+
1116
+ run_doctests.__name__ = ptolemy.__name__
1079
1117
 
1080
1118
  if __name__ == '__main__':
1081
- main()
1119
+ verbose = '-v' in sys.argv[1:] or '--verbose' in sys.argv[1:]
1120
+
1121
+ result = run_doctests(verbose=verbose, print_info=True)
1122
+ if result.failed:
1123
+ sys.exit(result.failed)
1124
+
1125
+ result = run_ptolemy_tests(verbose=verbose, print_info=True)
1126
+ sys.exit(result.failed)
@@ -212,7 +212,7 @@ class MethodMappingList(list):
212
212
  """
213
213
 
214
214
  def __init__(self, l=[], p=None):
215
- super(MethodMappingList, self).__init__(l)
215
+ super().__init__(l)
216
216
 
217
217
  def __call__(self, *args, **kwargs):
218
218
  return type(self)([elt(*args, **kwargs) for elt in self],
@@ -0,0 +1,64 @@
1
+ from ..exceptions import NonorientableManifoldError
2
+ from . import cohomology_fractal
3
+
4
+ try:
5
+ from ..gui import ViewerWindow
6
+ from .inside_viewer import InsideViewer
7
+ except ImportError as e:
8
+ InsideViewer = None
9
+ _importErrorRaytracing = str(e)
10
+
11
+ from typing import Sequence
12
+
13
+ def inside_view(self, cohomology_class=None, geodesics : Sequence[str]=[]):
14
+ r"""
15
+ Show raytraced inside view of hyperbolic manifold. See
16
+ `images <https://im.icerm.brown.edu/portfolio/snappy-views/>`_
17
+ and `demo video <https://youtu.be/CAERhmUCkRs>`_.
18
+
19
+ >>> M = Manifold("m004")
20
+ >>> M.inside_view() #doctest: +CYMODERNOPENGL
21
+
22
+ Or show the cohomology fractal:
23
+
24
+ >>> M = Manifold("m004")
25
+ >>> M.inside_view(cohomology_class = 0) #doctest: +CYMODERNOPENGL
26
+
27
+ The cohomology class in :math:`H^2(M, \partial M; \mathbb{R})` producing the
28
+ cohomology fractal can be specified as a cocycle or using an automatically
29
+ computed basis (of, say, length ``n``). Thus, ``cohomology_class`` can be
30
+ one of the following.
31
+
32
+ - An integer ``i`` between 0 and ``n`` - 1 to pick the ``i``-th basis
33
+ vector.
34
+ - An array of length ``n`` specifying the cohomology class as linear
35
+ combination of basis vectors.
36
+ - A weight for each face of each tetrahedron.
37
+
38
+ Geodesics can be specified as words in the unsimplified fundamental group:
39
+
40
+ >>> M = Manifold("m004")
41
+ >>> M.inside_view(geodesics=['a', 'bC']) #doctest: +CYMODERNOPENGL
42
+
43
+ """
44
+
45
+ if InsideViewer is None:
46
+ raise RuntimeError("Raytraced inside view not imported; "
47
+ "Tk or CyOpenGL is probably missing "
48
+ "(original error : %s)" % _importErrorRaytracing)
49
+
50
+ if not self.is_orientable():
51
+ raise NonorientableManifoldError("Manifold.inside_view", self)
52
+
53
+ weights, cohomology_basis, cohomology_class = (
54
+ cohomology_fractal.compute_weights_basis_class(
55
+ self, cohomology_class))
56
+
57
+ return ViewerWindow(
58
+ InsideViewer,
59
+ self,
60
+ title="Inside view of %s" % self.name(),
61
+ weights=weights,
62
+ cohomology_basis=cohomology_basis,
63
+ cohomology_class=cohomology_class,
64
+ geodesics=geodesics)
@@ -0,0 +1,64 @@
1
+ """
2
+ from snappy import *; from snappy.raytracing.additional_horospheres import *
3
+
4
+ M=Manifold("t10879")
5
+ M=CubicalOrientableCuspedCensus[0]
6
+ v = M.inside_view()
7
+ a=AdditionalHorospheres(M)
8
+ v.view.widget.additional_structures['horospheres'] = a; v.view.widget._update_shader()
9
+
10
+ """
11
+
12
+ from ..geometric_structure.cusp_neighborhood.tiles_for_cusp_neighborhood import mcomplex_for_tiling_cusp_neighborhoods
13
+ from .pack import pack_tet_data
14
+ from .upper_halfspace_utilities import add_coordinate_transform_to_mcomplex
15
+
16
+ class AdditionalHorospheres:
17
+ def __init__(self, manifold):
18
+
19
+ self.mcomplex = mcomplex_for_tiling_cusp_neighborhoods(
20
+ manifold, bits_prec = 53, verified = False)
21
+ add_coordinate_transform_to_mcomplex(self.mcomplex)
22
+
23
+ self.num_tetrahedra = manifold.num_tetrahedra()
24
+ self.RF = manifold.tetrahedra_shapes('rect')[0].real().parent()
25
+ self.cusp_areas = [ 1.0 for v in self.mcomplex.Vertices ]
26
+
27
+ self._num = 0
28
+
29
+ self.compute_bindings()
30
+
31
+ def get_compile_time_defs(self):
32
+ if self._num > 0:
33
+ num = max(100, self._num)
34
+ else:
35
+ num = 0
36
+
37
+ return { 'num_additional_horospheres' : num }
38
+
39
+ def get_uniform_bindings(self):
40
+ return self._uniform_bindings
41
+
42
+ def compute_bindings(self):
43
+
44
+ tets_to_data = [ [] for i in range(self.num_tetrahedra) ]
45
+
46
+ for cusp_index, v in enumerate(self.mcomplex.Vertices):
47
+ scale = (self.RF(self.cusp_areas[cusp_index]) / v.cusp_area).sqrt()
48
+
49
+ d = scale.log()
50
+
51
+ for tile in v.tiles():
52
+ if tile.lower_bound_distance > d:
53
+ break
54
+
55
+ tet = tile.lifted_tetrahedron.tet
56
+
57
+ s = (
58
+ tet.to_coordinates_in_symmetric_tet * tile.inverse_lifted_geometric_object.defining_vec) / scale
59
+
60
+ tets_to_data[tet.Index].append(
61
+ { 'Vec' : ('vec4', s),
62
+ 'CuspIndex' : ('int', cusp_index) })
63
+
64
+ self._uniform_bindings, self._num = pack_tet_data('additionalHorospheres.horosphere', tets_to_data)
@@ -0,0 +1,63 @@
1
+ """
2
+ from snappy import *; from snappy.raytracing.additional_len_spec_choices import *
3
+
4
+ M=Manifold("t10879")
5
+ M=CubicalOrientableCuspedCensus[0]
6
+ v = M.inside_view()
7
+ a=AdditionalLenSpecChoices(M)
8
+ v.view.widget.additional_structures['lenSpec'] = a; v.view.widget._update_shader()
9
+
10
+ """
11
+
12
+ from ..len_spec import mcomplex_for_len_spec
13
+
14
+ from .pack import pack_tet_data
15
+ from .upper_halfspace_utilities import add_coordinate_transform_to_mcomplex
16
+ from ..snap.t3mlite import simplex
17
+
18
+ class AdditionalLenSpecChoices:
19
+ def __init__(self, manifold):
20
+
21
+ self.mcomplex = mcomplex_for_len_spec(
22
+ manifold, bits_prec = 53, verified = False)
23
+ add_coordinate_transform_to_mcomplex(self.mcomplex)
24
+
25
+ self._num = 0
26
+
27
+ self.compute_bindings()
28
+
29
+ def get_compile_time_defs(self):
30
+ if self._num > 0:
31
+ num = max(100, self._num)
32
+ else:
33
+ num = 0
34
+
35
+ return { 'num_additional_horospheres' : num,
36
+ 'has_edge_midpoints' : 1}
37
+
38
+ def get_uniform_bindings(self):
39
+ return self._uniform_bindings
40
+
41
+ def compute_bindings(self):
42
+ self._uniform_bindings, self._num = pack_tet_data(
43
+ 'additionalHorospheres.horosphere',
44
+ self._get_data())
45
+ self._uniform_bindings['edgeMidpoints.edgeMidpointVec'] = (
46
+ 'vec4[]', [ tet.to_coordinates_in_symmetric_tet * tet.spine_points[e]
47
+ for tet in self.mcomplex.Tetrahedra
48
+ for e in simplex.OneSubsimplices ])
49
+ self._uniform_bindings['edgeMidpointRadiusParam'] = (
50
+ 'float', 1.002)
51
+
52
+ def _get_data(self):
53
+ return [ [ _data_for_vert(tet, v) for v in simplex.ZeroSubsimplices ]
54
+ for tet in self.mcomplex.Tetrahedra ]
55
+
56
+ def _data_for_vert(tet, v):
57
+ return {
58
+ 'Vec' :(
59
+ 'vec4',
60
+ tet.to_coordinates_in_symmetric_tet * tet.R13_vertices[v]),
61
+ 'CuspIndex' : (
62
+ 'int',
63
+ tet.Class[v].Index) }
@@ -55,7 +55,6 @@ def check_weights_valid(trig, weights):
55
55
  Given a SnapPy triangulation and weights per face per tetrahedron,
56
56
  check they are consistent across glued faces and form a 2-cocycle.
57
57
 
58
- >>> from snappy import Manifold
59
58
  >>> check_weights_valid(Manifold("m015"), [1, 0, 0, 0, -1, 0, 0, 1, -1, 0, 0, 0])
60
59
  >>> check_weights_valid(Manifold("m004"), [0, 1, 0, 1, 0, 0, -1, -2])
61
60
  Traceback (most recent call last):
@@ -111,7 +110,6 @@ def rational_cohomology_basis(trig):
111
110
  per face per tetrahedron that generate the second rational cohomology
112
111
  group.
113
112
 
114
- >>> from snappy import Manifold
115
113
  >>> rational_cohomology_basis(Manifold("m125"))
116
114
  [[-1, -4, -2, 0, 1, 0, 0, 0, 0, 4, 1, 2, -1, 0, 0, 0], [0, 5, 2, 0, 0, 0, 0, 1, 0, -5, 0, -2, 0, 0, 0, -1]]
117
115
 
@@ -147,7 +145,6 @@ def compute_weights_basis_class(trig, cohomology_class):
147
145
  Convenience method to quickly access cohomology classes for
148
146
  M.inside_view().
149
147
 
150
- >>> from snappy import Manifold
151
148
  >>> compute_weights_basis_class(Manifold("m004"), None)
152
149
  (None, None, None)
153
150
  >>> compute_weights_basis_class(Manifold("m003"), [1, 0, 0, 1, -1, 0, 0, -1])
@@ -0,0 +1,123 @@
1
+ from ..hyperboloid import o13_inverse
2
+ from ..hyperboloid.point import R13Point
3
+
4
+ from ..tiling.tile import compute_tiles
5
+ from ..tiling.lifted_tetrahedron import LiftedTetrahedron
6
+ from ..tiling.lifted_tetrahedron_set import (LiftedTetrahedronSet,
7
+ get_lifted_tetrahedron_set)
8
+ from ..tiling.triangle import add_triangles_to_tetrahedra
9
+
10
+ from ..matrix import make_matrix, make_vector
11
+
12
+ from ..matrix import matrix
13
+
14
+ import math
15
+
16
+ eyeball_type_none = 0
17
+ eyeball_type_paper_plane = 1
18
+ eyeball_type_eyeball = 2
19
+
20
+ _max_num_eyeballs = 40
21
+
22
+ class Eyeball:
23
+ def __init__(self, raytracing_view):
24
+ self.raytracing_view = raytracing_view
25
+
26
+ self.mcomplex = self.raytracing_view.raytracing_data.mcomplex
27
+ self.num_tetrahedra = len(self.mcomplex.Tetrahedra)
28
+
29
+ self._added_triangles = False
30
+
31
+ self.view_state = None
32
+
33
+ def _enabled(self):
34
+ return (
35
+ self.raytracing_view.ui_parameter_dict['eyeballSize'][1] > 0 and
36
+ self.raytracing_view.ui_parameter_dict['eyeballType'][1] > eyeball_type_none)
37
+
38
+ def get_compile_time_defs(self):
39
+ if not self._enabled():
40
+ return {}
41
+
42
+ d = { 'num_eyeballs' : _max_num_eyeballs,
43
+ 'eyeball_type' : self.raytracing_view.ui_parameter_dict['eyeballType'][1]}
44
+
45
+ return d
46
+
47
+ def get_uniform_bindings(self):
48
+ if not self._enabled():
49
+ return {}
50
+
51
+ if not self._added_triangles:
52
+ add_triangles_to_tetrahedra(self.mcomplex)
53
+ self._added_triangles = True
54
+
55
+ if self.view_state is None or (
56
+ not self.raytracing_view.ui_parameter_dict['freezeEyeball'][1]):
57
+ self.view_state = self.raytracing_view.view_state
58
+
59
+ boost, tet_num, current_weight = self.view_state
60
+
61
+ RF = self.raytracing_view.raytracing_data.RF
62
+
63
+ boost = make_matrix(boost, ring=RF)
64
+
65
+ base_point = make_vector([b[0] for b in boost])
66
+
67
+ eyeballRadius = self.raytracing_view.ui_parameter_dict['eyeballSize'][1]
68
+ if self.raytracing_view.ui_parameter_dict['eyeballType'][1] == eyeball_type_eyeball:
69
+ eyeballRadius = eyeballRadius / 2.0
70
+ tets_to_data = [ [] for i in range(self.num_tetrahedra) ]
71
+
72
+ initial_lifted_tetrahedron = LiftedTetrahedron(
73
+ self.mcomplex.Tetrahedra[tet_num], matrix.identity(RF, 4))
74
+
75
+ cut_off = RF(1.0 + 1e-5)
76
+
77
+ lifted_tetrahedron_set : LiftedTetrahedronSet = (
78
+ get_lifted_tetrahedron_set(
79
+ base_point=base_point,
80
+ act_on_base_point_by_inverse=True,
81
+ max_neg_prod_equal=cut_off,
82
+ min_neg_prod_distinct=cut_off,
83
+ canonical_keys_function=None,
84
+ verified=False))
85
+
86
+ for i, tile in enumerate(
87
+ compute_tiles(
88
+ geometric_object=R13Point(base_point),
89
+ visited_lifted_tetrahedra=lifted_tetrahedron_set,
90
+ initial_lifted_tetrahedra=[ initial_lifted_tetrahedron ],
91
+ verified=False)):
92
+
93
+ if i == _max_num_eyeballs:
94
+ break
95
+ if tile.lower_bound_distance > eyeballRadius:
96
+ break
97
+
98
+ m = o13_inverse(boost) * tile.lifted_tetrahedron.o13_matrix
99
+
100
+ tets_to_data[tile.lifted_tetrahedron.tet.Index].append((
101
+ tile.inverse_lifted_geometric_object.point,
102
+ m,
103
+ o13_inverse(m)))
104
+
105
+ eyeballPositions = []
106
+ eyeballInvEmbeddings = []
107
+ eyeballEmbeddings = []
108
+ eyeballOffsets = []
109
+
110
+ for data in tets_to_data:
111
+ eyeballOffsets.append(len(eyeballPositions))
112
+ for eyeballPosition, eyeballInvEmbedding, eyeballEmbedding in data:
113
+ eyeballPositions.append(eyeballPosition)
114
+ eyeballInvEmbeddings.append(eyeballInvEmbedding)
115
+ eyeballEmbeddings.append(eyeballEmbedding)
116
+ eyeballOffsets.append(len(eyeballPositions))
117
+
118
+ return {
119
+ 'eyeballRadius' : ('float', eyeballRadius),
120
+ 'eyeballs.eyeballPositions' : ('vec4[]', eyeballPositions),
121
+ 'eyeballs.eyeballInvEmbeddings' : ('mat4[]', eyeballInvEmbeddings),
122
+ 'eyeballs.eyeballEmbeddings' : ('mat4[]', eyeballEmbeddings),
123
+ 'eyeballs.eyeballOffsets' : ('int[]', eyeballOffsets) }