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
@@ -0,0 +1,22 @@
1
+ def pack_tet_data(prefix, tets_to_data):
2
+ result = {}
3
+
4
+ offset = 0
5
+ offsets = [ offset ]
6
+
7
+ for data in tets_to_data:
8
+ for datum in data:
9
+ if result:
10
+ for k, (t, v) in datum.items():
11
+ result[prefix + k][1].append(v)
12
+ else:
13
+ for k, (t, v) in datum.items():
14
+ result[prefix + k] = (t + '[]', [ v ])
15
+ offset += len(data)
16
+ offsets.append(offset)
17
+
18
+ result[prefix + 'Offsets'] = ('int[]', offsets)
19
+
20
+ return result, offset
21
+
22
+
@@ -1,12 +1,17 @@
1
1
  from snappy.snap import t3mlite as t3m
2
2
  from snappy.snap.mcomplex_base import *
3
- from snappy.SnapPy import matrix
4
3
 
5
4
  from .hyperboloid_utilities import *
6
5
 
6
+ from ..matrix import make_matrix
7
+
7
8
  __all__ = ['RaytracingData']
8
9
 
10
+
9
11
  class RaytracingData(McomplexEngine):
12
+ def is_valid(self):
13
+ return True
14
+
10
15
  def add_weights(self, weights):
11
16
  for tet in self.mcomplex.Tetrahedra:
12
17
  tet.Weights = {
@@ -15,18 +20,18 @@ class RaytracingData(McomplexEngine):
15
20
 
16
21
  def get_uniform_bindings(self):
17
22
  d = {}
18
- d['otherTetNums'] = (
23
+ d['TetrahedraCombinatorics.otherTetNums'] = (
19
24
  'int[]',
20
25
  [ tet.Neighbor[F].Index
21
26
  for tet in self.mcomplex.Tetrahedra
22
27
  for F in t3m.TwoSubsimplices ])
23
28
 
24
- d['otherFaceNums'] = (
29
+ d['TetrahedraCombinatorics.otherFaceNums'] = (
25
30
  'int[]',
26
31
  [ tet.Gluing[F][f]
27
32
  for tet in self.mcomplex.Tetrahedra
28
33
  for f, F in enumerate(t3m.TwoSubsimplices) ])
29
-
34
+
30
35
  d['TetrahedraBasics.SO13tsfms'] = (
31
36
  'mat4[]',
32
37
  [ tet.O13_matrices[F]
@@ -45,19 +50,19 @@ class RaytracingData(McomplexEngine):
45
50
  for tet in self.mcomplex.Tetrahedra
46
51
  for V in t3m.ZeroSubsimplices ])
47
52
 
48
- d['face_color_indices'] = (
53
+ d['Colors.face_color_indices'] = (
49
54
  'int[]',
50
55
  [ tet.Class[F].Index
51
56
  for tet in self.mcomplex.Tetrahedra
52
57
  for F in t3m.TwoSubsimplices ])
53
58
 
54
- d['edge_color_indices'] = (
59
+ d['Colors.edge_color_indices'] = (
55
60
  'int[]',
56
61
  [ tet.Class[E].Index
57
62
  for tet in self.mcomplex.Tetrahedra
58
63
  for E in t3m.OneSubsimplices ])
59
64
 
60
- d['vertex_color_indices'] = (
65
+ d['Colors.vertex_color_indices'] = (
61
66
  'int[]',
62
67
  [ tet.Class[V].Index
63
68
  for tet in self.mcomplex.Tetrahedra
@@ -70,7 +75,7 @@ class RaytracingData(McomplexEngine):
70
75
  for F in t3m.TwoSubsimplices ])
71
76
 
72
77
  return d
73
-
78
+
74
79
  def get_compile_time_constants(self):
75
80
  d = {}
76
81
  d[b'##num_tets##'] = len(self.mcomplex.Tetrahedra)
@@ -78,37 +83,44 @@ class RaytracingData(McomplexEngine):
78
83
  d[b'##num_edges##'] = len(self.mcomplex.Edges)
79
84
  return d
80
85
 
81
-
82
- def update_view_state(self, boost_tet_num_and_weight,
83
- m = matrix([[1.0, 0.0, 0.0, 0.0],
84
- [0.0, 1.0, 0.0, 0.0],
85
- [0.0, 0.0, 1.0, 0.0],
86
- [0.0, 0.0, 0.0, 1.0]])):
86
+ def update_view_state(self,
87
+ boost_tet_num_and_weight,
88
+ m=make_matrix([[1.0, 0.0, 0.0, 0.0],
89
+ [0.0, 1.0, 0.0, 0.0],
90
+ [0.0, 0.0, 1.0, 0.0],
91
+ [0.0, 0.0, 0.0, 1.0]])):
87
92
  boost, tet_num, weight = boost_tet_num_and_weight
88
93
 
89
- boost = matrix(boost, ring = self.RF)
90
- m = matrix(m, ring = self.RF)
94
+ boost = make_matrix(boost, ring=self.RF)
95
+ m = make_matrix(m, ring=self.RF)
96
+
97
+ boost, tet, weight = _graph_trace(
98
+ boost * m, self.mcomplex.Tetrahedra[tet_num], weight)
99
+
100
+ return boost, tet.Index, weight
101
+
102
+ def _graph_trace(boost, tet, weight):
103
+
104
+ boost = O13_orthonormalise(boost)
105
+
106
+ entry_face = 0
91
107
 
92
- boost = O13_orthonormalize(boost * m)
108
+ for i in range(100):
109
+ pos = boost.transpose()[0]
93
110
 
94
- entry_F = -1
111
+ signed_dist, face = max(
112
+ [ (r13_dot(pos, tet.R13_planes[face]), face)
113
+ for face in t3m.TwoSubsimplices ])
95
114
 
96
- for i in range(100):
97
- pos = boost.transpose()[0]
98
- tet = self.mcomplex.Tetrahedra[tet_num]
115
+ if face == entry_face:
116
+ break
117
+ if signed_dist < 0.0000001:
118
+ break
99
119
 
100
- amount, F = max(
101
- [ (R13_dot(pos, tet.R13_planes[F]), F)
102
- for F in t3m.TwoSubsimplices ])
120
+ boost = O13_orthonormalise(tet.O13_matrices[face] * boost)
121
+ weight += tet.Weights[face]
122
+ entry_face = tet.Gluing[face].image(face)
123
+ tet = tet.Neighbor[face]
103
124
 
104
- if F == entry_F:
105
- break
106
- if amount < 0.0000001:
107
- break
108
-
109
- boost = O13_orthonormalize(tet.O13_matrices[F] * boost)
110
- tet_num = tet.Neighbor[F].Index
111
- entry_F = tet.Gluing[F].image(F)
112
- weight += tet.Weights[F]
125
+ return boost, tet, weight
113
126
 
114
- return boost, tet_num, weight
@@ -1,54 +1,25 @@
1
- from __future__ import print_function
2
-
3
1
  from .hyperboloid_utilities import *
4
2
  from .ideal_raytracing_data import *
5
3
  from .finite_raytracing_data import *
6
4
  from .hyperboloid_navigation import *
5
+ from .geodesics import Geodesics
6
+ from .eyeball import Eyeball
7
+ from .eyeball import eyeball_type_none, eyeball_type_paper_plane
7
8
  from . import shaders
8
9
 
9
- from snappy.CyOpenGL import SimpleImageShaderWidget
10
+ from ..CyOpenGL import SimpleImageShaderWidget
10
11
 
11
- from snappy.SnapPy import vector, matrix
12
+ from ..matrix import make_vector, make_matrix
12
13
 
13
14
  import math
14
-
15
- # We could use
16
- #
17
- # from ..sage_helper import _within_sage
18
- #
19
- # but then dev/GLSLManifoldInsideView.py cannot be used for
20
- # debugging anymore.
21
-
22
- try:
23
- import sage.all
24
- _within_sage = True
25
- except:
26
- _within_sage = False
27
- import decorator
28
-
29
- if _within_sage:
30
- from sage.all import RealField, ComplexField
31
- RF = RealField()
32
- CF = ComplexField()
33
- else:
34
- from snappy.number import Number as RF
35
- from snappy.number import Number as CF
36
-
37
- __all__ = ['RaytracingView', 'NonorientableUnsupportedError']
38
-
39
- class NonorientableUnsupportedError(RuntimeError):
40
- def __init__(self, mfd):
41
- RuntimeError.__init__(
42
- self,
43
- ("Inside view for non-orientable manifolds such as %s is not "
44
- "supported yet.") % mfd.name())
15
+ __all__ = ['RaytracingView']
45
16
 
46
17
  _constant_uniform_bindings = {
47
18
  'multiScreenShot' : ('int', 0),
48
19
  'tile' : ('vec2', [0.0, 0.0]),
49
20
  'numTiles' : ('vec2', [1.0, 1.0]),
50
21
 
51
- 'gradientThreshholds' : ('float[]', [0.0, 0.25, 0.45, 0.75, 1.0]),
22
+ 'gradientThresholds' : ('float[]', [0.0, 0.25, 0.45, 0.75, 1.0]),
52
23
  'gradientColours' : ('vec3[]', [[1.0, 1.0, 1.0],
53
24
  [0.86, 0.92, 0.78],
54
25
  [0.25, 0.70, 0.83],
@@ -84,6 +55,7 @@ _max_linear_camera_speed = 2.0
84
55
  # here.
85
56
  _max_depth_for_orbiting = 0.9998
86
57
 
58
+
87
59
  class RaytracingView(SimpleImageShaderWidget, HyperboloidNavigation):
88
60
  def __init__(self,
89
61
  trig_type,
@@ -91,10 +63,17 @@ class RaytracingView(SimpleImageShaderWidget, HyperboloidNavigation):
91
63
  weights, # Weights for tet faces
92
64
  cohomology_basis, # Each entry are weights for the tet faces
93
65
  cohomology_class, # Number for each entry in basis specifying superposition
94
- master,
66
+ geodesics,
67
+ container,
95
68
  *args,
96
69
  **kwargs):
97
70
 
71
+ SimpleImageShaderWidget.__init__(
72
+ self, container,
73
+ *args, **kwargs)
74
+
75
+ self.set_textures(shaders.get_texture_paths())
76
+
98
77
  self.trig_type = trig_type
99
78
 
100
79
  # The view can be driven in two modes:
@@ -111,11 +90,9 @@ class RaytracingView(SimpleImageShaderWidget, HyperboloidNavigation):
111
90
  has_weights = bool(weights or cohomology_class)
112
91
 
113
92
  self.ui_uniform_dict = {
114
- 'maxSteps' : ['int', 99 if has_weights else 20],
93
+ 'maxSteps' : ['int', 99 if has_weights else 40],
115
94
  'maxDist' : ['float', 6.5 if has_weights else 17.0],
116
95
  'subpixelCount': ['int', 1],
117
- 'fov': ['float', 90],
118
- 'edgeThickness' : ['float', 0.0000001],
119
96
 
120
97
  'contrast' : ['float', 0.1 if has_weights else 0.5],
121
98
  'noGradient' : ['bool', False],
@@ -124,16 +101,25 @@ class RaytracingView(SimpleImageShaderWidget, HyperboloidNavigation):
124
101
  'lightFalloff' : ['float', 1.65],
125
102
  'brightness' : ['float', 1.9],
126
103
 
127
- 'showElevation' : ['bool', False]
104
+ 'showElevation' : ['bool', False],
105
+ 'desaturate_edges' : ['bool', False],
106
+ 'viewScale' : ['float', 1.0],
107
+ 'perspectiveType' : ['int', 0],
108
+ 'crosshairs' : ['bool', False]
128
109
  }
129
110
 
130
111
  self.ui_parameter_dict = {
131
- 'insphere_scale' : ['float', 0.0 if has_weights else 0.05],
112
+ 'insphere_scale' : ['float', 0.0 ],
132
113
  'cuspAreas' : ['float[]', manifold.num_cusps() * [ 0.0 if has_weights else 1.0 ]],
114
+ 'edgeThickness' : ['float', 0.0],
133
115
  'edgeTubeRadius' : ['float', 0.0 if has_weights else
134
- (0.05 if trig_type == 'finite' else 0.08)],
116
+ (0.025 if trig_type == 'finite' else 0.0)],
135
117
  'vertexRadius' : ['float', 0.0 if has_weights else 0.25],
136
- 'perspectiveType' : ['bool', False]
118
+ 'geodesicTubeRadii' : ['float[]', []],
119
+ 'geodesicTubeEnables' : ['bool[]', []],
120
+ 'eyeballSize' : ['float', 0.5],
121
+ 'freezeEyeball' : ['bool', False],
122
+ 'eyeballType' : ['int', eyeball_type_none if has_weights else eyeball_type_paper_plane]
137
123
  }
138
124
 
139
125
  if cohomology_class:
@@ -147,21 +133,26 @@ class RaytracingView(SimpleImageShaderWidget, HyperboloidNavigation):
147
133
  raise Exception(
148
134
  "Expected cohomology_class when given cohomology_basis")
149
135
 
136
+ self.compile_time_constants = {}
137
+ self.compile_time_defs = {}
138
+
150
139
  self.manifold = manifold
151
140
 
141
+ self.additional_structures = {}
142
+
152
143
  self._unguarded_initialize_raytracing_data()
153
144
 
154
- self.num_tets = len(self.raytracing_data.mcomplex.Tetrahedra)
145
+ if self.trig_type == 'ideal':
146
+ self.additional_structures['geodesics'] = (
147
+ Geodesics(manifold, geodesics))
148
+ self.resize_geodesic_params(enable=True)
149
+ self._update_geodesic_data()
155
150
 
156
- shader_source, uniform_block_names_sizes_and_offsets = (
157
- shaders.get_triangulation_shader_source_and_ubo_descriptors(
158
- self.raytracing_data.get_compile_time_constants()))
151
+ self.geodesics_disabled_edges = False
152
+ if geodesics:
153
+ self.disable_edges_for_geodesics()
159
154
 
160
- SimpleImageShaderWidget.__init__(
161
- self, master,
162
- shader_source,
163
- uniform_block_names_sizes_and_offsets,
164
- *args, **kwargs)
155
+ self._update_shader()
165
156
 
166
157
  # Use distance view for now
167
158
  self.view = 1
@@ -170,12 +161,22 @@ class RaytracingView(SimpleImageShaderWidget, HyperboloidNavigation):
170
161
 
171
162
  HyperboloidNavigation.__init__(self)
172
163
 
164
+ def reset_geodesics(self):
165
+ self.geodesics = Geodesics(self.manifold, [])
166
+ self.ui_parameter_dict['geodesicTubeRadii'][1] = []
167
+ self.ui_parameter_dict['geodesicTubeEnables'][1] = []
168
+ self._update_geodesic_data()
169
+
173
170
  def get_uniform_bindings(self, width, height):
174
171
  boost, tet_num, current_weight = self.view_state
175
172
 
176
173
  result = _merge_dicts(
177
174
  _constant_uniform_bindings,
178
175
  self.manifold_uniform_bindings,
176
+ _merge_dicts(
177
+ *(additional_structure.get_uniform_bindings()
178
+ for additional_structure
179
+ in self.additional_structures.values())),
179
180
  {
180
181
  'currentWeight' : ('float', current_weight),
181
182
  'screenResolution' : ('vec2', [width, height]),
@@ -183,11 +184,11 @@ class RaytracingView(SimpleImageShaderWidget, HyperboloidNavigation):
183
184
  'currentTetIndex' : ('int', tet_num),
184
185
  'viewMode' : ('int', self.view),
185
186
  'edgeTubeRadiusParam' :
186
- ('float', math.cosh(self.ui_parameter_dict['edgeTubeRadius'][1] / 2.0) ** 2 / 2.0),
187
+ ('float', math.cosh(self.ui_parameter_dict['edgeTubeRadius'][1]) ** 2 / 2.0),
188
+ 'edgeThicknessParam' :
189
+ ('float', math.sinh(self.ui_parameter_dict['edgeThickness'][1]) ** 2),
187
190
  'vertexSphereRadiusParam' :
188
- ('float', math.cosh(self.ui_parameter_dict['vertexRadius'][1])),
189
- 'perspectiveType' :
190
- ('int', int(self.ui_parameter_dict['perspectiveType'][1]))
191
+ ('float', math.cosh(self.ui_parameter_dict['vertexRadius'][1]) ** 2)
191
192
  },
192
193
  self.ui_uniform_dict
193
194
  )
@@ -197,15 +198,7 @@ class RaytracingView(SimpleImageShaderWidget, HyperboloidNavigation):
197
198
  return result
198
199
 
199
200
  def _initialize_raytracing_data(self):
200
- if self.manifold.solution_type() in [
201
- 'all tetrahedra positively oriented',
202
- 'contains negatively oriented tetrahedra' ]:
203
- self._unguarded_initialize_raytracing_data()
204
- else:
205
- try:
206
- self._unguarded_initialize_raytracing_data()
207
- except:
208
- pass
201
+ self._unguarded_initialize_raytracing_data()
209
202
 
210
203
  def _unguarded_initialize_raytracing_data(self):
211
204
  weights = self.weights
@@ -220,71 +213,94 @@ class RaytracingView(SimpleImageShaderWidget, HyperboloidNavigation):
220
213
  if self.trig_type == 'finite':
221
214
  self.raytracing_data = FiniteRaytracingData.from_triangulation(
222
215
  self.manifold,
223
- weights = weights)
216
+ weights=weights)
224
217
  else:
225
218
  self.raytracing_data = IdealRaytracingData.from_manifold(
226
219
  self.manifold,
227
- areas = self.ui_parameter_dict['cuspAreas'][1],
228
- insphere_scale = self.ui_parameter_dict['insphere_scale'][1],
229
- weights = weights)
230
-
220
+ areas=self.ui_parameter_dict['cuspAreas'][1],
221
+ insphere_scale=self.ui_parameter_dict['insphere_scale'][1],
222
+ weights=weights)
223
+ if self.raytracing_data.is_valid():
224
+ self.additional_structures['eyeball'] = (
225
+ Eyeball(self))
226
+ else:
227
+ if 'eyeball' in self.additional_structures:
228
+ del self.additional_structures['eyeball']
229
+
231
230
  self.manifold_uniform_bindings = (
232
231
  self.raytracing_data.get_uniform_bindings())
233
232
 
233
+ def update_shader_and_redraw(self):
234
+ self._update_shader()
235
+ self.draw()
236
+
234
237
  def recompute_raytracing_data_and_redraw(self):
235
238
  self._initialize_raytracing_data()
236
239
  self.fix_view_state()
237
- self.redraw_if_initialized()
240
+ self.draw()
241
+
242
+ def recompute_raytracing_data_update_shader_and_redraw(self):
243
+ self._initialize_raytracing_data()
244
+ self._update_shader()
245
+ self.fix_view_state()
246
+ self.draw()
238
247
 
239
248
  def compute_translation_and_inverse_from_pick_point(
240
249
  self, size, frag_coord, depth):
241
250
 
251
+ RF = self.raytracing_data.RF
252
+
242
253
  # Depth value emitted by shader is tanh(distance from camera)
243
254
 
244
255
  # Limit the maximal depth for orbiting to avoid numeric issues
245
256
  depth = min(depth, _max_depth_for_orbiting)
246
257
 
247
- fov = self.ui_uniform_dict['fov'][1]
248
- isIdeal = self.ui_parameter_dict['perspectiveType'][1]
258
+ view_scale = self.ui_uniform_dict['viewScale'][1]
259
+ perspective_type = self.ui_uniform_dict['perspectiveType'][1]
249
260
 
250
261
  # Reimplement functionality from fragment shader
251
262
 
252
- # See get_ray_eye_space
253
- fov_scale = 2.0 * math.tan(fov / 360.0 * math.pi)
254
-
255
263
  # Reimplement computation of xy from fragment coordinate
256
- x = (frag_coord[0] - 0.5 * size[0]) / size[0]
257
- y = (frag_coord[1] - 0.5 * size[1]) / size[0]
264
+ x = (frag_coord[0] - 0.5 * size[0]) / min(size[0], size[1])
265
+ y = (frag_coord[1] - 0.5 * size[1]) / min(size[0], size[1])
258
266
 
259
267
  # Reimplement get_ray_eye_space to determine end point of
260
268
  # ray. The end point is encoded as pair distance to origin
261
269
  # direction to origin.
262
- if isIdeal:
263
- scaled_x = 0.5 * fov_scale * x
264
- scaled_y = 0.5 * fov_scale * y
265
-
266
- # Use "parabolic transformation magic by Saul"
267
- # to determine the start point and direction of ray.
268
- # Then compute end point using depth value.
269
- foo = 0.5 * (scaled_x * scaled_x + scaled_y * scaled_y)
270
- rayEnd = R13_normalise(
271
- vector([RF((foo + 1.0) + depth * foo),
272
- RF( scaled_x + depth * scaled_x),
273
- RF( scaled_y + depth * scaled_y),
274
- RF( foo + depth * (foo - 1.0))]))
275
-
276
- # Distance of rayEnd from origin
277
- dist = math.acosh(rayEnd[0])
278
- # Direction from origin to rayEnd
279
- dir = vector([rayEnd[1], rayEnd[2], rayEnd[3]])
280
- else:
281
- scaled_x = fov_scale * x
282
- scaled_y = fov_scale * y
270
+ if perspective_type == 0:
271
+ scaled_x = 2.0 * view_scale * x
272
+ scaled_y = 2.0 * view_scale * y
283
273
 
284
274
  # Camera is assumed to be at origin.
285
- dist = math.atanh(depth)
275
+ dist = RF(depth).arctanh()
286
276
  # Reimplemented from get_ray_eye_space
287
- dir = vector([RF(scaled_x), RF(scaled_y), RF(-1.0)])
277
+ dir = make_vector([RF(scaled_x), RF(scaled_y), RF(-1)])
278
+
279
+ else:
280
+ if perspective_type == 1:
281
+ scaled_x = view_scale * x
282
+ scaled_y = view_scale * y
283
+
284
+ # Use "parabolic transformation magic by Saul"
285
+ # to determine the start point and direction of ray.
286
+ # Then compute end point using depth value.
287
+ r2 = 0.5 * (scaled_x * scaled_x + scaled_y * scaled_y)
288
+ ray_end = make_vector(
289
+ [RF((r2 + 1.0) + depth * r2),
290
+ RF( scaled_x + depth * scaled_x),
291
+ RF( scaled_y + depth * scaled_y),
292
+ RF( r2 + depth * (r2 - 1.0))])
293
+ else:
294
+ pt = R13_normalise(
295
+ make_vector([RF(1.0), RF(2.0 * x), RF(2.0 * y), RF(0.0)]))
296
+ ray_end = make_vector([pt[0],pt[1],pt[2],RF(-depth)])
297
+
298
+ ray_end = R13_normalise(ray_end)
299
+
300
+ # Distance of ray_end from origin
301
+ dist = ray_end[0].arccosh()
302
+ # Direction from origin to ray_end
303
+ dir = make_vector([ray_end[1], ray_end[2], ray_end[3]])
288
304
 
289
305
  # Normalize direction
290
306
  dir = dir.normalized()
@@ -293,7 +309,7 @@ class RaytracingView(SimpleImageShaderWidget, HyperboloidNavigation):
293
309
  #
294
310
  # Do this by using a concentric circle in the Poincare disk
295
311
  # model
296
- poincare_dist = math.tanh(dist / 2.0)
312
+ poincare_dist = (dist / 2).tanh()
297
313
  hyp_circumference_up_to_constant = (
298
314
  poincare_dist / (1.0 - poincare_dist * poincare_dist))
299
315
 
@@ -310,12 +326,73 @@ class RaytracingView(SimpleImageShaderWidget, HyperboloidNavigation):
310
326
  dir, -dist),
311
327
  speed)
312
328
 
329
+ def resize_geodesic_params(self, enable=False):
330
+ num = (len(self.additional_structures['geodesics'].geodesic_tube_infos) -
331
+ len(self.ui_parameter_dict['geodesicTubeRadii'][1]))
332
+ self.ui_parameter_dict['geodesicTubeRadii'][1] += num * [ 0.02 ]
333
+ self.ui_parameter_dict['geodesicTubeEnables'][1] += num * [ enable ]
334
+
335
+ def enable_geodesic(self, index):
336
+ self.ui_parameter_dict['geodesicTubeEnables'][1][index] = True
337
+
338
+ def _update_geodesic_data(self):
339
+ return self.additional_structures['geodesics'].set_enables_and_radii_and_update(
340
+ self.ui_parameter_dict['geodesicTubeEnables'][1],
341
+ self.ui_parameter_dict['geodesicTubeRadii'][1])
342
+
343
+ def update_geodesic_data_and_redraw(self):
344
+ success = self._update_geodesic_data()
345
+ self._update_shader()
346
+ self.draw()
347
+ return success
348
+
349
+ def disable_edges_for_geodesics(self):
350
+ # Only do once
351
+ if self.geodesics_disabled_edges:
352
+ return False
353
+
354
+ self.geodesics_disabled_edges = True
355
+
356
+ self.ui_uniform_dict['desaturate_edges'][1] = True
357
+ self.ui_parameter_dict['edgeTubeRadius'][1] = 0.0
358
+ self.ui_parameter_dict['insphere_scale'][1] = 0.0
359
+
360
+ self._initialize_raytracing_data()
361
+
362
+ return True
363
+
364
+ def _update_shader(self):
365
+ compile_time_defs = _merge_dicts(
366
+ *(additional_structure.get_compile_time_defs()
367
+ for additional_structure
368
+ in self.additional_structures.values()))
369
+
370
+ compile_time_constants = (
371
+ self.raytracing_data.get_compile_time_constants())
372
+
373
+ if (compile_time_constants == self.compile_time_constants and
374
+ compile_time_defs == self.compile_time_defs):
375
+ return
376
+
377
+ self.compile_time_constants = compile_time_constants
378
+ self.compile_time_defs = compile_time_defs
379
+
380
+ shader_source, uniform_block_names_sizes_and_offsets = (
381
+ shaders.get_triangulation_shader_source_and_ubo_descriptors(
382
+ compile_time_constants,
383
+ compile_time_defs))
384
+
385
+ self.set_fragment_shader_source(
386
+ shader_source,
387
+ uniform_block_names_sizes_and_offsets)
388
+
313
389
  def _merge_dicts(*dicts):
314
390
  return { k : v for d in dicts for k, v in d.items() }
315
391
 
316
392
  ##########################################################################
317
393
  # Consistency checks
318
394
 
395
+
319
396
  def _check_matrices_equal(m1, m2):
320
397
  for i in range(4):
321
398
  for j in range(4):
@@ -324,24 +401,28 @@ def _check_matrices_equal(m1, m2):
324
401
  print("Matrix not zero as expected")
325
402
  return
326
403
 
404
+
327
405
  def _check_matrix_o13(m):
328
- s = matrix([[-1, 0,0,0],
329
- [0, 1, 0, 0],
330
- [0, 0, 1, 0],
331
- [0, 0, 0, 1]])
406
+ s = make_matrix([[-1, 0,0,0],
407
+ [0, 1, 0, 0],
408
+ [0, 0, 1, 0],
409
+ [0, 0, 0, 1]])
332
410
 
333
411
  _check_matrices_equal(s, m * s * m.transpose())
334
412
 
413
+
335
414
  def _matrix4_vec(m, p):
336
415
  return [sum([ m[i][j] * p[j] for j in range(4)])
337
416
  for i in range(4) ]
338
417
 
339
- def _diff(v1, v2, label = ''):
418
+
419
+ def _diff(v1, v2, label=''):
340
420
  a = sum([(x - y)**2 for x, y in zip(v1, v2) ])
341
421
 
342
422
  if a > 1e-10:
343
423
  print("DIFF!!!", label, v1, v2)
344
424
 
425
+
345
426
  def _check_consistency(d):
346
427
  planes = d['TetrahedraBasics.planes'][1]
347
428
  otherTetNums = d['otherTetNums'][1]
@@ -358,7 +439,7 @@ def _check_consistency(d):
358
439
  # print("Bad plane equation")
359
440
 
360
441
  for i in range(len(planes)):
361
- if abs(R13_dot(planes[i], planes[i]) - 1) > 1e-10:
442
+ if abs(r13_dot(planes[i], planes[i]) - 1) > 1e-10:
362
443
  print("Plane vec not normalized")
363
444
 
364
445
  plane = [-x for x in planes[i]]
Binary file