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
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. "