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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (464) hide show
  1. snappy/CyOpenGL.cpython-39-darwin.so +0 -0
  2. snappy/SnapPy.cpython-39-darwin.so +0 -0
  3. snappy/SnapPyHP.cpython-39-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/development.rst.txt +66 -46
  25. snappy/doc/_sources/index.rst.txt +72 -5
  26. snappy/doc/_sources/installing.rst.txt +145 -162
  27. snappy/doc/_sources/news.rst.txt +73 -1
  28. snappy/doc/_sources/ptolemy_examples1.rst.txt +8 -7
  29. snappy/doc/_sources/ptolemy_examples3.rst.txt +2 -2
  30. snappy/doc/_sources/triangulation.rst.txt +2 -2
  31. snappy/doc/_sources/verify.rst.txt +89 -29
  32. snappy/doc/_sources/verify_internals.rst.txt +5 -16
  33. snappy/doc/_static/basic.css +23 -1
  34. snappy/doc/_static/css/badge_only.css +1 -1
  35. snappy/doc/_static/css/theme.css +1 -1
  36. snappy/doc/_static/doctools.js +1 -1
  37. snappy/doc/_static/documentation_options.js +2 -3
  38. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  39. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  40. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  41. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  42. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  43. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  44. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  45. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  46. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  47. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  48. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  49. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  50. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  51. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  52. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  53. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  54. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  55. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  56. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  57. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  58. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  59. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  60. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  61. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  62. snappy/doc/_static/js/versions.js +228 -0
  63. snappy/doc/_static/language_data.js +2 -2
  64. snappy/doc/_static/pygments.css +1 -0
  65. snappy/doc/_static/searchtools.js +125 -71
  66. snappy/doc/_static/sphinx_highlight.js +13 -3
  67. snappy/doc/additional_classes.html +291 -122
  68. snappy/doc/bugs.html +17 -20
  69. snappy/doc/censuses.html +34 -53
  70. snappy/doc/credits.html +18 -21
  71. snappy/doc/development.html +88 -68
  72. snappy/doc/genindex.html +66 -145
  73. snappy/doc/index.html +86 -31
  74. snappy/doc/installing.html +164 -182
  75. snappy/doc/manifold.html +1168 -556
  76. snappy/doc/manifoldhp.html +18 -21
  77. snappy/doc/news.html +91 -33
  78. snappy/doc/objects.inv +0 -0
  79. snappy/doc/other.html +20 -22
  80. snappy/doc/platonic_census.html +31 -34
  81. snappy/doc/plink.html +19 -22
  82. snappy/doc/ptolemy.html +20 -22
  83. snappy/doc/ptolemy_classes.html +102 -105
  84. snappy/doc/ptolemy_examples1.html +34 -36
  85. snappy/doc/ptolemy_examples2.html +28 -31
  86. snappy/doc/ptolemy_examples3.html +26 -29
  87. snappy/doc/ptolemy_examples4.html +20 -23
  88. snappy/doc/ptolemy_prelim.html +25 -28
  89. snappy/doc/py-modindex.html +16 -19
  90. snappy/doc/screenshots.html +22 -24
  91. snappy/doc/search.html +15 -18
  92. snappy/doc/searchindex.js +1 -1
  93. snappy/doc/snap.html +18 -21
  94. snappy/doc/snappy.html +18 -20
  95. snappy/doc/spherogram.html +84 -87
  96. snappy/doc/todo.html +17 -20
  97. snappy/doc/triangulation.html +324 -215
  98. snappy/doc/tutorial.html +17 -20
  99. snappy/doc/verify.html +100 -46
  100. snappy/doc/verify_internals.html +106 -563
  101. snappy/drilling/__init__.py +153 -235
  102. snappy/drilling/barycentric.py +103 -0
  103. snappy/drilling/constants.py +0 -2
  104. snappy/drilling/crush.py +56 -130
  105. snappy/drilling/cusps.py +12 -6
  106. snappy/drilling/debug.py +2 -1
  107. snappy/drilling/exceptions.py +7 -40
  108. snappy/drilling/moves.py +302 -243
  109. snappy/drilling/perturb.py +63 -37
  110. snappy/drilling/shorten.py +36 -0
  111. snappy/drilling/subdivide.py +0 -5
  112. snappy/drilling/test.py +23 -0
  113. snappy/drilling/test_cases.py +126 -0
  114. snappy/drilling/tracing.py +9 -37
  115. snappy/exceptions.py +18 -5
  116. snappy/exterior_to_link/barycentric_geometry.py +2 -4
  117. snappy/exterior_to_link/main.py +8 -7
  118. snappy/exterior_to_link/mcomplex_with_link.py +2 -2
  119. snappy/exterior_to_link/rational_linear_algebra.py +1 -1
  120. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
  121. snappy/exterior_to_link/test.py +21 -33
  122. snappy/geometric_structure/__init__.py +212 -0
  123. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  124. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  125. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  126. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  127. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  128. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  129. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  130. snappy/geometric_structure/geodesic/__init__.py +0 -0
  131. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  132. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  133. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  134. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  135. snappy/geometric_structure/geodesic/constants.py +6 -0
  136. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  137. snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
  138. snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
  139. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  140. snappy/geometric_structure/geodesic/line.py +30 -0
  141. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  142. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  143. snappy/geometric_structure/test.py +22 -0
  144. snappy/gui.py +23 -13
  145. snappy/horoviewer.py +7 -7
  146. snappy/hyperboloid/__init__.py +96 -31
  147. snappy/hyperboloid/distances.py +245 -0
  148. snappy/hyperboloid/horoball.py +19 -0
  149. snappy/hyperboloid/line.py +35 -0
  150. snappy/hyperboloid/point.py +9 -0
  151. snappy/hyperboloid/triangle.py +29 -0
  152. snappy/isometry_signature.py +382 -0
  153. snappy/len_spec/__init__.py +596 -0
  154. snappy/len_spec/geodesic_info.py +110 -0
  155. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  156. snappy/len_spec/geodesic_piece.py +143 -0
  157. snappy/len_spec/geometric_structure.py +182 -0
  158. snappy/len_spec/geometry.py +80 -0
  159. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  160. snappy/len_spec/spine.py +206 -0
  161. snappy/len_spec/test.py +24 -0
  162. snappy/len_spec/test_cases.py +69 -0
  163. snappy/len_spec/tile.py +275 -0
  164. snappy/len_spec/word.py +86 -0
  165. snappy/math_basics.py +39 -13
  166. snappy/matrix.py +52 -9
  167. snappy/number.py +12 -6
  168. snappy/numeric_output_checker.py +2 -3
  169. snappy/pari.py +8 -4
  170. snappy/phone_home.py +2 -1
  171. snappy/polyviewer.py +8 -8
  172. snappy/ptolemy/__init__.py +1 -1
  173. snappy/ptolemy/component.py +2 -2
  174. snappy/ptolemy/coordinates.py +25 -25
  175. snappy/ptolemy/findLoops.py +9 -9
  176. snappy/ptolemy/manifoldMethods.py +27 -29
  177. snappy/ptolemy/polynomial.py +50 -57
  178. snappy/ptolemy/processFileBase.py +60 -0
  179. snappy/ptolemy/ptolemyVariety.py +109 -41
  180. snappy/ptolemy/reginaWrapper.py +4 -4
  181. snappy/ptolemy/rur.py +1 -1
  182. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
  183. snappy/ptolemy/test.py +99 -54
  184. snappy/ptolemy/utilities.py +1 -1
  185. snappy/raytracing/__init__.py +64 -0
  186. snappy/raytracing/additional_horospheres.py +64 -0
  187. snappy/raytracing/additional_len_spec_choices.py +63 -0
  188. snappy/raytracing/cohomology_fractal.py +0 -3
  189. snappy/raytracing/eyeball.py +123 -0
  190. snappy/raytracing/finite_raytracing_data.py +17 -17
  191. snappy/raytracing/finite_viewer.py +15 -15
  192. snappy/raytracing/geodesic_tube_info.py +93 -63
  193. snappy/raytracing/geodesics.py +94 -64
  194. snappy/raytracing/geodesics_window.py +56 -34
  195. snappy/raytracing/gui_utilities.py +21 -6
  196. snappy/raytracing/hyperboloid_navigation.py +29 -4
  197. snappy/raytracing/hyperboloid_utilities.py +73 -73
  198. snappy/raytracing/ideal_raytracing_data.py +121 -91
  199. snappy/raytracing/inside_viewer.py +199 -66
  200. snappy/raytracing/pack.py +22 -0
  201. snappy/raytracing/raytracing_data.py +37 -25
  202. snappy/raytracing/raytracing_view.py +70 -65
  203. snappy/raytracing/shaders/Eye.png +0 -0
  204. snappy/raytracing/shaders/NonGeometric.png +0 -0
  205. snappy/raytracing/shaders/__init__.py +39 -3
  206. snappy/raytracing/shaders/fragment.glsl +451 -133
  207. snappy/raytracing/test.py +29 -0
  208. snappy/raytracing/tooltip.py +146 -0
  209. snappy/raytracing/upper_halfspace_utilities.py +42 -9
  210. snappy/sage_helper.py +67 -134
  211. snappy/settings.py +90 -77
  212. snappy/shell.py +2 -0
  213. snappy/snap/character_varieties.py +2 -2
  214. snappy/snap/find_field.py +4 -3
  215. snappy/snap/fundamental_polyhedron.py +2 -2
  216. snappy/snap/kernel_structures.py +5 -1
  217. snappy/snap/nsagetools.py +9 -8
  218. snappy/snap/peripheral/dual_cellulation.py +4 -3
  219. snappy/snap/peripheral/peripheral.py +2 -2
  220. snappy/snap/peripheral/surface.py +5 -5
  221. snappy/snap/peripheral/test.py +1 -1
  222. snappy/snap/polished_reps.py +8 -8
  223. snappy/snap/slice_obs_HKL.py +16 -14
  224. snappy/snap/t3mlite/arrow.py +3 -3
  225. snappy/snap/t3mlite/edge.py +3 -3
  226. snappy/snap/t3mlite/homology.py +2 -2
  227. snappy/snap/t3mlite/mcomplex.py +3 -3
  228. snappy/snap/t3mlite/simplex.py +12 -0
  229. snappy/snap/t3mlite/spun.py +18 -17
  230. snappy/snap/t3mlite/test_vs_regina.py +4 -4
  231. snappy/snap/test.py +37 -53
  232. snappy/snap/utilities.py +4 -5
  233. snappy/test.py +121 -138
  234. snappy/test_cases.py +263 -0
  235. snappy/testing.py +131 -0
  236. snappy/tiling/__init__.py +2 -0
  237. snappy/tiling/canonical_key_dict.py +59 -0
  238. snappy/tiling/dict_based_set.py +79 -0
  239. snappy/tiling/floor.py +49 -0
  240. snappy/tiling/hyperboloid_dict.py +54 -0
  241. snappy/tiling/iter_utils.py +78 -0
  242. snappy/tiling/lifted_tetrahedron.py +22 -0
  243. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  244. snappy/tiling/real_hash_dict.py +164 -0
  245. snappy/tiling/test.py +23 -0
  246. snappy/tiling/tile.py +215 -0
  247. snappy/tiling/triangle.py +33 -0
  248. snappy/tkterminal.py +113 -84
  249. snappy/twister/main.py +1 -7
  250. snappy/twister/twister_core.cpython-39-darwin.so +0 -0
  251. snappy/upper_halfspace/__init__.py +78 -17
  252. snappy/verify/__init__.py +3 -7
  253. snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
  254. snappy/verify/complex_volume/adjust_torsion.py +1 -2
  255. snappy/verify/complex_volume/closed.py +13 -13
  256. snappy/verify/complex_volume/cusped.py +6 -6
  257. snappy/verify/complex_volume/extended_bloch.py +5 -8
  258. snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
  259. snappy/verify/edge_equations.py +80 -0
  260. snappy/verify/exceptions.py +0 -55
  261. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
  262. snappy/verify/interval_newton_shapes_engine.py +7 -5
  263. snappy/verify/interval_tree.py +5 -5
  264. snappy/verify/krawczyk_shapes_engine.py +17 -18
  265. snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
  266. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
  267. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
  268. snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
  269. snappy/verify/shapes.py +5 -3
  270. snappy/verify/short_slopes.py +39 -41
  271. snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
  272. snappy/verify/test.py +57 -60
  273. snappy/verify/upper_halfspace/extended_matrix.py +1 -1
  274. snappy/verify/upper_halfspace/finite_point.py +3 -4
  275. snappy/verify/upper_halfspace/ideal_point.py +9 -9
  276. snappy/verify/volume.py +2 -2
  277. snappy/version.py +2 -2
  278. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +26 -11
  279. snappy-3.2.dist-info/RECORD +503 -0
  280. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  281. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  282. snappy/__pycache__/__init__.cpython-39.pyc +0 -0
  283. snappy/__pycache__/browser.cpython-39.pyc +0 -0
  284. snappy/__pycache__/cache.cpython-39.pyc +0 -0
  285. snappy/__pycache__/database.cpython-39.pyc +0 -0
  286. snappy/__pycache__/db_utilities.cpython-39.pyc +0 -0
  287. snappy/__pycache__/decorated_isosig.cpython-39.pyc +0 -0
  288. snappy/__pycache__/exceptions.cpython-39.pyc +0 -0
  289. snappy/__pycache__/export_stl.cpython-39.pyc +0 -0
  290. snappy/__pycache__/filedialog.cpython-39.pyc +0 -0
  291. snappy/__pycache__/gui.cpython-39.pyc +0 -0
  292. snappy/__pycache__/horoviewer.cpython-39.pyc +0 -0
  293. snappy/__pycache__/infowindow.cpython-39.pyc +0 -0
  294. snappy/__pycache__/math_basics.cpython-39.pyc +0 -0
  295. snappy/__pycache__/matrix.cpython-39.pyc +0 -0
  296. snappy/__pycache__/number.cpython-39.pyc +0 -0
  297. snappy/__pycache__/numeric_output_checker.cpython-39.pyc +0 -0
  298. snappy/__pycache__/pari.cpython-39.pyc +0 -0
  299. snappy/__pycache__/polyviewer.cpython-39.pyc +0 -0
  300. snappy/__pycache__/sage_helper.cpython-39.pyc +0 -0
  301. snappy/__pycache__/version.cpython-39.pyc +0 -0
  302. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  303. snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
  304. snappy/doc/_static/js/html5shiv.min.js +0 -4
  305. snappy/doc/verify_canon.html +0 -304
  306. snappy/drilling/__pycache__/__init__.cpython-39.pyc +0 -0
  307. snappy/drilling/__pycache__/constants.cpython-39.pyc +0 -0
  308. snappy/drilling/__pycache__/crush.cpython-39.pyc +0 -0
  309. snappy/drilling/__pycache__/cusps.cpython-39.pyc +0 -0
  310. snappy/drilling/__pycache__/debug.cpython-39.pyc +0 -0
  311. snappy/drilling/__pycache__/epsilons.cpython-39.pyc +0 -0
  312. snappy/drilling/__pycache__/exceptions.cpython-39.pyc +0 -0
  313. snappy/drilling/__pycache__/fixed_points.cpython-39.pyc +0 -0
  314. snappy/drilling/__pycache__/geodesic_info.cpython-39.pyc +0 -0
  315. snappy/drilling/__pycache__/geodesic_tube.cpython-39.pyc +0 -0
  316. snappy/drilling/__pycache__/geometric_structure.cpython-39.pyc +0 -0
  317. snappy/drilling/__pycache__/line.cpython-39.pyc +0 -0
  318. snappy/drilling/__pycache__/moves.cpython-39.pyc +0 -0
  319. snappy/drilling/__pycache__/peripheral_curves.cpython-39.pyc +0 -0
  320. snappy/drilling/__pycache__/perturb.cpython-39.pyc +0 -0
  321. snappy/drilling/__pycache__/quotient_space.cpython-39.pyc +0 -0
  322. snappy/drilling/__pycache__/spatial_dict.cpython-39.pyc +0 -0
  323. snappy/drilling/__pycache__/subdivide.cpython-39.pyc +0 -0
  324. snappy/drilling/__pycache__/tracing.cpython-39.pyc +0 -0
  325. snappy/drilling/geodesic_tube.py +0 -441
  326. snappy/drilling/geometric_structure.py +0 -366
  327. snappy/drilling/line.py +0 -122
  328. snappy/drilling/quotient_space.py +0 -94
  329. snappy/drilling/spatial_dict.py +0 -128
  330. snappy/exterior_to_link/__pycache__/__init__.cpython-39.pyc +0 -0
  331. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-39.pyc +0 -0
  332. snappy/exterior_to_link/__pycache__/exceptions.cpython-39.pyc +0 -0
  333. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-39.pyc +0 -0
  334. snappy/exterior_to_link/__pycache__/link_projection.cpython-39.pyc +0 -0
  335. snappy/exterior_to_link/__pycache__/main.cpython-39.pyc +0 -0
  336. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-39.pyc +0 -0
  337. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-39.pyc +0 -0
  338. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-39.pyc +0 -0
  339. snappy/exterior_to_link/__pycache__/pl_utils.cpython-39.pyc +0 -0
  340. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-39.pyc +0 -0
  341. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-39.pyc +0 -0
  342. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-39.pyc +0 -0
  343. snappy/exterior_to_link/__pycache__/stored_moves.cpython-39.pyc +0 -0
  344. snappy/hyperboloid/__pycache__/__init__.cpython-39.pyc +0 -0
  345. snappy/manifolds/__pycache__/__init__.cpython-39.pyc +0 -0
  346. snappy/ptolemy/__pycache__/__init__.cpython-39.pyc +0 -0
  347. snappy/ptolemy/__pycache__/component.cpython-39.pyc +0 -0
  348. snappy/ptolemy/__pycache__/coordinates.cpython-39.pyc +0 -0
  349. snappy/ptolemy/__pycache__/fieldExtensions.cpython-39.pyc +0 -0
  350. snappy/ptolemy/__pycache__/findLoops.cpython-39.pyc +0 -0
  351. snappy/ptolemy/__pycache__/homology.cpython-39.pyc +0 -0
  352. snappy/ptolemy/__pycache__/manifoldMethods.cpython-39.pyc +0 -0
  353. snappy/ptolemy/__pycache__/matrix.cpython-39.pyc +0 -0
  354. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-39.pyc +0 -0
  355. snappy/ptolemy/__pycache__/polynomial.cpython-39.pyc +0 -0
  356. snappy/ptolemy/__pycache__/processComponents.cpython-39.pyc +0 -0
  357. snappy/ptolemy/__pycache__/processFileBase.cpython-39.pyc +0 -0
  358. snappy/ptolemy/__pycache__/processFileDispatch.cpython-39.pyc +0 -0
  359. snappy/ptolemy/__pycache__/processMagmaFile.cpython-39.pyc +0 -0
  360. snappy/ptolemy/__pycache__/processRurFile.cpython-39.pyc +0 -0
  361. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-39.pyc +0 -0
  362. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-39.pyc +0 -0
  363. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-39.pyc +0 -0
  364. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-39.pyc +0 -0
  365. snappy/ptolemy/__pycache__/rur.cpython-39.pyc +0 -0
  366. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-39.pyc +0 -0
  367. snappy/ptolemy/__pycache__/utilities.cpython-39.pyc +0 -0
  368. snappy/raytracing/__pycache__/__init__.cpython-39.pyc +0 -0
  369. snappy/raytracing/__pycache__/finite_raytracing_data.cpython-39.pyc +0 -0
  370. snappy/raytracing/__pycache__/gui_utilities.cpython-39.pyc +0 -0
  371. snappy/raytracing/__pycache__/hyperboloid_navigation.cpython-39.pyc +0 -0
  372. snappy/raytracing/__pycache__/hyperboloid_utilities.cpython-39.pyc +0 -0
  373. snappy/raytracing/__pycache__/ideal_raytracing_data.cpython-39.pyc +0 -0
  374. snappy/raytracing/__pycache__/inside_viewer.cpython-39.pyc +0 -0
  375. snappy/raytracing/__pycache__/raytracing_data.cpython-39.pyc +0 -0
  376. snappy/raytracing/__pycache__/raytracing_view.cpython-39.pyc +0 -0
  377. snappy/raytracing/__pycache__/upper_halfspace_utilities.cpython-39.pyc +0 -0
  378. snappy/raytracing/__pycache__/view_scale_controller.cpython-39.pyc +0 -0
  379. snappy/raytracing/zoom_slider/__pycache__/__init__.cpython-39.pyc +0 -0
  380. snappy/snap/__pycache__/__init__.cpython-39.pyc +0 -0
  381. snappy/snap/__pycache__/character_varieties.cpython-39.pyc +0 -0
  382. snappy/snap/__pycache__/fundamental_polyhedron.cpython-39.pyc +0 -0
  383. snappy/snap/__pycache__/interval_reps.cpython-39.pyc +0 -0
  384. snappy/snap/__pycache__/kernel_structures.cpython-39.pyc +0 -0
  385. snappy/snap/__pycache__/mcomplex_base.cpython-39.pyc +0 -0
  386. snappy/snap/__pycache__/nsagetools.cpython-39.pyc +0 -0
  387. snappy/snap/__pycache__/polished_reps.cpython-39.pyc +0 -0
  388. snappy/snap/__pycache__/shapes.cpython-39.pyc +0 -0
  389. snappy/snap/__pycache__/slice_obs_HKL.cpython-39.pyc +0 -0
  390. snappy/snap/__pycache__/utilities.cpython-39.pyc +0 -0
  391. snappy/snap/peripheral/__pycache__/__init__.cpython-39.pyc +0 -0
  392. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-39.pyc +0 -0
  393. snappy/snap/peripheral/__pycache__/link.cpython-39.pyc +0 -0
  394. snappy/snap/peripheral/__pycache__/peripheral.cpython-39.pyc +0 -0
  395. snappy/snap/peripheral/__pycache__/surface.cpython-39.pyc +0 -0
  396. snappy/snap/t3mlite/__pycache__/__init__.cpython-39.pyc +0 -0
  397. snappy/snap/t3mlite/__pycache__/arrow.cpython-39.pyc +0 -0
  398. snappy/snap/t3mlite/__pycache__/corner.cpython-39.pyc +0 -0
  399. snappy/snap/t3mlite/__pycache__/edge.cpython-39.pyc +0 -0
  400. snappy/snap/t3mlite/__pycache__/face.cpython-39.pyc +0 -0
  401. snappy/snap/t3mlite/__pycache__/files.cpython-39.pyc +0 -0
  402. snappy/snap/t3mlite/__pycache__/homology.cpython-39.pyc +0 -0
  403. snappy/snap/t3mlite/__pycache__/linalg.cpython-39.pyc +0 -0
  404. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-39.pyc +0 -0
  405. snappy/snap/t3mlite/__pycache__/perm4.cpython-39.pyc +0 -0
  406. snappy/snap/t3mlite/__pycache__/simplex.cpython-39.pyc +0 -0
  407. snappy/snap/t3mlite/__pycache__/spun.cpython-39.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/surface.cpython-39.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-39.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/vertex.cpython-39.pyc +0 -0
  411. snappy/togl/__init__.py +0 -3
  412. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  413. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  414. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  415. snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
  416. snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
  417. snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
  418. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  419. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  420. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  421. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  422. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  423. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  424. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  425. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  426. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  427. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  428. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  429. snappy/twister/__pycache__/__init__.cpython-39.pyc +0 -0
  430. snappy/twister/__pycache__/main.cpython-39.pyc +0 -0
  431. snappy/upper_halfspace/__pycache__/__init__.cpython-39.pyc +0 -0
  432. snappy/upper_halfspace/__pycache__/ideal_point.cpython-39.pyc +0 -0
  433. snappy/verify/__pycache__/__init__.cpython-39.pyc +0 -0
  434. snappy/verify/__pycache__/cuspCrossSection.cpython-39.pyc +0 -0
  435. snappy/verify/__pycache__/cuspTranslations.cpython-39.pyc +0 -0
  436. snappy/verify/__pycache__/cusp_areas.cpython-39.pyc +0 -0
  437. snappy/verify/__pycache__/cusp_shapes.cpython-39.pyc +0 -0
  438. snappy/verify/__pycache__/exceptions.cpython-39.pyc +0 -0
  439. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-39.pyc +0 -0
  440. snappy/verify/__pycache__/interval_tree.cpython-39.pyc +0 -0
  441. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-39.pyc +0 -0
  442. snappy/verify/__pycache__/realAlgebra.cpython-39.pyc +0 -0
  443. snappy/verify/__pycache__/shapes.cpython-39.pyc +0 -0
  444. snappy/verify/__pycache__/short_slopes.cpython-39.pyc +0 -0
  445. snappy/verify/__pycache__/squareExtensions.cpython-39.pyc +0 -0
  446. snappy/verify/__pycache__/verifyCanonical.cpython-39.pyc +0 -0
  447. snappy/verify/__pycache__/verifyHyperbolicity.cpython-39.pyc +0 -0
  448. snappy/verify/__pycache__/volume.cpython-39.pyc +0 -0
  449. snappy/verify/complex_volume/__pycache__/__init__.cpython-39.pyc +0 -0
  450. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-39.pyc +0 -0
  451. snappy/verify/complex_volume/__pycache__/closed.cpython-39.pyc +0 -0
  452. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-39.pyc +0 -0
  453. snappy/verify/complex_volume/__pycache__/cusped.cpython-39.pyc +0 -0
  454. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-39.pyc +0 -0
  455. snappy/verify/cuspCrossSection.py +0 -1422
  456. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-39.pyc +0 -0
  457. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-39.pyc +0 -0
  458. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-39.pyc +0 -0
  459. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-39.pyc +0 -0
  460. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-39.pyc +0 -0
  461. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-39.pyc +0 -0
  462. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-39.pyc +0 -0
  463. snappy-3.1.1.dist-info/RECORD +0 -585
  464. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,101 @@
1
+ from .canonical_keys import canonical_keys_function_for_line
2
+ from .geodesic_start_point_info import GeodesicStartPointInfo
3
+ from .avoid_core_curves import replace_piece_in_core_curve_tube
4
+
5
+ from ...tiling.tile import Tile, compute_tiles
6
+ from ...tiling.lifted_tetrahedron_set import (LiftedTetrahedronSet,
7
+ get_lifted_tetrahedron_set)
8
+
9
+ from ...snap.t3mlite import Mcomplex # type: ignore
10
+
11
+ from typing import Sequence
12
+
13
+ def compute_tiles_for_geodesic(mcomplex : Mcomplex,
14
+ geodesic : GeodesicStartPointInfo,
15
+ avoid_core_curves : bool = False,
16
+ for_raytracing : bool = False
17
+ ) -> Sequence[Tile]:
18
+ """
19
+ Computes all GeodesicPiece's needed to cover a tube about the
20
+ given closed geodesic in the given manifold. The geodesic cannot be
21
+ a core curve of a filled cusp.
22
+
23
+ A GeodesicTube is constructed from a triangulation with a suitable
24
+ geometric structure and a suitable GeodesicStartPointInfo object.
25
+
26
+ To add the necessary geometric structure to a triangulation, call
27
+ add_r13_geometry and add_r13_planes_to_tetrahedra.
28
+
29
+ The GeodesicStartPointInfo object needs to be constructed with a line and
30
+ GeodesicStartPointInfo.find_tet_or_core_curve be called on it.
31
+
32
+ Calling GeodesicStartPointInfo.add_pieces_for_radius will then add the
33
+ necessary pieces to GeodesicStartPointInfo.pieces to cover the tube of the
34
+ given radius.
35
+ """
36
+
37
+ if geodesic.core_curve_cusp is not None:
38
+ raise ValueError(
39
+ "Cannot tile a tube about a geodesic that is a core curve.")
40
+
41
+ if geodesic.line is None:
42
+ raise ValueError(
43
+ "Tiling a tube about a geodesic expected GeodesicStartPointInfo with valid "
44
+ "line.")
45
+
46
+ if not geodesic.lifted_tetrahedra:
47
+ raise ValueError(
48
+ "Tiling a tube about a geodesic expected GeodesicStartPointInfo with valid "
49
+ "lifted_tetrahedra.")
50
+
51
+ min_neg_prod_distinct = (mcomplex.baseTetInRadius/2).cosh()
52
+
53
+ if mcomplex.verified:
54
+ max_neg_prod_equal = min_neg_prod_distinct
55
+ else:
56
+ max_neg_prod_equal = min(
57
+ min_neg_prod_distinct, 1 + _compute_prod_epsilon(mcomplex.RF))
58
+ if for_raytracing:
59
+ min_neg_prod_distinct = max_neg_prod_equal
60
+
61
+ lifted_tetrahedron_set : LiftedTetrahedronSet = (
62
+ get_lifted_tetrahedron_set(
63
+ base_point=mcomplex.R13_baseTetInCenter,
64
+ canonical_keys_function=(
65
+ canonical_keys_function_for_line(geodesic.line)),
66
+ act_on_base_point_by_inverse=False,
67
+ max_neg_prod_equal=max_neg_prod_equal,
68
+ min_neg_prod_distinct=min_neg_prod_distinct,
69
+ verified=mcomplex.verified))
70
+
71
+ if avoid_core_curves:
72
+ replace_lifted_tetrahedron_function = replace_piece_in_core_curve_tube
73
+ else:
74
+ replace_lifted_tetrahedron_function = None
75
+
76
+ return compute_tiles(
77
+ geometric_object=geodesic.line.r13_line,
78
+ visited_lifted_tetrahedra=lifted_tetrahedron_set,
79
+ initial_lifted_tetrahedra=geodesic.lifted_tetrahedra,
80
+ replace_lifted_tetrahedron_function=replace_lifted_tetrahedron_function,
81
+ verified=mcomplex.verified)
82
+
83
+ def _compute_prod_epsilon(RF):
84
+ p = RF.precision()
85
+
86
+ # We try to be a factor of at least several magnitudes smaller than
87
+ # 1/_compute_epsilon_inverse(RF) in hyperboloid_dict.py.
88
+ #
89
+ # This factor will even grow larger as the precision increases.
90
+ #
91
+ # That way, we will hopefully fail in _equality_predicate
92
+ # in hyperboloid_dict rather than failing by not hashing together
93
+ # lifted tetrahedra that should be the same but are not recognised
94
+ # as such because of numerical error.
95
+
96
+ result = RF(1e-6)
97
+ if p > 53:
98
+ result *= RF(0.5) ** ((p - 53) / 2)
99
+
100
+ return result
101
+
@@ -0,0 +1,22 @@
1
+ from snappy import testing
2
+ import snappy
3
+
4
+ from snappy import geometric_structure
5
+
6
+ modules = [
7
+ geometric_structure.cusp_neighborhood.cusp_cross_section_base,
8
+ geometric_structure.cusp_neighborhood.real_cusp_cross_section,
9
+ geometric_structure.cusp_neighborhood.complex_cusp_cross_section
10
+ ]
11
+
12
+ def run_doctests(verbose=False, print_info=True):
13
+ globs = {'Manifold': snappy.Manifold}
14
+ return testing.doctest_modules(modules,
15
+ verbose=verbose,
16
+ print_info=print_info,
17
+ extraglobs=globs)
18
+
19
+ run_doctests.__name__ = geometric_structure.__name__
20
+
21
+ if __name__ == '__main__':
22
+ testing.run_doctests_as_main(run_doctests)
snappy/gui.py CHANGED
@@ -4,21 +4,20 @@ import sys
4
4
  import time
5
5
  import tempfile
6
6
  import tkinter as Tk_
7
- from tkinter import ttk as ttk
7
+ from tkinter import ttk
8
+ from tkinter.ttk import Spinbox
8
9
  from tkinter.font import Font, families as font_families
9
10
  from tkinter.simpledialog import Dialog, SimpleDialog
10
11
  from plink.ipython_tools import IPythonTkRoot
11
12
  from . import filedialog
12
13
 
13
- if sys.version_info < (3, 7):
14
- class Spinbox(ttk.Entry):
15
- def __init__(self, container=None, **kw):
16
- ttk.Entry.__init__(self, container, "ttk::spinbox", **kw)
17
-
18
- def set(self, value):
19
- self.tk.call(self._w, "set", value)
20
- else:
21
- Spinbox = ttk.Spinbox
14
+
15
+ def nominal_font_dict(tk_font):
16
+ """
17
+ Like Font.actual() but not messed up by GNOME scaling factors on
18
+ Linux.
19
+ """
20
+ return {key:tk_font.cget(key) for key in tk_font.actual()}
22
21
 
23
22
 
24
23
  class SnapPyStyle:
@@ -41,10 +40,21 @@ class SnapPyStyle:
41
40
  else:
42
41
  self.windowBG = ttk_style.lookup('TLabelframe', 'background')
43
42
  self.groupBG = self.subgroupBG = self.windowBG
44
- self.font = ttk_style.lookup('TLabel', 'font')
45
- self.font_info = fi = Font(font=self.font).actual()
46
- fi['size'] = abs(fi['size']) # Why would the size be negative???
47
43
 
44
+ self.font = ttk_style.lookup('TLabel', 'font')
45
+ if self.font == '':
46
+ self.font = 'TkDefaultFont'
47
+ # TLabel.font and TLabelframe.Label.font differ in Tk 9.0 (at
48
+ # least on macOS). We restore the Tk 8.6 behavior.
49
+ self.ttk_style.configure('TLabelframe.Label',
50
+ font=self.font)
51
+ self.font_info = fi = nominal_font_dict(Font(font=self.font))
52
+ fi['size'] = int(str(fi['size']))
53
+ # On linux the treeview rows are too small, at least with hi-dpi displays.
54
+ if sys.platform == 'linux':
55
+ default_font = Font(name='TkDefaultFont', exists=True)
56
+ line_height = default_font.metrics()['linespace']
57
+ self.ttk_style.configure('Treeview', rowheight=line_height)
48
58
 
49
59
  class ViewerWindow(Tk_.Toplevel):
50
60
  def __init__(self, view_class, *args, **kwargs):
snappy/horoviewer.py CHANGED
@@ -146,7 +146,7 @@ Use the View Options to select which components of the scene are drawn.
146
146
  self.scene = HoroballScene(nbhd, pgram_var, Ford_var, tri_var,
147
147
  horo_var, label_var, flipped=self.flip_var.get(), cutoff=self.cutoff,
148
148
  which_cusp=self.which_cusp,togl_widget=self.widget)
149
- self.widget.redraw_impl = self.scene.draw
149
+ self.widget.draw_projection_impl = self.scene.draw
150
150
  if isinstance(parent, Tk_.Toplevel):
151
151
  parent.config(menu=self.menubar)
152
152
  # hacks needed on Sierra
@@ -174,7 +174,7 @@ Use the View Options to select which components of the scene are drawn.
174
174
  self.widget.set_background(0.3, 0.3, 0.4)
175
175
  else:
176
176
  self.widget.set_background(1.0, 1.0, 1.0)
177
- self.widget.redraw_if_initialized()
177
+ self.widget.redraw()
178
178
 
179
179
  def build_sliders(self):
180
180
  nbhd = self.nbhd
@@ -264,7 +264,7 @@ Use the View Options to select which components of the scene are drawn.
264
264
  flipped=self.flip_var.get(), cutoff=self.cutoff,
265
265
  which_cusp=self.which_cusp, togl_widget=self.widget)
266
266
  assert(self.scene is not None)
267
- self.widget.redraw_impl = self.scene.draw
267
+ self.widget.draw_projection_impl = self.scene.draw
268
268
  self.configure_sliders()
269
269
  self.rebuild()
270
270
 
@@ -278,7 +278,7 @@ Use the View Options to select which components of the scene are drawn.
278
278
  flipped = self.flip_var.get()
279
279
  self.scene.flip(flipped)
280
280
  self.widget.flipped = flipped
281
- self.widget.redraw_if_initialized()
281
+ self.widget.redraw()
282
282
 
283
283
  def configure_sliders(self):
284
284
  nbhd = self.nbhd
@@ -331,7 +331,7 @@ Use the View Options to select which components of the scene are drawn.
331
331
  self.destroy()
332
332
 
333
333
  def redraw(self):
334
- self.widget.redraw_if_initialized()
334
+ self.widget.redraw()
335
335
 
336
336
  def set_zoom(self, x):
337
337
  fovy = 1.0 + (100.0-float(x))/15.0
@@ -342,14 +342,14 @@ Use the View Options to select which components of the scene are drawn.
342
342
  else:
343
343
  self.update_idletasks()
344
344
  self.after(50, self.set_zoom, x)
345
- self.widget.redraw_if_initialized()
345
+ self.widget.redraw()
346
346
 
347
347
  def rebuild(self, full_list=True):
348
348
  self.set_ties()
349
349
  self.configure_sliders()
350
350
  self.widget.make_current()
351
351
  self.scene.build_scene(which_cusp=self.which_cusp, full_list=full_list)
352
- self.widget.redraw_if_initialized()
352
+ self.widget.redraw()
353
353
 
354
354
  def start_radius(self, event):
355
355
  self.cusp_moving = True
@@ -1,9 +1,6 @@
1
- from ..matrix import vector, matrix
2
- from ..math_basics import is_RealIntervalFieldElement
3
- from ..sage_helper import _within_sage
1
+ from ..matrix import make_vector, make_matrix, mat_solve
4
2
 
5
- if _within_sage:
6
- import sage.all
3
+ from ..sage_helper import _within_sage
7
4
 
8
5
  """
9
6
  hyperboloid contains methods relating to the hyperboloid model
@@ -40,27 +37,6 @@ def r13_dot(u, v):
40
37
  return -u[0]*v[0] + u[1]*v[1] + u[2]*v[2] + u[3]*v[3]
41
38
 
42
39
 
43
- def distance_unit_time_r13_points(u, v):
44
- """
45
- Computes the hyperbolic distance between two points (represented
46
- by unit time vectors) in the hyperboloid model.
47
- """
48
-
49
- d = -r13_dot(u, v)
50
-
51
- # Due to rounding errors, the resulting number or interval can be
52
- # slightly less than 1 or contain numbers slightly less than 1,
53
- # respectively - resulting in NaN's. Avoid this here.
54
- if is_RealIntervalFieldElement(d):
55
- RIF = d.parent()
56
- d = d.intersection(RIF(1, sage.all.Infinity))
57
- else:
58
- if d < 1:
59
- RF = d.parent()
60
- d = RF(1)
61
- return d.arccosh()
62
-
63
-
64
40
  def time_r13_normalise(u):
65
41
  """
66
42
  Given a time-like vector in Minkowski space, returns the normalised
@@ -94,6 +70,51 @@ def o13_inverse(m):
94
70
 
95
71
  return result
96
72
 
73
+ def so13_to_pgl2c(B):
74
+ """
75
+ Given an SO13 matrix, returns corresponding complex 2x2-matrix.
76
+ The determinant of the result is not 1 in general.
77
+
78
+ Python implementation of O31_to_Moebius (without normalization).
79
+ """
80
+
81
+ AM0A_00 = B[0,0] + B[1,0]
82
+ AM1A_00 = B[0,1] + B[1,1]
83
+ aa = AM0A_00 + AM1A_00
84
+ bb = AM0A_00 - AM1A_00
85
+
86
+ if aa > bb:
87
+ return _to_complex_matrix(
88
+ aa, 0 ,
89
+ B[0,2] + B[1,2], B[0,3] + B[1,3] ,
90
+
91
+ B[2,0] + B[2,1], -(B[3,0] + B[3,1]),
92
+ B[2,2] + B[3,3], B[2,3] - B[3,2] )
93
+ else:
94
+ return _to_complex_matrix(
95
+ B[0,2] + B[1,2], -(B[0,3] + B[1,3]),
96
+ bb , 0 ,
97
+ B[2,2] - B[3,3], -(B[2,3] + B[3,2]),
98
+ B[2,0] - B[2,1], B[3,1] - B[3,0] )
99
+
100
+ def so13_to_psl2c(m):
101
+ """
102
+ Given an SO13 matrix, returns corresponding complex 2x2-matrix
103
+ with determinant 1.
104
+
105
+ Python implementation of O31_to_Moebius (with normalization).
106
+ """
107
+
108
+ A = so13_to_pgl2c(m)
109
+ return A / A.det().sqrt()
110
+
111
+ def r13_to_klein(v):
112
+ """
113
+ Given a time-like or light-like vector, gives the respective point
114
+ in the Klein model or its boundary, respectively.
115
+ """
116
+
117
+ return make_vector([v[1] / v[0], v[2] / v[0], v[3] / v[0]])
97
118
 
98
119
  def unit_time_vector_to_o13_hyperbolic_translation(v):
99
120
  """
@@ -112,7 +133,7 @@ def unit_time_vector_to_o13_hyperbolic_translation(v):
112
133
  m[2][2] += 1
113
134
  m[3][3] += 1
114
135
 
115
- return matrix(m)
136
+ return make_matrix(m)
116
137
 
117
138
 
118
139
  def unnormalised_plane_eqn_from_r13_points(pts):
@@ -123,10 +144,10 @@ def unnormalised_plane_eqn_from_r13_points(pts):
123
144
  three given points.
124
145
  """
125
146
 
126
- return vector([ _det_shifted_matrix3(pts, 0),
127
- _det_shifted_matrix3(pts, 1),
128
- - _det_shifted_matrix3(pts, 2),
129
- _det_shifted_matrix3(pts, 3)])
147
+ return make_vector([ _det_shifted_matrix3(pts, 0),
148
+ _det_shifted_matrix3(pts, 1),
149
+ - _det_shifted_matrix3(pts, 2),
150
+ _det_shifted_matrix3(pts, 3)])
130
151
 
131
152
 
132
153
  def _det_shifted_matrix3(m, i):
@@ -145,3 +166,47 @@ def _det_shifted_matrix3(m, i):
145
166
  - m[0][i2] * m[1][i1] * m[2][i0]
146
167
  - m[0][i0] * m[1][i2] * m[2][i1]
147
168
  - m[0][i1] * m[1][i0] * m[2][i2])
169
+
170
+ def compute_inradius_and_incenter_from_planes(planes):
171
+ """
172
+ Given outside-facing normals for the four faces of a
173
+ tetrahedron, compute the hyperbolic inradius and the
174
+ incenter (as unit time vector) of the tetrahedron (in the
175
+ hyperboloid model).
176
+ """
177
+
178
+ # We need to c and r such that
179
+ # * r13_dot(c, c) = -1 and
180
+ # * r13_dot(plane, c) = -sinh(r) for every plane
181
+ #
182
+ # We instead solve for the following system of linear equations:
183
+ # * r13_dot(plane, pt) = -1 for every plane
184
+
185
+ RF = planes[0][0].parent()
186
+ m = make_matrix([[-plane[0], plane[1], plane[2], plane[3]]
187
+ for plane in planes])
188
+ v = make_vector([RF(-1), RF(-1), RF(-1), RF(-1)])
189
+
190
+ pt = mat_solve(m, v)
191
+
192
+ # And then use the inverse length of pt to scale pt to be
193
+ # a unit time vector and to compute the r.
194
+ scale = 1 / (-r13_dot(pt, pt)).sqrt()
195
+
196
+ return scale.arcsinh(), scale * pt
197
+
198
+ def _to_complex_matrix(
199
+ a, b, c, d,
200
+ e, f, g, h):
201
+ RF = a.parent()
202
+ if _within_sage:
203
+ CF = RF.complex_field()
204
+ return make_matrix(
205
+ [ [ CF(a,b), CF(c, d) ],
206
+ [ CF(e,f), CF(g, h) ] ],
207
+ ring=CF)
208
+ else:
209
+ I = RF('I')
210
+ return make_matrix(
211
+ [ [ a + b * I, c + d * I ],
212
+ [ e + f * I, g + h * I ] ])
@@ -0,0 +1,245 @@
1
+ from .triangle import R13IdealTriangle
2
+ from .line import R13Line
3
+ from .point import R13Point
4
+ from .horoball import R13Horoball
5
+ from . import r13_dot
6
+
7
+ from ..math_basics import is_RealIntervalFieldElement # type: ignore
8
+ from ..sage_helper import _within_sage # type: ignore
9
+
10
+ if _within_sage:
11
+ from ..sage_helper import Infinity
12
+
13
+ __all__ = ['distance_r13_lines',
14
+ 'lower_bound_distance_r13_line_triangle']
15
+
16
+ def distance_r13_lines(line0 : R13Line, line1 : R13Line):
17
+ """
18
+ Computes distance between two hyperbolic lines.
19
+ """
20
+
21
+ p00 = r13_dot(line0.points[0], line1.points[0])
22
+ p01 = r13_dot(line0.points[0], line1.points[1])
23
+ p10 = r13_dot(line0.points[1], line1.points[0])
24
+ p11 = r13_dot(line0.points[1], line1.points[1])
25
+
26
+ pp = line0.inner_product * line1.inner_product
27
+
28
+ t0 = _safe_sqrt((p00 * p11) / pp)
29
+ t1 = _safe_sqrt((p01 * p10) / pp)
30
+
31
+ p = (t0 + t1 - 1) / 2
32
+
33
+ return 2 * _safe_sqrt(p).arcsinh()
34
+
35
+ def distance_r13_horoballs(horoball_defining_vec0,
36
+ horoball_defining_vec1):
37
+ p = -r13_dot(horoball_defining_vec0, horoball_defining_vec1) / 2
38
+ return _safe_log(p)
39
+
40
+ def distance_r13_horoball_line(horoball_defining_vec, # Light-like
41
+ line : R13Line):
42
+
43
+ p = (r13_dot(line.points[0], horoball_defining_vec) *
44
+ r13_dot(line.points[1], horoball_defining_vec))
45
+ s = -2 * p / line.inner_product
46
+
47
+ return _safe_log(s)/2
48
+
49
+ def distance_r13_horoball_plane(horoball_defining_vec, # Light-like
50
+ plane_defining_vec): # Unit space-like
51
+ p = r13_dot(horoball_defining_vec, plane_defining_vec)
52
+ return _safe_log_of_abs(p)
53
+
54
+ def distance_r13_horoball_point(horoball_defining_vec, # Light-like
55
+ pt): # Unit-time-like
56
+ p = r13_dot(horoball_defining_vec, pt)
57
+ return (-p).log()
58
+
59
+ def distance_r13_point_line(pt, # Unit time-like
60
+ line : R13Line):
61
+ """
62
+ This also works if line is degenerate and starts and ends at some point.
63
+ """
64
+
65
+ p = (r13_dot(line.points[0], pt) *
66
+ r13_dot(line.points[1], pt))
67
+ s = _safe_div(2 * p, -line.inner_product)
68
+ return _safe_arccosh(_safe_sqrt(s))
69
+
70
+ def distance_r13_point_plane(pt, # Unit time-like
71
+ plane_defining_vec): # Unit space-like
72
+ p = r13_dot(pt, plane_defining_vec)
73
+ return p.arcsinh().abs()
74
+
75
+ def distance_r13_points(pt0, # Unit time-like
76
+ pt1): # Unit time-like
77
+ """
78
+ Computes the hyperbolic distance between two points (represented
79
+ by unit time vectors) in the hyperboloid model.
80
+ """
81
+ p = r13_dot(pt0, pt1)
82
+
83
+ # Due to rounding errors, the resulting number or interval can be
84
+ # slightly less than 1 or contain numbers slightly less than 1,
85
+ # respectively - resulting in NaN's. Avoid this here.
86
+ return _safe_arccosh(-p)
87
+
88
+ def lower_bound_distance_to_r13_triangle(
89
+ geometric_object, triangle : R13IdealTriangle, verified : bool):
90
+ if isinstance(geometric_object, R13Horoball):
91
+ return lower_bound_distance_r13_horoball_triangle(
92
+ geometric_object.defining_vec, triangle, verified)
93
+ if isinstance(geometric_object, R13Line):
94
+ return lower_bound_distance_r13_line_triangle(
95
+ geometric_object, triangle, verified)
96
+ if isinstance(geometric_object, R13Point):
97
+ return lower_bound_distance_r13_point_triangle(
98
+ geometric_object.point, triangle, verified)
99
+ raise ValueError(
100
+ "Distance between %r and triangle not supported" % geometric_object)
101
+
102
+ def lower_bound_distance_r13_horoball_triangle(
103
+ horoball_defining_vec,
104
+ triangle : R13IdealTriangle, verified : bool):
105
+
106
+ if verified:
107
+ epsilon = 0
108
+ else:
109
+ RF = horoball_defining_vec[0].parent()
110
+ epsilon = _compute_epsilon(RF)
111
+
112
+ for bounding_plane, edge in zip(triangle.bounding_planes,
113
+ triangle.edges):
114
+ if r13_dot(horoball_defining_vec, bounding_plane) > epsilon:
115
+ return distance_r13_horoball_line(horoball_defining_vec, edge)
116
+
117
+ return distance_r13_horoball_plane(
118
+ horoball_defining_vec, triangle.plane)
119
+
120
+ def lower_bound_distance_r13_line_triangle(
121
+ line : R13Line, triangle : R13IdealTriangle, verified : bool):
122
+
123
+ if verified:
124
+ epsilon = 0
125
+ else:
126
+ RF = line.points[0][0].parent()
127
+ epsilon = _compute_epsilon(RF)
128
+
129
+ a0 = r13_dot(triangle.plane, line.points[0])
130
+ a1 = r13_dot(triangle.plane, line.points[1])
131
+
132
+ abs0 = abs(a0)
133
+ abs1 = abs(a1)
134
+
135
+ pt = abs1 * line.points[0] + abs0 * line.points[1]
136
+
137
+ for bounding_plane, edge in zip(triangle.bounding_planes,
138
+ triangle.edges):
139
+ if r13_dot(pt, bounding_plane) > epsilon:
140
+ return distance_r13_lines(line, edge)
141
+
142
+ p = a0 * a1
143
+
144
+ if p > 0:
145
+ return (-2 * p / line.inner_product).sqrt().arcsinh()
146
+
147
+ RF = line.points[0][0].parent()
148
+ return RF(0)
149
+
150
+ def lower_bound_distance_r13_point_triangle(
151
+ point,
152
+ triangle : R13IdealTriangle, verified : bool):
153
+
154
+ if verified:
155
+ epsilon = 0
156
+ else:
157
+ RF = point[0].parent()
158
+ epsilon = _compute_epsilon(RF)
159
+
160
+ for bounding_plane, edge in zip(triangle.bounding_planes,
161
+ triangle.edges):
162
+ if r13_dot(point, bounding_plane) > epsilon:
163
+ return distance_r13_point_line(point, edge)
164
+
165
+ return distance_r13_point_plane(point, triangle.plane)
166
+
167
+ def _compute_epsilon(RF):
168
+ return RF(0.5) ** (RF.prec() // 2)
169
+
170
+ def _safe_sqrt(p):
171
+ """
172
+ Compute the sqrt of a number that is known to be non-negative
173
+ though might not be non-negative because of floating point
174
+ issues. When using interval arithmetic, this means that
175
+ while the upper bound will be non-negative, the lower bound
176
+ we computed might be negative because it is too conservative.
177
+
178
+ Example of a quantity that can be given to this function:
179
+ negative inner product of two vectors in the positive
180
+ light cone. This is because we know that the inner product
181
+ of two such vectors is always non-positive.
182
+ """
183
+
184
+ if is_RealIntervalFieldElement(p):
185
+ RIF = p.parent()
186
+ p = p.intersection(RIF(0, Infinity))
187
+ else:
188
+ if p < 0:
189
+ RF = p.parent()
190
+ return RF(0)
191
+ return p.sqrt()
192
+
193
+ def _safe_log(p):
194
+ if is_RealIntervalFieldElement(p):
195
+ RIF = p.parent()
196
+ p = p.intersection(RIF(0, Infinity))
197
+ else:
198
+ if p <= 0:
199
+ RF = p.parent()
200
+ return RF(-1e20)
201
+ return p.log()
202
+
203
+ def _safe_log_of_abs(p):
204
+ return _safe_log_non_neg(p.abs())
205
+
206
+ def _safe_log_non_neg(p):
207
+ if p == 0:
208
+ if is_RealIntervalFieldElement(p):
209
+ RIF = p.parent()
210
+ return RIF(-Infinity)
211
+ else:
212
+ RF = p.parent()
213
+ return RF(-1e20)
214
+ else:
215
+ return p.log()
216
+
217
+ def _safe_arccosh(p):
218
+ if is_RealIntervalFieldElement(p):
219
+ RIF = p.parent()
220
+ p = p.intersection(RIF(1, Infinity))
221
+ else:
222
+ if p < 1:
223
+ RF = p.parent()
224
+ return RF(0)
225
+ return p.arccosh()
226
+
227
+ def _safe_div(a, b):
228
+ """
229
+ Compute a / b where be is known to be non-negative and we should
230
+ return infinity if b is zero.
231
+ """
232
+
233
+ if is_RealIntervalFieldElement(b):
234
+ RIF = b.parent()
235
+ if b == 0:
236
+ return RIF(Infinity)
237
+ else:
238
+ return a / b.intersection(RIF(0, Infinity))
239
+ else:
240
+ if b <= 0:
241
+ RIF = b.parent()
242
+ return RIF(1e20)
243
+ else:
244
+ return a / b
245
+
@@ -0,0 +1,19 @@
1
+ __all__ = ['R13Horoball']
2
+
3
+ class R13Horoball:
4
+ """
5
+ Horoball defined by { x : r13_dot(x, l) > -1 } where l is a
6
+ light-like vector.
7
+ """
8
+
9
+ def __init__(self,
10
+ defining_vec): # Light-like vector
11
+ self.defining_vec = defining_vec
12
+
13
+ def transformed(self,
14
+ m): # O13-matrix
15
+ """
16
+ Returns image of the horoball under given O13-matrix m.
17
+ """
18
+
19
+ return R13Horoball(m * self.defining_vec)