snappy 3.1.1__cp312-cp312-win_amd64.whl → 3.2__cp312-cp312-win_amd64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (471) hide show
  1. snappy/CyOpenGL.cp312-win_amd64.pyd +0 -0
  2. snappy/SnapPy.cp312-win_amd64.pyd +0 -0
  3. snappy/SnapPyHP.cp312-win_amd64.pyd +0 -0
  4. snappy/__init__.py +271 -401
  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 -924
  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 -12
  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 -74
  85. snappy/doc/_static/searchtools.js +108 -62
  86. snappy/doc/_static/snappy_furo.css +33 -33
  87. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
  88. snappy/doc/additional_classes.html +1499 -1330
  89. snappy/doc/bugs.html +131 -134
  90. snappy/doc/censuses.html +426 -445
  91. snappy/doc/credits.html +180 -183
  92. snappy/doc/development.html +383 -363
  93. snappy/doc/genindex.html +1330 -1409
  94. snappy/doc/index.html +261 -206
  95. snappy/doc/installing.html +345 -363
  96. snappy/doc/manifold.html +3451 -2839
  97. snappy/doc/manifoldhp.html +179 -182
  98. snappy/doc/news.html +387 -329
  99. snappy/doc/objects.inv +0 -0
  100. snappy/doc/other.html +160 -162
  101. snappy/doc/platonic_census.html +374 -377
  102. snappy/doc/plink.html +209 -212
  103. snappy/doc/ptolemy.html +253 -255
  104. snappy/doc/ptolemy_classes.html +1143 -1146
  105. snappy/doc/ptolemy_examples1.html +408 -410
  106. snappy/doc/ptolemy_examples2.html +470 -473
  107. snappy/doc/ptolemy_examples3.html +413 -416
  108. snappy/doc/ptolemy_examples4.html +194 -197
  109. snappy/doc/ptolemy_prelim.html +247 -250
  110. snappy/doc/py-modindex.html +164 -167
  111. snappy/doc/screenshots.html +140 -142
  112. snappy/doc/search.html +134 -137
  113. snappy/doc/searchindex.js +1 -1
  114. snappy/doc/snap.html +201 -204
  115. snappy/doc/snappy.html +180 -182
  116. snappy/doc/spherogram.html +1210 -1213
  117. snappy/doc/todo.html +165 -168
  118. snappy/doc/triangulation.html +1583 -1474
  119. snappy/doc/tutorial.html +158 -161
  120. snappy/doc/verify.html +329 -275
  121. snappy/doc/verify_internals.html +1234 -1691
  122. snappy/drilling/__init__.py +153 -235
  123. snappy/drilling/barycentric.py +103 -0
  124. snappy/drilling/constants.py +0 -2
  125. snappy/drilling/crush.py +56 -130
  126. snappy/drilling/cusps.py +12 -6
  127. snappy/drilling/debug.py +2 -1
  128. snappy/drilling/exceptions.py +7 -40
  129. snappy/drilling/moves.py +302 -243
  130. snappy/drilling/perturb.py +63 -37
  131. snappy/drilling/shorten.py +36 -0
  132. snappy/drilling/subdivide.py +0 -5
  133. snappy/drilling/test.py +23 -0
  134. snappy/drilling/test_cases.py +126 -0
  135. snappy/drilling/tracing.py +9 -37
  136. snappy/exceptions.py +18 -5
  137. snappy/exterior_to_link/barycentric_geometry.py +2 -4
  138. snappy/exterior_to_link/main.py +8 -7
  139. snappy/exterior_to_link/mcomplex_with_link.py +2 -2
  140. snappy/exterior_to_link/rational_linear_algebra.py +1 -1
  141. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
  142. snappy/exterior_to_link/test.py +21 -33
  143. snappy/geometric_structure/__init__.py +212 -0
  144. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  145. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  146. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  147. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  148. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  149. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  150. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  151. snappy/geometric_structure/geodesic/__init__.py +0 -0
  152. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  153. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  154. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  155. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  156. snappy/geometric_structure/geodesic/constants.py +6 -0
  157. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  158. snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
  159. snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
  160. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  161. snappy/geometric_structure/geodesic/line.py +30 -0
  162. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  163. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  164. snappy/geometric_structure/test.py +22 -0
  165. snappy/gui.py +23 -13
  166. snappy/horoviewer.py +7 -7
  167. snappy/hyperboloid/__init__.py +96 -31
  168. snappy/hyperboloid/distances.py +245 -0
  169. snappy/hyperboloid/horoball.py +19 -0
  170. snappy/hyperboloid/line.py +35 -0
  171. snappy/hyperboloid/point.py +9 -0
  172. snappy/hyperboloid/triangle.py +29 -0
  173. snappy/isometry_signature.py +382 -0
  174. snappy/len_spec/__init__.py +596 -0
  175. snappy/len_spec/geodesic_info.py +110 -0
  176. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  177. snappy/len_spec/geodesic_piece.py +143 -0
  178. snappy/len_spec/geometric_structure.py +182 -0
  179. snappy/len_spec/geometry.py +80 -0
  180. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  181. snappy/len_spec/spine.py +206 -0
  182. snappy/len_spec/test.py +24 -0
  183. snappy/len_spec/test_cases.py +69 -0
  184. snappy/len_spec/tile.py +275 -0
  185. snappy/len_spec/word.py +86 -0
  186. snappy/math_basics.py +39 -13
  187. snappy/matrix.py +52 -9
  188. snappy/number.py +12 -6
  189. snappy/numeric_output_checker.py +2 -3
  190. snappy/pari.py +6 -3
  191. snappy/polyviewer.py +8 -8
  192. snappy/ptolemy/__init__.py +1 -1
  193. snappy/ptolemy/component.py +2 -2
  194. snappy/ptolemy/coordinates.py +25 -25
  195. snappy/ptolemy/findLoops.py +9 -9
  196. snappy/ptolemy/manifoldMethods.py +27 -29
  197. snappy/ptolemy/polynomial.py +50 -57
  198. snappy/ptolemy/processFileBase.py +60 -0
  199. snappy/ptolemy/ptolemyVariety.py +109 -41
  200. snappy/ptolemy/reginaWrapper.py +4 -4
  201. snappy/ptolemy/rur.py +1 -1
  202. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
  203. snappy/ptolemy/test.py +99 -54
  204. snappy/ptolemy/utilities.py +1 -1
  205. snappy/raytracing/__init__.py +64 -0
  206. snappy/raytracing/additional_horospheres.py +64 -0
  207. snappy/raytracing/additional_len_spec_choices.py +63 -0
  208. snappy/raytracing/cohomology_fractal.py +0 -3
  209. snappy/raytracing/eyeball.py +123 -0
  210. snappy/raytracing/finite_raytracing_data.py +17 -17
  211. snappy/raytracing/finite_viewer.py +15 -15
  212. snappy/raytracing/geodesic_tube_info.py +93 -63
  213. snappy/raytracing/geodesics.py +94 -64
  214. snappy/raytracing/geodesics_window.py +56 -34
  215. snappy/raytracing/gui_utilities.py +21 -6
  216. snappy/raytracing/hyperboloid_navigation.py +29 -4
  217. snappy/raytracing/hyperboloid_utilities.py +73 -73
  218. snappy/raytracing/ideal_raytracing_data.py +121 -91
  219. snappy/raytracing/inside_viewer.py +199 -66
  220. snappy/raytracing/pack.py +22 -0
  221. snappy/raytracing/raytracing_data.py +37 -25
  222. snappy/raytracing/raytracing_view.py +70 -65
  223. snappy/raytracing/shaders/Eye.png +0 -0
  224. snappy/raytracing/shaders/NonGeometric.png +0 -0
  225. snappy/raytracing/shaders/__init__.py +39 -3
  226. snappy/raytracing/shaders/fragment.glsl +451 -133
  227. snappy/raytracing/test.py +29 -0
  228. snappy/raytracing/tooltip.py +146 -0
  229. snappy/raytracing/upper_halfspace_utilities.py +42 -9
  230. snappy/sage_helper.py +67 -134
  231. snappy/settings.py +90 -77
  232. snappy/shell.py +2 -0
  233. snappy/snap/character_varieties.py +2 -2
  234. snappy/snap/find_field.py +4 -3
  235. snappy/snap/fundamental_polyhedron.py +2 -2
  236. snappy/snap/kernel_structures.py +5 -1
  237. snappy/snap/nsagetools.py +9 -8
  238. snappy/snap/peripheral/dual_cellulation.py +4 -3
  239. snappy/snap/peripheral/peripheral.py +2 -2
  240. snappy/snap/peripheral/surface.py +5 -5
  241. snappy/snap/peripheral/test.py +1 -1
  242. snappy/snap/polished_reps.py +8 -8
  243. snappy/snap/slice_obs_HKL.py +16 -14
  244. snappy/snap/t3mlite/arrow.py +3 -3
  245. snappy/snap/t3mlite/edge.py +3 -3
  246. snappy/snap/t3mlite/homology.py +2 -2
  247. snappy/snap/t3mlite/mcomplex.py +3 -3
  248. snappy/snap/t3mlite/simplex.py +12 -0
  249. snappy/snap/t3mlite/spun.py +18 -17
  250. snappy/snap/t3mlite/test_vs_regina.py +4 -4
  251. snappy/snap/test.py +37 -53
  252. snappy/snap/utilities.py +4 -5
  253. snappy/test.py +121 -138
  254. snappy/test_cases.py +263 -0
  255. snappy/testing.py +131 -0
  256. snappy/tiling/__init__.py +2 -0
  257. snappy/tiling/canonical_key_dict.py +59 -0
  258. snappy/tiling/dict_based_set.py +79 -0
  259. snappy/tiling/floor.py +49 -0
  260. snappy/tiling/hyperboloid_dict.py +54 -0
  261. snappy/tiling/iter_utils.py +78 -0
  262. snappy/tiling/lifted_tetrahedron.py +22 -0
  263. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  264. snappy/tiling/real_hash_dict.py +164 -0
  265. snappy/tiling/test.py +23 -0
  266. snappy/tiling/tile.py +215 -0
  267. snappy/tiling/triangle.py +33 -0
  268. snappy/tkterminal.py +113 -84
  269. snappy/twister/main.py +1 -7
  270. snappy/twister/twister_core.cp312-win_amd64.pyd +0 -0
  271. snappy/upper_halfspace/__init__.py +78 -17
  272. snappy/verify/__init__.py +3 -7
  273. snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
  274. snappy/verify/complex_volume/adjust_torsion.py +1 -2
  275. snappy/verify/complex_volume/closed.py +13 -13
  276. snappy/verify/complex_volume/cusped.py +6 -6
  277. snappy/verify/complex_volume/extended_bloch.py +5 -8
  278. snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
  279. snappy/verify/edge_equations.py +80 -0
  280. snappy/verify/exceptions.py +0 -55
  281. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
  282. snappy/verify/interval_newton_shapes_engine.py +7 -5
  283. snappy/verify/interval_tree.py +5 -5
  284. snappy/verify/krawczyk_shapes_engine.py +17 -18
  285. snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
  286. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
  287. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
  288. snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
  289. snappy/verify/shapes.py +5 -3
  290. snappy/verify/short_slopes.py +39 -41
  291. snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
  292. snappy/verify/test.py +57 -60
  293. snappy/verify/upper_halfspace/extended_matrix.py +1 -1
  294. snappy/verify/upper_halfspace/finite_point.py +3 -4
  295. snappy/verify/upper_halfspace/ideal_point.py +9 -9
  296. snappy/verify/volume.py +2 -2
  297. snappy/version.py +2 -2
  298. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +25 -11
  299. snappy-3.2.dist-info/RECORD +503 -0
  300. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  301. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  302. snappy/__pycache__/__init__.cpython-312.pyc +0 -0
  303. snappy/__pycache__/browser.cpython-312.pyc +0 -0
  304. snappy/__pycache__/cache.cpython-312.pyc +0 -0
  305. snappy/__pycache__/database.cpython-312.pyc +0 -0
  306. snappy/__pycache__/db_utilities.cpython-312.pyc +0 -0
  307. snappy/__pycache__/decorated_isosig.cpython-312.pyc +0 -0
  308. snappy/__pycache__/exceptions.cpython-312.pyc +0 -0
  309. snappy/__pycache__/export_stl.cpython-312.pyc +0 -0
  310. snappy/__pycache__/filedialog.cpython-312.pyc +0 -0
  311. snappy/__pycache__/gui.cpython-312.pyc +0 -0
  312. snappy/__pycache__/horoviewer.cpython-312.pyc +0 -0
  313. snappy/__pycache__/math_basics.cpython-312.pyc +0 -0
  314. snappy/__pycache__/matrix.cpython-312.pyc +0 -0
  315. snappy/__pycache__/number.cpython-312.pyc +0 -0
  316. snappy/__pycache__/numeric_output_checker.cpython-312.pyc +0 -0
  317. snappy/__pycache__/pari.cpython-312.pyc +0 -0
  318. snappy/__pycache__/polyviewer.cpython-312.pyc +0 -0
  319. snappy/__pycache__/sage_helper.cpython-312.pyc +0 -0
  320. snappy/__pycache__/version.cpython-312.pyc +0 -0
  321. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  322. snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
  323. snappy/doc/_static/js/html5shiv.min.js +0 -4
  324. snappy/doc/verify_canon.html +0 -304
  325. snappy/drilling/__pycache__/__init__.cpython-312.pyc +0 -0
  326. snappy/drilling/__pycache__/constants.cpython-312.pyc +0 -0
  327. snappy/drilling/__pycache__/crush.cpython-312.pyc +0 -0
  328. snappy/drilling/__pycache__/cusps.cpython-312.pyc +0 -0
  329. snappy/drilling/__pycache__/debug.cpython-312.pyc +0 -0
  330. snappy/drilling/__pycache__/epsilons.cpython-312.pyc +0 -0
  331. snappy/drilling/__pycache__/exceptions.cpython-312.pyc +0 -0
  332. snappy/drilling/__pycache__/fixed_points.cpython-312.pyc +0 -0
  333. snappy/drilling/__pycache__/geodesic_info.cpython-312.pyc +0 -0
  334. snappy/drilling/__pycache__/geodesic_tube.cpython-312.pyc +0 -0
  335. snappy/drilling/__pycache__/geometric_structure.cpython-312.pyc +0 -0
  336. snappy/drilling/__pycache__/line.cpython-312.pyc +0 -0
  337. snappy/drilling/__pycache__/moves.cpython-312.pyc +0 -0
  338. snappy/drilling/__pycache__/peripheral_curves.cpython-312.pyc +0 -0
  339. snappy/drilling/__pycache__/perturb.cpython-312.pyc +0 -0
  340. snappy/drilling/__pycache__/quotient_space.cpython-312.pyc +0 -0
  341. snappy/drilling/__pycache__/spatial_dict.cpython-312.pyc +0 -0
  342. snappy/drilling/__pycache__/subdivide.cpython-312.pyc +0 -0
  343. snappy/drilling/__pycache__/tracing.cpython-312.pyc +0 -0
  344. snappy/drilling/geodesic_tube.py +0 -441
  345. snappy/drilling/geometric_structure.py +0 -366
  346. snappy/drilling/line.py +0 -122
  347. snappy/drilling/quotient_space.py +0 -94
  348. snappy/drilling/spatial_dict.py +0 -128
  349. snappy/exterior_to_link/__pycache__/__init__.cpython-312.pyc +0 -0
  350. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-312.pyc +0 -0
  351. snappy/exterior_to_link/__pycache__/exceptions.cpython-312.pyc +0 -0
  352. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-312.pyc +0 -0
  353. snappy/exterior_to_link/__pycache__/link_projection.cpython-312.pyc +0 -0
  354. snappy/exterior_to_link/__pycache__/main.cpython-312.pyc +0 -0
  355. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-312.pyc +0 -0
  356. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-312.pyc +0 -0
  357. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-312.pyc +0 -0
  358. snappy/exterior_to_link/__pycache__/pl_utils.cpython-312.pyc +0 -0
  359. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-312.pyc +0 -0
  360. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-312.pyc +0 -0
  361. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-312.pyc +0 -0
  362. snappy/exterior_to_link/__pycache__/stored_moves.cpython-312.pyc +0 -0
  363. snappy/hyperboloid/__pycache__/__init__.cpython-312.pyc +0 -0
  364. snappy/manifolds/__pycache__/__init__.cpython-312.pyc +0 -0
  365. snappy/ptolemy/__pycache__/__init__.cpython-312.pyc +0 -0
  366. snappy/ptolemy/__pycache__/component.cpython-312.pyc +0 -0
  367. snappy/ptolemy/__pycache__/coordinates.cpython-312.pyc +0 -0
  368. snappy/ptolemy/__pycache__/fieldExtensions.cpython-312.pyc +0 -0
  369. snappy/ptolemy/__pycache__/findLoops.cpython-312.pyc +0 -0
  370. snappy/ptolemy/__pycache__/homology.cpython-312.pyc +0 -0
  371. snappy/ptolemy/__pycache__/manifoldMethods.cpython-312.pyc +0 -0
  372. snappy/ptolemy/__pycache__/matrix.cpython-312.pyc +0 -0
  373. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-312.pyc +0 -0
  374. snappy/ptolemy/__pycache__/polynomial.cpython-312.pyc +0 -0
  375. snappy/ptolemy/__pycache__/processComponents.cpython-312.pyc +0 -0
  376. snappy/ptolemy/__pycache__/processFileBase.cpython-312.pyc +0 -0
  377. snappy/ptolemy/__pycache__/processFileDispatch.cpython-312.pyc +0 -0
  378. snappy/ptolemy/__pycache__/processMagmaFile.cpython-312.pyc +0 -0
  379. snappy/ptolemy/__pycache__/processRurFile.cpython-312.pyc +0 -0
  380. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-312.pyc +0 -0
  381. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-312.pyc +0 -0
  382. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-312.pyc +0 -0
  383. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-312.pyc +0 -0
  384. snappy/ptolemy/__pycache__/rur.cpython-312.pyc +0 -0
  385. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-312.pyc +0 -0
  386. snappy/ptolemy/__pycache__/utilities.cpython-312.pyc +0 -0
  387. snappy/snap/__pycache__/__init__.cpython-312.pyc +0 -0
  388. snappy/snap/__pycache__/character_varieties.cpython-312.pyc +0 -0
  389. snappy/snap/__pycache__/fundamental_polyhedron.cpython-312.pyc +0 -0
  390. snappy/snap/__pycache__/interval_reps.cpython-312.pyc +0 -0
  391. snappy/snap/__pycache__/kernel_structures.cpython-312.pyc +0 -0
  392. snappy/snap/__pycache__/mcomplex_base.cpython-312.pyc +0 -0
  393. snappy/snap/__pycache__/nsagetools.cpython-312.pyc +0 -0
  394. snappy/snap/__pycache__/polished_reps.cpython-312.pyc +0 -0
  395. snappy/snap/__pycache__/shapes.cpython-312.pyc +0 -0
  396. snappy/snap/__pycache__/slice_obs_HKL.cpython-312.pyc +0 -0
  397. snappy/snap/__pycache__/utilities.cpython-312.pyc +0 -0
  398. snappy/snap/peripheral/__pycache__/__init__.cpython-312.pyc +0 -0
  399. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-312.pyc +0 -0
  400. snappy/snap/peripheral/__pycache__/link.cpython-312.pyc +0 -0
  401. snappy/snap/peripheral/__pycache__/peripheral.cpython-312.pyc +0 -0
  402. snappy/snap/peripheral/__pycache__/surface.cpython-312.pyc +0 -0
  403. snappy/snap/t3mlite/__pycache__/__init__.cpython-312.pyc +0 -0
  404. snappy/snap/t3mlite/__pycache__/arrow.cpython-312.pyc +0 -0
  405. snappy/snap/t3mlite/__pycache__/corner.cpython-312.pyc +0 -0
  406. snappy/snap/t3mlite/__pycache__/edge.cpython-312.pyc +0 -0
  407. snappy/snap/t3mlite/__pycache__/face.cpython-312.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/files.cpython-312.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/homology.cpython-312.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/linalg.cpython-312.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-312.pyc +0 -0
  412. snappy/snap/t3mlite/__pycache__/perm4.cpython-312.pyc +0 -0
  413. snappy/snap/t3mlite/__pycache__/simplex.cpython-312.pyc +0 -0
  414. snappy/snap/t3mlite/__pycache__/spun.cpython-312.pyc +0 -0
  415. snappy/snap/t3mlite/__pycache__/surface.cpython-312.pyc +0 -0
  416. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-312.pyc +0 -0
  417. snappy/snap/t3mlite/__pycache__/vertex.cpython-312.pyc +0 -0
  418. snappy/togl/__init__.py +0 -3
  419. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  420. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  421. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  422. snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
  423. snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
  424. snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
  425. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  426. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  427. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  428. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  429. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  430. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  431. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  432. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  433. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  434. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  435. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  436. snappy/twister/__pycache__/__init__.cpython-312.pyc +0 -0
  437. snappy/twister/__pycache__/main.cpython-312.pyc +0 -0
  438. snappy/upper_halfspace/__pycache__/__init__.cpython-312.pyc +0 -0
  439. snappy/upper_halfspace/__pycache__/ideal_point.cpython-312.pyc +0 -0
  440. snappy/verify/__pycache__/__init__.cpython-312.pyc +0 -0
  441. snappy/verify/__pycache__/cuspCrossSection.cpython-312.pyc +0 -0
  442. snappy/verify/__pycache__/cuspTranslations.cpython-312.pyc +0 -0
  443. snappy/verify/__pycache__/cusp_areas.cpython-312.pyc +0 -0
  444. snappy/verify/__pycache__/cusp_shapes.cpython-312.pyc +0 -0
  445. snappy/verify/__pycache__/exceptions.cpython-312.pyc +0 -0
  446. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-312.pyc +0 -0
  447. snappy/verify/__pycache__/interval_tree.cpython-312.pyc +0 -0
  448. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-312.pyc +0 -0
  449. snappy/verify/__pycache__/realAlgebra.cpython-312.pyc +0 -0
  450. snappy/verify/__pycache__/shapes.cpython-312.pyc +0 -0
  451. snappy/verify/__pycache__/short_slopes.cpython-312.pyc +0 -0
  452. snappy/verify/__pycache__/squareExtensions.cpython-312.pyc +0 -0
  453. snappy/verify/__pycache__/verifyCanonical.cpython-312.pyc +0 -0
  454. snappy/verify/__pycache__/verifyHyperbolicity.cpython-312.pyc +0 -0
  455. snappy/verify/__pycache__/volume.cpython-312.pyc +0 -0
  456. snappy/verify/complex_volume/__pycache__/__init__.cpython-312.pyc +0 -0
  457. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-312.pyc +0 -0
  458. snappy/verify/complex_volume/__pycache__/closed.cpython-312.pyc +0 -0
  459. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-312.pyc +0 -0
  460. snappy/verify/complex_volume/__pycache__/cusped.cpython-312.pyc +0 -0
  461. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-312.pyc +0 -0
  462. snappy/verify/cuspCrossSection.py +0 -1422
  463. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-312.pyc +0 -0
  464. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-312.pyc +0 -0
  465. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-312.pyc +0 -0
  466. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-312.pyc +0 -0
  467. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-312.pyc +0 -0
  468. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-312.pyc +0 -0
  469. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-312.pyc +0 -0
  470. snappy-3.1.1.dist-info/RECORD +0 -572
  471. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
snappy/drilling/moves.py CHANGED
@@ -1,21 +1,30 @@
1
1
  from .cusps import CuspPostDrillInfo
2
- from .geometric_structure import compute_r13_planes_for_tet
3
2
  from .tracing import compute_plane_intersection_param, Endpoint, GeodesicPiece
4
3
  from .epsilons import compute_epsilon
5
4
  from . import constants
6
5
  from . import exceptions
7
6
 
8
- from ..snap.t3mlite import simplex, Perm4, Tetrahedron # type: ignore
9
- from ..matrix import matrix # type: ignore
7
+ from ..geometric_structure import add_r13_planes_to_tetrahedron
8
+ from ..snap.t3mlite import simplex, Perm4, Tetrahedron, Corner # type: ignore
9
+ from ..matrix import make_identity_matrix # type: ignore
10
10
  from ..exceptions import InsufficientPrecisionError # type: ignore
11
11
 
12
- from typing import Sequence, Optional, Union, Tuple, List, Dict, Mapping
12
+ from typing import Sequence, Optional, List
13
13
 
14
14
  __all__ = ['one_four_move', 'two_three_move']
15
15
 
16
-
17
16
  def one_four_move(given_pieces : Sequence[GeodesicPiece],
18
17
  verified : bool) -> Sequence[GeodesicPiece]:
18
+ """
19
+ Performs a 1-4 move.
20
+
21
+ Given pieces are supposed to be either two pieces
22
+ F-T-F (see subdivide.py for notation) or just one piece F-F.
23
+
24
+ For F-T-F, the new point for the 1-4 move will be the one given
25
+ for T. For F-F, the 1-4 move will pick a point on the line segment
26
+ (not picking exactly the middle to avoid coincidences).
27
+ """
19
28
 
20
29
  tet : Tetrahedron = given_pieces[0].tet
21
30
  RF = tet.O13_matrices[simplex.F0].base_ring()
@@ -50,15 +59,20 @@ def one_four_move(given_pieces : Sequence[GeodesicPiece],
50
59
  else:
51
60
  raise Exception("Bad 1-4 move")
52
61
 
62
+ # The new tetrahedra.
63
+ # new_tets[f] shares face f with the old tetrahedron.
64
+ # That is vertex v of the new tetrahedron corresponds to
65
+ # vertex v of the old tetrahedron if v is on the face f.
66
+ # Otherwise, the vertex v of the new tetrahedron corresponds
67
+ # to the new vertex in the center.
68
+
53
69
  new_tets : dict[int, Tetrahedron] = {
54
70
  f : Tetrahedron() for f in simplex.TwoSubsimplices }
55
71
 
56
- neighbors : dict[int, Tetrahedron] = {
57
- f: t for f, t in tet.Neighbor.items() }
58
- gluings : dict[int, Perm4] = {
59
- f: p for f, p in tet.Gluing.items() }
72
+ neighbors : dict[int, Tetrahedron] = dict(tet.Neighbor.items())
73
+ gluings : dict[int, Perm4] = dict(tet.Gluing.items())
60
74
 
61
- id_matrix = matrix.identity(ring=RF, n=4)
75
+ id_matrix = make_identity_matrix(ring=RF, n=4)
62
76
 
63
77
  for f0, new_tet0 in new_tets.items():
64
78
  new_tet0.geodesic_pieces = []
@@ -91,7 +105,7 @@ def one_four_move(given_pieces : Sequence[GeodesicPiece],
91
105
 
92
106
  new_tet0.O13_matrices[f0] = tet.O13_matrices[f0]
93
107
 
94
- compute_r13_planes_for_tet(new_tet0)
108
+ add_r13_planes_to_tetrahedron(new_tet0)
95
109
 
96
110
  for ml in range(2):
97
111
  for sheet in range(2):
@@ -109,6 +123,8 @@ def one_four_move(given_pieces : Sequence[GeodesicPiece],
109
123
  new_tets[f2].PeripheralCurves[ml][sheet][v][f1] = (
110
124
  -tet.PeripheralCurves[ml][sheet][v][f2])
111
125
 
126
+ # Transfer or re-trace the other pieces of the geodesic going through
127
+ # the old tetrahedron in the new tetrahedra.
112
128
  for old_piece in tet.geodesic_pieces:
113
129
  if old_piece in given_pieces:
114
130
  continue
@@ -116,11 +132,14 @@ def one_four_move(given_pieces : Sequence[GeodesicPiece],
116
132
  start_subsimplex : int = old_piece.endpoints[0].subsimplex
117
133
  end_subsimplex : int = old_piece.endpoints[1].subsimplex
118
134
 
119
- # Both endpoints are vertices
120
- total_subsimplex = start_subsimplex | end_subsimplex
121
- if total_subsimplex in simplex.OneSubsimplices:
122
- for face, new_tet in new_tets.items():
123
- if simplex.is_subset(total_subsimplex, face):
135
+ dimension_start_subsimplex = simplex.dimension(start_subsimplex)
136
+ dimension_end_subsimplex = simplex.dimension(end_subsimplex)
137
+
138
+ if dimension_start_subsimplex == 0 and dimension_end_subsimplex == 0:
139
+ # Both endpoints are vertices, no re-tracing necessary.
140
+ total_subsimplex = start_subsimplex | end_subsimplex
141
+ for new_face, new_tet in new_tets.items():
142
+ if simplex.is_subset(total_subsimplex, new_face):
124
143
  GeodesicPiece.replace_by(
125
144
  old_piece, old_piece,
126
145
  [ GeodesicPiece.create_and_attach(
@@ -130,49 +149,24 @@ def one_four_move(given_pieces : Sequence[GeodesicPiece],
130
149
  break
131
150
  else:
132
151
  raise Exception("Unhandled edge case")
133
- continue
134
-
135
- r13_endpoints = [ e.r13_point for e in old_piece.endpoints ]
136
- retrace_direction : int = +1
137
- end_cell_dimension : int = 2
138
- if end_subsimplex in simplex.ZeroSubsimplices:
139
- end_cell_dimension = 0
140
- allowed_end_corners : Sequence[Tuple[Tetrahedron, int]] = [
141
- (new_tets[f], end_subsimplex)
142
- for f in simplex.TwoSubsimplices
143
- if simplex.is_subset(end_subsimplex, f) ]
144
- elif end_subsimplex == simplex.T:
145
- end_cell_dimension = 3
146
- allowed_end_corners = [
147
- (new_tet, end_subsimplex)
148
- for new_tet in new_tets.values() ]
149
- elif start_subsimplex == simplex.T:
150
- end_cell_dimension = 3
151
- retrace_direction = -1
152
- start_subsimplex, end_subsimplex = end_subsimplex, start_subsimplex
153
- r13_endpoints = r13_endpoints[::-1]
154
- allowed_end_corners = [
155
- (new_tet, end_subsimplex)
156
- for new_tet in new_tets.values() ]
157
- elif (start_subsimplex in simplex.TwoSubsimplices and
158
- end_subsimplex in simplex.TwoSubsimplices):
159
- allowed_end_corners = [ (new_tets[end_subsimplex], end_subsimplex) ]
160
152
  else:
161
- raise Exception("Unhandled case")
162
-
163
- GeodesicPiece.replace_by(
164
- old_piece, old_piece,
165
- _retrace_geodesic_piece(
166
- old_piece.index,
167
- new_tets,
168
- new_tets[start_subsimplex],
169
- start_subsimplex,
170
- end_cell_dimension,
171
- r13_endpoints,
172
- retrace_direction,
173
- verified,
174
- allowed_end_corners=allowed_end_corners))
175
-
153
+ # Re-trace.
154
+ r13_endpoints = [ e.r13_point for e in old_piece.endpoints ]
155
+
156
+ GeodesicPiece.replace_by(
157
+ old_piece, old_piece,
158
+ _retrace_geodesic_piece(
159
+ index=old_piece.index,
160
+ r13_points=r13_endpoints,
161
+ start_corners=[ Corner(new_tets[f], start_subsimplex)
162
+ for f in simplex.TwoSubsimplices
163
+ if simplex.is_subset(start_subsimplex, f) ],
164
+ end_corners=[ Corner(new_tets[f], end_subsimplex)
165
+ for f in simplex.TwoSubsimplices
166
+ if simplex.is_subset(end_subsimplex, f) ],
167
+ verified=verified))
168
+
169
+ # Turn given pieces into F-V-F
176
170
  start_point : Endpoint = given_pieces[0].endpoints[0]
177
171
  end_point : Endpoint = given_pieces[-1].endpoints[1]
178
172
  new_pieces : Sequence[GeodesicPiece] = [
@@ -192,24 +186,33 @@ def one_four_move(given_pieces : Sequence[GeodesicPiece],
192
186
 
193
187
  return new_pieces
194
188
 
195
-
196
189
  def two_three_move(given_pieces : Sequence[GeodesicPiece],
197
190
  verified : bool) -> Sequence[GeodesicPiece]:
198
191
  """
199
- piece is assumed to go from a vertex to opposite face.
200
- The 2-3 move is performed on the two tetrahedra adjacent to that
201
- face.
192
+ Expects two given pieces V-F-V which form one straight line
193
+ segment from V to V.
194
+
195
+ The 2-3 move is performed on the two tetrahedra adjacent to
196
+ that face.
202
197
  """
203
198
 
199
+ # We imagine the two old tetrahedra such that the shared face
200
+ # is horizontal. We list them in the order where the top one
201
+ # is first and has index 0.
202
+
204
203
  old_tets = [ old_piece.tet for old_piece in given_pieces ]
205
204
  old_tips = [ given_pieces[i].endpoints[i].subsimplex
206
205
  for i in range(2) ]
206
+ # For each old tetrahedron, its face that it shared with the other
207
+ # tetrahedron.
207
208
  old_shared_faces = [ simplex.comp(old_tip)
208
209
  for old_tip in old_tips ]
209
210
 
210
211
  RF = old_tets[0].O13_matrices[simplex.F0].base_ring()
211
- id_matrix = matrix.identity(ring=RF, n=4)
212
+ id_matrix = make_identity_matrix(ring=RF, n=4)
212
213
 
214
+ # Embeddings to map both tetrahedra into the same coordinate
215
+ # system
213
216
  O13_embeddings = [ old_tets[0].O13_matrices[old_shared_faces[0]],
214
217
  id_matrix ]
215
218
  O13_inverse_embeddings = [ old_tets[1].O13_matrices[old_shared_faces[1]],
@@ -219,13 +222,8 @@ def two_three_move(given_pieces : Sequence[GeodesicPiece],
219
222
  O13_embeddings[i] * old_tets[i].R13_vertices[old_tips[i]]
220
223
  for i in range(2) ]
221
224
 
222
- # Imagine a tetrahedron coinciding with the top tetrahedron but
223
- # with the vertices labeled such that 0 is the top vertex. Let
224
- # us call this tetrahedron standard tetrahedron (std tet).
225
- #
226
- # std_to_tet is the permutation taking the vertices of the standard
227
- # tetrahedron to the top tetrahedron.
228
- #
225
+ # Find permutation such that we can label the top vertex of
226
+ # the top tetrahedron by 0.
229
227
  for perm in Perm4.A4():
230
228
  if perm.image(simplex.V0) == old_tips[0]:
231
229
  break
@@ -236,6 +234,17 @@ def two_three_move(given_pieces : Sequence[GeodesicPiece],
236
234
  perm * Perm4((0,2,3,1)),
237
235
  perm * Perm4((0,3,1,2)) ] ]
238
236
 
237
+ # The new tetrahedra have vertices as follows:
238
+ # Vertex 0 always corresponds to the top vertex of the
239
+ # top tetrahedron.
240
+ # Vertex 1 always corresponds to the top vertex of the
241
+ # bottom tetrahedron
242
+ # Vertex 3 is glued to vertex 2 of the next tetrahedron.
243
+ #
244
+ # Note that face 0 of a new tetrahedron is shared with
245
+ # some face of the old top tetrahedron (index=1).
246
+ # Similarly for face 1 and the bottom tetrahedron (index=0).
247
+ #
239
248
  new_tets = [ Tetrahedron() for i in range(3) ]
240
249
 
241
250
  for i, new_tet in enumerate(new_tets):
@@ -297,28 +306,65 @@ def two_three_move(given_pieces : Sequence[GeodesicPiece],
297
306
  simplex.V3 : old_tets[1].post_drill_infos[new_to_old_tets[i][1].image(simplex.V3)],
298
307
  }
299
308
 
300
- compute_r13_planes_for_tet(new_tet)
309
+ add_r13_planes_to_tetrahedron(new_tet)
301
310
 
302
311
  old_to_new_tets = [ [ ~new_to_old_tets[j][i] for j in range(3) ]
303
312
  for i in range(2) ]
304
313
 
314
+ # Transfer or re-trace the other pieces of the geodesic going through
315
+ # the old tetrahedron in the new tetrahedra.
316
+ # Consider one old tetrahedron at a time.
305
317
  for j, old_tet in enumerate(old_tets):
306
318
  for old_piece in old_tet.geodesic_pieces:
307
319
 
308
320
  if old_piece in given_pieces:
309
321
  continue
310
322
 
311
- start_subsimplex = old_piece.endpoints[0].subsimplex
312
- end_subsimplex = old_piece.endpoints[1].subsimplex
323
+ start_point = old_piece.endpoints[0]
324
+ start_subsimplex = start_point.subsimplex
325
+ # Index of old tet where piece is starting
326
+ start_j = j
313
327
 
314
- if (start_subsimplex | end_subsimplex) in simplex.OneSubsimplices:
328
+ # A geodesic piece crossing the face shared between the bottom and
329
+ # top tetrahedron was originally two pieces. Of these two pieces,
330
+ # discard the one after crossing the shared face.
331
+ if start_subsimplex == old_shared_faces[j]:
332
+ continue
333
+
334
+ end_point = old_piece.endpoints[1]
335
+ end_subsimplex = end_point.subsimplex
336
+ # Index of old tet where piece is ending
337
+ end_j = j
338
+
339
+ old_pieces = [ old_piece ]
340
+ # If a geodesic piece ends at the shared face, merge it
341
+ # with the next piece.
342
+ if end_subsimplex == old_shared_faces[j]:
343
+ old_pieces.append(old_piece.next_)
344
+ end_point = old_piece.next_.endpoints[1]
345
+ end_subsimplex = end_point.subsimplex
346
+ end_j = 1 - j
347
+
348
+ dimension_start_subsimplex = simplex.dimension(start_subsimplex)
349
+ dimension_end_subsimplex = simplex.dimension(end_subsimplex)
350
+
351
+ # Face of new tetrahedron that is shared with old tetrahedron.
352
+ new_start_face = simplex.TwoSubsimplices[1 - start_j]
353
+ new_end_face = simplex.TwoSubsimplices[1 - end_j]
354
+
355
+ if dimension_start_subsimplex == 0 and dimension_end_subsimplex == 0:
356
+ # Vertex to vertex piece. We can just transfer.
315
357
  for i, new_tet in enumerate(new_tets):
358
+ # We need to find the right new tetrahedron such that the
359
+ # geodesic piece is an edge of the face shared with the old
360
+ # tetrahedron.
316
361
  new_start_subsimplex = old_to_new_tets[j][i].image(start_subsimplex)
317
362
  new_end_subsimplex = old_to_new_tets[j][i].image(end_subsimplex)
363
+ new_subsimplex = new_start_subsimplex | new_end_subsimplex
318
364
 
319
- if (new_start_subsimplex | new_end_subsimplex) == simplex.E23:
365
+ if simplex.is_subset(new_subsimplex, new_start_face):
320
366
  GeodesicPiece.replace_by(
321
- old_piece, old_piece,
367
+ old_pieces[0], old_pieces[-1],
322
368
  [
323
369
  GeodesicPiece.create_and_attach(
324
370
  old_piece.index,
@@ -328,68 +374,38 @@ def two_three_move(given_pieces : Sequence[GeodesicPiece],
328
374
  break
329
375
  else:
330
376
  raise Exception("Unhandled edge case.")
331
- continue
332
-
333
- # A geodesic piece crossing the face shared between the bottom and
334
- # top tetrahedron was originally two pieces. Discard the piece after
335
- # the ray cross the shared face.
336
- if start_subsimplex == old_shared_faces[j]:
337
- continue
338
-
339
- old_pieces = [ old_piece ]
340
- if end_subsimplex == old_shared_faces[j]:
341
- old_pieces.append(old_piece.next_)
342
- end_j = 1 - j
343
- end_subsimplex = old_pieces[-1].endpoints[1].subsimplex
344
377
  else:
345
- end_j = j
346
-
347
- r13_endpoints = [
348
- O13_embeddings[j] * old_pieces[ 0].endpoints[0].r13_point,
349
- O13_embeddings[end_j] * old_pieces[-1].endpoints[1].r13_point
378
+ # We need to re-trace.
379
+ r13_endpoints = [
380
+ O13_embeddings[start_j] * start_point.r13_point,
381
+ O13_embeddings[end_j] * end_point.r13_point
350
382
  ]
351
383
 
352
- end_cell_dimension = 2
353
- retrace_direction = +1
354
-
355
- start_j = j
356
-
357
- if end_subsimplex in simplex.ZeroSubsimplices:
358
- end_cell_dimension = 0
359
- elif end_subsimplex == simplex.T:
360
- end_cell_dimension = 3
361
- elif start_subsimplex == simplex.T:
362
- end_cell_dimension = 3
363
- retrace_direction = -1
364
- start_j, end_j = end_j, start_j
365
- start_subsimplex, end_subsimplex = end_subsimplex, start_subsimplex
366
- r13_endpoints = r13_endpoints[::-1]
367
- elif not (start_subsimplex in simplex.TwoSubsimplices and
368
- end_subsimplex in simplex.TwoSubsimplices):
369
- raise Exception("Unhandled case")
370
-
371
- for i, new_tet in enumerate(new_tets):
372
- new_face = simplex.TwoSubsimplices[1 - start_j]
373
-
374
- new_start_subsimplex = old_to_new_tets[start_j][i].image(start_subsimplex)
375
-
376
- if new_start_subsimplex == new_face:
377
- GeodesicPiece.replace_by(
378
- old_pieces[0], old_pieces[-1],
379
- _retrace_geodesic_piece(
380
- old_piece.index,
381
- new_tets,
382
- new_tet,
383
- new_face,
384
- end_cell_dimension,
385
- r13_endpoints,
386
- retrace_direction,
387
- verified,
388
- allowed_end_corners=None))
389
- break
390
- else:
391
- raise Exception("No match")
392
-
384
+ new_start_subsimplices = [
385
+ old_to_new_tets[start_j][i].image(start_subsimplex)
386
+ for i in range(3) ]
387
+ start_corners = [
388
+ Corner(new_tets[i], new_start_subsimplices[i])
389
+ for i in range(3)
390
+ if simplex.is_subset(new_start_subsimplices[i], new_start_face) ]
391
+ new_end_subsimplices = [
392
+ old_to_new_tets[end_j][i].image(end_subsimplex)
393
+ for i in range(3) ]
394
+ end_corners = [
395
+ Corner(new_tets[i], new_end_subsimplices[i])
396
+ for i in range(3)
397
+ if simplex.is_subset(new_end_subsimplices[i], new_end_face) ]
398
+
399
+ GeodesicPiece.replace_by(
400
+ old_pieces[0], old_pieces[-1],
401
+ _retrace_geodesic_piece(
402
+ index=old_piece.index,
403
+ r13_points=r13_endpoints,
404
+ start_corners=start_corners,
405
+ end_corners=end_corners,
406
+ verified=verified))
407
+
408
+ # Given pieces are converted to one V-V piece.
393
409
  new_piece = GeodesicPiece.create_and_attach(
394
410
  given_pieces[0].index,
395
411
  new_tets[0],
@@ -401,31 +417,74 @@ def two_three_move(given_pieces : Sequence[GeodesicPiece],
401
417
 
402
418
  return new_piece
403
419
 
404
-
405
420
  def _swap_perm(i, j):
406
421
  result = [0, 1, 2, 3]
407
422
  result[i] = j
408
423
  result[j] = i
409
424
  return result
410
425
 
411
-
412
426
  _swap_perms = { (f0, f1) : _swap_perm(i, j)
413
427
  for i, f0 in enumerate(simplex.TwoSubsimplices)
414
428
  for j, f1 in enumerate(simplex.TwoSubsimplices) }
415
429
 
416
-
430
+ # Re-trace a line segment between two points in R^{1,3} in the new
431
+ # tetrahedra (which are assumed to be all in the same coordinate system).
432
+ #
433
+ # We are given the combinatorial information about the start and end points
434
+ # of the line segment through Corner's which are pairs of a tetrahedron and
435
+ # subsimplex.
436
+ #
437
+ # If such a start or end point is on a face, we give retrace exactly one
438
+ # corner encoding the face of the respective tetrahedron.
439
+ #
440
+ # If such a point is inside one of the new tetrahedra (we do not know yet
441
+ # which), we given an empty list of Corner's.
442
+ #
443
+ # If such a point is a vertex, we give all pairs of a new tetrahedron
444
+ # and one of its vertices that correspond to this vertex.
445
+ #
446
+ # index identifies to which of the geodesics we want to drill the retraced
447
+ # pieces belong. It is the index of the cusp that the geodesic will become
448
+ # in the drilled manifold.
449
+ #
417
450
  def _retrace_geodesic_piece(
418
451
  index : int,
419
- tets : Union[Mapping[int,Tetrahedron], Sequence[Tetrahedron]],
420
- tet : Tetrahedron,
421
- face : int,
422
- dimension_end_cell : int,
423
- points,
424
- trace_direction : int,
425
- verified : bool,
426
- allowed_end_corners : Optional[Sequence[Tuple[Tetrahedron, int]]] = None):
452
+ r13_points,
453
+ start_corners : Sequence[Corner],
454
+ end_corners : Sequence[Corner],
455
+ verified : bool) -> Sequence[GeodesicPiece]:
456
+
457
+ if len(start_corners) == 1:
458
+ # If we have a unique start corner (which is supposed
459
+ # to be a face of a tetrahedron), we can just start
460
+ # tracing from that face.
461
+ trace_direction = +1
462
+ else:
463
+ # Otherwise, we need to trace the other way.
464
+ # The end corner was supposed to be a face of a tetrahedron
465
+ # in this case.
466
+ trace_direction = -1
467
+ start_corners, end_corners = end_corners, start_corners
468
+ r13_points = r13_points[::-1]
427
469
 
428
- start_point, end_point = points
470
+ if len(start_corners) != 1:
471
+ raise Exception("No unique start corner")
472
+
473
+ # Tet and face to start re-tracing
474
+ tet = start_corners[0].Tetrahedron
475
+ face = start_corners[0].Subsimplex
476
+
477
+ if face not in simplex.TwoSubsimplices:
478
+ raise Exception("Tracing not starting on a face")
479
+
480
+ # Get dimension of subsimplex where line segment
481
+ # we are re-tracing ends.
482
+ dimension_end_subsimplex = 3
483
+ if len(end_corners) > 0:
484
+ dimension_end_subsimplex = simplex.dimension(
485
+ end_corners[0].Subsimplex)
486
+
487
+ start_point, end_point = r13_points
429
488
 
430
489
  RF = start_point[0].parent()
431
490
  if verified:
@@ -433,125 +492,125 @@ def _retrace_geodesic_piece(
433
492
  else:
434
493
  epsilon = compute_epsilon(RF)
435
494
 
436
- direction = end_point - start_point
437
-
438
495
  # Result
439
496
  pieces : List[GeodesicPiece] = []
440
497
 
441
498
  # Parametrizes ray. That is, we are start_point + param * direction.
442
499
  param = RF(0)
500
+ direction = end_point - start_point
443
501
 
502
+ # 1-4 and 2-3 move never breaks up one line segment into more
503
+ # than 4 pieces.
444
504
  for i in range(4):
505
+ hit_end : bool = False
445
506
  # Record the face and param through which the ray is leaving
446
507
  # the tet - that is which face the ray is hitting next.
447
- hit_face : Optional[int] = None
508
+ hit_subsimplex : Optional[int] = None
448
509
  hit_param = None
449
- for candidate_face, plane in tet.R13_unnormalised_planes.items():
450
- # Skip the face through which the ray just entered the tet
451
- if candidate_face == face:
452
- continue
453
- # Compute the param at which the ray intersects this face
454
- candidate_param = compute_plane_intersection_param(
455
- plane, start_point, direction, verified)
456
510
 
457
- # If the ray crossed this face before it crossed the
458
- # entry face, ignore. Can happen when a dihedral angle is obtuse.
459
- if candidate_param < param - epsilon:
460
- continue
461
- if not candidate_param > param + epsilon:
462
- raise InsufficientPrecisionError(
463
- "When re-tracing the geodesic, the intersection with the "
464
- "next tetrahedron face was too close to the previous "
465
- "to tell them apart. Increasing the precision will "
466
- "probably avoid this problem.")
467
-
468
- # This face is the (potential) exit face if the ray crossed
469
- # it before it crossed the other faces (encountered so far).
470
- if hit_param is None:
471
- # No other face encountered so far
472
- hit_param = candidate_param
473
- hit_face = candidate_face
474
- else:
475
- # Check this face crossed before other faces
476
- if candidate_param + epsilon < hit_param:
511
+ if dimension_end_subsimplex == 0:
512
+ # Check if we just entered a tetrahedron adjacent to the
513
+ # vertex where the line segments stops.
514
+ for end_corner in end_corners:
515
+ if tet == end_corner.Tetrahedron:
516
+ # If that is true, we have finished re-tracing
517
+ # and just need to emit the final F-V piece below.
518
+ # Do some sanity checks first though.
519
+ hit_subsimplex = simplex.comp(face)
520
+ if hit_subsimplex != end_corner.Subsimplex:
521
+ raise Exception("Implementation error: "
522
+ "ray entered tetrahedron through "
523
+ "unexpected face.")
524
+ hit_end = True
525
+
526
+ if not hit_end:
527
+ # Above condition not met, do actual ray-tracing.
528
+ if dimension_end_subsimplex == 3:
529
+ # The line-segment to be re-traced ends in the interior
530
+ # of a simplex. We set hit_param to 1 so that any face
531
+ # the ray hits after reaching the end of the line
532
+ # segment are ignored.
533
+ hit_subsimplex = simplex.T
534
+ hit_param = RF(1)
535
+
536
+ # Now intersect the ray with each face we did not enter through.
537
+ for candidate_face, plane in tet.R13_unnormalised_planes.items():
538
+ # Skip the face through which the ray just entered the tet
539
+ if candidate_face == face:
540
+ continue
541
+ # Compute the param at which the ray intersects this face
542
+ candidate_param = compute_plane_intersection_param(
543
+ plane, start_point, direction, verified)
544
+
545
+ # If the ray crossed this face before it crossed the
546
+ # entry face, ignore. Can happen when a dihedral angle is obtuse.
547
+ if candidate_param < param - epsilon:
548
+ continue
549
+ if not candidate_param > param + epsilon:
550
+ raise InsufficientPrecisionError(
551
+ "When re-tracing the geodesic, the intersection with the "
552
+ "next tetrahedron face was too close to the previous "
553
+ "to tell them apart. Increasing the precision will "
554
+ "probably avoid this problem.")
555
+
556
+ # This face is the (potential) exit face if the ray crossed
557
+ # it before it crossed the other faces (encountered so far).
558
+ if hit_param is None:
559
+ # No other face encountered so far
477
560
  hit_param = candidate_param
478
- hit_face = candidate_face
479
- elif not candidate_param > hit_param + epsilon:
480
- # If there is any ambiguity whether this face was
481
- # crossed before the other face, fail!
482
- # Most likely, this is because the ray is close to
483
- # or crossing an edge of the triangulation.
484
- raise exceptions.RetracingRayHittingOneSkeletonError()
485
-
486
- if hit_param is None or hit_face is None:
487
- raise InsufficientPrecisionError(
488
- "Could not find the next intersection of the geodesic with a "
489
- "tetrahedron face. Increasing the precision should solve this "
490
- "problem.")
491
-
492
- if dimension_end_cell == 3:
493
- if hit_param < RF(1) - epsilon:
494
- hit_end : bool = False
495
- elif hit_param > RF(1) + epsilon:
496
- hit_end = True
497
- else:
561
+ hit_subsimplex = candidate_face
562
+ else:
563
+ # Check this face crossed before other faces
564
+ if candidate_param + epsilon < hit_param:
565
+ hit_param = candidate_param
566
+ hit_subsimplex = candidate_face
567
+ elif not candidate_param > hit_param + epsilon:
568
+ # If there is any ambiguity whether this face was
569
+ # crossed before the other face, fail!
570
+ # Most likely, this is because the ray is close to
571
+ # or crossing an edge of the triangulation.
572
+ raise exceptions.RetracingRayHittingOneSkeletonError()
573
+
574
+ if hit_param is None or hit_subsimplex is None:
498
575
  raise InsufficientPrecisionError(
499
- "Could not determine whether we finished re-tracing "
500
- "geodesic piece."
501
- "Increasing the precision will most likely fix the "
576
+ "Could not find the next intersection of the geodesic with a "
577
+ "tetrahedron face. Increasing the precision should solve this "
502
578
  "problem.")
503
- else:
504
- if len(tets) == 3:
505
- hit_end = hit_face in [ simplex.F0, simplex.F1]
506
- else:
507
- hit_end = tet is tets[hit_face]
508
579
 
509
- if hit_end:
510
- if dimension_end_cell == 3:
511
- end_cell : int = simplex.T
580
+ if dimension_end_subsimplex == 3:
581
+ # If we hit not face before the line segment ended, we are done
582
+ # Emit final F-T segment below.
583
+ if hit_subsimplex == simplex.T:
584
+ hit_end = True
512
585
  else:
513
- end_cell = hit_face
514
-
515
- if allowed_end_corners:
516
- if not (tet, end_cell) in allowed_end_corners:
517
- raise Exception(
518
- "Re-tracing geodesic piece ended at wrong cell. "
519
- "This is either due to a lack of precision or an "
520
- "implementation bug.")
586
+ if hit_subsimplex == simplex.T:
587
+ raise Exception("Implementation error. Got interior of "
588
+ "simplex when expected face.")
589
+ # Did we hit the face where the line segment is ending at?
590
+ hit_end = (
591
+ tet == end_corners[0].Tetrahedron and
592
+ hit_subsimplex == end_corners[0].Subsimplex)
521
593
 
522
- endpoints = [ Endpoint(start_point + param * direction, face),
523
- Endpoint(end_point, end_cell) ][::trace_direction]
594
+ if hit_end:
595
+ # Use end point of line segment if we hit the end.
596
+ point = end_point
597
+ else:
598
+ # Advance ray.
599
+ point = start_point + hit_param * direction
524
600
 
525
- pieces.append(
526
- GeodesicPiece.create_and_attach(index, tet, endpoints))
527
-
528
- break
601
+ endpoints = [ Endpoint(start_point + param * direction, face),
602
+ Endpoint(point, hit_subsimplex) ][::trace_direction]
529
603
 
530
604
  pieces.append(
531
- GeodesicPiece.create_and_attach(
532
- index,
533
- tet,
534
- [ Endpoint(start_point + param * direction, face),
535
- Endpoint(start_point + hit_param * direction, hit_face) ][::trace_direction]))
536
-
537
- face = tet.Gluing[hit_face].image(hit_face)
538
- tet = tet.Neighbor[hit_face]
539
- param = hit_param
605
+ GeodesicPiece.create_and_attach(index, tet, endpoints))
540
606
 
541
- if dimension_end_cell == 0:
542
- if allowed_end_corners:
543
- if not (tet, simplex.comp(face)) in allowed_end_corners:
544
- raise Exception(
545
- "Re-tracing geodesic piece ended at wrong cell. "
546
- "This is either due to a lack of precision or an "
547
- "implementation bug.")
548
-
549
- pieces.append(
550
- GeodesicPiece.create_face_to_vertex_and_attach(
551
- index,
552
- tet, Endpoint(start_point + hit_param * direction, face), trace_direction))
607
+ if hit_end:
553
608
  break
554
609
 
610
+ # Teleport to the next tetrahedron.
611
+ face = tet.Gluing[hit_subsimplex].image(hit_subsimplex)
612
+ tet = tet.Neighbor[hit_subsimplex]
613
+ param = hit_param
555
614
  else:
556
615
  raise Exception(
557
616
  "Too many steps when re-tracing a geodesic piece. "