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
@@ -14,8 +14,6 @@ space, the permutation may be omitted when it is equal to the identity
14
14
  permutation; this is indicated by the fact that the length of the
15
15
  decoration is 4n rather than 5n.
16
16
 
17
- Currently, only oriented manifolds are supported.
18
-
19
17
  A simple valid decorated isosig for a two-cusped manifold is::
20
18
 
21
19
  eLPkbdcddhgggb_abBaaBBaaB
@@ -36,18 +34,60 @@ isosig, decorator = di.split('_')
36
34
 
37
35
  Note: An isosig is an invariant of a triangulation of an *unoriented*
38
36
  manifold. For an amphicheiral manifold M, it can happen that
39
- Manifold(M.triangulation_isosig()) has the opposite orientation from M
40
- itself. The decoration implicitly embeds the preferred orientation of
37
+ Manifold(M.triangulation_isosig(decorated=False)) has the opposite
38
+ orientation from M itself.
39
+ The decoration implicitly embeds the preferred orientation of
41
40
  M in the sign of the determinant of the change-of-basis matrices.
42
41
 
43
42
  Note: If the triangulation has combinatorial symmetries, there can be
44
43
  multiple change-of-basis matrices that yield combinatorially
45
44
  isomorphic pairs (triangulation, peripheral curves). In such cases,
46
45
  the decoration is the lexicographically first one.
46
+
47
+ Caveat: We pick the decoration with the lexicographically smallest
48
+ encoding with the following consequence: If we have more 26 cusps, the
49
+ lexicographically smallest permutation might not have the smallest encoding
50
+ and thus might not be the one picked.
51
+
52
+ Caveat: We drop the trivial permutation from the encoding. Pairs (a,b) of string
53
+ come with the lexicographic ordering. We also obtain a (partial) ordering by
54
+ ordering by a + b. These two orderings are not the same.
55
+ In particular, there is a combinatorial isomorphism from
56
+ Triangulation('L6n1') to
57
+ Triangulation(Triangulation('L6n1').triangulation_isosig(decorated = False))
58
+ that acts on the cusp by the identity perm and, thus, we would expect it to
59
+ be preferred. However,
60
+ Triangulation("L6n1(0,0)(0,0)(0,0)").triangulation_isosig() results in
61
+ 'gLMzQbcdefffaelaaai_acbBaabCbbabbBC' which does not use the identity perm.
62
+
63
+ Caveat: There are de-facto two canonical choices of peripheral curves.
64
+ When calling
65
+ >>> T = Triangulation('ovLMvvPQQQccddlmnijklmnmnlgvfamtvfblhaumx'),
66
+ the SnapPea kernel picks peripheral curves and then orients the manifold
67
+ (see data_to_triangulation in kernel_code/kernel/triangulation.c)
68
+ >>> T.set_peripheral_curves('combinatorial')
69
+ is now calling the same SnapPea kernel code to pick peripheral curve but
70
+ on the oriented manifold. This can result in different peripheral curves.
71
+
72
+ Note that the encoding and decoding needs to use the same of the two
73
+ canonical choices of peripheral curves.
74
+
75
+ For the decoding, there is a difference based on whether the isosig is
76
+ decorated because set_peripheral_from_decoration calls
77
+ manifold.set_peripheral_curves('combinatorial').
78
+
79
+ We need to account for that in the encoding: we need to use
80
+ set_peripheral_curves('combinatorial') on the "target" triangulation if
81
+ we anticipate a decoration. And if we called
82
+ set_peripheral_curves('combinatorial'), we need to make sure we have a
83
+ decoration (see force_decoration).
47
84
  """
85
+
48
86
  import re
49
87
  import string
50
88
 
89
+ from .matrix import make_vector
90
+
51
91
  # Used between the base isosig and the decorated version.
52
92
  separator = '_'
53
93
 
@@ -58,7 +98,7 @@ separator_pat = '[%s]{1}' % separator
58
98
  base64_opt_pat = r'([a-zA-Z0-9\+\-]*)'
59
99
  isosig_pattern = re.compile(base64_pat + separator_pat + base64_opt_pat + '$')
60
100
 
61
- # We store lists of integers as base64 strings.
101
+ # We store lists of integers as (non-RFC4648) base64 strings.
62
102
 
63
103
  base64_letters = string.ascii_letters + '0123456789+-'
64
104
  base64_lower = string.ascii_lowercase + '01234+'
@@ -66,7 +106,7 @@ base64_upper = string.ascii_uppercase + '56789-'
66
106
  in_one = string.ascii_lowercase[:16] + string.ascii_lowercase[1:16].upper()
67
107
 
68
108
  int_to_letter = dict(enumerate(base64_letters))
69
- letter_to_int = dict((a, i) for i, a in enumerate(base64_letters))
109
+ letter_to_int = {a: i for i, a in enumerate(base64_letters)}
70
110
 
71
111
 
72
112
  def encode_nonnegative_int(x):
@@ -138,9 +178,9 @@ def decode_integer_list(encoded):
138
178
  ans.append(sign*decode_nonnegative_int(current))
139
179
  return ans
140
180
 
181
+ ###############################################################################
141
182
  # Some helper functions
142
183
 
143
-
144
184
  def det(A):
145
185
  return A[0][0]*A[1][1] - A[0][1]*A[1][0]
146
186
 
@@ -156,146 +196,253 @@ def as_two_by_two_matrices(L):
156
196
  assert len(L) % 4 == 0
157
197
  return [[(L[i], L[i+1]), (L[i+2], L[i+3])] for i in range(0, len(L), 4)]
158
198
 
199
+ def first_non_zero_entry_in_column(matrix, col):
200
+ e = matrix[0, col]
201
+ if e != 0:
202
+ return e
203
+ return matrix[1, col]
159
204
 
160
205
  def sgn_column(matrix, col):
161
206
  """
162
207
  Returns +1 or -1 depending on the sign of the first non-zero entry
163
208
  in the column of the given matrix.
164
209
  """
165
- first_non_zero_entry = (
166
- matrix[0, col] if matrix[0, col] != 0 else matrix[1, col])
167
- return +1 if first_non_zero_entry > 0 else -1
168
-
210
+ if first_non_zero_entry_in_column(matrix, col) > 0:
211
+ return +1
212
+ else:
213
+ return -1
169
214
 
170
- def determine_flips(matrices, orientable):
215
+ def apply_peripheral_curve_flips(
216
+ matrix, slope, manifold_orientable, isomorphism_orientation):
171
217
  """
172
- Returns pairs [(l,m)] for each given matrix. Multiplying the columns of
173
- each matrix with the respective pair brings the matrix in "canonical" form.
218
+ Flips peripheral curves (as encoded by matrix) to bring them into
219
+ canonical form and updates slope accordingly.
174
220
  """
175
221
 
176
- if orientable:
177
- # Determine whether the given matrices are reversing the orientation of
178
- # the entire manifold
179
- det_sign = ( matrices[0][0,0] * matrices[0][1,1]
180
- - matrices[0][0,1] * matrices[0][1,0])
222
+ # Determine whether to flip meridian
223
+ f0 = sgn_column(matrix, 0)
181
224
 
225
+ # Determine whether to flip longitude
226
+ if manifold_orientable:
182
227
  # We conform the matrix such that the first non-zero entry in the
183
228
  # first column and the determinant are always positive
184
- return [ (sgn_column(matrix, 0), sgn_column(matrix, 0) * det_sign)
185
- for matrix in matrices ]
229
+ f1 = f0 * isomorphism_orientation
186
230
  else:
187
231
  # We conform the matrix such that the first non-zero entry in each
188
232
  # column is always positive
189
- return [ (sgn_column(matrix, 0), sgn_column(matrix, 1))
190
- for matrix in matrices ]
233
+ f1 = sgn_column(matrix, 1)
234
+
235
+ flips = [ f0, f1 ]
191
236
 
237
+ for col, flip in enumerate(flips):
238
+ for row in range(2):
239
+ matrix[row,col] *= flip
240
+ slope[col] *= flip
192
241
 
193
- def pack_matrices_applying_flips(matrices, flips):
242
+ def pack_matrices(matrices):
194
243
  """
195
244
  Multiplies the columns of each matrix by the entries in flips and
196
245
  packs all the matrices into one array, column-major.
197
246
  """
198
- result = []
199
247
 
200
- for matrix, flip in zip(matrices, flips):
201
- for col in range(2):
202
- for row in range(2):
203
- result.append(matrix[row,col] * flip[col])
204
-
205
- return result
248
+ return [ matrix[row,col]
249
+ for matrix in matrices
250
+ for col in range(2)
251
+ for row in range(2) ]
206
252
 
207
253
 
208
254
  def supress_minus_zero(x):
209
- return 0 if x == 0 else x
255
+ if x == 0:
256
+ return 0
257
+ else:
258
+ return x
210
259
 
211
- # main two functions
212
260
 
261
+ def is_trivial_perm(perm):
262
+ return all(i == p for i, p in enumerate(perm))
213
263
 
214
- def decorated_isosig(manifold, triangulation_class,
215
- ignore_cusp_ordering=False,
216
- ignore_curve_orientations=False,
217
- ignore_orientation=True):
218
264
 
219
- isosig = manifold.triangulation_isosig(
220
- decorated=False,
221
- ignore_orientation=ignore_orientation)
222
-
223
- # Do not decorate if no cusps
224
- if manifold.num_cusps() == 0:
225
- return isosig
265
+ def key_prefer_pos(x):
266
+ """
267
+ Intended for key argument to min.
226
268
 
227
- N = triangulation_class(isosig, remove_finite_vertices=False)
228
- N.set_peripheral_curves('combinatorial')
269
+ Prefers positive and then absolute value.
270
+ """
271
+
272
+ if x >= 0:
273
+ return (0, x)
274
+ else:
275
+ return (1, -x)
229
276
 
230
- # in Python3 range is an iterator
231
- trivial_perm = list(range(manifold.num_cusps()))
277
+ def key_slope(slope):
278
+ """
279
+ Intended for key argument to min.
232
280
 
233
- min_encoded = None
234
- min_perm = None
235
- min_flips = None
281
+ Prefers positive and small denominator.
282
+ """
236
283
 
237
- # Try all combinatorial isomorphisms
238
- for tri_iso in manifold.isomorphisms_to(N):
284
+ slope_m, slope_l = slope
285
+ return (key_prefer_pos(slope_l), key_prefer_pos(slope_m))
239
286
 
240
- # Do not consider orientation-reversing isomorphisms if
241
- # ignore_orientation isn't specified.
242
- if ( manifold.is_orientable() and
243
- not ignore_orientation and
244
- det(tri_iso.cusp_maps()[0]) < 0):
245
- continue
287
+ def key_decoration_info(info):
288
+ encoded, slopes = info
289
+ return [encoded, [key_slope(slope) for slope in slopes]]
246
290
 
247
- # Permutation of cusps
248
- perm = inverse_perm(tri_iso.cusp_images())
291
+ def normalized_slope(slope):
292
+ """
293
+ Returns slope or -slope preferring positive and small denominator.
249
294
 
250
- if ignore_cusp_ordering:
251
- # If we do not include the permutation in the encoding,
252
- # we need to apply it to the matrices
253
- matrices = [ tri_iso.cusp_maps()[i] for i in perm ]
254
- else:
255
- matrices = tri_iso.cusp_maps()
295
+ Equivalent to min([slope, -slope], key=key_slope)
296
+ """
256
297
 
298
+ slope_m, slope_l = slope
299
+ if slope_l < 0:
300
+ return -slope
301
+ if slope_l > 0:
302
+ return slope
303
+ if slope_m < 0:
304
+ return -slope
305
+ return slope
306
+
307
+ def candidate_decoration_info(
308
+ isomorphism,
309
+ slopes,
310
+ manifold_orientable,
311
+ ignore_cusp_ordering,
312
+ ignore_curves,
313
+ ignore_curve_orientations,
314
+ ignore_filling_orientations,
315
+ ignore_orientation):
316
+
317
+ matrices = isomorphism.cusp_maps()
318
+ isomorphism_orientation = matrices[0].det()
319
+
320
+ # Do not consider orientation-reversing isomorphisms if
321
+ # ignore_orientation isn't specified.
322
+ if manifold_orientable and not ignore_orientation:
323
+ if isomorphism_orientation < 0:
324
+ return None
325
+
326
+ # Make a copy as vectors so that we can modify in place and
327
+ # apply matrices.
328
+ # Outside of SnapPy, SimpleVector is not making a copy of the
329
+ # tuple and we need a list to modify things in place.
330
+ slopes = [ make_vector([slope_m, slope_l])
331
+ for slope_m, slope_l in slopes ]
332
+
333
+ # Permutation of cusps
334
+ perm = inverse_perm(isomorphism.cusp_images())
335
+
336
+ if ignore_cusp_ordering:
337
+ # If we do not include the permutation in the encoding,
338
+ # we need to apply it to the matrices
339
+ matrices = [ matrices[i] for i in perm ]
340
+ slopes = [ slopes[i] for i in perm ]
341
+
342
+ if ignore_curves:
343
+ slopes = [ matrix * slope
344
+ for matrix, slope in zip(matrices, slopes) ]
345
+ else:
257
346
  if ignore_curve_orientations:
258
- # Determine the multipliers for the columns of the matrices
259
- # to bring them into canonical form if so desired
260
- flips = determine_flips(matrices, manifold.is_orientable())
261
- else:
262
- flips = [ (1,1) for matrix in matrices ]
263
-
347
+ for matrix, slope in zip(matrices, slopes):
348
+ apply_peripheral_curve_flips(
349
+ matrix, slope, manifold_orientable, isomorphism_orientation)
350
+
351
+ encoded = ''
352
+
353
+ if not ignore_cusp_ordering:
354
+ #
355
+ # Force decoration to fix a very subtle bug!
356
+ #
357
+ # Recall that we call N.set_peripheral_curves('combinatorial')
358
+ # in decorated_isosig below if either ignore_cusp_ordering or
359
+ # ignore_curves is False.
360
+ #
361
+ # On the decoding site, we thus also need to call
362
+ # manifold.set_peripheral_curves('combinatorial') in those cases.
363
+ # This happens in set_peripheral_from_decoration and thus only
364
+ # if the isosig returned here has a decoration, that is "encoded"
365
+ # is not empty.
366
+ #
367
+ # Assume that ignore_cusp_ordering is False and ignore_curves is
368
+ # True and the permutation happens to be the identity.
369
+ #
370
+ # We need to make sure not to have an empty "encoded" in this case.
371
+ force_decoration = ignore_curves
372
+
373
+ if force_decoration or not is_trivial_perm(perm):
374
+ # Encode permutation
375
+ encoded += encode_integer_list(perm)
376
+
377
+ if not ignore_curves:
264
378
  # Encode the matrices
265
- decorations = pack_matrices_applying_flips(matrices, flips)
379
+ encoded += encode_integer_list(pack_matrices(matrices))
266
380
 
267
- if perm == trivial_perm or ignore_cusp_ordering:
268
- # Only encode matrices
269
- encoded = encode_integer_list(decorations)
270
- else:
271
- # Encode permutation and matrices
272
- encoded = encode_integer_list(perm + decorations)
273
-
274
- if min_encoded is None or encoded < min_encoded:
275
- # If this is lexicographically smallest, remember it
276
- min_encoded = encoded
277
- min_perm = perm
278
- min_flips = flips
279
-
280
- # Add decoration to isosig
281
- ans = isosig + separator + min_encoded
282
-
283
- # Add Dehn-fillings if we have any
284
- if False in manifold.cusp_info('complete?'):
285
- if ignore_cusp_ordering:
286
- # If we do not include the permutation in the encoding,
287
- # we need to apply it to the slopes
288
- slopes = [ manifold.cusp_info('filling')[i] for i in min_perm ]
289
- else:
290
- slopes = manifold.cusp_info('filling')
381
+ if ignore_filling_orientations:
382
+ slopes = [ normalized_slope(slope)
383
+ for slope in slopes ]
291
384
 
292
- for flip, slope in zip(min_flips, slopes):
293
- # Apply the flips to the slopes
294
- ans += '(%g,%g)' % (supress_minus_zero(flip[0] * slope[0]),
295
- supress_minus_zero(flip[1] * slope[1]))
385
+ return encoded, slopes
296
386
 
297
- return ans
387
+ # main two functions
298
388
 
389
+ def decorated_isosig(manifold, triangulation_class,
390
+ ignore_cusp_ordering=False,
391
+ ignore_curves=False,
392
+ ignore_curve_orientations=False,
393
+ ignore_filling_orientations=False,
394
+ ignore_orientation=True):
395
+
396
+ isosig = manifold._undecorated_triangulation_isosig(
397
+ ignore_orientation=ignore_orientation)
398
+
399
+ # Do not decorate if no cusps
400
+ if manifold.num_cusps() == 0:
401
+ return isosig
402
+
403
+ N = triangulation_class(isosig, remove_finite_vertices=False)
404
+ if not (ignore_cusp_ordering and ignore_curves):
405
+ # Note that data_to_triangulation determines the peripheral
406
+ # curves before orienting the manifold.
407
+ # Thus, we get different peripheral curves when calling
408
+ # N.set_peripheral_curves.
409
+ # For backwards compatibility (see set_peripheral_from_decoration),
410
+ # we need to keep calling N.set_peripheral_curves here unless there is
411
+ # no decoration.
412
+ N.set_peripheral_curves('combinatorial')
413
+
414
+ manifold_orientable = manifold.is_orientable()
415
+ slopes = manifold.cusp_info('filling')
416
+
417
+ # Try all combinatorial isomorphisms and pick
418
+ # lexicographically smallest info.
419
+ encoded, slopes = min(
420
+ (info
421
+ for isomorphism in manifold.isomorphisms_to(N)
422
+ if (
423
+ info := candidate_decoration_info(
424
+ isomorphism,
425
+ slopes,
426
+ manifold_orientable=manifold_orientable,
427
+ ignore_cusp_ordering=ignore_cusp_ordering,
428
+ ignore_curves=ignore_curves,
429
+ ignore_curve_orientations=ignore_curve_orientations,
430
+ ignore_filling_orientations=ignore_filling_orientations,
431
+ ignore_orientation=ignore_orientation)
432
+ ) is not None),
433
+ key = key_decoration_info)
434
+
435
+ ans = isosig
436
+
437
+ if encoded:
438
+ ans += separator + encoded
439
+
440
+ if not all(manifold.cusp_info('complete?')):
441
+ for slope_m, slope_l in slopes:
442
+ ans += '(%g,%g)' % (supress_minus_zero(slope_m),
443
+ supress_minus_zero(slope_l))
444
+
445
+ return ans
299
446
 
300
447
  def set_peripheral_from_decoration(manifold, decoration):
301
448
  """
@@ -305,16 +452,25 @@ def set_peripheral_from_decoration(manifold, decoration):
305
452
  dec = decode_integer_list(decoration)
306
453
  manifold.set_peripheral_curves('combinatorial')
307
454
  n = manifold.num_cusps()
308
- if len(dec) == 4 * n:
309
- cobs = as_two_by_two_matrices(dec)
310
- else:
311
- assert len(dec) == 5 * n
312
- manifold._reindex_cusps(dec[:n])
313
- cobs = as_two_by_two_matrices(dec[n:])
314
- if det(cobs[0]) < 0 and manifold.is_orientable():
315
- manifold.reverse_orientation()
316
- cobs = [[(-a, b), (-c, d)] for [(a, b), (c,d)] in cobs]
317
- manifold.set_peripheral_curves(cobs)
455
+ k = len(dec)
456
+
457
+ if k not in [ n, 4 * n, 5 * n]:
458
+ raise ValueError("Decoration has unexpected length.")
459
+
460
+ if k == n or k == 5 * n:
461
+ if k == n:
462
+ manifold._reindex_cusps(dec)
463
+ else:
464
+ manifold._reindex_cusps(dec[:n])
465
+ if k == 4 * n or k == 5 * n:
466
+ if k == 4 * n:
467
+ cobs = as_two_by_two_matrices(dec)
468
+ else:
469
+ cobs = as_two_by_two_matrices(dec[n:])
470
+ if det(cobs[0]) < 0 and manifold.is_orientable():
471
+ manifold.reverse_orientation()
472
+ cobs = [[(-a, b), (-c, d)] for [(a, b), (c,d)] in cobs]
473
+ manifold.set_peripheral_curves(cobs)
318
474
 
319
475
  # Testing code
320
476
 
@@ -479,9 +635,76 @@ def test_by_dehn_filling():
479
635
 
480
636
  print("Tested %d randomly Dehn filled manifolds" % count)
481
637
 
638
+ def test_slope_transformations():
639
+ """
640
+ Tests that slopes are transformed so that the filled
641
+ manifold is the same.
642
+ """
482
643
 
483
- if __name__ == '__main__':
644
+ import snappy
645
+ M = snappy.ManifoldHP("L14n63023(-5,1)(5,1)(10,1)")
646
+ oriented_isosig = M.triangulation_isosig(
647
+ decorated=False, ignore_orientation=False)
648
+ isosig = M.triangulation_isosig(
649
+ decorated=False)
650
+ Mop = M.copy()
651
+ Mop.reverse_orientation()
652
+ reverse_oriented_isosig = Mop.triangulation_isosig(
653
+ decorated=False, ignore_orientation=False)
654
+
655
+ if oriented_isosig != 'vLLvvLLMALQQzQQceillmnppqrlmrqtruututiivimllaelaqxrvdoxqltt':
656
+ raise AssertionError()
657
+ if isosig != 'vLLvLLPwPQLAMPQcefikkmnplkopqrsttutuuiixvimqlippawidlabavth':
658
+ raise AssertionError()
659
+
660
+ # The canonical orientation (used to compute the unoriented isosig)
661
+ # is the reverse of the actual orientation:
662
+ if reverse_oriented_isosig != isosig:
663
+ raise AssertionError()
664
+ if oriented_isosig == isosig:
665
+ raise ValueError()
666
+
667
+ isom_sig_pos = M.isometry_signature(ignore_orientation = False)
668
+ if isom_sig_pos != 'KLALvLwLLwMQLQPAMzMzMPzMPcbbeghnklntpqpqvrswtuvxyzABCDEFEGHIJJhhkofnaocnmrlsiaowxfcsaxhxhxhxhjhhhhs':
669
+ raise AssertionError()
670
+ isom_sig_neg = Mop.isometry_signature(ignore_orientation = False)
671
+ if isom_sig_neg != 'KLAMvMvvAwLvQPPPQMPzMPzMPcbbdegilopoouqtryvuxvwxzzBACDEFEGHIJJhhkhhohahrscaagwxkkgbvwpuxwqxqxwxxxxr':
672
+ raise AssertionError()
673
+
674
+ # It is not just the triangulation that is chiral, the manifold itself is:
675
+ if isom_sig_pos == isom_sig_neg:
676
+ raise ValueError()
677
+
678
+ # So we expect the oriented isometry signature to flip when neither the isomorphism
679
+ # signature nor its decoration capture the orientation.
680
+ for ignore_cusp_ordering in [False, True]:
681
+ for ignore_curves in [False, True]:
682
+ for ignore_curve_orientations in [False, True]:
683
+ for ignore_filling_orientations in [False, True]:
684
+ for ignore_orientation in [False, True]:
685
+ isosig = M.triangulation_isosig(
686
+ ignore_cusp_ordering = ignore_cusp_ordering,
687
+ ignore_curves = ignore_curves,
688
+ ignore_curve_orientations = ignore_curve_orientations,
689
+ ignore_filling_orientations = ignore_filling_orientations,
690
+ ignore_orientation = ignore_orientation)
691
+ isom_sig = (
692
+ snappy.ManifoldHP(isosig)
693
+ .isometry_signature(ignore_orientation = False))
694
+ does_ignore_orientation = (
695
+ ignore_orientation and
696
+ (ignore_curve_orientations or ignore_curves))
697
+ expected_isom_sig = (
698
+ isom_sig_neg
699
+ if does_ignore_orientation
700
+ else isom_sig_pos)
701
+ if isom_sig != expected_isom_sig:
702
+ raise AssertionError()
703
+ print("Tested slope transformations")
704
+
705
+ def run_tests():
484
706
  test_integer_list_encoder()
485
707
  main_test()
486
708
  test_link_invariant()
487
709
  test_by_dehn_filling()
710
+ test_slope_transformations()
@@ -101,16 +101,49 @@ def has_value(v, values):
101
101
  return False
102
102
 
103
103
  if __name__ == '__main__':
104
-
104
+ # Use 5_2(1,2) as an example.
105
105
  from snappy import ManifoldHP
106
106
 
107
107
  M = ManifoldHP("5_2")
108
108
  M.chern_simons()
109
109
  M.dehn_fill((1,2))
110
110
 
111
- cvol = M.complex_volume() * sage.all.I
112
-
113
- # Because of ordering issues, only correct up to pi^2/2
114
- cvols = sum(complex_volumes(M, precision = 300), [])
115
-
116
- print(has_value(cvol, cvols))
111
+ # Complex volume of geometric representation of 5_2(1,2).
112
+ # Unverified.
113
+ geom_cvol = M.complex_volume()
114
+
115
+ # This file uses a different convention (simply adding Neumann's
116
+ # extensions of Roger's dilogarithm to the Abelian cover of C \ {0,1})
117
+ # from the rest of SnapPy, so convert.
118
+ geom_cvol = sage.all.I * geom_cvol
119
+
120
+ # The complex volumes as verified intervals of the SL(2,C)-representations
121
+ # detected by the (spun-)triangulation.
122
+ # Grouped by algebraic component of the extended Ptolemy variety.
123
+ #
124
+ # We can only compute it in this file up to multiples of pi^2/2.
125
+ #
126
+ # (Note that Neumann's method can compute it up to multiple of pi^2 but
127
+ # assumes an ordered triangulation. Most census triangulations are not
128
+ # orderable and would require subdivision).
129
+ #
130
+ # The method uses SageMath's giac to compute the rational univariate
131
+ # representation and evaluates it at the roots of the defining polynomial
132
+ # using complex intervals.
133
+ #
134
+ # It can be accessed from sage (with SnapPy installed) by:
135
+ # from snappy.dev.extended_ptolemy.complexVolumesClosed import complex_volumes
136
+ #
137
+ # Tested with SageMath 9.7 and 10.0.
138
+ #
139
+ cvols_by_component = complex_volumes(M, precision = 300)
140
+
141
+ print(cvols_by_component)
142
+
143
+ # Concatenate the grouped complex volumes to just have a single list.
144
+ cvols = sum(cvols_by_component, [])
145
+
146
+ if not has_value(geom_cvol, cvols):
147
+ raise RuntimeError(
148
+ "There is a problem. The complex volume of the geometric "
149
+ "representation is not included.")
@@ -153,7 +153,7 @@ def simplify_equation(poly):
153
153
  def extended_ptolemy_equations(manifold, gen_obs_class=None,
154
154
  nonzero_cond=True, return_full_var_dict = False,
155
155
  notation = 'short'):
156
- """
156
+ r"""
157
157
  We assign ptolemy coordinates ['a', 'b', 'c', 'd', 'e', 'f'] to the
158
158
  *directed* edges::
159
159
 
@@ -165,12 +165,12 @@ def extended_ptolemy_equations(manifold, gen_obs_class=None,
165
165
 
166
166
  1
167
167
  /|\
168
- d/ | \e
168
+ d / | \ e
169
169
  / | \
170
170
  / | \
171
171
  2----|----3 with back edge from 2 to 3 labelled f.
172
172
  \ | /
173
- b\ |a /c
173
+ b \ |a / c
174
174
  \ | /
175
175
  \|/
176
176
  0