snappy 3.1.1__cp38-cp38-win_amd64.whl → 3.2__cp38-cp38-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. snappy/CyOpenGL.cp38-win_amd64.pyd +0 -0
  2. snappy/SnapPy.cp38-win_amd64.pyd +0 -0
  3. snappy/SnapPyHP.cp38-win_amd64.pyd +0 -0
  4. snappy/__init__.py +299 -402
  5. snappy/app.py +70 -20
  6. snappy/browser.py +18 -17
  7. snappy/canonical.py +249 -0
  8. snappy/{verify/cusp_shapes.py → cusps/__init__.py} +8 -18
  9. snappy/cusps/cusp_area_matrix.py +101 -0
  10. snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +23 -39
  11. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  12. snappy/cusps/test.py +21 -0
  13. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  14. snappy/database.py +10 -9
  15. snappy/decorated_isosig.py +337 -114
  16. snappy/dev/extended_ptolemy/complexVolumesClosed.py +40 -7
  17. snappy/dev/extended_ptolemy/extended.py +3 -3
  18. snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
  19. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +1 -1
  20. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  21. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  22. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  23. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  24. snappy/doc/_sources/additional_classes.rst.txt +40 -40
  25. snappy/doc/_sources/bugs.rst.txt +14 -14
  26. snappy/doc/_sources/censuses.rst.txt +51 -51
  27. snappy/doc/_sources/credits.rst.txt +75 -75
  28. snappy/doc/_sources/development.rst.txt +259 -239
  29. snappy/doc/_sources/index.rst.txt +182 -115
  30. snappy/doc/_sources/installing.rst.txt +247 -264
  31. snappy/doc/_sources/manifold.rst.txt +6 -6
  32. snappy/doc/_sources/manifoldhp.rst.txt +46 -46
  33. snappy/doc/_sources/news.rst.txt +355 -283
  34. snappy/doc/_sources/other.rst.txt +25 -25
  35. snappy/doc/_sources/platonic_census.rst.txt +20 -20
  36. snappy/doc/_sources/plink.rst.txt +102 -102
  37. snappy/doc/_sources/ptolemy.rst.txt +66 -66
  38. snappy/doc/_sources/ptolemy_classes.rst.txt +42 -42
  39. snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -297
  40. snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -363
  41. snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -301
  42. snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -61
  43. snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -105
  44. snappy/doc/_sources/screenshots.rst.txt +21 -21
  45. snappy/doc/_sources/snap.rst.txt +87 -87
  46. snappy/doc/_sources/snappy.rst.txt +28 -28
  47. snappy/doc/_sources/spherogram.rst.txt +103 -103
  48. snappy/doc/_sources/todo.rst.txt +47 -47
  49. snappy/doc/_sources/triangulation.rst.txt +11 -11
  50. snappy/doc/_sources/tutorial.rst.txt +49 -49
  51. snappy/doc/_sources/verify.rst.txt +210 -150
  52. snappy/doc/_sources/verify_internals.rst.txt +79 -90
  53. snappy/doc/_static/basic.css +924 -902
  54. snappy/doc/_static/css/badge_only.css +1 -1
  55. snappy/doc/_static/css/theme.css +1 -1
  56. snappy/doc/_static/doctools.js +1 -1
  57. snappy/doc/_static/documentation_options.js +12 -13
  58. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  59. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  60. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  61. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  62. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  63. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  64. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  65. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  66. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  67. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  68. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  69. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  70. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  71. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  72. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  73. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  74. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  75. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  76. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  77. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  78. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  79. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  80. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  81. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  82. snappy/doc/_static/js/versions.js +228 -0
  83. snappy/doc/_static/language_data.js +199 -199
  84. snappy/doc/_static/pygments.css +74 -73
  85. snappy/doc/_static/searchtools.js +125 -71
  86. snappy/doc/_static/snappy_furo.css +33 -33
  87. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
  88. snappy/doc/_static/sphinx_highlight.js +13 -3
  89. snappy/doc/additional_classes.html +1499 -1330
  90. snappy/doc/bugs.html +131 -134
  91. snappy/doc/censuses.html +426 -445
  92. snappy/doc/credits.html +180 -183
  93. snappy/doc/development.html +383 -363
  94. snappy/doc/genindex.html +1330 -1409
  95. snappy/doc/index.html +261 -206
  96. snappy/doc/installing.html +345 -363
  97. snappy/doc/manifold.html +3451 -2839
  98. snappy/doc/manifoldhp.html +179 -182
  99. snappy/doc/news.html +387 -329
  100. snappy/doc/objects.inv +0 -0
  101. snappy/doc/other.html +160 -162
  102. snappy/doc/platonic_census.html +374 -377
  103. snappy/doc/plink.html +209 -212
  104. snappy/doc/ptolemy.html +253 -255
  105. snappy/doc/ptolemy_classes.html +1143 -1146
  106. snappy/doc/ptolemy_examples1.html +408 -410
  107. snappy/doc/ptolemy_examples2.html +470 -473
  108. snappy/doc/ptolemy_examples3.html +413 -416
  109. snappy/doc/ptolemy_examples4.html +194 -197
  110. snappy/doc/ptolemy_prelim.html +247 -250
  111. snappy/doc/py-modindex.html +164 -167
  112. snappy/doc/screenshots.html +140 -142
  113. snappy/doc/search.html +134 -137
  114. snappy/doc/searchindex.js +1 -1
  115. snappy/doc/snap.html +201 -204
  116. snappy/doc/snappy.html +180 -182
  117. snappy/doc/spherogram.html +1210 -1213
  118. snappy/doc/todo.html +165 -168
  119. snappy/doc/triangulation.html +1583 -1474
  120. snappy/doc/tutorial.html +158 -161
  121. snappy/doc/verify.html +329 -275
  122. snappy/doc/verify_internals.html +1234 -1691
  123. snappy/drilling/__init__.py +153 -235
  124. snappy/drilling/barycentric.py +103 -0
  125. snappy/drilling/constants.py +0 -2
  126. snappy/drilling/crush.py +56 -130
  127. snappy/drilling/cusps.py +12 -6
  128. snappy/drilling/debug.py +2 -1
  129. snappy/drilling/exceptions.py +7 -40
  130. snappy/drilling/moves.py +302 -243
  131. snappy/drilling/perturb.py +63 -37
  132. snappy/drilling/shorten.py +36 -0
  133. snappy/drilling/subdivide.py +0 -5
  134. snappy/drilling/test.py +23 -0
  135. snappy/drilling/test_cases.py +126 -0
  136. snappy/drilling/tracing.py +9 -37
  137. snappy/exceptions.py +18 -5
  138. snappy/exterior_to_link/barycentric_geometry.py +2 -4
  139. snappy/exterior_to_link/main.py +8 -7
  140. snappy/exterior_to_link/mcomplex_with_link.py +2 -2
  141. snappy/exterior_to_link/rational_linear_algebra.py +1 -1
  142. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
  143. snappy/exterior_to_link/test.py +21 -33
  144. snappy/geometric_structure/__init__.py +212 -0
  145. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  146. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  147. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  148. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  149. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  150. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  151. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  152. snappy/geometric_structure/geodesic/__init__.py +0 -0
  153. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  154. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  155. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  156. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  157. snappy/geometric_structure/geodesic/constants.py +6 -0
  158. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  159. snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
  160. snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
  161. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  162. snappy/geometric_structure/geodesic/line.py +30 -0
  163. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  164. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  165. snappy/geometric_structure/test.py +22 -0
  166. snappy/gui.py +23 -13
  167. snappy/horoviewer.py +7 -7
  168. snappy/hyperboloid/__init__.py +96 -31
  169. snappy/hyperboloid/distances.py +245 -0
  170. snappy/hyperboloid/horoball.py +19 -0
  171. snappy/hyperboloid/line.py +35 -0
  172. snappy/hyperboloid/point.py +9 -0
  173. snappy/hyperboloid/triangle.py +29 -0
  174. snappy/isometry_signature.py +382 -0
  175. snappy/len_spec/__init__.py +596 -0
  176. snappy/len_spec/geodesic_info.py +110 -0
  177. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  178. snappy/len_spec/geodesic_piece.py +143 -0
  179. snappy/len_spec/geometric_structure.py +182 -0
  180. snappy/len_spec/geometry.py +80 -0
  181. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  182. snappy/len_spec/spine.py +206 -0
  183. snappy/len_spec/test.py +24 -0
  184. snappy/len_spec/test_cases.py +69 -0
  185. snappy/len_spec/tile.py +275 -0
  186. snappy/len_spec/word.py +86 -0
  187. snappy/math_basics.py +39 -13
  188. snappy/matrix.py +52 -9
  189. snappy/number.py +12 -6
  190. snappy/numeric_output_checker.py +2 -3
  191. snappy/pari.py +8 -4
  192. snappy/phone_home.py +2 -1
  193. snappy/polyviewer.py +8 -8
  194. snappy/ptolemy/__init__.py +1 -1
  195. snappy/ptolemy/component.py +2 -2
  196. snappy/ptolemy/coordinates.py +25 -25
  197. snappy/ptolemy/findLoops.py +9 -9
  198. snappy/ptolemy/manifoldMethods.py +27 -29
  199. snappy/ptolemy/polynomial.py +50 -57
  200. snappy/ptolemy/processFileBase.py +60 -0
  201. snappy/ptolemy/ptolemyVariety.py +109 -41
  202. snappy/ptolemy/reginaWrapper.py +4 -4
  203. snappy/ptolemy/rur.py +1 -1
  204. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
  205. snappy/ptolemy/test.py +99 -54
  206. snappy/ptolemy/utilities.py +1 -1
  207. snappy/raytracing/__init__.py +64 -0
  208. snappy/raytracing/additional_horospheres.py +64 -0
  209. snappy/raytracing/additional_len_spec_choices.py +63 -0
  210. snappy/raytracing/cohomology_fractal.py +0 -3
  211. snappy/raytracing/eyeball.py +123 -0
  212. snappy/raytracing/finite_raytracing_data.py +17 -17
  213. snappy/raytracing/finite_viewer.py +15 -15
  214. snappy/raytracing/geodesic_tube_info.py +93 -63
  215. snappy/raytracing/geodesics.py +94 -64
  216. snappy/raytracing/geodesics_window.py +56 -34
  217. snappy/raytracing/gui_utilities.py +21 -6
  218. snappy/raytracing/hyperboloid_navigation.py +29 -4
  219. snappy/raytracing/hyperboloid_utilities.py +73 -73
  220. snappy/raytracing/ideal_raytracing_data.py +121 -91
  221. snappy/raytracing/inside_viewer.py +199 -66
  222. snappy/raytracing/pack.py +22 -0
  223. snappy/raytracing/raytracing_data.py +37 -25
  224. snappy/raytracing/raytracing_view.py +70 -65
  225. snappy/raytracing/shaders/Eye.png +0 -0
  226. snappy/raytracing/shaders/NonGeometric.png +0 -0
  227. snappy/raytracing/shaders/__init__.py +39 -3
  228. snappy/raytracing/shaders/fragment.glsl +451 -133
  229. snappy/raytracing/test.py +29 -0
  230. snappy/raytracing/tooltip.py +146 -0
  231. snappy/raytracing/upper_halfspace_utilities.py +42 -9
  232. snappy/sage_helper.py +67 -134
  233. snappy/settings.py +90 -77
  234. snappy/shell.py +2 -0
  235. snappy/snap/character_varieties.py +2 -2
  236. snappy/snap/find_field.py +4 -3
  237. snappy/snap/fundamental_polyhedron.py +2 -2
  238. snappy/snap/kernel_structures.py +5 -1
  239. snappy/snap/nsagetools.py +9 -8
  240. snappy/snap/peripheral/dual_cellulation.py +4 -3
  241. snappy/snap/peripheral/peripheral.py +2 -2
  242. snappy/snap/peripheral/surface.py +5 -5
  243. snappy/snap/peripheral/test.py +1 -1
  244. snappy/snap/polished_reps.py +8 -8
  245. snappy/snap/slice_obs_HKL.py +16 -14
  246. snappy/snap/t3mlite/arrow.py +3 -3
  247. snappy/snap/t3mlite/edge.py +3 -3
  248. snappy/snap/t3mlite/homology.py +2 -2
  249. snappy/snap/t3mlite/mcomplex.py +3 -3
  250. snappy/snap/t3mlite/simplex.py +12 -0
  251. snappy/snap/t3mlite/spun.py +18 -17
  252. snappy/snap/t3mlite/test_vs_regina.py +4 -4
  253. snappy/snap/test.py +37 -53
  254. snappy/snap/utilities.py +4 -5
  255. snappy/test.py +121 -138
  256. snappy/test_cases.py +263 -0
  257. snappy/testing.py +131 -0
  258. snappy/tiling/__init__.py +2 -0
  259. snappy/tiling/canonical_key_dict.py +59 -0
  260. snappy/tiling/dict_based_set.py +79 -0
  261. snappy/tiling/floor.py +49 -0
  262. snappy/tiling/hyperboloid_dict.py +54 -0
  263. snappy/tiling/iter_utils.py +78 -0
  264. snappy/tiling/lifted_tetrahedron.py +22 -0
  265. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  266. snappy/tiling/real_hash_dict.py +164 -0
  267. snappy/tiling/test.py +23 -0
  268. snappy/tiling/tile.py +215 -0
  269. snappy/tiling/triangle.py +33 -0
  270. snappy/tkterminal.py +113 -84
  271. snappy/twister/main.py +1 -7
  272. snappy/twister/twister_core.cp38-win_amd64.pyd +0 -0
  273. snappy/upper_halfspace/__init__.py +78 -17
  274. snappy/verify/__init__.py +3 -7
  275. snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
  276. snappy/verify/complex_volume/adjust_torsion.py +1 -2
  277. snappy/verify/complex_volume/closed.py +13 -13
  278. snappy/verify/complex_volume/cusped.py +6 -6
  279. snappy/verify/complex_volume/extended_bloch.py +5 -8
  280. snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
  281. snappy/verify/edge_equations.py +80 -0
  282. snappy/verify/exceptions.py +0 -55
  283. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
  284. snappy/verify/interval_newton_shapes_engine.py +7 -5
  285. snappy/verify/interval_tree.py +5 -5
  286. snappy/verify/krawczyk_shapes_engine.py +17 -18
  287. snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
  288. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
  289. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
  290. snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
  291. snappy/verify/shapes.py +5 -3
  292. snappy/verify/short_slopes.py +39 -41
  293. snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
  294. snappy/verify/test.py +57 -60
  295. snappy/verify/upper_halfspace/extended_matrix.py +1 -1
  296. snappy/verify/upper_halfspace/finite_point.py +3 -4
  297. snappy/verify/upper_halfspace/ideal_point.py +9 -9
  298. snappy/verify/volume.py +2 -2
  299. snappy/version.py +2 -2
  300. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +14 -10
  301. snappy-3.2.dist-info/RECORD +503 -0
  302. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  303. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  304. snappy/__pycache__/__init__.cpython-38.pyc +0 -0
  305. snappy/__pycache__/browser.cpython-38.pyc +0 -0
  306. snappy/__pycache__/cache.cpython-38.pyc +0 -0
  307. snappy/__pycache__/database.cpython-38.pyc +0 -0
  308. snappy/__pycache__/db_utilities.cpython-38.pyc +0 -0
  309. snappy/__pycache__/decorated_isosig.cpython-38.pyc +0 -0
  310. snappy/__pycache__/exceptions.cpython-38.pyc +0 -0
  311. snappy/__pycache__/export_stl.cpython-38.pyc +0 -0
  312. snappy/__pycache__/filedialog.cpython-38.pyc +0 -0
  313. snappy/__pycache__/gui.cpython-38.pyc +0 -0
  314. snappy/__pycache__/horoviewer.cpython-38.pyc +0 -0
  315. snappy/__pycache__/math_basics.cpython-38.pyc +0 -0
  316. snappy/__pycache__/matrix.cpython-38.pyc +0 -0
  317. snappy/__pycache__/number.cpython-38.pyc +0 -0
  318. snappy/__pycache__/numeric_output_checker.cpython-38.pyc +0 -0
  319. snappy/__pycache__/pari.cpython-38.pyc +0 -0
  320. snappy/__pycache__/polyviewer.cpython-38.pyc +0 -0
  321. snappy/__pycache__/sage_helper.cpython-38.pyc +0 -0
  322. snappy/__pycache__/version.cpython-38.pyc +0 -0
  323. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  324. snappy/doc/_static/jquery-3.6.0.js +0 -10881
  325. snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
  326. snappy/doc/_static/js/html5shiv.min.js +0 -4
  327. snappy/doc/_static/underscore-1.13.1.js +0 -2042
  328. snappy/doc/_static/underscore.js +0 -6
  329. snappy/doc/verify_canon.html +0 -304
  330. snappy/drilling/__pycache__/__init__.cpython-38.pyc +0 -0
  331. snappy/drilling/__pycache__/constants.cpython-38.pyc +0 -0
  332. snappy/drilling/__pycache__/crush.cpython-38.pyc +0 -0
  333. snappy/drilling/__pycache__/cusps.cpython-38.pyc +0 -0
  334. snappy/drilling/__pycache__/debug.cpython-38.pyc +0 -0
  335. snappy/drilling/__pycache__/epsilons.cpython-38.pyc +0 -0
  336. snappy/drilling/__pycache__/exceptions.cpython-38.pyc +0 -0
  337. snappy/drilling/__pycache__/fixed_points.cpython-38.pyc +0 -0
  338. snappy/drilling/__pycache__/geodesic_info.cpython-38.pyc +0 -0
  339. snappy/drilling/__pycache__/geodesic_tube.cpython-38.pyc +0 -0
  340. snappy/drilling/__pycache__/geometric_structure.cpython-38.pyc +0 -0
  341. snappy/drilling/__pycache__/line.cpython-38.pyc +0 -0
  342. snappy/drilling/__pycache__/moves.cpython-38.pyc +0 -0
  343. snappy/drilling/__pycache__/peripheral_curves.cpython-38.pyc +0 -0
  344. snappy/drilling/__pycache__/perturb.cpython-38.pyc +0 -0
  345. snappy/drilling/__pycache__/quotient_space.cpython-38.pyc +0 -0
  346. snappy/drilling/__pycache__/spatial_dict.cpython-38.pyc +0 -0
  347. snappy/drilling/__pycache__/subdivide.cpython-38.pyc +0 -0
  348. snappy/drilling/__pycache__/tracing.cpython-38.pyc +0 -0
  349. snappy/drilling/geodesic_tube.py +0 -441
  350. snappy/drilling/geometric_structure.py +0 -366
  351. snappy/drilling/line.py +0 -122
  352. snappy/drilling/quotient_space.py +0 -94
  353. snappy/drilling/spatial_dict.py +0 -128
  354. snappy/exterior_to_link/__pycache__/__init__.cpython-38.pyc +0 -0
  355. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-38.pyc +0 -0
  356. snappy/exterior_to_link/__pycache__/exceptions.cpython-38.pyc +0 -0
  357. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-38.pyc +0 -0
  358. snappy/exterior_to_link/__pycache__/link_projection.cpython-38.pyc +0 -0
  359. snappy/exterior_to_link/__pycache__/main.cpython-38.pyc +0 -0
  360. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-38.pyc +0 -0
  361. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-38.pyc +0 -0
  362. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-38.pyc +0 -0
  363. snappy/exterior_to_link/__pycache__/pl_utils.cpython-38.pyc +0 -0
  364. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-38.pyc +0 -0
  365. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-38.pyc +0 -0
  366. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-38.pyc +0 -0
  367. snappy/exterior_to_link/__pycache__/stored_moves.cpython-38.pyc +0 -0
  368. snappy/hyperboloid/__pycache__/__init__.cpython-38.pyc +0 -0
  369. snappy/manifolds/__pycache__/__init__.cpython-38.pyc +0 -0
  370. snappy/ptolemy/__pycache__/__init__.cpython-38.pyc +0 -0
  371. snappy/ptolemy/__pycache__/component.cpython-38.pyc +0 -0
  372. snappy/ptolemy/__pycache__/coordinates.cpython-38.pyc +0 -0
  373. snappy/ptolemy/__pycache__/fieldExtensions.cpython-38.pyc +0 -0
  374. snappy/ptolemy/__pycache__/findLoops.cpython-38.pyc +0 -0
  375. snappy/ptolemy/__pycache__/homology.cpython-38.pyc +0 -0
  376. snappy/ptolemy/__pycache__/manifoldMethods.cpython-38.pyc +0 -0
  377. snappy/ptolemy/__pycache__/matrix.cpython-38.pyc +0 -0
  378. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-38.pyc +0 -0
  379. snappy/ptolemy/__pycache__/polynomial.cpython-38.pyc +0 -0
  380. snappy/ptolemy/__pycache__/processComponents.cpython-38.pyc +0 -0
  381. snappy/ptolemy/__pycache__/processFileBase.cpython-38.pyc +0 -0
  382. snappy/ptolemy/__pycache__/processFileDispatch.cpython-38.pyc +0 -0
  383. snappy/ptolemy/__pycache__/processMagmaFile.cpython-38.pyc +0 -0
  384. snappy/ptolemy/__pycache__/processRurFile.cpython-38.pyc +0 -0
  385. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-38.pyc +0 -0
  386. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-38.pyc +0 -0
  387. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-38.pyc +0 -0
  388. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
  389. snappy/ptolemy/__pycache__/rur.cpython-38.pyc +0 -0
  390. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
  391. snappy/ptolemy/__pycache__/utilities.cpython-38.pyc +0 -0
  392. snappy/snap/__pycache__/__init__.cpython-38.pyc +0 -0
  393. snappy/snap/__pycache__/character_varieties.cpython-38.pyc +0 -0
  394. snappy/snap/__pycache__/fundamental_polyhedron.cpython-38.pyc +0 -0
  395. snappy/snap/__pycache__/interval_reps.cpython-38.pyc +0 -0
  396. snappy/snap/__pycache__/kernel_structures.cpython-38.pyc +0 -0
  397. snappy/snap/__pycache__/mcomplex_base.cpython-38.pyc +0 -0
  398. snappy/snap/__pycache__/nsagetools.cpython-38.pyc +0 -0
  399. snappy/snap/__pycache__/polished_reps.cpython-38.pyc +0 -0
  400. snappy/snap/__pycache__/shapes.cpython-38.pyc +0 -0
  401. snappy/snap/__pycache__/slice_obs_HKL.cpython-38.pyc +0 -0
  402. snappy/snap/__pycache__/utilities.cpython-38.pyc +0 -0
  403. snappy/snap/peripheral/__pycache__/__init__.cpython-38.pyc +0 -0
  404. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-38.pyc +0 -0
  405. snappy/snap/peripheral/__pycache__/link.cpython-38.pyc +0 -0
  406. snappy/snap/peripheral/__pycache__/peripheral.cpython-38.pyc +0 -0
  407. snappy/snap/peripheral/__pycache__/surface.cpython-38.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/__init__.cpython-38.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/arrow.cpython-38.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/corner.cpython-38.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/edge.cpython-38.pyc +0 -0
  412. snappy/snap/t3mlite/__pycache__/face.cpython-38.pyc +0 -0
  413. snappy/snap/t3mlite/__pycache__/files.cpython-38.pyc +0 -0
  414. snappy/snap/t3mlite/__pycache__/homology.cpython-38.pyc +0 -0
  415. snappy/snap/t3mlite/__pycache__/linalg.cpython-38.pyc +0 -0
  416. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-38.pyc +0 -0
  417. snappy/snap/t3mlite/__pycache__/perm4.cpython-38.pyc +0 -0
  418. snappy/snap/t3mlite/__pycache__/simplex.cpython-38.pyc +0 -0
  419. snappy/snap/t3mlite/__pycache__/spun.cpython-38.pyc +0 -0
  420. snappy/snap/t3mlite/__pycache__/surface.cpython-38.pyc +0 -0
  421. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-38.pyc +0 -0
  422. snappy/snap/t3mlite/__pycache__/vertex.cpython-38.pyc +0 -0
  423. snappy/togl/__init__.py +0 -3
  424. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  425. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  426. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  427. snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
  428. snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
  429. snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
  430. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  431. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  432. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  433. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  434. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  435. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  436. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  437. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  438. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  439. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  440. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  441. snappy/twister/__pycache__/__init__.cpython-38.pyc +0 -0
  442. snappy/twister/__pycache__/main.cpython-38.pyc +0 -0
  443. snappy/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
  444. snappy/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
  445. snappy/verify/__pycache__/__init__.cpython-38.pyc +0 -0
  446. snappy/verify/__pycache__/cuspCrossSection.cpython-38.pyc +0 -0
  447. snappy/verify/__pycache__/cuspTranslations.cpython-38.pyc +0 -0
  448. snappy/verify/__pycache__/cusp_areas.cpython-38.pyc +0 -0
  449. snappy/verify/__pycache__/cusp_shapes.cpython-38.pyc +0 -0
  450. snappy/verify/__pycache__/exceptions.cpython-38.pyc +0 -0
  451. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-38.pyc +0 -0
  452. snappy/verify/__pycache__/interval_tree.cpython-38.pyc +0 -0
  453. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-38.pyc +0 -0
  454. snappy/verify/__pycache__/realAlgebra.cpython-38.pyc +0 -0
  455. snappy/verify/__pycache__/shapes.cpython-38.pyc +0 -0
  456. snappy/verify/__pycache__/short_slopes.cpython-38.pyc +0 -0
  457. snappy/verify/__pycache__/squareExtensions.cpython-38.pyc +0 -0
  458. snappy/verify/__pycache__/verifyCanonical.cpython-38.pyc +0 -0
  459. snappy/verify/__pycache__/verifyHyperbolicity.cpython-38.pyc +0 -0
  460. snappy/verify/__pycache__/volume.cpython-38.pyc +0 -0
  461. snappy/verify/complex_volume/__pycache__/__init__.cpython-38.pyc +0 -0
  462. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-38.pyc +0 -0
  463. snappy/verify/complex_volume/__pycache__/closed.cpython-38.pyc +0 -0
  464. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-38.pyc +0 -0
  465. snappy/verify/complex_volume/__pycache__/cusped.cpython-38.pyc +0 -0
  466. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-38.pyc +0 -0
  467. snappy/verify/cuspCrossSection.py +0 -1422
  468. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-38.pyc +0 -0
  469. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-38.pyc +0 -0
  470. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-38.pyc +0 -0
  471. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
  472. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-38.pyc +0 -0
  473. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-38.pyc +0 -0
  474. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
  475. snappy-3.1.1.dist-info/RECORD +0 -575
  476. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,275 @@
1
+ from ..tiling.lifted_tetrahedron import LiftedTetrahedron
2
+ from ..tiling.lifted_tetrahedron_set import (LiftedTetrahedronSet,
3
+ get_lifted_tetrahedron_set)
4
+ from ..tiling.iter_utils import merge_iterables
5
+ from ..tiling.hyperboloid_dict import get_hyperboloid_dict
6
+ from ..tiling.dict_based_set import DictBasedSet
7
+ from ..hyperboloid import o13_inverse
8
+ from ..snap.t3mlite import Mcomplex, simplex
9
+ from ..math_basics import correct_min, correct_max, lower # type: ignore
10
+ from ..matrix import make_identity_matrix
11
+
12
+ from .geometry import (lower_bound_geodesic_length,
13
+ lower_bound_distance_r13_point_truncated_tetrahedron)
14
+
15
+ import heapq
16
+ from typing import List, Sequence
17
+
18
+ class LengthSpectrumTile:
19
+ """
20
+ Represents a translate of the fundamental domain by the given
21
+ o13_matrix used to tile H^3. A corresponding word in the unsimplified
22
+ fundamental group is also given.
23
+
24
+ Note that we drop the base tile where the o13_matrix is the identity.
25
+
26
+ Thus, for every LengthSpectrumTile, the matrix determines a possibly
27
+ degenerate geodesic. Here degenerate means that the two endpoints
28
+ coincide (and the geodesic has length zero) since the matrix is parabolic.
29
+
30
+ LengthSpectrumTile's are emitted by compute_length_spectrum_tiles with
31
+ increasing lower_bound_geodesic_length (more precisely, increasing
32
+ left endpoint if intervals are used). If we are interested only geodesics
33
+ up to length L, we need to iterate over the tiles emitted by
34
+ compute_length_sepctrum_tiles until we have tile where
35
+ lower_bound_geodesic_length is larger than L.
36
+
37
+ Note that the length of the geodesic associated to the o13_matrix can
38
+ actually be shorter than lower_bound_geodesic_length. This can happen
39
+ since we can have a parabolic matrix or a matrix conjugate to an
40
+ earlier matrix we have seen encoding a geodesic we already had seen
41
+ earlier in a different way.
42
+
43
+ This class is similar to snappy.tiling.tile.Tile and
44
+ snappy.tiling.tile._PendingLiftedTetrahedron but specialized to the
45
+ length spectrum and corresponds to tiling by fundamental domains.
46
+ """
47
+
48
+ def __init__(self,
49
+ word : List[int],
50
+ o13_matrix,
51
+ lower_bound_geodesic_length):
52
+ self.word = word
53
+ self.o13_matrix = o13_matrix
54
+ self.lower_bound_geodesic_length = lower_bound_geodesic_length
55
+
56
+ self._key = lower(lower_bound_geodesic_length)
57
+
58
+ def __lt__(self, other):
59
+ """
60
+ Used so that we can merge streams of tiles with merge_iterables.
61
+ """
62
+ return self._key < other._key
63
+
64
+ def compute_length_spectrum_tiles(mcomplex : Mcomplex
65
+ ) -> Sequence[LengthSpectrumTile]:
66
+ """
67
+ Given the result of mcomplex_for_len_spec, provides a stream of tiles
68
+ suitable to compute the length spectrum.
69
+
70
+ More precisely, to know all geodesics up to length L, we need to
71
+ iterate the stream until we have a tile with
72
+ tile.lower_bound_geodesic_length > L.
73
+ """
74
+
75
+ # We spawn a separate tiling process for each tetrahedron.
76
+ # This process will start tiling a ball about the basepoint of
77
+ # the given tetrahedron and emits a stream of LengthSpectrumTile's
78
+ # with increasing lower_bound_geodesic_length.
79
+ #
80
+ # We need to merge the result of all these streams to find all
81
+ # geodesics (up to a certain length L).
82
+ #
83
+ # However, we might also find duplicates among these streams.
84
+ # We de-duplicate them here using the visited_dict.
85
+ #
86
+ # For more context:
87
+ # Recall that mcomplex_for_len_spec added a spine to the manifold.
88
+ # Each geodesic has to intersect that spine somewhere.
89
+ #
90
+ # However, the tiling process for one tetrahedron only takes into
91
+ # account the intersection of the spine with that particular
92
+ # tetrahedron.
93
+ #
94
+ # See _compute_length_spectrum_tiles_for_tetrahedron for more details.
95
+
96
+ max_neg_prod_equal, min_neg_prod_distinct = _max_min_prod(mcomplex)
97
+ visited_dict = DictBasedSet(
98
+ get_hyperboloid_dict(max_neg_prod_equal,
99
+ min_neg_prod_distinct,
100
+ mcomplex.verified))
101
+
102
+ # Add (non-translated) base point so that we do not emit the base tile
103
+ # with the identity matrix
104
+ visited_dict.add(mcomplex.R13_baseTetInCenter)
105
+
106
+ for tile in merge_iterables(
107
+ [ _compute_length_spectrum_tiles_for_tetrahedron(mcomplex, tet)
108
+ for tet in mcomplex.Tetrahedra ]):
109
+ if visited_dict.add(tile.o13_matrix * mcomplex.R13_baseTetInCenter):
110
+ yield tile
111
+
112
+ def _compute_length_spectrum_tiles_for_tetrahedron(
113
+ mcomplex, initial_tetrahedron) -> Sequence[LengthSpectrumTile]:
114
+
115
+ """
116
+ Returns a stream of length spectrum tiles. To know all geodesics
117
+ up to length L that intersect the restriction of the spine to the
118
+ given tetrahedron, we need to iterate the stream until we have a tile
119
+ with tile.lower_bound_geodesic_length > L.
120
+ """
121
+
122
+ # We tile H^3 by lifted tetrahedra by covering a larger and larger ball
123
+ # about the incenter of the initial_tetrahedron.
124
+ #
125
+ # If a lifted tetrahedron is a translated copy of the initial_tetrahedron,
126
+ # we emit a LengthSpectrumTile. The lower_bound_geodesic_length is computed
127
+ # from the radius of the covered ball using lower_bound_geodesic_length.
128
+
129
+ initial_lifted_tetrahedron = LiftedTetrahedron(
130
+ initial_tetrahedron, make_identity_matrix(ring=mcomplex.RF, n=4))
131
+
132
+ # The pending pieces as priority queue - that is, a python list
133
+ # but we use heapq to access it.
134
+ pending_lifted_tetrahedra : Sequence[_PendingLiftedTetrahedron] = []
135
+
136
+ # Start tiling with the initial_tetrahedron.
137
+ heapq.heappush(
138
+ pending_lifted_tetrahedra,
139
+ _PendingLiftedTetrahedron(
140
+ [], initial_lifted_tetrahedron, mcomplex.RF(0)))
141
+
142
+ max_neg_prod_equal, min_neg_prod_distinct = _max_min_prod(mcomplex)
143
+
144
+ # Initialize data structure recording which lifted tetrahedra have
145
+ # already been visited while tiling H^3.
146
+ visited_lifted_tetrahedra : LiftedTetrahedronSet = (
147
+ get_lifted_tetrahedron_set(
148
+ base_point=mcomplex.R13_baseTetInCenter,
149
+ canonical_keys_function=None,
150
+ act_on_base_point_by_inverse=False,
151
+ max_neg_prod_equal=max_neg_prod_equal,
152
+ min_neg_prod_distinct=min_neg_prod_distinct,
153
+ verified=mcomplex.verified))
154
+
155
+ while True:
156
+ pending_lifted_tetrahedron : _PendingLiftedTetrahedron = (
157
+ heapq.heappop(pending_lifted_tetrahedra))
158
+
159
+ tet = pending_lifted_tetrahedron.lifted_tetrahedron.tet
160
+ m = pending_lifted_tetrahedron.lifted_tetrahedron.o13_matrix
161
+
162
+ if tet is initial_tetrahedron:
163
+ # Emit Tile
164
+ yield LengthSpectrumTile(
165
+ pending_lifted_tetrahedron.word,
166
+ pending_lifted_tetrahedron.lifted_tetrahedron.o13_matrix,
167
+ lower_bound_geodesic_length(
168
+ pending_lifted_tetrahedron.lower_bound_distance,
169
+ initial_tetrahedron.inv_spine_cosh))
170
+
171
+ # For all faces ...
172
+ for f, new_tet in tet.Neighbor.items():
173
+ # ... except the one that was used to reach this lifted tetrahedron
174
+ if f == pending_lifted_tetrahedron.entry_cell:
175
+ continue
176
+
177
+ entry_face = tet.Gluing[f].image(f)
178
+
179
+ # Inverse of tet.O13_matrices[f]
180
+ new_m = m * new_tet.O13_matrices[entry_face]
181
+ new_lifted_tetrahedron = LiftedTetrahedron(new_tet, new_m)
182
+
183
+ if not visited_lifted_tetrahedra.add(new_lifted_tetrahedron):
184
+ continue
185
+
186
+ # Compute word
187
+ word = pending_lifted_tetrahedron.word
188
+ g = new_tet.GeneratorsInfo[entry_face]
189
+ if g != 0:
190
+ word = word + [ -g ]
191
+
192
+ # We want to compute the distance of the spine_center to the
193
+ # lifted tetrahedron.
194
+ # However, it is cheaper to apply the inverse matrix to the
195
+ # spine center rather than the matrix to the tetrahedron.
196
+ lifted_spine_center = (
197
+ o13_inverse(new_m) * initial_tetrahedron.spine_center)
198
+
199
+ heapq.heappush(
200
+ pending_lifted_tetrahedra,
201
+ _PendingLiftedTetrahedron(
202
+ word,
203
+ new_lifted_tetrahedron,
204
+ lower_bound_distance_r13_point_truncated_tetrahedron(
205
+ lifted_spine_center,
206
+ new_tet,
207
+ mcomplex.verified),
208
+ entry_cell=entry_face))
209
+
210
+ class _PendingLiftedTetrahedron:
211
+ """
212
+ A lifted tetrahedron that still needs to be processed to tile
213
+ together with the face used to reach this tetrahedron.
214
+
215
+ The < operator is overloaded so that the piece with the lowest
216
+ lower_bound will be picked up next by a priority queue.
217
+
218
+ If pieces are processed in this order, then the lower_bound of the
219
+ next piece will actually be a lower bound for the distance between L
220
+ and the lifted tetrahedron (with other pending pieces for the same
221
+ lifted tetrahedron having higher values for lower_bound and thus
222
+ being further down the queue).
223
+ """
224
+
225
+ def __init__(self,
226
+ word,
227
+ lifted_tetrahedron : LiftedTetrahedron,
228
+ lower_bound_distance,
229
+ entry_cell : int = simplex.T):
230
+ self.word = word
231
+ self.lifted_tetrahedron = lifted_tetrahedron
232
+ self.lower_bound_distance = lower_bound_distance
233
+
234
+ # Either element of simplex.ZeroSubsimplices (if piece was reached
235
+ # through another piece) or simplex.T (if this pending piece was
236
+ # used to start tiling).
237
+ self.entry_cell = entry_cell
238
+
239
+ # For convenience, lower_bound is an interval but it is only
240
+ # the left value of the interval that is relevant and that we
241
+ # should use: A < B can be False for two intervals even
242
+ # when A's left value is lower than B's left value.
243
+ self._key = lower(lower_bound_distance)
244
+
245
+ def __lt__(self, other):
246
+ return self._key < other._key
247
+
248
+ def _max_min_prod(mcomplex):
249
+ min_neg_prod_distinct = (mcomplex.baseTetInRadius/2).cosh()
250
+ if mcomplex.verified:
251
+ return (min_neg_prod_distinct, min_neg_prod_distinct)
252
+ else:
253
+ max_neg_prod_equal = min(
254
+ min_neg_prod_distinct,
255
+ 1 + _compute_epsilon(mcomplex.RF))
256
+ return (max_neg_prod_equal, min_neg_prod_distinct)
257
+
258
+ def _compute_epsilon(RF):
259
+ p = RF.precision()
260
+
261
+ # We try to be a factor of at least 10^6 smaller than
262
+ # 1/_compute_epsilon_inverse(RF) in hyperboloid_dict.py.
263
+ #
264
+ # This factor will even grow larger as the precision increases.
265
+ #
266
+ # That way, we will hopefully fail in _equality_predicate
267
+ # in hyperboloid_dict rather than failing by not hashing together
268
+ # lifted tetrahedra that should be the same but are not recognised
269
+ # as such because of numerical error.
270
+
271
+ result = RF(1e-5)
272
+ if p > 53:
273
+ result *= RF(0.5) ** ((p - 53) / 2)
274
+
275
+ return result
@@ -0,0 +1,86 @@
1
+ from ..SnapPy import reduce_list_word, inverse_list_word
2
+
3
+ from typing import List
4
+
5
+ def simplify_geodesic_word(word : List[int]) -> List[int]:
6
+ """
7
+ Simplifies given word. It can change the word by a conjugate or
8
+ invert it.
9
+
10
+ More precisely, it cancels pairs of generator and inverse. First if
11
+ they are next to each other and then if they are at opposite ends of
12
+ the word. It then cyclically rotates the word and its inverse to take
13
+ the lexicographically smallest when ordering the generators as
14
+ 1, -1, 2, -2, 3, -3, ...
15
+
16
+ >>> simplify_geodesic_word([])
17
+ []
18
+ >>> simplify_geodesic_word([1])
19
+ [1]
20
+ >>> simplify_geodesic_word([1, 2])
21
+ [1, 2]
22
+ >>> simplify_geodesic_word([-1, 2, -2, 1])
23
+ []
24
+ >>> simplify_geodesic_word([-1, 3, 2, -2, 1])
25
+ [3]
26
+ >>> simplify_geodesic_word([-1, 3, 4, 2, -2, 1])
27
+ [3, 4]
28
+ >>> simplify_geodesic_word([-1, 4, 3, 2, -2, 1])
29
+ [3, 4]
30
+ >>> simplify_geodesic_word([-1, -3, -4, 5, 2, -2, 1])
31
+ [3, -5, 4]
32
+ """
33
+
34
+ return (
35
+ _rotate_and_optionally_invert(
36
+ _cancel_conjugation(
37
+ reduce_list_word(word))))
38
+
39
+ def _cancel_conjugation(word : List[int]) -> List[int]:
40
+ """
41
+ Cancels pairs of generator and inverse at opposite ends of
42
+ given word.
43
+
44
+ >>> _cancel_conjugation([])
45
+ []
46
+ >>> _cancel_conjugation([1])
47
+ [1]
48
+ >>> _cancel_conjugation([1, -1])
49
+ []
50
+ >>> _cancel_conjugation([1, 2, -1])
51
+ [2]
52
+ >>> _cancel_conjugation([1, 2, 3, -1])
53
+ [2, 3]
54
+ """
55
+ n = len(word)
56
+ for i in range(n // 2):
57
+ k = n - i - 1
58
+ if word[i] != -word[k]:
59
+ return word[i:k+1]
60
+ return word[n // 2 : (n + 1) // 2]
61
+
62
+ def _rotate_and_optionally_invert(word : List[int]) -> List[int]:
63
+ """
64
+ Rotate word and its inverse to pick lexicographically smallest when
65
+ ordering the generators as 1, -1, 2, -2, 3, -3, ...
66
+
67
+ >>> _rotate_and_optionally_invert([3, 4, 5])
68
+ [3, 4, 5]
69
+ >>> _rotate_and_optionally_invert([4, 5, 3])
70
+ [3, 4, 5]
71
+ >>> _rotate_and_optionally_invert([-3])
72
+ [3]
73
+ >>> _rotate_and_optionally_invert([5, 3, 4, -3])
74
+ [3, 4, -3, 5]
75
+ """
76
+ n = len(word)
77
+
78
+ if n == 0:
79
+ return word
80
+
81
+ return min(
82
+ (candidates[i:] + candidates[:i]
83
+ for candidates in [ word, inverse_list_word(word) ]
84
+ for i in range(len(word))),
85
+ key=lambda w: [ 2 * l if l > 0 else 2 * -l + 1
86
+ for l in w ])
snappy/math_basics.py CHANGED
@@ -1,4 +1,5 @@
1
1
  from .sage_helper import _within_sage
2
+ from .exceptions import InsufficientPrecisionError
2
3
 
3
4
  from functools import reduce
4
5
  import operator
@@ -6,21 +7,30 @@ import operator
6
7
  __all__ = ['prod',
7
8
  'xgcd',
8
9
  'is_RealIntervalFieldElement',
10
+ 'is_ComplexIntervalFieldElement'
9
11
  'is_Interval',
10
12
  'correct_min',
11
- 'correct_max']
13
+ 'correct_max',
14
+ 'lower']
15
+
16
+ def is_Interval(x):
17
+ """
18
+ Returns True is x is either a real or complex interval as constructed
19
+ with RealIntervalField or ComplexIntervalField, respectively.
20
+ """
21
+ return is_RealIntervalFieldElement(x) or is_ComplexIntervalFieldElement(x)
12
22
 
13
23
  if _within_sage:
14
- from sage.all import prod, xgcd
15
- from sage.rings.real_mpfi import is_RealIntervalFieldElement
16
- from sage.rings.complex_interval import is_ComplexIntervalFieldElement
24
+ from .sage_helper import prod, xgcd
17
25
 
18
- def is_Interval(x):
19
- """
20
- Returns True is x is either a real or complex interval as constructed
21
- with RealIntervalField or ComplexIntervalField, respectively.
22
- """
23
- return is_RealIntervalFieldElement(x) or is_ComplexIntervalFieldElement(x)
26
+ from sage.rings.real_mpfi import RealIntervalFieldElement
27
+ from sage.rings.complex_interval import ComplexIntervalFieldElement
28
+
29
+ def is_RealIntervalFieldElement(x):
30
+ return isinstance(x, RealIntervalFieldElement)
31
+
32
+ def is_ComplexIntervalFieldElement(x):
33
+ return isinstance(x, ComplexIntervalFieldElement)
24
34
 
25
35
  else:
26
36
 
@@ -75,10 +85,16 @@ else:
75
85
  # so always return False.
76
86
  return False
77
87
 
78
- def is_Interval(x):
79
- return False
80
-
88
+ def is_ComplexIntervalFieldElement(x):
89
+ """
90
+ is_ComplexIntervalFieldElement returns whether x is a complex
91
+ interval (constructed with ComplexIntervalField(precision)(value)).
92
+ """
81
93
 
94
+ # We do not support interval arithmetic outside of SnapPy,
95
+ # so always return False.
96
+ return False
97
+
82
98
  def correct_min(l):
83
99
  """
84
100
  A version of min that works correctly even when l is a list of
@@ -148,3 +164,13 @@ def correct_max(l):
148
164
  raise ValueError(
149
165
  "Trying to compute max of array containing NaN.")
150
166
  return max(l)
167
+
168
+ def lower(x):
169
+ if is_RealIntervalFieldElement(x):
170
+ if x.is_NaN():
171
+ raise InsufficientPrecisionError(
172
+ "A NaN was encountered during a verified computation. "
173
+ "Increasing the precision will probably fix this.")
174
+ return x.lower()
175
+ else:
176
+ return x
snappy/matrix.py CHANGED
@@ -3,13 +3,51 @@ from .sage_helper import _within_sage
3
3
  from . import number
4
4
  from .math_basics import is_Interval
5
5
 
6
+ def snappy_make_vector(entries, *, ring=None):
7
+ return SimpleVector(entries, ring)
8
+
9
+ def snappy_make_matrix(entries, *, ring=None):
10
+ return SimpleMatrix(entries, ring)
11
+
12
+ def snappy_make_identity_matrix(*, n, ring):
13
+ return SimpleMatrix.identity(ring, n)
14
+
15
+ if _within_sage:
16
+ from sage.modules.free_module_element import vector as _sage_vector
17
+ from sage.matrix.constructor import matrix as _sage_matrix
18
+
19
+ def sage_make_vector(entries, *, ring=None):
20
+ if ring is None:
21
+ return _sage_vector(entries)
22
+ else:
23
+ return _sage_vector(ring, entries)
24
+
25
+ def sage_make_matrix(entries, *, ring=None):
26
+ if ring is None:
27
+ return _sage_matrix(entries)
28
+ else:
29
+ return _sage_matrix(ring, entries)
30
+
31
+ def sage_make_identity_matrix(*, n, ring):
32
+ return _sage_matrix.identity(ring, n)
33
+
34
+ make_vector = sage_make_vector
35
+ make_matrix = sage_make_matrix
36
+ make_identity_matrix = sage_make_identity_matrix
37
+ else:
38
+ make_vector = snappy_make_vector
39
+ make_matrix = snappy_make_matrix
40
+ make_identity_matrix = snappy_make_identity_matrix
6
41
 
7
42
  class SimpleVector(number.SupportsMultiplicationByNumber):
8
- def __init__(self, list_of_values):
9
- self.data = list_of_values
43
+ def __init__(self, entries, ring=None):
44
+ if ring is None:
45
+ self.data = entries
46
+ else:
47
+ self.data = [ ring(e) for e in entries ]
10
48
  try:
11
49
  self.type = type(self.data[0])
12
- self.shape = (len(list_of_values),)
50
+ self.shape = (len(entries),)
13
51
  except IndexError:
14
52
  self.type = type(0)
15
53
  self.shape = (0,)
@@ -36,7 +74,7 @@ class SimpleVector(number.SupportsMultiplicationByNumber):
36
74
  self.data[key] = value
37
75
 
38
76
  def entries(self):
39
- return [ x for x in self.data ]
77
+ return list(self.data)
40
78
 
41
79
  def list(self):
42
80
  return self.entries()
@@ -79,24 +117,29 @@ class SimpleVector(number.SupportsMultiplicationByNumber):
79
117
  def __truediv__(self, other):
80
118
  return SimpleVector([ x / other for x in self.data])
81
119
 
120
+ def __neg__(self):
121
+ return SimpleVector([ -e for e in self.data ])
122
+
82
123
  def base_ring(self):
83
124
  try:
84
125
  return self.data[0].parent()
85
126
  except IndexError:
86
127
  return self.type
87
128
 
88
-
89
129
  # A very basic matrix class
90
130
  class SimpleMatrix(number.SupportsMultiplicationByNumber):
91
131
  """
92
132
  A simple matrix class that wraps a list of lists.
93
133
  """
94
- def __init__(self, list_of_lists, ring=None):
134
+ def __init__(self, list_of_lists, base_ring=None, ring=None):
95
135
 
96
136
  if isinstance(list_of_lists, SimpleMatrix):
97
137
  list_of_lists = list_of_lists.data
98
- if ring is not None:
99
- self.data = [ [ ring(e) for e in row ] for row in list_of_lists ]
138
+ if base_ring is None:
139
+ base_ring = ring # Sage has deprecated "ring"
140
+ if base_ring is not None:
141
+ self.data = [ [ base_ring(e) for e in row ]
142
+ for row in list_of_lists ]
100
143
  else:
101
144
  # XXX
102
145
  # We should really copy the data here since otherwise we might
@@ -479,4 +522,4 @@ def mat_solve(m, v, epsilon=0):
479
522
  # Return the last column
480
523
  # (11/7, -164/133, 46/133, 32/133)
481
524
 
482
- return vector([ row[-1] for row in m1])
525
+ return make_vector([ row[-1] for row in m1])
snappy/number.py CHANGED
@@ -11,7 +11,7 @@ left_zeros = re.compile(r'0\.0*')
11
11
  precision_of_exact_GEN = pari(0).precision()
12
12
 
13
13
  if _within_sage:
14
- from sage.all import RealField, Integer, Rational, ZZ, QQ, RR, CC, SR
14
+ from .sage_helper import RealField, Integer, Rational, ZZ, QQ, RR, CC
15
15
  from sage.structure.parent import Parent
16
16
  from sage.structure.unique_representation import UniqueRepresentation
17
17
  from sage.categories.homset import Hom
@@ -66,8 +66,13 @@ if _within_sage:
66
66
  self._precision = precision
67
67
  self.register_coercion(MorphismToSPN(ZZ, self, self._precision))
68
68
  self.register_coercion(MorphismToSPN(QQ, self, self._precision))
69
- to_SR = Hom(self, SR, Sets())(lambda x: SR(x.sage()))
70
- SR.register_coercion(to_SR)
69
+ try:
70
+ from sage.symbolic.ring import SR
71
+ except ImportError:
72
+ pass
73
+ else:
74
+ to_SR = Hom(self, SR, Sets())(lambda x: SR(x.sage()))
75
+ SR.register_coercion(to_SR)
71
76
 
72
77
  def _repr_(self):
73
78
  return "SnapPy Numbers with %s bits precision" % self._precision
@@ -193,7 +198,7 @@ else: # We are not in Sage
193
198
 
194
199
  def __new__(cls, precision=53):
195
200
  if precision not in SnapPyNumbers._cache:
196
- obj = super(SnapPyNumbers, cls).__new__(cls)
201
+ obj = super().__new__(cls)
197
202
  obj._precision = precision
198
203
  SnapPyNumbers._cache[precision] = obj
199
204
  return obj
@@ -295,7 +300,8 @@ class Number(Number_baseclass):
295
300
  self.accuracy = self.decimal_precision
296
301
  else:
297
302
  if accuracy is None:
298
- accuracy = prec_words_to_dec(self.gen.sizeword())
303
+ accuracy = prec_bits_to_dec(64 * (self.gen.sizeword() - 2))
304
+
299
305
  self.accuracy = min(accuracy, self.decimal_precision)
300
306
  self._parent = SnapPyNumbers(self._precision)
301
307
  if _within_sage:
@@ -575,7 +581,7 @@ class Number(Number_baseclass):
575
581
  def sqrtn(self, n):
576
582
  """
577
583
  >>> r = Number(2.0, precision=100)
578
- >>> r.sqrtn(10)
584
+ >>> r.sqrtn(10) # doctest: +NUMERIC27
579
585
  (1.071773462536293164213006325023, 0.809016994374947424102293417183 + 0.587785252292473129168705954639*I)
580
586
  """
581
587
  a, b = self.gen.sqrtn(n, precision=self._precision)
@@ -319,7 +319,7 @@ class NumericOutputChecker(doctest.OutputChecker):
319
319
  return base_result + '\nReason for failure: ' + compare_result + '\n'
320
320
 
321
321
 
322
- def run_doctests(verbose=False):
322
+ def run_doctests(verbose=False, print_info=True):
323
323
  failed, attempted = 0, 0
324
324
 
325
325
  finder = doctest.DocTestFinder()
@@ -342,5 +342,4 @@ def run_doctests(verbose=False):
342
342
 
343
343
  return doctest.TestResults(failed, attempted)
344
344
 
345
-
346
- run_doctests.__name__ = 'NumericOutputChecker'
345
+ run_doctests.__name__ = __name__
snappy/pari.py CHANGED
@@ -3,7 +3,8 @@ Import pari and associated classes and functions here, to be more DRY,
3
3
  while supporting both old and new versions of cypari and sage.pari and
4
4
  accounting for all of the various idiosyncrasies.
5
5
  """
6
- from pkg_resources import parse_version
6
+
7
+ from packaging.version import parse as parse_version
7
8
  from .sage_helper import _within_sage
8
9
 
9
10
  if _within_sage:
@@ -13,11 +14,14 @@ if _within_sage:
13
14
  raise ValueError("you need a more recent version of SageMath")
14
15
  from sage.libs.pari import pari
15
16
  from cypari2 import Gen
16
- from cypari2.pari_instance import (prec_words_to_dec,
17
- prec_words_to_bits,
17
+ from cypari2.pari_instance import (prec_words_to_bits,
18
18
  prec_bits_to_dec,
19
19
  prec_dec_to_bits)
20
- from sage.all import PariError
20
+ try:
21
+ from sage.all import PariError
22
+ except ImportError:
23
+ from sage.libs.pari.all import PariError
24
+
21
25
  shut_up = lambda: None
22
26
  speak_up = lambda: None
23
27
 
snappy/phone_home.py CHANGED
@@ -1,7 +1,8 @@
1
1
  import sys
2
2
  from threading import Thread
3
3
  from .version import version as current
4
- from pkg_resources import parse_version
4
+ from packaging.version import parse as parse_version
5
+
5
6
  import ssl
6
7
  from urllib import request
7
8
  version_url = 'http://snappy.computop.org/current.txt'