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
@@ -1,18 +1,27 @@
1
- from .line import R13LineWithMatrix
2
- from . import epsilons
3
1
  from . import constants
4
2
  from . import exceptions
5
3
 
6
- from ..hyperboloid import r13_dot, o13_inverse, distance_unit_time_r13_points # type: ignore
7
- from ..snap.t3mlite import simplex # type: ignore
8
- from ..snap.t3mlite import Tetrahedron, Vertex, Mcomplex # type: ignore
9
- from ..exceptions import InsufficientPrecisionError # type: ignore
10
- from ..matrix import matrix # type: ignore
4
+ from .line import R13LineWithMatrix
5
+ from .fixed_points import r13_fixed_line_of_psl2c_matrix
6
+ from .multiplicity import compute_and_verify_multiplicity
7
+ from .graph_trace_helper import find_lifted_tetrahedra_containing_point
8
+
9
+ from .. import word_to_psl2c_matrix
10
+
11
+ from ...tiling.lifted_tetrahedron import LiftedTetrahedron
12
+ from ...hyperboloid import r13_dot, o13_inverse # type: ignore
13
+ from ...hyperboloid.distances import distance_r13_points
14
+ from ...hyperboloid.line import R13Line
15
+ from ...snap.t3mlite import simplex # type: ignore
16
+ from ...snap.t3mlite import Tetrahedron, Vertex, Mcomplex # type: ignore
17
+ from ...exceptions import InsufficientPrecisionError # type: ignore
18
+ from ...matrix import make_identity_matrix # type: ignore
11
19
 
12
20
  from typing import Tuple, Sequence, Optional, Any
13
21
 
22
+ __all__ = ['compute_geodsic_info', 'GeodesicStartPointInfo', 'sample_line']
14
23
 
15
- def sample_line(line_with_matrix : R13LineWithMatrix):
24
+ def sample_line(line : R13Line):
16
25
  """
17
26
  Pick a point on a line in the hyperboloid model.
18
27
  Returns an unnormalised time-like vector computed
@@ -24,9 +33,18 @@ def sample_line(line_with_matrix : R13LineWithMatrix):
24
33
  triangulation (which happens for some geodesics in some
25
34
  triangulated hyperbolic manifolds when picking equal weights for
26
35
  the fixed points computed by r13_fixed_points_of_psl2c_matrix).
36
+
37
+ Note that we want to avoid picking a point that is far away from
38
+ the fundamental polyhedron. By the choices we made, this is not
39
+ the case: the fundamental polyhedron is contains the origin in the
40
+ hyperboloid model. r13_fixed_points_of_psl2c_matrix returns
41
+ light-like vectors of the form (1, ...) so the average corresponds
42
+ to taking the mid-point in the Klein model and is thus the point
43
+ on the line closest to the origin. Furthermore, the bias is close
44
+ enough to 1 (the log is ~0.22, so we move the point by ~0.11
45
+ units in hyperbolic space).
27
46
  """
28
47
 
29
- line = line_with_matrix.r13_line
30
48
  RF = line.points[0][0].parent()
31
49
  bias = RF(constants.start_point_bias)
32
50
 
@@ -35,29 +53,7 @@ def sample_line(line_with_matrix : R13LineWithMatrix):
35
53
  # @dataclass
36
54
 
37
55
 
38
- class LiftedTetrahedron:
39
- """
40
- Represents the lift of a tetrahedron in a manifold to the hyperboloid
41
- model.
42
-
43
- That is, if a tetrahedron (as part of the fundamental domain) was assigned
44
- vertices by calling add_r13_geometry, then the vertices of a
45
- LiftedTetrahedron l will be given by l.o13_matrices * tet.R13_vertices[v]
46
- where v in snappy.snap.t3mlite.simplex.ZeroSubsimplices.
47
- """
48
-
49
- def __init__(self,
50
- tet : Tetrahedron,
51
- # An O(1,3)-matrix - since this might be a SageMath class or a
52
- # SimpleMatrix, just using Any as type annotation.
53
- o13_matrix):
54
- self.tet = tet
55
- self.o13_matrix = o13_matrix
56
-
57
- # @dataclass
58
-
59
-
60
- class GeodesicInfo:
56
+ class GeodesicStartPointInfo:
61
57
  """
62
58
  Information needed to trace a closed geodesic through a triangulation
63
59
  given as snappy.snap.t3mlite.Mcomplex with geometric structure added
@@ -74,7 +70,7 @@ class GeodesicInfo:
74
70
  will either:
75
71
 
76
72
  1. Detect that the closed geodesic is actually a core curve of a
77
- filled cusp and set core_curve_cusp and core_curve_direction
73
+ filled cusp and set core_curve_cusp and core_curve_multiplicity
78
74
  accordingly. This means that instead tracing the geodesic
79
75
  through the triangulation, the client has to unfill the
80
76
  corresponding cusp instead.
@@ -104,6 +100,9 @@ class GeodesicInfo:
104
100
  # The triangulation
105
101
  mcomplex : Mcomplex,
106
102
 
103
+ # Word were are drilling
104
+ word : str,
105
+
107
106
  # Trace of corresponding PSL(2,C)-matrix.
108
107
  trace : Any,
109
108
 
@@ -143,13 +142,14 @@ class GeodesicInfo:
143
142
  # Output of find_tet_or_core_corve: sign (+1/-1) indicating whether
144
143
  # the given geodesic and the core curve run parallel or
145
144
  # anti-parallel.
146
- core_curve_direction : int = 0,
145
+ core_curve_multiplicity : Optional[int] = None,
147
146
 
148
147
  # Field filled by client to indicate which index the cusp resulting
149
148
  # from drilling this geodesic is supposed to have.
150
149
  index : Optional[int] = None):
151
150
 
152
151
  self.mcomplex = mcomplex
152
+ self.word = word
153
153
  self.trace = trace
154
154
  self.unnormalised_start_point = unnormalised_start_point
155
155
  self.unnormalised_end_point = unnormalised_end_point
@@ -157,7 +157,7 @@ class GeodesicInfo:
157
157
  self.tet = tet
158
158
  self.lifted_tetrahedra = lifted_tetrahedra
159
159
  self.core_curve_cusp = core_curve_cusp
160
- self.core_curve_direction = core_curve_direction
160
+ self.core_curve_multiplicity = core_curve_multiplicity
161
161
  self.index = index
162
162
 
163
163
  def find_tet_or_core_curve(self) -> None:
@@ -172,10 +172,13 @@ class GeodesicInfo:
172
172
  not ensure that this distance is positive.
173
173
  """
174
174
 
175
+ self._graph_trace()
176
+
177
+ def _graph_trace(self):
175
178
  self.tet = None
176
179
  self.lifted_tetrahedra = ()
177
180
  self.core_curve_cusp = None
178
- self.core_curve_direction = 0
181
+ self.core_curve_multiplicity = None
179
182
 
180
183
  # Walks from tetrahedron to tetrahedron (transforming the start point
181
184
  # and other data) trying to get the start_point closer and closer to
@@ -184,111 +187,36 @@ class GeodesicInfo:
184
187
  # face of a tetrahedron or when (the lift of) the geodesic was really
185
188
  # close to (a lift of) a core curve.
186
189
 
187
- # tet is the tetrahedron where the algorithm stopped.
188
- # faces is the subset of simplex.TwoSubsimplices: a face is in the subset
189
- # if it could not be verified that the start point is to the inside
190
- # of the plane supporting that face.
191
- # cusp_curve_vertex is None or an element of simplex.ZeroSubsimplices
192
- # if we are close to the core curve at that vertex.
193
- tet, faces, cusp_curve_vertex = self._graph_trace(self.mcomplex.baseTet)
194
-
195
- # Do some verification work for the above information to fill
196
- # self.tet, self.lifted_tetrahedra and self.core_curve_cusp.
197
-
198
- if cusp_curve_vertex is not None:
199
- # Verify that the the geodesic is really the core curve and
200
- # determine whether the geodesic and core curve or parallel
201
- # or anti-parallel.
202
- self.core_curve_direction = self._verify_direction_of_core_curve(
203
- tet, cusp_curve_vertex)
204
- self.core_curve_cusp = tet.Class[cusp_curve_vertex]
205
- return
206
-
207
- id_matrix = matrix.identity(ring=self.mcomplex.RF, n=4)
208
-
209
- if len(faces) == 0:
210
- # The start point is really inside the given tetrahedron.
211
-
212
- # Signal to the client that we can start tracing the geodesic
213
- # throguh the triangulation from this tetrahedron:
214
- self.tet = tet
215
-
216
- # Signal to the client that we can start with this tetrahedron
217
- # when developing a tube about the geodesic.
218
- self.lifted_tetrahedra = [ LiftedTetrahedron(tet, id_matrix) ]
219
- return
220
-
221
- if len(faces) == 1:
222
- # The start point is probably on the face of the tetrahedron,
223
- # that is, we could verify it lies to the right side of the
224
- # supporting planes for three faces but not one:
225
- face, = faces
226
-
227
- # Even though we cannot verify that the start point lies
228
- # exactly on the face, we can verify that the start point
229
- # lies in the interior of the union of two neighboring
230
- # tetrahedra. That is, the union is a hexahedron and
231
- # it suffices to check that the start point lies to the
232
- # inside of the six faces of the tetrahedron.
233
- #
234
- # _graph_trace already checked the three faces of the given
235
- # tetrahedron. But it is left to check this for the neighboring
236
- # tetrahedron.
237
-
238
- # Find the other tetrahedron of the neighboring tetrahedra.
239
- other_tet = tet.Neighbor[face]
240
- other_unnormalised_start_point = (
241
- tet.O13_matrices[face] * self.unnormalised_start_point)
242
- other_face = tet.Gluing[face].image(face)
243
-
244
- for f in simplex.TwoSubsimplices:
245
- if f != other_face:
246
- if not r13_dot(other_unnormalised_start_point,
247
- other_tet.R13_planes[f]) < 0:
248
- raise InsufficientPrecisionError(
249
- "Failed to find lift of geodesic and prove that "
250
- "it intersects tetrahedra of the fundamental domain. "
251
- "Increasing the precision will probably fix this "
252
- "problem.")
253
-
254
- # Returns the two (lifted) tetrahedra.
255
- self.lifted_tetrahedra = [
256
- LiftedTetrahedron(tet, id_matrix),
257
- LiftedTetrahedron(other_tet,
258
- other_tet.O13_matrices[other_face]) ]
259
- return
260
-
261
- raise InsufficientPrecisionError(
262
- "Start point chosen on geodesic too close to 1-skeleton of "
263
- "triangulation to verify it is not on the 1-skeleton. "
264
- "Increasing the precision will probably fix this problem.")
265
-
266
- def _graph_trace(
267
- self,
268
- tet : Tetrahedron) -> Tuple[Tetrahedron,
269
- Sequence[int],
270
- Optional[int]]:
271
- """
272
- Walk from tetrahedron to tetrahedron (transforming start point and
273
- the other data) to capture the start point in a tetrahedron.
274
- """
275
-
276
190
  if self.mcomplex.verified:
277
191
  epsilon = 0
278
- key = _graph_trace_key_verified
192
+ def key(face_and_signed_distance):
193
+ return face_and_signed_distance[1].center()
279
194
  else:
280
- epsilon = epsilons.compute_epsilon(self.mcomplex.RF)
281
- key = _graph_trace_key
195
+ epsilon = _compute_epsilon(self.mcomplex.RF)
196
+ def key(face_and_signed_distance):
197
+ return face_and_signed_distance[1]
282
198
 
283
199
  # Face through which tetrahedron was entered - to avoid we are
284
200
  # going back through the face we just came from. Initialized to
285
201
  # simplex.T for the first iteration.
202
+ tet = self.mcomplex.baseTet
286
203
  entry_cell = simplex.T
287
204
 
288
205
  for i in range(constants.graph_trace_max_steps):
289
206
  # See whether the geodesic is close to a core curve.
207
+ # v is the vertex of the simplex for that core curve.
208
+ # Or None
290
209
  v = self._find_cusp_if_core_curve(tet, entry_cell, epsilon)
291
210
 
211
+ if v is not None:
212
+ # Verify that the the geodesic is really the core curve and
213
+ # determine whether the geodesic and core curve or parallel
214
+ # or anti-parallel.
215
+ self.core_curve_multiplicity = self._multiplicity_of_core_curve(
216
+ tet, v)
217
+ self.core_curve_cusp = tet.Class[v]
218
+ return
219
+
292
220
  # Compute the signed distance of the start point to the
293
221
  # planes supporting a face for each face of the tetrahedron.
294
222
  #
@@ -308,22 +236,29 @@ class GeodesicInfo:
308
236
  # tetrahedron, stop.
309
237
  #
310
238
  # Note the subtle difference here between using
311
- # signed_distance > epsilon to determine whether to stop
239
+ # signed_distance > epsilon to determine whether to stop
312
240
  # signed_distance < -epsilon to determine whether the start point
313
241
  # is inside.
314
242
  #
315
- if v or not any( signed_distance > epsilon
316
- for face, signed_distance
317
- in faces_and_signed_distances ):
318
-
319
- # Report faces for which we cannot confirm that the start point
320
- # is to the inside of the plane supporting that face.
321
- return (tet,
322
- [ face
323
- for face, signed_distance
324
- in faces_and_signed_distances
325
- if not signed_distance < -epsilon ],
326
- v)
243
+ if not any( signed_distance > epsilon
244
+ for face, signed_distance
245
+ in faces_and_signed_distances ):
246
+
247
+ self.lifted_tetrahedra = find_lifted_tetrahedra_containing_point(
248
+ LiftedTetrahedron(
249
+ tet, make_identity_matrix(ring=self.mcomplex.RF, n=4)),
250
+ faces_and_signed_distances,
251
+ self.unnormalised_start_point,
252
+ epsilon)
253
+
254
+ if len(self.lifted_tetrahedra) == 1:
255
+ # We verified that there is a unique tetrahedron containing
256
+ # the start point.
257
+ # Signal to the client that we can start tracing the geodesic
258
+ # throguh the triangulation from this tetrahedron:
259
+ self.tet = self.lifted_tetrahedra[0].tet
260
+
261
+ return
327
262
 
328
263
  # Find face for which the signed distance is largest.
329
264
  #
@@ -422,12 +357,12 @@ class GeodesicInfo:
422
357
 
423
358
  return None
424
359
 
425
- def _verify_direction_of_core_curve(self,
426
- tet : Tetrahedron,
427
- vertex : int) -> int:
360
+ def _multiplicity_of_core_curve(self,
361
+ tet : Tetrahedron,
362
+ vertex : int) -> int:
428
363
  """
429
- Verify that geodesic and core curve are indeed the same and
430
- return sign indicating whether they are parallel or anti-parallel.
364
+ Verify that geodesic is indeed a multiple of the core curve (including
365
+ sign).
431
366
  """
432
367
 
433
368
  if self.line is None:
@@ -435,42 +370,66 @@ class GeodesicInfo:
435
370
  "There is a bug in the code: it is trying to verify that "
436
371
  "geodesic is a core curve without being given a line.")
437
372
 
438
- # We do this by checking whether the corresponding
439
- # Decktransformations corresponding to each are the same.
440
-
441
- # To check whether two Decktransformations are the same, we let each
442
- # act on the basepoint (which is the incenter of the base tetrahedron)
443
- # and compute the distance between the two images.
444
- # We know that the ball about the basepoint with radius the inradius
445
- # of the base tetrahedron injects into the manifold. Thus,
446
- # the distance between the two images is either 0 or larger than
447
- # two times the inradius.
448
- # Hence, if we can prove the distance to be less than the inradius,
449
- # we know that the two Decktransformations are the same.
450
-
451
- # Decktransformation corresponding geodesic acting on basepoint
452
- a = self.line.o13_matrix * self.mcomplex.R13_baseTetInCenter
453
-
454
- # Decktransformation corresponding to core curve acting on basepoint
455
- m = tet.core_curves[vertex].o13_matrix
456
- b0 = m * self.mcomplex.R13_baseTetInCenter
457
- if distance_unit_time_r13_points(a, b0) < self.mcomplex.baseTetInRadius:
458
- return +1
459
-
460
- # Decktransformation corresponding to core curve with opposite
461
- # orientation acting on basepoint.
462
- b1 = o13_inverse(m) * self.mcomplex.R13_baseTetInCenter
463
- if distance_unit_time_r13_points(a, b1) < self.mcomplex.baseTetInRadius:
464
- return -1
373
+ try:
374
+ return compute_and_verify_multiplicity(
375
+ tet.core_curves[vertex],
376
+ self.line,
377
+ self.mcomplex)
378
+ except InsufficientPrecisionError:
379
+ raise InsufficientPrecisionError(
380
+ "Geodesic is very close to a core curve but could not verify "
381
+ "it is the core curve. Increasing the precision will probably "
382
+ "fix this.")
383
+
384
+ def compute_geodesic_start_point_info(mcomplex : Mcomplex,
385
+ word) -> GeodesicStartPointInfo:
386
+ """
387
+ Compute basic information about a geodesic given a word.
465
388
 
466
- raise InsufficientPrecisionError(
467
- "Geodesic is very close to a core curve but could not verify it is "
468
- "the core curve. Increasing the precision will probably fix this.")
389
+ add_r13_geometry must have been called on the Mcomplex.
390
+ """
469
391
 
392
+ m = word_to_psl2c_matrix(mcomplex, word)
393
+ _verify_not_parabolic(m, mcomplex, word)
394
+ # Line fixed by matrix
395
+ line : R13LineWithMatrix = r13_fixed_line_of_psl2c_matrix(m)
396
+
397
+ # Pick a point on the line
398
+ start_point = sample_line(line.r13_line)
399
+
400
+ g = GeodesicStartPointInfo(
401
+ mcomplex=mcomplex,
402
+ word=word,
403
+ trace=m.trace(),
404
+ unnormalised_start_point=start_point,
405
+ unnormalised_end_point=line.o13_matrix * start_point,
406
+ line=line)
407
+
408
+ # Determines whether geodesic corresponds to a core curve.
409
+ # Applies Decktransformations so that start point lies within
410
+ # the interior of one tetrahedron in the fundamental domain or
411
+ # within the union of two tetrahedra neighboring in the hyperboloid
412
+ # model.
413
+ #
414
+ # See GeodesicStartPointInfo for details.
415
+ g.find_tet_or_core_curve()
416
+
417
+ return g
418
+
419
+ def _verify_not_parabolic(m, mcomplex, word):
420
+ """
421
+ Raise exception when user gives a word corresponding to a parabolic
422
+ matrix.
423
+ """
470
424
 
471
- def _graph_trace_key(face_and_signed_distance):
472
- return face_and_signed_distance[1]
425
+ if mcomplex.verified:
426
+ epsilon = 0
427
+ else:
428
+ epsilon = _compute_epsilon(mcomplex.RF)
473
429
 
430
+ tr = m.trace()
431
+ if not (abs(tr - 2) > epsilon and abs(tr + 2) > epsilon):
432
+ raise exceptions.WordAppearsToBeParabolic(word, tr)
474
433
 
475
- def _graph_trace_key_verified(face_and_signed_distance):
476
- return face_and_signed_distance[1].center()
434
+ def _compute_epsilon(RF):
435
+ return RF(0.5) ** (RF.prec() // 2)
@@ -0,0 +1,67 @@
1
+ from ...tiling.lifted_tetrahedron import LiftedTetrahedron
2
+ from ...snap.t3mlite import simplex # type: ignore
3
+ from ...hyperboloid import r13_dot
4
+ from ...exceptions import InsufficientPrecisionError # type: ignore
5
+
6
+ def find_lifted_tetrahedra_containing_point(
7
+ lifted_tetrahedron : LiftedTetrahedron,
8
+ faces_and_signed_distances,
9
+ lifted_pt,
10
+ epsilon):
11
+
12
+ # Report faces for which we cannot confirm that the start point
13
+ # is to the inside of the plane supporting that face.
14
+ faces = [ face
15
+ for face, signed_distance
16
+ in faces_and_signed_distances
17
+ if not signed_distance < -epsilon ]
18
+
19
+ if len(faces) == 0:
20
+ # Signal to the client that we can start with this tetrahedron
21
+ # when developing a tube about the geodesic.
22
+ return [ lifted_tetrahedron ]
23
+
24
+ if len(faces) == 1:
25
+ # The start point is probably on the face of the tetrahedron,
26
+ # that is, we could verify it lies to the right side of the
27
+ # supporting planes for three faces but not one:
28
+ face, = faces
29
+
30
+ # Even though we cannot verify that the start point lies
31
+ # exactly on the face, we can verify that the start point
32
+ # lies in the interior of the union of two neighboring
33
+ # tetrahedra. That is, the union is a hexahedron and
34
+ # it suffices to check that the start point lies to the
35
+ # inside of the six faces of the tetrahedron.
36
+ #
37
+ # _graph_trace already checked the three faces of the given
38
+ # tetrahedron. But it is left to check this for the neighboring
39
+ # tetrahedron.
40
+
41
+ tet = lifted_tetrahedron.tet
42
+ m = lifted_tetrahedron.o13_matrix
43
+
44
+ # Find the other tetrahedron of the neighboring tetrahedra.
45
+ other_tet = tet.Neighbor[face]
46
+ other_pt = tet.O13_matrices[face] * lifted_pt
47
+ other_face = tet.Gluing[face].image(face)
48
+
49
+ for f in simplex.TwoSubsimplices:
50
+ if f == other_face:
51
+ continue
52
+ if not r13_dot(other_pt, other_tet.R13_planes[f]) < epsilon:
53
+ raise InsufficientPrecisionError(
54
+ "Failed to find lift of geodesic and prove that "
55
+ "it intersects tetrahedra of the fundamental domain. "
56
+ "Increasing the precision will probably fix this "
57
+ "problem.")
58
+
59
+ return [ lifted_tetrahedron,
60
+ LiftedTetrahedron(
61
+ other_tet,
62
+ m * other_tet.O13_matrices[other_face]) ]
63
+
64
+ raise InsufficientPrecisionError(
65
+ "Start point chosen on geodesic too close to 1-skeleton of "
66
+ "triangulation to verify it is not on the 1-skeleton. "
67
+ "Increasing the precision will probably fix this problem.")
@@ -0,0 +1,30 @@
1
+ from ...hyperboloid import o13_inverse # type: ignore
2
+ from ...hyperboloid.line import R13Line
3
+
4
+ __all__ = [ 'R13LineWithMatrix' ]
5
+
6
+ class R13LineWithMatrix:
7
+ """
8
+ A line in the hyperboloid model together with a O(1,3)-matrix moving
9
+ the line forward by the given complex length (with real positive part)
10
+ (the matrix is fixing the line set-wise).
11
+ """
12
+ def __init__(self,
13
+ r13_line : R13Line,
14
+ o13_matrix,
15
+ complex_length):
16
+ self.r13_line = r13_line
17
+ self.o13_matrix = o13_matrix
18
+ self.complex_length = complex_length
19
+
20
+ def transformed(self, m):
21
+ """
22
+ Returns image of line with matrix under given O13-matrix m.
23
+
24
+ That is, the matrix will be conjugated by m so that the new
25
+ matrix will fix the image of the line (set-wise).
26
+ """
27
+ return R13LineWithMatrix(
28
+ self.r13_line.transformed(m),
29
+ m * self.o13_matrix * o13_inverse(m),
30
+ self.complex_length)
@@ -0,0 +1,127 @@
1
+ from .line import R13LineWithMatrix
2
+ from ...hyperboloid.distances import distance_r13_points
3
+ from ...hyperboloid import o13_inverse
4
+ from ...exceptions import InsufficientPrecisionError
5
+
6
+ def compute_and_verify_multiplicity(line : R13LineWithMatrix,
7
+ line_power : R13LineWithMatrix,
8
+ mcomplex):
9
+ """
10
+ Assume that line and line_power are created from matrices from the geometric
11
+ representation.
12
+
13
+ Verify that the matrix of line_power is a signed multiple of the matrix
14
+ of line and return the multiple.
15
+ """
16
+
17
+ # First use real length to compute multiple up to sign.
18
+ multiplicity = _compute_absolute_multiplicity(
19
+ line.complex_length.real(),
20
+ line_power.complex_length.real(),
21
+ mcomplex.verified)
22
+
23
+ sign = _determine_and_verify_sign(
24
+ multiplicity,
25
+ line.o13_matrix,
26
+ line_power.o13_matrix,
27
+ mcomplex)
28
+
29
+ return sign * multiplicity
30
+
31
+ _epsilon = 0.001
32
+ _max_multiple = 500
33
+
34
+ def _compute_absolute_multiplicity(
35
+ length,
36
+ length_multiple,
37
+ verified):
38
+
39
+ r = length_multiple / length
40
+
41
+ if verified:
42
+ is_int, r_int = r.is_int()
43
+ if not is_int:
44
+ raise InsufficientPrecisionError(
45
+ "When verifying that a geodesic is a multiple of another "
46
+ "geodesic, the interval for the multiplicity does not contain "
47
+ "a unique integer.")
48
+ else:
49
+ r_int = r.round()
50
+ if abs(r_int - r) > _epsilon:
51
+ raise InsufficientPrecisionError(
52
+ "When verifying that a geodesic is a multiple of another "
53
+ "geodesic, the floating point approximation for the "
54
+ "multiplicity is too far off an integer.")
55
+ r_int = int(r_int)
56
+
57
+ if not r_int > 0:
58
+ if verified:
59
+ raise RuntimeError(
60
+ "When verifying that a geodesic is a multiple of another "
61
+ "geodesic, we got zero for multiplicity. This is a bug.")
62
+ else:
63
+ raise InsufficientPrecisionError(
64
+ "When verifying that a geodesic is a multiple of another "
65
+ "geodesic, we got zero for multiplicity. Increasing the "
66
+ "precision might help.")
67
+ if not r_int < _max_multiple:
68
+ raise RuntimeError(
69
+ "When verifying that a geodesic is a multiple of another "
70
+ "geodesic, we got a multiple (%d) higher than what we support "
71
+ "(%d)" % (r_int, _max_multiple))
72
+
73
+ return r_int
74
+
75
+ def _determine_and_verify_sign(multiplicity, m, m_power, mcomplex):
76
+ """
77
+ Given matrices m and m_power coming from the geometric representation,
78
+ verify that either m^multiplicity = m_power^sign for either sign = +1
79
+ or sign = -1. Return sign.
80
+ """
81
+
82
+ base_pt = mcomplex.R13_baseTetInCenter
83
+
84
+ # Compute image of base point under m^multiplicity.
85
+ pt = base_pt
86
+ for i in range(multiplicity):
87
+ pt = m * pt
88
+
89
+ # Check whether it is equal to image under m_power
90
+ if _are_images_of_basepoints_equal(
91
+ pt, m_power * base_pt, mcomplex):
92
+ return +1
93
+
94
+ # Check whether it is equal to image under m_power^-1
95
+ if _are_images_of_basepoints_equal(
96
+ pt, o13_inverse(m_power) * base_pt, mcomplex):
97
+ return -1
98
+
99
+ raise RuntimeError(
100
+ "Given geodesic is not a multiple of other given geodesic.")
101
+
102
+ def _are_images_of_basepoints_equal(pt0, pt1, mcomplex):
103
+ """
104
+ Given two images of the base point under Deck transformations,
105
+ check whether they are the same (and thus correspond to the same
106
+ Deck transformation).
107
+ """
108
+
109
+ # We use that the the base point is the incenter of the base
110
+ # tetrahedron. Thus, we know that if the minimum distance for
111
+ # them to be distinct is the in-radius of the base tetrahedron.
112
+ #
113
+ # We add in a factor of 1/2 for safety.
114
+
115
+ d = distance_r13_points(pt0, pt1)
116
+ if d < mcomplex.baseTetInRadius / 2:
117
+ return True
118
+ if d > mcomplex.baseTetInRadius / 2:
119
+ return False
120
+
121
+ raise InsufficientPrecisionError(
122
+ "When determining whether a geodesic is a multiple of another "
123
+ "geodesic, we could not verify that the images of the base point "
124
+ "under the corresponding matrices are the same or not.\n"
125
+ "Distance between basepoints: %r\n"
126
+ "Cut-off: %r" % (d, mcomplex.baseTetInRadius / 2))
127
+