snappy 3.0.3__cp38-cp38-macosx_11_0_arm64.whl → 3.2__cp38-cp38-macosx_11_0_arm64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (401) hide show
  1. snappy/CyOpenGL.cpython-38-darwin.so +0 -0
  2. snappy/SnapPy.cpython-38-darwin.so +0 -0
  3. snappy/SnapPyHP.cpython-38-darwin.so +0 -0
  4. snappy/__init__.py +373 -426
  5. snappy/app.py +240 -75
  6. snappy/app_menus.py +93 -78
  7. snappy/browser.py +87 -63
  8. snappy/cache.py +5 -8
  9. snappy/canonical.py +249 -0
  10. snappy/{verify/cusp_shapes.py → cusps/__init__.py} +11 -19
  11. snappy/cusps/cusp_area_matrix.py +101 -0
  12. snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +39 -54
  13. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  14. snappy/cusps/test.py +21 -0
  15. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  16. snappy/database.py +40 -31
  17. snappy/db_utilities.py +13 -14
  18. snappy/decorated_isosig.py +377 -133
  19. snappy/dev/extended_ptolemy/complexVolumesClosed.py +42 -9
  20. snappy/dev/extended_ptolemy/extended.py +32 -25
  21. snappy/dev/extended_ptolemy/giac_rur.py +23 -8
  22. snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
  23. snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +2 -1
  24. snappy/dev/vericlosed/gimbalLoopFinder.py +5 -5
  25. snappy/dev/vericlosed/hyperbolicStructure.py +3 -3
  26. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +2 -2
  27. snappy/dev/vericlosed/truncatedComplex.py +3 -2
  28. snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +4 -3
  29. snappy/doc/_images/geodesics.jpg +0 -0
  30. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  31. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  32. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  33. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  34. snappy/doc/_sources/additional_classes.rst.txt +1 -0
  35. snappy/doc/_sources/credits.rst.txt +6 -1
  36. snappy/doc/_sources/development.rst.txt +69 -50
  37. snappy/doc/_sources/index.rst.txt +101 -66
  38. snappy/doc/_sources/installing.rst.txt +148 -165
  39. snappy/doc/_sources/news.rst.txt +136 -32
  40. snappy/doc/_sources/ptolemy.rst.txt +1 -1
  41. snappy/doc/_sources/ptolemy_examples1.rst.txt +9 -8
  42. snappy/doc/_sources/ptolemy_examples2.rst.txt +3 -3
  43. snappy/doc/_sources/ptolemy_examples3.rst.txt +14 -14
  44. snappy/doc/_sources/ptolemy_prelim.rst.txt +1 -1
  45. snappy/doc/_sources/snap.rst.txt +2 -2
  46. snappy/doc/_sources/snappy.rst.txt +1 -1
  47. snappy/doc/_sources/triangulation.rst.txt +3 -2
  48. snappy/doc/_sources/verify.rst.txt +89 -29
  49. snappy/doc/_sources/verify_internals.rst.txt +5 -16
  50. snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
  51. snappy/doc/_static/SnapPy.ico +0 -0
  52. snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  53. snappy/doc/_static/basic.css +47 -27
  54. snappy/doc/_static/css/badge_only.css +1 -0
  55. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  56. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  57. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  58. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  59. snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
  60. snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  61. snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  62. snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
  63. snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  64. snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
  65. snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  66. snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
  67. snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
  68. snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
  69. snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  70. snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
  71. snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
  72. snappy/doc/_static/css/theme.css +4 -0
  73. snappy/doc/_static/doctools.js +107 -274
  74. snappy/doc/_static/documentation_options.js +6 -5
  75. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  76. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  77. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  78. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  79. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  80. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  81. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  82. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  83. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  84. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  85. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  86. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  87. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  88. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  89. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  90. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  91. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  92. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  93. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  94. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  95. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  96. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  97. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  98. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  99. snappy/doc/_static/jquery.js +2 -2
  100. snappy/doc/_static/js/badge_only.js +1 -0
  101. snappy/doc/_static/js/theme.js +1 -0
  102. snappy/doc/_static/js/versions.js +228 -0
  103. snappy/doc/_static/language_data.js +3 -101
  104. snappy/doc/_static/pygments.css +1 -0
  105. snappy/doc/_static/searchtools.js +489 -398
  106. snappy/doc/_static/snappy_furo.css +33 -0
  107. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
  108. snappy/doc/_static/sphinx_highlight.js +154 -0
  109. snappy/doc/additional_classes.html +688 -263
  110. snappy/doc/bugs.html +107 -94
  111. snappy/doc/censuses.html +155 -127
  112. snappy/doc/credits.html +115 -104
  113. snappy/doc/development.html +184 -146
  114. snappy/doc/genindex.html +287 -204
  115. snappy/doc/index.html +189 -150
  116. snappy/doc/installing.html +259 -266
  117. snappy/doc/manifold.html +1626 -592
  118. snappy/doc/manifoldhp.html +119 -105
  119. snappy/doc/news.html +198 -104
  120. snappy/doc/objects.inv +0 -0
  121. snappy/doc/other.html +117 -105
  122. snappy/doc/platonic_census.html +161 -114
  123. snappy/doc/plink.html +113 -105
  124. snappy/doc/ptolemy.html +131 -108
  125. snappy/doc/ptolemy_classes.html +242 -223
  126. snappy/doc/ptolemy_examples1.html +144 -130
  127. snappy/doc/ptolemy_examples2.html +141 -129
  128. snappy/doc/ptolemy_examples3.html +148 -132
  129. snappy/doc/ptolemy_examples4.html +131 -111
  130. snappy/doc/ptolemy_prelim.html +162 -138
  131. snappy/doc/py-modindex.html +104 -69
  132. snappy/doc/screenshots.html +117 -108
  133. snappy/doc/search.html +115 -84
  134. snappy/doc/searchindex.js +1 -1
  135. snappy/doc/snap.html +109 -96
  136. snappy/doc/snappy.html +134 -97
  137. snappy/doc/spherogram.html +259 -187
  138. snappy/doc/todo.html +107 -94
  139. snappy/doc/triangulation.html +1380 -111
  140. snappy/doc/tutorial.html +107 -94
  141. snappy/doc/verify.html +194 -125
  142. snappy/doc/verify_internals.html +248 -686
  143. snappy/drilling/__init__.py +456 -0
  144. snappy/drilling/barycentric.py +103 -0
  145. snappy/drilling/constants.py +5 -0
  146. snappy/drilling/crush.py +270 -0
  147. snappy/drilling/cusps.py +125 -0
  148. snappy/drilling/debug.py +242 -0
  149. snappy/drilling/epsilons.py +6 -0
  150. snappy/drilling/exceptions.py +55 -0
  151. snappy/drilling/moves.py +620 -0
  152. snappy/drilling/peripheral_curves.py +210 -0
  153. snappy/drilling/perturb.py +188 -0
  154. snappy/drilling/shorten.py +36 -0
  155. snappy/drilling/subdivide.py +274 -0
  156. snappy/drilling/test.py +23 -0
  157. snappy/drilling/test_cases.py +126 -0
  158. snappy/drilling/tracing.py +351 -0
  159. snappy/exceptions.py +23 -3
  160. snappy/export_stl.py +20 -14
  161. snappy/exterior_to_link/__init__.py +2 -0
  162. snappy/exterior_to_link/barycentric_geometry.py +463 -0
  163. snappy/exterior_to_link/exceptions.py +6 -0
  164. snappy/exterior_to_link/geodesic_map.json +14408 -0
  165. snappy/exterior_to_link/hyp_utils.py +112 -0
  166. snappy/exterior_to_link/link_projection.py +323 -0
  167. snappy/exterior_to_link/main.py +197 -0
  168. snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
  169. snappy/exterior_to_link/mcomplex_with_link.py +687 -0
  170. snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
  171. snappy/exterior_to_link/pl_utils.py +491 -0
  172. snappy/exterior_to_link/put_in_S3.py +156 -0
  173. snappy/exterior_to_link/rational_linear_algebra.py +123 -0
  174. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
  175. snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
  176. snappy/exterior_to_link/stored_moves.py +475 -0
  177. snappy/exterior_to_link/test.py +31 -0
  178. snappy/geometric_structure/__init__.py +212 -0
  179. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  180. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  181. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  182. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  183. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  184. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  185. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  186. snappy/geometric_structure/geodesic/__init__.py +0 -0
  187. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  188. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  189. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  190. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  191. snappy/geometric_structure/geodesic/constants.py +6 -0
  192. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  193. snappy/geometric_structure/geodesic/fixed_points.py +93 -0
  194. snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
  195. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  196. snappy/geometric_structure/geodesic/line.py +30 -0
  197. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  198. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  199. snappy/geometric_structure/test.py +22 -0
  200. snappy/gui.py +36 -36
  201. snappy/horoviewer.py +50 -48
  202. snappy/hyperboloid/__init__.py +212 -0
  203. snappy/hyperboloid/distances.py +245 -0
  204. snappy/hyperboloid/horoball.py +19 -0
  205. snappy/hyperboloid/line.py +35 -0
  206. snappy/hyperboloid/point.py +9 -0
  207. snappy/hyperboloid/triangle.py +29 -0
  208. snappy/{infodialog.py → infowindow.py} +32 -33
  209. snappy/isometry_signature.py +382 -0
  210. snappy/len_spec/__init__.py +596 -0
  211. snappy/len_spec/geodesic_info.py +110 -0
  212. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  213. snappy/len_spec/geodesic_piece.py +143 -0
  214. snappy/len_spec/geometric_structure.py +182 -0
  215. snappy/len_spec/geometry.py +80 -0
  216. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  217. snappy/len_spec/spine.py +206 -0
  218. snappy/len_spec/test.py +24 -0
  219. snappy/len_spec/test_cases.py +69 -0
  220. snappy/len_spec/tile.py +275 -0
  221. snappy/len_spec/word.py +86 -0
  222. snappy/manifolds/__init__.py +1 -1
  223. snappy/math_basics.py +176 -0
  224. snappy/matrix.py +525 -0
  225. snappy/number.py +97 -21
  226. snappy/numeric_output_checker.py +37 -27
  227. snappy/pari.py +30 -69
  228. snappy/phone_home.py +25 -20
  229. snappy/polyviewer.py +39 -37
  230. snappy/ptolemy/__init__.py +4 -6
  231. snappy/ptolemy/component.py +14 -12
  232. snappy/ptolemy/coordinates.py +312 -295
  233. snappy/ptolemy/fieldExtensions.py +14 -12
  234. snappy/ptolemy/findLoops.py +43 -31
  235. snappy/ptolemy/geometricRep.py +24 -26
  236. snappy/ptolemy/homology.py +12 -7
  237. snappy/ptolemy/manifoldMethods.py +69 -70
  238. snappy/ptolemy/matrix.py +65 -26
  239. snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +18 -14
  240. snappy/ptolemy/polynomial.py +125 -119
  241. snappy/ptolemy/processComponents.py +36 -30
  242. snappy/ptolemy/processFileBase.py +79 -18
  243. snappy/ptolemy/processFileDispatch.py +13 -14
  244. snappy/ptolemy/processMagmaFile.py +44 -39
  245. snappy/ptolemy/processRurFile.py +18 -11
  246. snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +20 -17
  247. snappy/ptolemy/ptolemyObstructionClass.py +13 -17
  248. snappy/ptolemy/ptolemyVariety.py +190 -121
  249. snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +20 -19
  250. snappy/ptolemy/reginaWrapper.py +25 -29
  251. snappy/ptolemy/rur.py +6 -14
  252. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +27 -22
  253. snappy/ptolemy/test.py +247 -188
  254. snappy/ptolemy/utilities.py +41 -43
  255. snappy/raytracing/__init__.py +64 -0
  256. snappy/raytracing/additional_horospheres.py +64 -0
  257. snappy/raytracing/additional_len_spec_choices.py +63 -0
  258. snappy/raytracing/cohomology_fractal.py +10 -6
  259. snappy/raytracing/eyeball.py +123 -0
  260. snappy/raytracing/finite_raytracing_data.py +48 -38
  261. snappy/raytracing/finite_viewer.py +218 -210
  262. snappy/raytracing/geodesic_tube_info.py +174 -0
  263. snappy/raytracing/geodesics.py +246 -0
  264. snappy/raytracing/geodesics_window.py +258 -0
  265. snappy/raytracing/gui_utilities.py +152 -40
  266. snappy/raytracing/hyperboloid_navigation.py +102 -52
  267. snappy/raytracing/hyperboloid_utilities.py +114 -261
  268. snappy/raytracing/ideal_raytracing_data.py +256 -179
  269. snappy/raytracing/inside_viewer.py +522 -253
  270. snappy/raytracing/pack.py +22 -0
  271. snappy/raytracing/raytracing_data.py +46 -34
  272. snappy/raytracing/raytracing_view.py +190 -109
  273. snappy/raytracing/shaders/Eye.png +0 -0
  274. snappy/raytracing/shaders/NonGeometric.png +0 -0
  275. snappy/raytracing/shaders/__init__.py +60 -4
  276. snappy/raytracing/shaders/fragment.glsl +575 -148
  277. snappy/raytracing/test.py +29 -0
  278. snappy/raytracing/tooltip.py +146 -0
  279. snappy/raytracing/upper_halfspace_utilities.py +98 -0
  280. snappy/raytracing/view_scale_controller.py +98 -0
  281. snappy/raytracing/zoom_slider/__init__.py +32 -29
  282. snappy/raytracing/zoom_slider/test.py +2 -0
  283. snappy/sage_helper.py +69 -123
  284. snappy/{preferences.py → settings.py} +167 -145
  285. snappy/shell.py +4 -0
  286. snappy/snap/__init__.py +12 -8
  287. snappy/snap/character_varieties.py +24 -18
  288. snappy/snap/find_field.py +35 -34
  289. snappy/snap/fundamental_polyhedron.py +99 -85
  290. snappy/snap/generators.py +6 -8
  291. snappy/snap/interval_reps.py +18 -6
  292. snappy/snap/kernel_structures.py +8 -3
  293. snappy/snap/mcomplex_base.py +1 -2
  294. snappy/snap/nsagetools.py +107 -53
  295. snappy/snap/peripheral/__init__.py +1 -1
  296. snappy/snap/peripheral/dual_cellulation.py +15 -7
  297. snappy/snap/peripheral/link.py +20 -16
  298. snappy/snap/peripheral/peripheral.py +22 -14
  299. snappy/snap/peripheral/surface.py +47 -50
  300. snappy/snap/peripheral/test.py +8 -8
  301. snappy/snap/polished_reps.py +65 -40
  302. snappy/snap/shapes.py +41 -22
  303. snappy/snap/slice_obs_HKL.py +64 -25
  304. snappy/snap/t3mlite/arrow.py +88 -51
  305. snappy/snap/t3mlite/corner.py +5 -6
  306. snappy/snap/t3mlite/edge.py +32 -21
  307. snappy/snap/t3mlite/face.py +7 -9
  308. snappy/snap/t3mlite/files.py +31 -23
  309. snappy/snap/t3mlite/homology.py +14 -10
  310. snappy/snap/t3mlite/linalg.py +158 -56
  311. snappy/snap/t3mlite/mcomplex.py +739 -291
  312. snappy/snap/t3mlite/perm4.py +236 -84
  313. snappy/snap/t3mlite/setup.py +9 -10
  314. snappy/snap/t3mlite/simplex.py +65 -48
  315. snappy/snap/t3mlite/spun.py +42 -30
  316. snappy/snap/t3mlite/surface.py +45 -45
  317. snappy/snap/t3mlite/test.py +3 -0
  318. snappy/snap/t3mlite/test_vs_regina.py +17 -13
  319. snappy/snap/t3mlite/tetrahedron.py +25 -24
  320. snappy/snap/t3mlite/vertex.py +8 -13
  321. snappy/snap/test.py +45 -52
  322. snappy/snap/utilities.py +66 -65
  323. snappy/test.py +155 -158
  324. snappy/test_cases.py +263 -0
  325. snappy/testing.py +131 -0
  326. snappy/tiling/__init__.py +2 -0
  327. snappy/tiling/canonical_key_dict.py +59 -0
  328. snappy/tiling/dict_based_set.py +79 -0
  329. snappy/tiling/floor.py +49 -0
  330. snappy/tiling/hyperboloid_dict.py +54 -0
  331. snappy/tiling/iter_utils.py +78 -0
  332. snappy/tiling/lifted_tetrahedron.py +22 -0
  333. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  334. snappy/tiling/real_hash_dict.py +164 -0
  335. snappy/tiling/test.py +23 -0
  336. snappy/tiling/tile.py +215 -0
  337. snappy/tiling/triangle.py +33 -0
  338. snappy/tkterminal.py +313 -203
  339. snappy/twister/main.py +1 -8
  340. snappy/twister/twister_core.cpython-38-darwin.so +0 -0
  341. snappy/upper_halfspace/__init__.py +146 -0
  342. snappy/upper_halfspace/ideal_point.py +26 -0
  343. snappy/verify/__init__.py +4 -8
  344. snappy/verify/{verifyCanonical.py → canonical.py} +114 -97
  345. snappy/verify/complex_volume/__init__.py +3 -2
  346. snappy/verify/complex_volume/adjust_torsion.py +13 -11
  347. snappy/verify/complex_volume/closed.py +29 -24
  348. snappy/verify/complex_volume/compute_ptolemys.py +8 -6
  349. snappy/verify/complex_volume/cusped.py +10 -9
  350. snappy/verify/complex_volume/extended_bloch.py +14 -12
  351. snappy/verify/{cuspTranslations.py → cusp_translations.py} +15 -14
  352. snappy/verify/edge_equations.py +80 -0
  353. snappy/verify/exceptions.py +23 -56
  354. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +19 -15
  355. snappy/verify/interval_newton_shapes_engine.py +51 -211
  356. snappy/verify/interval_tree.py +27 -25
  357. snappy/verify/krawczyk_shapes_engine.py +47 -50
  358. snappy/verify/maximal_cusp_area_matrix/__init__.py +17 -86
  359. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +58 -48
  360. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +53 -57
  361. snappy/verify/{realAlgebra.py → real_algebra.py} +26 -20
  362. snappy/verify/shapes.py +10 -7
  363. snappy/verify/short_slopes.py +41 -42
  364. snappy/verify/{squareExtensions.py → square_extensions.py} +96 -92
  365. snappy/verify/test.py +59 -57
  366. snappy/verify/upper_halfspace/extended_matrix.py +5 -5
  367. snappy/verify/upper_halfspace/finite_point.py +44 -31
  368. snappy/verify/upper_halfspace/ideal_point.py +69 -57
  369. snappy/verify/volume.py +15 -12
  370. snappy/version.py +2 -3
  371. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/METADATA +14 -12
  372. snappy-3.2.dist-info/RECORD +503 -0
  373. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  374. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -1
  375. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/top_level.txt +10 -1
  376. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  377. snappy/doc/_static/classic.css +0 -266
  378. snappy/doc/_static/jquery-3.5.1.js +0 -10872
  379. snappy/doc/_static/sidebar.js +0 -159
  380. snappy/doc/_static/underscore-1.13.1.js +0 -2042
  381. snappy/doc/_static/underscore.js +0 -6
  382. snappy/doc/verify_canon.html +0 -283
  383. snappy/ppm_to_png.py +0 -243
  384. snappy/togl/__init__.py +0 -3
  385. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  386. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  387. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  388. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  389. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  390. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  391. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  392. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  393. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  394. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  395. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  396. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  397. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  398. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  399. snappy/verify/cuspCrossSection.py +0 -1413
  400. snappy/verify/mathHelpers.py +0 -64
  401. snappy-3.0.3.dist-info/RECORD +0 -360
@@ -6,23 +6,25 @@ of it (though depending very much on snappy), except for borrowing
6
6
  some linear algebra code.
7
7
  """
8
8
 
9
- import snappy, FXrays
10
- if snappy._within_sage:
11
- from sage.all import gcd
12
- from sage.all import vector as Vector
13
- from sage.all import matrix as Matrix
9
+ import FXrays
10
+
11
+ from ...sage_helper import _within_sage
12
+ if _within_sage:
13
+ from ...sage_helper import vector as Vector, matrix as Matrix, gcd
14
14
  else:
15
15
  from snappy.snap.t3mlite.linalg import Vector, Matrix, gcd
16
16
 
17
+
17
18
  def weak_normalize_slope(slope):
18
19
  """For a tuple (a, b), scale it so that gcd(a,b)=1"""
19
- a, b = [int(s) for s in slope]
20
+ a, b = (int(s) for s in slope)
20
21
  if a == b == 0:
21
22
  return (0, 0)
22
23
  g = gcd(a,b)
23
24
  a, b = a//g, b//g
24
25
  return (a,b)
25
26
 
27
+
26
28
  def normalize_slope(slope):
27
29
  """
28
30
  For a tuple (a, b), scale it so that gcd(a,b)=1 and it lies in the
@@ -40,17 +42,19 @@ def normalize_slope(slope):
40
42
  """
41
43
  a, b = weak_normalize_slope(slope)
42
44
  if a == b == 0:
43
- return (0, 0)
45
+ return (0, 0)
44
46
  if a < 0:
45
47
  a, b = -a, -b
46
48
  elif a == 0 and b < 0:
47
49
  b = -b
48
50
  return (a,b)
49
51
 
52
+
50
53
  def shift_matrix(n):
51
54
  """
52
55
  The edge shifts corresponding to each of three quad types, see Figure
53
- 2.1 and 2.2 of `[DG] <http://arxiv.org/abs/1102.4588>`_
56
+ 2.1 and 2.2 of
57
+ `Dunfield and Garoufalidis '12 <http://arxiv.org/abs/1102.4588>`_.
54
58
  """
55
59
  shifts = Matrix(3*n, 3*n)
56
60
  for i in range(0, 3*n, 3):
@@ -59,11 +63,12 @@ def shift_matrix(n):
59
63
  shifts[i+j, i+((j+1) % 3)] = -1
60
64
  return shifts
61
65
 
66
+
62
67
  def quad_vector_to_type_and_coeffs(quad_vector):
63
68
  """
64
69
  For an n-tetrahedra manifold, take a full quad vector
65
70
  of length 3n and store the quad type and weight for
66
- each tetrahedron.
71
+ each tetrahedron.
67
72
  """
68
73
  quad_types, coefficients = [], []
69
74
  quad_vector = list(quad_vector)
@@ -81,25 +86,26 @@ def quad_vector_to_type_and_coeffs(quad_vector):
81
86
 
82
87
  return quad_types, Vector(coefficients)
83
88
 
89
+
84
90
  class SpunSurface:
85
91
  """
86
92
  A spun normal surface in an ideal triangulation, as introduced by
87
93
  Thurston.
88
94
 
89
- For an quick sketch of this theory see `[DG]
95
+ For an quick sketch of this theory see `Dunfield and Garoufalidis '12
90
96
  <http://arxiv.org/abs/1102.4588>`_ and for more details see
91
- `[Tillmann] <http://arxiv.org/abs/math/0406271>`_.
97
+ `Tillmann '08 <http://arxiv.org/abs/math/0406271>`_.
92
98
 
93
99
  The quad conventions are (Q02, Q03, Q01) corresponding to
94
100
  z -> 0, z' -> 0, and z'' -> 0 respectively, as per Figure 3.1 of
95
- `[DG] <http://arxiv.org/abs/1102.4588>`_. The quad types
96
- are numbered 0, 1, 2; the "None" quad type means a
97
- tetrahedron contains no quads at all.
98
- """
101
+ `Dunfield and Garoufalidis '12 <http://arxiv.org/abs/1102.4588>`_.
102
+ The quad types are numbered 0, 1, 2; the "None" quad type means a
103
+ tetrahedron contains no quads at all.
104
+ """
99
105
  def __init__(self, manifold, quad_vector=None, quad_types=None, index=None):
100
106
  self._manifold = manifold
101
- self._index=index
102
- if quad_types != None:
107
+ self._index = index
108
+ if quad_types is not None:
103
109
  coefficients = quad_vector
104
110
  quad_vector = []
105
111
  for c, q in zip(coefficients, quad_types):
@@ -132,11 +138,11 @@ class SpunSurface:
132
138
  return True
133
139
 
134
140
  def __radd__(self, other):
135
- if other==0:
141
+ if other == 0:
136
142
  return self
137
143
 
138
144
  def __add__(self, other):
139
- if other==0:
145
+ if other == 0:
140
146
  return self
141
147
  if not self.is_compatible(other):
142
148
  raise ValueError('Normal surfaces are not compatible')
@@ -146,6 +152,7 @@ class SpunSurface:
146
152
  return "<Surface %s: %s %s %s>" % (self._index, self._quad_types,
147
153
  list(self._coefficients), tuple(self._boundary_slopes))
148
154
 
155
+
149
156
  class SpunNormalSurfaceEquations:
150
157
  def __init__(self, manifold):
151
158
  self.manifold = manifold
@@ -174,7 +181,10 @@ class SpunNormalSurfaceEquations:
174
181
  T = regina.Triangulation3(M._to_string())
175
182
  ans = []
176
183
  tets = range(M.num_tetrahedra())
177
- surfaces = regina.NormalSurfaces.enumerate(T, regina.NS_QUAD)
184
+ if hasattr(regina.NormalSurfaces, 'enumerate'):
185
+ surfaces = regina.NormalSurfaces.enumerate(T, regina.NS_QUAD)
186
+ else:
187
+ surfaces = regina.NormalSurfaces(T, regina.NS_QUAD)
178
188
  for i in range(surfaces.size()):
179
189
  S = surfaces.surface(i)
180
190
  coeff_vector = [int(S.quads(tet, quad).stringValue())
@@ -184,7 +194,6 @@ class SpunNormalSurfaceEquations:
184
194
  else:
185
195
  raise ValueError("Algorithm should be one of {'FXrays', 'regina'}")
186
196
 
187
-
188
197
  def is_solution(self, quad_vector):
189
198
  return self.quad_equations * quad_vector == 0
190
199
 
@@ -192,16 +201,16 @@ class SpunNormalSurfaceEquations:
192
201
  return self.slope_matrix*self.shift_matrix*quad_vector
193
202
 
194
203
 
195
-
196
204
  # The following methods get monkey patched into the manifold
197
- # classes.
205
+ # classes.
198
206
 
199
207
  def _normal_surface_equations(self):
200
208
  name = '_normal_surface_equations'
201
209
  if name not in self._cache:
202
210
  eqns = SpunNormalSurfaceEquations(self)
203
211
  self._cache[name] = SpunNormalSurfaceEquations(self)
204
- return self._cache[name]
212
+ return self._cache[name]
213
+
205
214
 
206
215
  def normal_surfaces(self, algorithm='FXrays'):
207
216
  """
@@ -220,6 +229,7 @@ def normal_surfaces(self, algorithm='FXrays'):
220
229
  for i, qv in enumerate(eqns.vertex_solutions(algorithm))]
221
230
  return self._cache['normal_surfaces']
222
231
 
232
+
223
233
  def normal_boundary_slopes(self, subset='all', algorithm='FXrays'):
224
234
  """
225
235
  For a one-cusped manifold, returns all the nonempty boundary slopes of
@@ -235,9 +245,9 @@ def normal_boundary_slopes(self, subset='all', algorithm='FXrays'):
235
245
 
236
246
  If the ``subset`` flag is set to ``'kabaya'``, then it only
237
247
  returns boundary slopes associated to vertex surfaces with a quad
238
- in every tetrahedron; by Theorem 1.1. of `[DG]
239
- <http://arxiv.org/abs/1102.4588>`_ these are all strict boundary
240
- slopes.
248
+ in every tetrahedron; by Theorem 1.1. of
249
+ `Dunfield and Garoufalidis '12 <http://arxiv.org/abs/1102.4588>`_
250
+ these are all strict boundary slopes.
241
251
 
242
252
  >>> N = Manifold('m113')
243
253
  >>> N.normal_boundary_slopes()
@@ -275,11 +285,13 @@ def normal_boundary_slopes(self, subset='all', algorithm='FXrays'):
275
285
  if subset != 'all':
276
286
  raise ValueError("Subset must be one of 'all', 'kabaya', or 'brasile'")
277
287
 
278
- slopes = set([normalize_slope(S.boundary_slopes()) for S in surfaces])
279
- slopes.discard( (0, 0) )
288
+ slopes = {normalize_slope(S.boundary_slopes()) for S in surfaces}
289
+ slopes.discard((0, 0))
280
290
  return sorted(slopes)
281
291
 
292
+
282
293
  if __name__ == "__main__":
283
294
  import doctest
284
- names = {'Manifold':snappy.Manifold}
295
+ import snappy
296
+ names = {'Manifold': snappy.Manifold}
285
297
  doctest.testmod(extraglobs=names)
@@ -1,7 +1,7 @@
1
1
  # t3m - software for studying triangulated 3-manifolds
2
2
  # Copyright (C) 2002 Marc Culler, Nathan Dunfield and others
3
3
  #
4
- # This program is distributed under the terms of the
4
+ # This program is distributed under the terms of the
5
5
  # GNU General Public License, version 2 or later, as published by
6
6
  # the Free Software Foundation. See the file GPL.txt for details.
7
7
 
@@ -38,7 +38,7 @@ from .linalg import Vector, Matrix
38
38
  # NOTE (3) Our plan is to create (at least) three subclasses of the
39
39
  # Surface class: Closed_Surface, Spun_Surface, Bounded_Surface.
40
40
 
41
- #Incidence dictionaries for quads, triangles and octagons
41
+ # Incidence dictionaries for quads, triangles and octagons
42
42
 
43
43
  MeetsQuad = {E01:Vector((1,1,0)), E02:Vector((1,0,1)), E21:Vector((0,1,1)),
44
44
  E32:Vector((1,1,0)), E31:Vector((1,0,1)), E03:Vector((0,1,1))}
@@ -46,8 +46,8 @@ MeetsQuad = {E01:Vector((1,1,0)), E02:Vector((1,0,1)), E21:Vector((0,1,1)),
46
46
  MeetsTri = {E01:Vector((1,1,0,0)), E02:Vector((1,0,1,0)), E21:Vector((0,1,1,0)),
47
47
  E32:Vector((0,0,1,1)), E31:Vector((0,1,0,1)), E03:Vector((1,0,0,1))}
48
48
 
49
- MeetsOct = {E01:Vector((1,1,2)), E02:Vector((1,2,1)), E21:Vector((2,1,1)),
50
- E32:Vector((1,1,2)), E31:Vector((1,2,1)), E03:Vector((2,1,1))}
49
+ MeetsOct = {E01:Vector((1,1,2)), E02:Vector((1,2,1)), E21:Vector((2,1,1)),
50
+ E32:Vector((1,1,2)), E31:Vector((1,2,1)), E03:Vector((2,1,1))}
51
51
 
52
52
  DisjointQuad = {E01:2, E02:1, E21:0,
53
53
  E32:2, E31:1, E03:0}
@@ -56,7 +56,7 @@ QuadWeights = (Vector((1,0,0)), Vector((0,1,0)), Vector((0,0,1)) )
56
56
 
57
57
  WeightVector = Vector([1,1,1])
58
58
 
59
- TypeVector = Vector([0,1,2])
59
+ TypeVector = Vector([0,1,2])
60
60
 
61
61
  # Used for converting normal surface into tetrahedron edge-shift data.
62
62
  # QuadShift[k] is the shifts induced by quad Qk3 along edges (E03, E13, E23).
@@ -71,6 +71,7 @@ NonInteger = 'Error'
71
71
 
72
72
  # NOTE: The convention is that the order of the quads is (Q03, Q13, Q23)
73
73
 
74
+
74
75
  def gcd(x, y):
75
76
  if x == 0:
76
77
  if y == 0:
@@ -80,11 +81,12 @@ def gcd(x, y):
80
81
  x = abs(x)
81
82
  y = abs(y)
82
83
  while y != 0:
83
- r = x%y
84
+ r = x % y
84
85
  x = y
85
86
  y = r
86
87
  return x
87
88
 
89
+
88
90
  def reduce_slope( slope ):
89
91
  a, b = slope
90
92
  if a == b == 0:
@@ -93,6 +95,7 @@ def reduce_slope( slope ):
93
95
  a, b = a/g, b/g
94
96
  return (a,b), g
95
97
 
98
+
96
99
  class Surface:
97
100
 
98
101
  def __init__(self, manifold, quadvector):
@@ -126,7 +129,7 @@ class Surface:
126
129
  indices of those edges for which the Surface contains an edge-linking
127
130
  annulus (and hence has an obvious compression).
128
131
  """
129
- if not self in manifold.NormalSurfaces:
132
+ if self not in manifold.NormalSurfaces:
130
133
  raise ValueError('That manifold does not contain the Surface!')
131
134
  linked_edges = []
132
135
  for edge in manifold.Edges:
@@ -134,14 +137,14 @@ class Surface:
134
137
  for corner in edge.Corners:
135
138
  quad = DisjointQuad[corner.Subsimplex]
136
139
  if ( self.Coefficients[corner.Tetrahedron.Index] == 0 or
137
- self.Quadtypes[corner.Tetrahedron.Index] != quad ):
140
+ self.Quadtypes[corner.Tetrahedron.Index] != quad ):
138
141
  is_linked = 0
139
142
  break
140
143
  if is_linked:
141
144
  linked_edges.append(edge.Index)
142
145
  return linked_edges
143
146
 
144
- def info(self, out = sys.stdout):
147
+ def info(self, out=sys.stdout):
145
148
  if self.type() == "normal":
146
149
  out.write("Normal surface\n")
147
150
  for i in range(self.Size):
@@ -152,7 +155,8 @@ class Surface:
152
155
  weight = " Quad Type Q%d3, weight %d" % (self.Quadtypes[i], quad_weight)
153
156
  else:
154
157
  weight = "No quads"
155
- out.write(weight + "\n")
158
+ out.write(weight + "\n")
159
+
156
160
 
157
161
  class ClosedSurface(Surface):
158
162
 
@@ -248,7 +252,7 @@ class ClosedSurface(Surface):
248
252
  x = A.solve(b)
249
253
  # Subtract off as many vertex links as possible.
250
254
  for vertex in manifold.Vertices:
251
- vert_vec = vertex.IncidenceVector
255
+ vert_vec = vertex.IncidenceVector
252
256
  m = min([x[i] for i, w in enumerate(vert_vec) if w])
253
257
  x -= Vector(m*vert_vec)
254
258
 
@@ -265,7 +269,6 @@ class ClosedSurface(Surface):
265
269
 
266
270
  self.EdgeWeights = Matrix(edge_matrix).dot(self.Weights)
267
271
 
268
-
269
272
  def find_euler_characteristic(self, manifold):
270
273
  # An EdgeValence is the number of tetrahedra that meet the edge.
271
274
  # The number of 2-simplices that meet the edge is larger by 1 in
@@ -320,7 +323,6 @@ class ClosedSurface(Surface):
320
323
  if not (bounds_subcomplex or double_bounds_subcomplex):
321
324
  break
322
325
 
323
-
324
326
  if bounds_subcomplex or double_bounds_subcomplex:
325
327
  thick_or_thin = "thin"
326
328
  for tet in manifold.Tetrahedra:
@@ -340,7 +342,7 @@ class ClosedSurface(Surface):
340
342
 
341
343
  self.BoundingInfo = (bounds_subcomplex, double_bounds_subcomplex, thick_or_thin)
342
344
 
343
- ###### It is not a torus unless the edge is a loop!
345
+ # It is not a torus unless the edge is a loop!
344
346
  # A surface is an edge linking torus iff all edge weights are 2 except one which
345
347
  # is zero. Returns pair (is linking torus, edge it links around).
346
348
 
@@ -357,31 +359,31 @@ class ClosedSurface(Surface):
357
359
  elif w != 2:
358
360
  return (0, None)
359
361
 
360
- return (1, zero_index)
362
+ return (1, zero_index)
361
363
 
362
- def info(self, manifold, out = sys.stdout):
364
+ def info(self, manifold, out=sys.stdout):
363
365
  if self.type() == "normal":
364
366
  # check if really boring:
365
367
  q, e = self.is_edge_linking_torus()
366
368
  if q:
367
369
  out.write("Normal surface #%d is thin linking torus of edge %s\n"
368
- %(manifold.NormalSurfaces.index(self), manifold.Edges[e]))
370
+ % (manifold.NormalSurfaces.index(self), manifold.Edges[e]))
369
371
  return
370
372
  out.write("Normal surface #%d of Euler characteristic %d\n"
371
- %(manifold.NormalSurfaces.index(self), self.EulerCharacteristic))
373
+ % (manifold.NormalSurfaces.index(self), self.EulerCharacteristic))
372
374
  # additional message about bounding subcomplex
373
375
  b, d, t = self.BoundingInfo
374
376
  if b == 1:
375
- out.write(" Bounds %s subcomplex\n" % t)
377
+ out.write(" Bounds %s subcomplex\n" % t)
376
378
  elif d == 1:
377
- out.write(" Double bounds %s subcomplex\n" %t)
379
+ out.write(" Double bounds %s subcomplex\n" % t)
378
380
  else:
379
381
  out.write(" doesn't bound subcomplex\n")
380
382
  else:
381
383
  out.write("Almost-normal surface #%d of Euler characteristic %d\n"
382
- % (manifold.AlmostNormalSurfaces.index(self),
384
+ % (manifold.AlmostNormalSurfaces.index(self),
383
385
  self.EulerCharacteristic))
384
- out.write('\n')
386
+ out.write('\n')
385
387
  for i in range(self.Size):
386
388
  quad_weight = self.Coefficients[i]
387
389
  if quad_weight == -1:
@@ -392,15 +394,15 @@ class ClosedSurface(Surface):
392
394
  weight = "No quads"
393
395
  out.write(" In tetrahedron %s : %s\n" %
394
396
  (manifold.Tetrahedra[i], weight))
395
- out.write("\tTri weights V0: %d V1: %d V2 : %d V3 : %d\n"
396
- % (self.get_weight(i, V0),
397
- self.get_weight(i, V1),
397
+ out.write("\tTri weights V0: %d V1: %d V2 : %d V3 : %d\n"
398
+ % (self.get_weight(i, V0),
399
+ self.get_weight(i, V1),
398
400
  self.get_weight(i, V2),
399
401
  self.get_weight(i, V3)))
400
- out.write('\n')
402
+ out.write('\n')
401
403
 
402
404
  for i in range(len(self.EdgeWeights)):
403
- out.write(" Edge %s has weight %d\n"
405
+ out.write(" Edge %s has weight %d\n"
404
406
  % (manifold.Edges[i], self.EdgeWeights[i]))
405
407
 
406
408
  def casson_split(self, manifold):
@@ -413,7 +415,7 @@ class ClosedSurface(Surface):
413
415
  complementary manifold.
414
416
 
415
417
  """
416
- M = manifold
418
+ M = manifold
417
419
  have_quads = [self.has_quad(i) for i in range(len(M))]
418
420
  new_tets = {}
419
421
  for i in have_quads:
@@ -421,10 +423,10 @@ class ClosedSurface(Surface):
421
423
  for i in have_quads:
422
424
  T = new_tets[i]
423
425
 
424
- #-----------------end class ClosedSurface---------------------------------------
426
+ # -----------------end class ClosedSurface---------------------------------------
425
427
 
426
428
 
427
- #-----------------begin class SpunSurface--------------------------------------
429
+ # -----------------begin class SpunSurface--------------------------------------
428
430
 
429
431
  def dot_product(x,y):
430
432
  assert len(x) == len(y)
@@ -433,6 +435,7 @@ def dot_product(x,y):
433
435
  dot += x[i]*y[i]
434
436
  return dot
435
437
 
438
+
436
439
  class SpunSurface(Surface):
437
440
 
438
441
  def __init__(self, manifold, quadvector):
@@ -453,10 +456,10 @@ class SpunSurface(Surface):
453
456
  raise OverflowError('Yikes! A non-integral euler characteristic!')
454
457
  return -int(intresult)
455
458
 
456
- def info(self, manifold, out = sys.stdout):
459
+ def info(self, manifold, out=sys.stdout):
457
460
  out.write("SpunSurface.\n Slope: %s; Boundary components: %d; " %
458
461
  reduce_slope(self.BoundarySlope))
459
- out.write("Euler characteristic: %d\n"%
462
+ out.write("Euler characteristic: %d\n" %
460
463
  self.find_euler_characteristic(manifold))
461
464
  out.write(" Incompressible: %s\n" % self.Incompressible)
462
465
  for i in range(self.Size):
@@ -466,10 +469,10 @@ class SpunSurface(Surface):
466
469
  (i, self.Quadtypes[i], quad_weight))
467
470
  else:
468
471
  weight = " Tet %d: no quads" % i
469
- out.write(weight + "\n")
472
+ out.write(weight + "\n")
470
473
 
471
474
 
472
- #-------------begin class ClosedSurfaceInCusped------------------------
475
+ # -------------begin class ClosedSurfaceInCusped------------------------
473
476
 
474
477
  class ClosedSurfaceInCusped(ClosedSurface):
475
478
  def __init__(self, manifold, quadvector):
@@ -477,8 +480,7 @@ class ClosedSurfaceInCusped(ClosedSurface):
477
480
  self.Incompressible = None
478
481
  self.BoundarySlope = None
479
482
 
480
-
481
- def info(self, manifold, out = sys.stdout):
483
+ def info(self, manifold, out=sys.stdout):
482
484
  out.write("ClosedSurfaceInCusped #%d: Euler %d; Incompressible %s\n" %
483
485
  (manifold.ClosedSurfaces.index(self), self.EulerCharacteristic, self.Incompressible))
484
486
  # check if really boring:
@@ -490,9 +492,9 @@ class ClosedSurfaceInCusped(ClosedSurface):
490
492
  # additional message about bounding subcomplex
491
493
  b, d, t = self.BoundingInfo
492
494
  if b == 1:
493
- out.write(" Bounds %s subcomplex\n" % t)
495
+ out.write(" Bounds %s subcomplex\n" % t)
494
496
  elif d == 1:
495
- out.write(" Double bounds %s subcomplex\n" %t)
497
+ out.write(" Double bounds %s subcomplex\n" % t)
496
498
  else:
497
499
  out.write(" Doesn't bound subcomplex\n")
498
500
 
@@ -505,15 +507,13 @@ class ClosedSurfaceInCusped(ClosedSurface):
505
507
 
506
508
  out.write(" In tet %s : %s\n" %
507
509
  (manifold.Tetrahedra[i], weight))
508
- out.write("\tTri weights V0: %d V1: %d V2 : %d V3 : %d\n"
509
- % (self.get_weight(i, V0),
510
- self.get_weight(i, V1),
510
+ out.write("\tTri weights V0: %d V1: %d V2 : %d V3 : %d\n"
511
+ % (self.get_weight(i, V0),
512
+ self.get_weight(i, V1),
511
513
  self.get_weight(i, V2),
512
514
  self.get_weight(i, V3)))
513
- out.write('\n')
515
+ out.write('\n')
514
516
 
515
517
  for i in range(len(self.EdgeWeights)):
516
- out.write(" Edge %s has weight %d\n"
518
+ out.write(" Edge %s has weight %d\n"
517
519
  % (manifold.Edges[i], self.EdgeWeights[i]))
518
-
519
-
@@ -1,6 +1,7 @@
1
1
  import snappy
2
2
  import snappy.snap.t3mlite as t3m
3
3
 
4
+
4
5
  def closed_test():
5
6
  for M in snappy.OrientableClosedCensus[:10]:
6
7
  N = M.filled_triangulation()
@@ -8,10 +9,12 @@ def closed_test():
8
9
  T.find_normal_surfaces()
9
10
  T.normal_surface_info()
10
11
 
12
+
11
13
  def cusped_test():
12
14
  for M in snappy.OrientableCuspedCensus[:10]:
13
15
  T = t3m.Mcomplex(M)
14
16
  T.find_normal_surfaces()
15
17
 
18
+
16
19
  closed_test()
17
20
  cusped_test()
@@ -1,14 +1,16 @@
1
- from __future__ import print_function
2
- import snappy, regina
1
+ import snappy
2
+ import regina
3
3
  import snappy.snap.t3mlite as t3m
4
4
  import snappy.snap.t3mlite.spun as spun
5
5
 
6
+
6
7
  def hash_t3m_surface(surface):
7
8
  ans = [surface.EulerCharacteristic]
8
- ans += sorted(list(surface.EdgeWeights))
9
- ans += sorted(list(surface.Quadvector))
9
+ ans += sorted(surface.EdgeWeights)
10
+ ans += sorted(surface.Quadvector)
10
11
  return ans
11
12
 
13
+
12
14
  def hash_regina_surface(S):
13
15
  T = S.getTriangulation()
14
16
  t = T.getNumberOfTetrahedra()
@@ -17,19 +19,22 @@ def hash_regina_surface(S):
17
19
  ans += sorted([S.getQuadCoord(i, j) for i in range(t) for j in range(3)])
18
20
  return ans
19
21
 
22
+
20
23
  def to_regina(snappy_manifold):
21
24
  return regina.NTriangulation(snappy_manifold._to_string())
22
25
 
26
+
23
27
  def vertex_surfaces(regina_triangulation):
24
28
  """
25
29
  Enumerate the vertex surfaces of the given triangulation
26
- in quad coordinates.
30
+ in quad coordinates.
27
31
  """
28
32
  surfaces = regina.NNormalSurfaceList.enumerate(
29
33
  regina_triangulation, regina.NS_QUAD)
30
34
  for i in range(surfaces.getNumberOfSurfaces()):
31
35
  yield surfaces.getSurface(i)
32
36
 
37
+
33
38
  def compare_closed(snappy_manifold):
34
39
  N = snappy_manifold.filled_triangulation()
35
40
 
@@ -43,12 +48,14 @@ def compare_closed(snappy_manifold):
43
48
  all_together = sum(t_hashes, [])
44
49
  return t_hashes == r_hashes, len(all_together), sum(all_together)
45
50
 
51
+
46
52
  def regina_boundary_slope(surface):
47
53
  slope = surface.boundaryIntersections()
48
54
  a = int(slope.entry(0,0).stringValue())
49
55
  b = int(slope.entry(0,1).stringValue())
50
56
  return (b, -a)
51
57
 
58
+
52
59
  def compare_cusped(snappy_manifold):
53
60
  tri_data = snappy_manifold._to_string()
54
61
  T = spun.Manifold(tri_data)
@@ -59,24 +66,21 @@ def compare_cusped(snappy_manifold):
59
66
  t = R.getNumberOfTetrahedra()
60
67
  regina_surfaces = list(vertex_surfaces(R))
61
68
  r_hashes = sorted(
62
- sorted(sorted(int(S.getQuadCoord(i, j).stringValue())
63
- for i in range(t) for j in range(3)))
69
+ sorted(int(S.getQuadCoord(i, j).stringValue())
70
+ for i in range(t) for j in range(3))
64
71
  for S in regina_surfaces)
65
72
  r_slopes = sorted(map(regina_boundary_slope, regina_surfaces))
66
73
 
67
74
  assert t_hashes == r_hashes and t_slopes == r_slopes
68
75
 
69
76
 
70
- def closed_test(N = 10):
77
+ def closed_test(N=10):
71
78
  for M in snappy.OrientableClosedCensus[:N]:
72
79
  print(M, compare_closed(M))
73
80
 
74
- def cusped_test(N = 100):
81
+
82
+ def cusped_test(N=100):
75
83
  for census in [snappy.CensusKnots, snappy.OrientableCuspedCensus(cusps=1)]:
76
84
  for M in census:
77
85
  print(M)
78
86
  compare_cusped(M)
79
-
80
-
81
-
82
-