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,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)