pytensor 2.31.6__tar.gz → 2.32.0__tar.gz

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 (491) hide show
  1. {pytensor-2.31.6/pytensor.egg-info → pytensor-2.32.0}/PKG-INFO +1 -3
  2. {pytensor-2.31.6 → pytensor-2.32.0}/doc/conf.py +24 -6
  3. {pytensor-2.31.6 → pytensor-2.32.0}/doc/environment.yml +2 -1
  4. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/index.rst +1 -3
  5. pytensor-2.32.0/doc/library/xtensor/index.md +101 -0
  6. pytensor-2.32.0/doc/library/xtensor/linalg.md +7 -0
  7. pytensor-2.32.0/doc/library/xtensor/math.md +8 -0
  8. pytensor-2.32.0/doc/library/xtensor/module_functions.md +7 -0
  9. pytensor-2.32.0/doc/library/xtensor/random.md +7 -0
  10. pytensor-2.32.0/doc/library/xtensor/type.md +20 -0
  11. {pytensor-2.31.6 → pytensor-2.32.0}/pyproject.toml +1 -1
  12. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/_version.py +3 -3
  13. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/rewriting/basic.py +21 -10
  14. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/basic.py +8 -4
  15. pytensor-2.32.0/pytensor/link/jax/dispatch/blockwise.py +21 -0
  16. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -11
  17. pytensor-2.32.0/pytensor/link/jax/dispatch/signal/conv.py +24 -0
  18. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/slinalg.py +11 -0
  19. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/basic.py +9 -11
  20. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/blockwise.py +3 -2
  21. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +87 -1
  22. pytensor-2.32.0/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +880 -0
  23. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/nlinalg.py +0 -36
  24. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/scalar.py +60 -70
  25. pytensor-2.32.0/pytensor/link/numba/dispatch/signal/conv.py +69 -0
  26. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/slinalg.py +104 -1
  27. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/__init__.py +1 -0
  28. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/basic.py +10 -1
  29. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -16
  30. pytensor-2.32.0/pytensor/link/pytorch/dispatch/slinalg.py +23 -0
  31. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/printing.py +12 -36
  32. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/raise_op.py +24 -53
  33. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/math.py +42 -32
  34. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/__init__.py +0 -1
  35. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/basic.py +16 -6
  36. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/blas.py +14 -22
  37. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/blockwise.py +96 -29
  38. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/extra_ops.py +38 -1
  39. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/math.py +66 -137
  40. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/nlinalg.py +0 -171
  41. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/__init__.py +0 -2
  42. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/basic.py +11 -9
  43. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/blas.py +80 -95
  44. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/blockwise.py +1 -12
  45. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/elemwise.py +33 -62
  46. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/linalg.py +4 -13
  47. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/math.py +270 -138
  48. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/subtensor.py +108 -64
  49. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/subtensor_lift.py +115 -46
  50. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/signal/conv.py +54 -56
  51. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/slinalg.py +389 -4
  52. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/subtensor.py +6 -2
  53. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/__init__.py +2 -2
  54. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/linalg.py +40 -2
  55. pytensor-2.32.0/pytensor/xtensor/math.py +627 -0
  56. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/random.py +148 -35
  57. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/reduction.py +2 -2
  58. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/shape.py +2 -23
  59. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/shape.py +127 -0
  60. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/type.py +195 -29
  61. {pytensor-2.31.6 → pytensor-2.32.0/pytensor.egg-info}/PKG-INFO +1 -3
  62. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor.egg-info/SOURCES.txt +8 -3
  63. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor.egg-info/requires.txt +0 -2
  64. {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_gradient.py +19 -1
  65. {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_printing.py +4 -4
  66. {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_raise_op.py +12 -5
  67. pytensor-2.31.6/pytensor/link/jax/dispatch/blockwise.py +0 -29
  68. pytensor-2.31.6/pytensor/link/jax/dispatch/signal/conv.py +0 -14
  69. pytensor-2.31.6/pytensor/link/numba/dispatch/signal/conv.py +0 -70
  70. pytensor-2.31.6/pytensor/tensor/blas_scipy.py +0 -34
  71. pytensor-2.31.6/pytensor/tensor/rewriting/blas_scipy.py +0 -37
  72. pytensor-2.31.6/pytensor/tensor/rewriting/conv.py +0 -78
  73. pytensor-2.31.6/pytensor/xtensor/math.py +0 -252
  74. {pytensor-2.31.6 → pytensor-2.32.0}/LICENSE.txt +0 -0
  75. {pytensor-2.31.6 → pytensor-2.32.0}/MANIFEST.in +0 -0
  76. {pytensor-2.31.6 → pytensor-2.32.0}/README.rst +0 -0
  77. {pytensor-2.31.6 → pytensor-2.32.0}/doc/.templates/PLACEHOLDER +0 -0
  78. {pytensor-2.31.6 → pytensor-2.32.0}/doc/.templates/layout.html +0 -0
  79. {pytensor-2.31.6 → pytensor-2.32.0}/doc/.templates/nb-badges.html +0 -0
  80. {pytensor-2.31.6 → pytensor-2.32.0}/doc/.templates/rendered_citation.html +0 -0
  81. {pytensor-2.31.6 → pytensor-2.32.0}/doc/LICENSE.txt +0 -0
  82. {pytensor-2.31.6 → pytensor-2.32.0}/doc/README.md +0 -0
  83. {pytensor-2.31.6 → pytensor-2.32.0}/doc/acknowledgement.rst +0 -0
  84. {pytensor-2.31.6 → pytensor-2.32.0}/doc/bcast.png +0 -0
  85. {pytensor-2.31.6 → pytensor-2.32.0}/doc/bcast.svg +0 -0
  86. {pytensor-2.31.6 → pytensor-2.32.0}/doc/blog.md +0 -0
  87. {pytensor-2.31.6 → pytensor-2.32.0}/doc/core_development_guide.rst +0 -0
  88. {pytensor-2.31.6 → pytensor-2.32.0}/doc/css.inc +0 -0
  89. {pytensor-2.31.6 → pytensor-2.32.0}/doc/dev_start_guide.rst +0 -0
  90. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/apply.png +0 -0
  91. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/apply.svg +0 -0
  92. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/apply2.svg +0 -0
  93. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/creating_a_c_op.rst +0 -0
  94. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  95. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/creating_an_op.rst +0 -0
  96. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/ctype.rst +0 -0
  97. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/extending_faq.rst +0 -0
  98. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
  99. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/graph_rewriting.rst +0 -0
  100. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/graphstructures.rst +0 -0
  101. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/index.rst +0 -0
  102. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/inplace.rst +0 -0
  103. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/op.rst +0 -0
  104. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/other_ops.rst +0 -0
  105. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  106. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  107. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/pipeline.rst +0 -0
  108. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/scan.rst +0 -0
  109. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/tips.rst +0 -0
  110. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/type.rst +0 -0
  111. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/unittest.rst +0 -0
  112. {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/using_params.rst +0 -0
  113. {pytensor-2.31.6 → pytensor-2.32.0}/doc/faq.rst +0 -0
  114. {pytensor-2.31.6 → pytensor-2.32.0}/doc/gallery/optimize/root.ipynb +0 -0
  115. {pytensor-2.31.6 → pytensor-2.32.0}/doc/gallery/page_footer.md +0 -0
  116. {pytensor-2.31.6 → pytensor-2.32.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  117. {pytensor-2.31.6 → pytensor-2.32.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  118. {pytensor-2.31.6 → pytensor-2.32.0}/doc/generate_dtype_tensor_table.py +0 -0
  119. {pytensor-2.31.6 → pytensor-2.32.0}/doc/glossary.rst +0 -0
  120. {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/Elman_srnn.png +0 -0
  121. {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/PyTensor.png +0 -0
  122. {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/PyTensor_RGB.svg +0 -0
  123. {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/PyTensor_logo.png +0 -0
  124. {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/binder.svg +0 -0
  125. {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/blocksparse.png +0 -0
  126. {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/colab.svg +0 -0
  127. {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/github.svg +0 -0
  128. {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/lstm.png +0 -0
  129. {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/lstm_memorycell.png +0 -0
  130. {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/talk2010.gif +0 -0
  131. {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/talk2010.png +0 -0
  132. {pytensor-2.31.6 → pytensor-2.32.0}/doc/index.rst +0 -0
  133. {pytensor-2.31.6 → pytensor-2.32.0}/doc/install.rst +0 -0
  134. {pytensor-2.31.6 → pytensor-2.32.0}/doc/internal/how_to_release.rst +0 -0
  135. {pytensor-2.31.6 → pytensor-2.32.0}/doc/internal/index.rst +0 -0
  136. {pytensor-2.31.6 → pytensor-2.32.0}/doc/internal/metadocumentation.rst +0 -0
  137. {pytensor-2.31.6 → pytensor-2.32.0}/doc/introduction.rst +0 -0
  138. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/debugmode.rst +0 -0
  139. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/function.rst +0 -0
  140. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/index.rst +0 -0
  141. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/io.rst +0 -0
  142. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/mode.rst +0 -0
  143. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/nanguardmode.rst +0 -0
  144. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/opfromgraph.rst +0 -0
  145. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/ops.rst +0 -0
  146. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/profilemode.rst +0 -0
  147. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/shared.rst +0 -0
  148. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/config.rst +0 -0
  149. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  150. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  151. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  152. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  153. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  154. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  155. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  156. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/mlp.html +0 -0
  157. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/mlp.png +0 -0
  158. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/mlp2.html +0 -0
  159. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  160. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/mlp2.png +0 -0
  161. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/ofg.html +0 -0
  162. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/ofg2.html +0 -0
  163. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/index.ipynb +0 -0
  164. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/index.rst +0 -0
  165. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  166. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  167. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  168. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  169. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/features.rst +0 -0
  170. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/fgraph.rst +0 -0
  171. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/graph.rst +0 -0
  172. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/index.rst +0 -0
  173. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/op.rst +0 -0
  174. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/replace.rst +0 -0
  175. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/type.rst +0 -0
  176. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/utils.rst +0 -0
  177. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/misc/pkl_utils.rst +0 -0
  178. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/printing.rst +0 -0
  179. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/scalar/index.rst +0 -0
  180. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/scan.rst +0 -0
  181. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/sparse/index.rst +0 -0
  182. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/sparse/sandbox.rst +0 -0
  183. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/basic.rst +0 -0
  184. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/basic_opt.rst +0 -0
  185. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/bcast.png +0 -0
  186. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/bcast.svg +0 -0
  187. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/conv.rst +0 -0
  188. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/elemwise.rst +0 -0
  189. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/extra_ops.rst +0 -0
  190. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/fft.rst +0 -0
  191. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/functional.rst +0 -0
  192. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/index.rst +0 -0
  193. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/io.rst +0 -0
  194. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/math_opt.rst +0 -0
  195. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/nlinalg.rst +0 -0
  196. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/optimize.rst +0 -0
  197. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/plot_fft.png +0 -0
  198. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/random/distributions.rst +0 -0
  199. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/random/index.rst +0 -0
  200. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/slinalg.rst +0 -0
  201. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/utils.rst +0 -0
  202. {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/typed_list.rst +0 -0
  203. {pytensor-2.31.6 → pytensor-2.32.0}/doc/links.rst +0 -0
  204. {pytensor-2.31.6 → pytensor-2.32.0}/doc/optimizations.rst +0 -0
  205. {pytensor-2.31.6 → pytensor-2.32.0}/doc/pylintrc +0 -0
  206. {pytensor-2.31.6 → pytensor-2.32.0}/doc/robots.txt +0 -0
  207. {pytensor-2.31.6 → pytensor-2.32.0}/doc/troubleshooting.rst +0 -0
  208. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/adding.rst +0 -0
  209. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/adding_solution_1.py +0 -0
  210. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/aliasing.rst +0 -0
  211. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/apply.png +0 -0
  212. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/apply.svg +0 -0
  213. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/bcast.png +0 -0
  214. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/broadcasting.rst +0 -0
  215. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/conditions.rst +0 -0
  216. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/debug_faq.rst +0 -0
  217. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/dlogistic.png +0 -0
  218. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/examples.rst +0 -0
  219. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/faq_tutorial.rst +0 -0
  220. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/gradients.rst +0 -0
  221. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/index.rst +0 -0
  222. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/loading_and_saving.rst +0 -0
  223. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/logistic.gp +0 -0
  224. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/logistic.png +0 -0
  225. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/loop.rst +0 -0
  226. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/loop_solution_1.py +0 -0
  227. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/modes.rst +0 -0
  228. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/modes_solution_1.py +0 -0
  229. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/multi_cores.rst +0 -0
  230. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/nan_tutorial.rst +0 -0
  231. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/pics/d3viz.png +0 -0
  232. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  233. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  234. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  235. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/printing_drawing.rst +0 -0
  236. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/prng.rst +0 -0
  237. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/profiling.rst +0 -0
  238. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/profiling_example.py +0 -0
  239. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/profiling_example_out.prof +0 -0
  240. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/shape_info.rst +0 -0
  241. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/sparse.rst +0 -0
  242. {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/symbolic_graphs.rst +0 -0
  243. {pytensor-2.31.6 → pytensor-2.32.0}/doc/user_guide.rst +0 -0
  244. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/__init__.py +0 -0
  245. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/bin/__init__.py +0 -0
  246. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/bin/pytensor_cache.py +0 -0
  247. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/breakpoint.py +0 -0
  248. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/__init__.py +0 -0
  249. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/builders.py +0 -0
  250. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/compiledir.py +0 -0
  251. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/compilelock.py +0 -0
  252. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/debugmode.py +0 -0
  253. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/function/__init__.py +0 -0
  254. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/function/pfunc.py +0 -0
  255. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/function/types.py +0 -0
  256. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/io.py +0 -0
  257. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/mode.py +0 -0
  258. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/monitormode.py +0 -0
  259. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/nanguardmode.py +0 -0
  260. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/ops.py +0 -0
  261. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/profiling.py +0 -0
  262. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/sharedvalue.py +0 -0
  263. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/configdefaults.py +0 -0
  264. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/configparser.py +0 -0
  265. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/__init__.py +0 -0
  266. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  267. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/css/d3viz.css +0 -0
  268. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/d3viz.py +0 -0
  269. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/formatting.py +0 -0
  270. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/html/template.html +0 -0
  271. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  272. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  273. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/js/d3viz.js +0 -0
  274. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  275. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  276. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/gradient.py +0 -0
  277. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/__init__.py +0 -0
  278. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/basic.py +0 -0
  279. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/destroyhandler.py +0 -0
  280. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/features.py +0 -0
  281. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/fg.py +0 -0
  282. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/null_type.py +0 -0
  283. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/op.py +0 -0
  284. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/replace.py +0 -0
  285. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/rewriting/__init__.py +0 -0
  286. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/rewriting/db.py +0 -0
  287. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/rewriting/kanren.py +0 -0
  288. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/rewriting/unify.py +0 -0
  289. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/rewriting/utils.py +0 -0
  290. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/type.py +0 -0
  291. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/utils.py +0 -0
  292. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/ifelse.py +0 -0
  293. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/ipython.py +0 -0
  294. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/__init__.py +0 -0
  295. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/basic.py +0 -0
  296. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/__init__.py +0 -0
  297. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/basic.py +0 -0
  298. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  299. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  300. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/cmodule.py +0 -0
  301. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/cutils.py +0 -0
  302. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/cvm.py +0 -0
  303. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/exceptions.py +0 -0
  304. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/interface.py +0 -0
  305. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/lazylinker_c.py +0 -0
  306. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/op.py +0 -0
  307. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/params_type.py +0 -0
  308. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/type.py +0 -0
  309. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/__init__.py +0 -0
  310. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/__init__.py +0 -0
  311. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/blas.py +0 -0
  312. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
  313. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  314. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  315. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/math.py +0 -0
  316. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/pad.py +0 -0
  317. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/random.py +0 -0
  318. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/scalar.py +0 -0
  319. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/scan.py +0 -0
  320. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/shape.py +0 -0
  321. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  322. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/sort.py +0 -0
  323. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
  324. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  325. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  326. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/linker.py +0 -0
  327. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/__init__.py +0 -0
  328. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/__init__.py +0 -0
  329. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  330. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/elemwise.py +0 -0
  331. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  332. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  333. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  334. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  335. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
  336. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  337. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
  338. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +0 -0
  339. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -0
  340. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +0 -0
  341. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -0
  342. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -0
  343. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +0 -0
  344. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +0 -0
  345. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +0 -0
  346. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
  347. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  348. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/random.py +0 -0
  349. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/scan.py +0 -0
  350. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  351. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/sparse.py +0 -0
  352. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  353. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  354. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  355. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/linker.py +0 -0
  356. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  357. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  358. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  359. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  360. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
  361. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  362. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  363. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  364. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  365. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/linker.py +0 -0
  366. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/utils.py +0 -0
  367. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/vm.py +0 -0
  368. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/__init__.py +0 -0
  369. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/check_blas.py +0 -0
  370. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/check_blas_many.sh +0 -0
  371. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/check_duplicate_key.py +0 -0
  372. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  373. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/elemwise_time_test.py +0 -0
  374. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/frozendict.py +0 -0
  375. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/may_share_memory.py +0 -0
  376. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/ordered_set.py +0 -0
  377. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/pkl_utils.py +0 -0
  378. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/npy_2_compat.py +0 -0
  379. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/py.typed +0 -0
  380. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/__init__.py +0 -0
  381. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/basic.py +0 -0
  382. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  383. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  384. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/c_code/gamma.c +0 -0
  385. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/c_code/incbet.c +0 -0
  386. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/loop.py +0 -0
  387. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/sharedvar.py +0 -0
  388. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/__init__.py +0 -0
  389. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/basic.py +0 -0
  390. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/checkpoints.py +0 -0
  391. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/op.py +0 -0
  392. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/rewriting.py +0 -0
  393. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/scan_perform.pyx +0 -0
  394. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/scan_perform_ext.py +0 -0
  395. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/utils.py +0 -0
  396. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/views.py +0 -0
  397. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/__init__.py +0 -0
  398. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/basic.py +0 -0
  399. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/rewriting.py +0 -0
  400. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/sandbox/__init__.py +0 -0
  401. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/sandbox/sp.py +0 -0
  402. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/sandbox/sp2.py +0 -0
  403. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/sharedvar.py +0 -0
  404. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/type.py +0 -0
  405. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/utils.py +0 -0
  406. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/_linalg/__init__.py +0 -0
  407. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
  408. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/_linalg/solve/rewriting.py +0 -0
  409. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/_linalg/solve/tridiagonal.py +0 -0
  410. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/blas_c.py +0 -0
  411. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/blas_headers.py +0 -0
  412. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  413. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  414. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  415. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/conv/__init__.py +0 -0
  416. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/conv/abstract_conv.py +0 -0
  417. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/einsum.py +0 -0
  418. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/elemwise.py +0 -0
  419. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/elemwise_cgen.py +0 -0
  420. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/exceptions.py +0 -0
  421. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/fft.py +0 -0
  422. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/fourier.py +0 -0
  423. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/functional.py +0 -0
  424. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/inplace.py +0 -0
  425. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/interpolate.py +0 -0
  426. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/io.py +0 -0
  427. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/linalg.py +0 -0
  428. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/optimize.py +0 -0
  429. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/pad.py +0 -0
  430. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/__init__.py +0 -0
  431. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/basic.py +0 -0
  432. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/op.py +0 -0
  433. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  434. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
  435. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
  436. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
  437. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/type.py +0 -0
  438. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/utils.py +0 -0
  439. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/var.py +0 -0
  440. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/blas_c.py +0 -0
  441. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/einsum.py +0 -0
  442. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  443. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/jax.py +0 -0
  444. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/numba.py +0 -0
  445. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/ofg.py +0 -0
  446. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/shape.py +0 -0
  447. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/special.py +0 -0
  448. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  449. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/shape.py +0 -0
  450. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/sharedvar.py +0 -0
  451. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/signal/__init__.py +0 -0
  452. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/sort.py +0 -0
  453. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/special.py +0 -0
  454. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/type.py +0 -0
  455. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/type_other.py +0 -0
  456. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/utils.py +0 -0
  457. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/var.py +0 -0
  458. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/variable.py +0 -0
  459. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/xlogx.py +0 -0
  460. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/typed_list/__init__.py +0 -0
  461. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/typed_list/basic.py +0 -0
  462. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/typed_list/rewriting.py +0 -0
  463. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/typed_list/type.py +0 -0
  464. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/updates.py +0 -0
  465. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/utils.py +0 -0
  466. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/basic.py +0 -0
  467. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/indexing.py +0 -0
  468. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/__init__.py +0 -0
  469. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/basic.py +0 -0
  470. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/indexing.py +0 -0
  471. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/math.py +0 -0
  472. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/reduction.py +0 -0
  473. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/utils.py +0 -0
  474. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  475. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/vectorization.py +0 -0
  476. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor.egg-info/dependency_links.txt +0 -0
  477. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor.egg-info/entry_points.txt +0 -0
  478. {pytensor-2.31.6 → pytensor-2.32.0}/pytensor.egg-info/top_level.txt +0 -0
  479. {pytensor-2.31.6 → pytensor-2.32.0}/scripts/mypy-failing.txt +0 -0
  480. {pytensor-2.31.6 → pytensor-2.32.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  481. {pytensor-2.31.6 → pytensor-2.32.0}/setup.cfg +0 -0
  482. {pytensor-2.31.6 → pytensor-2.32.0}/setup.py +0 -0
  483. {pytensor-2.31.6 → pytensor-2.32.0}/tests/link/c/c_code/test_cenum.h +0 -0
  484. {pytensor-2.31.6 → pytensor-2.32.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  485. {pytensor-2.31.6 → pytensor-2.32.0}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
  486. {pytensor-2.31.6 → pytensor-2.32.0}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
  487. {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_breakpoint.py +0 -0
  488. {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_config.py +0 -0
  489. {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_ifelse.py +0 -0
  490. {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_rop.py +0 -0
  491. {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_updates.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 2.31.6
3
+ Version: 2.32.0
4
4
  Summary: Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs.
5
5
  Author-email: pymc-devs <pymc.devs@gmail.com>
6
6
  License-Expression: BSD-3-Clause
@@ -55,8 +55,6 @@ Provides-Extra: rtd
55
55
  Requires-Dist: sphinx<6,>=5.1.0; extra == "rtd"
56
56
  Requires-Dist: pygments; extra == "rtd"
57
57
  Requires-Dist: pydot; extra == "rtd"
58
- Requires-Dist: pydot2; extra == "rtd"
59
- Requires-Dist: pydot-ng; extra == "rtd"
60
58
  Provides-Extra: jax
61
59
  Requires-Dist: jax; extra == "jax"
62
60
  Requires-Dist: jaxlib; extra == "jax"
@@ -1,6 +1,7 @@
1
1
  import os
2
2
  import inspect
3
3
  import sys
4
+
4
5
  import pytensor
5
6
  from pathlib import Path
6
7
 
@@ -12,6 +13,7 @@ extensions = [
12
13
  "sphinx.ext.autodoc",
13
14
  "sphinx.ext.todo",
14
15
  "sphinx.ext.doctest",
16
+ "sphinx_copybutton",
15
17
  "sphinx.ext.napoleon",
16
18
  "sphinx.ext.linkcode",
17
19
  "sphinx.ext.mathjax",
@@ -86,8 +88,7 @@ today_fmt = "%B %d, %Y"
86
88
 
87
89
  # List of directories, relative to source directories, that shouldn't be
88
90
  # searched for source files.
89
- exclude_dirs = ["images", "scripts", "sandbox"]
90
- exclude_patterns = ['page_footer.md', '**/*.myst.md']
91
+ exclude_patterns = ["README.md", "images/*", "page_footer.md", "**/*.myst.md"]
91
92
 
92
93
  # The reST default role (used for this markup: `text`) to use for all
93
94
  # documents.
@@ -235,24 +236,41 @@ htmlhelp_basename = "pytensor_doc"
235
236
  # Resolve function
236
237
  # This function is used to populate the (source) links in the API
237
238
  def linkcode_resolve(domain, info):
238
- def find_source():
239
+ def find_obj() -> object:
239
240
  # try to find the file and line number, based on code from numpy:
240
241
  # https://github.com/numpy/numpy/blob/master/doc/source/conf.py#L286
241
242
  obj = sys.modules[info["module"]]
242
243
  for part in info["fullname"].split("."):
243
244
  obj = getattr(obj, part)
245
+ return obj
244
246
 
247
+ def find_source(obj):
245
248
  fn = Path(inspect.getsourcefile(obj))
246
- fn = fn.relative_to(Path(__file__).parent)
249
+ fn = fn.relative_to(Path(pytensor.__file__).parent)
247
250
  source, lineno = inspect.getsourcelines(obj)
248
251
  return fn, lineno, lineno + len(source) - 1
249
252
 
253
+ def fallback_source():
254
+ return info["module"].replace(".", "/") + ".py"
255
+
250
256
  if domain != "py" or not info["module"]:
251
257
  return None
258
+
252
259
  try:
253
- filename = "pytensor/%s#L%d-L%d" % find_source()
260
+ obj = find_obj()
254
261
  except Exception:
255
- filename = info["module"].replace(".", "/") + ".py"
262
+ filename = fallback_source()
263
+ else:
264
+ try:
265
+ filename = "pytensor/%s#L%d-L%d" % find_source(obj)
266
+ except Exception:
267
+ # warnings.warn(f"Could not find source code for {domain}:{info}")
268
+ try:
269
+ filename = obj.__module__.replace(".", "/") + ".py"
270
+ except AttributeError:
271
+ # Some objects do not have a __module__ attribute (?)
272
+ filename = fallback_source()
273
+
256
274
  import subprocess
257
275
 
258
276
  tag = subprocess.Popen(
@@ -13,7 +13,9 @@ dependencies:
13
13
  - mock
14
14
  - pillow
15
15
  - pymc-sphinx-theme
16
+ - sphinx-copybutton
16
17
  - sphinx-design
18
+ - sphinx-sitemap
17
19
  - pygments
18
20
  - pydot
19
21
  - ipython
@@ -23,5 +25,4 @@ dependencies:
23
25
  - ablog
24
26
  - pip
25
27
  - pip:
26
- - sphinx_sitemap
27
28
  - -e ..
@@ -20,14 +20,12 @@ Modules
20
20
  d3viz/index
21
21
  graph/index
22
22
  gradient
23
- misc/pkl_utils
24
23
  printing
25
- scalar/index
26
24
  scan
27
25
  sparse/index
28
- sparse/sandbox
29
26
  tensor/index
30
27
  typed_list
28
+ xtensor/index
31
29
 
32
30
  .. module:: pytensor
33
31
  :platform: Unix, Windows
@@ -0,0 +1,101 @@
1
+ (libdoc_xtensor)=
2
+ # `xtensor` -- XTensor operations
3
+
4
+ This module implements as abstraction layer on regular tensor operations, that behaves like Xarray.
5
+
6
+ A new type {class}`pytensor.xtensor.type.XTensorType`, generalizes the {class}`pytensor.tensor.TensorType`
7
+ with the addition of a `dims` attribute, that labels the dimensions of the tensor.
8
+
9
+ Variables of XTensorType (i.e., {class}`pytensor.xtensor.type.XTensorVariable`s) are the symbolic counterpart
10
+ to xarray DataArray objects.
11
+
12
+ The module implements several PyTensor operations {class}`pytensor.xtensor.basic.XOp`s, whose signature mimics that of
13
+ xarray (and xarray_einstats) DataArray operations. These operations, unlike most regular PyTensor operations, cannot
14
+ be directly evaluated, but require a rewrite (lowering) into a regular tensor graph that can itself be evaluated as usual.
15
+
16
+ Like regular PyTensor, we don't need an Op for every possible method or function in the public API of xarray.
17
+ If the existing XOps can be composed to produce the desired result, then we can use them directly.
18
+
19
+ ## Coordinates
20
+ For now, there's no analogous of xarray coordinates, so you won't be able to do coordinate operations like `.sel`.
21
+ The graphs produced by an xarray program without coords are much more amenable to the numpy-like backend of PyTensor.
22
+ Coords involve aspects of Pandas/database query and joining that are not trivially expressible in PyTensor.
23
+
24
+ ## Example
25
+
26
+
27
+ ```{testcode}
28
+
29
+ import pytensor.tensor as pt
30
+ import pytensor.xtensor as ptx
31
+
32
+ a = pt.tensor("a", shape=(3,))
33
+ b = pt.tensor("b", shape=(4,))
34
+
35
+ ax = ptx.as_xtensor(a, dims=["x"])
36
+ bx = ptx.as_xtensor(b, dims=["y"])
37
+
38
+ zx = ax + bx
39
+ assert zx.type == ptx.type.XTensorType("float64", dims=["x", "y"], shape=(3, 4))
40
+
41
+ z = zx.values
42
+ z.dprint()
43
+ ```
44
+
45
+
46
+ ```{testoutput}
47
+
48
+ TensorFromXTensor [id A]
49
+ └─ XElemwise{scalar_op=Add()} [id B]
50
+ ├─ XTensorFromTensor{dims=('x',)} [id C]
51
+ │ └─ a [id D]
52
+ └─ XTensorFromTensor{dims=('y',)} [id E]
53
+ └─ b [id F]
54
+ ```
55
+
56
+ Once we compile the graph, no XOps are left.
57
+
58
+ ```{testcode}
59
+
60
+ import pytensor
61
+
62
+ with pytensor.config.change_flags(optimizer_verbose=True):
63
+ fn = pytensor.function([a, b], z)
64
+
65
+ ```
66
+
67
+ ```{testoutput}
68
+
69
+ rewriting: rewrite lower_elemwise replaces XElemwise{scalar_op=Add()}.0 of XElemwise{scalar_op=Add()}(XTensorFromTensor{dims=('x',)}.0, XTensorFromTensor{dims=('y',)}.0) with XTensorFromTensor{dims=('x', 'y')}.0 of XTensorFromTensor{dims=('x', 'y')}(Add.0)
70
+ rewriting: rewrite useless_tensor_from_xtensor replaces TensorFromXTensor.0 of TensorFromXTensor(XTensorFromTensor{dims=('x',)}.0) with a of None
71
+ rewriting: rewrite useless_tensor_from_xtensor replaces TensorFromXTensor.0 of TensorFromXTensor(XTensorFromTensor{dims=('y',)}.0) with b of None
72
+ rewriting: rewrite useless_tensor_from_xtensor replaces TensorFromXTensor.0 of TensorFromXTensor(XTensorFromTensor{dims=('x', 'y')}.0) with Add.0 of Add(ExpandDims{axis=1}.0, ExpandDims{axis=0}.0)
73
+
74
+ ```
75
+
76
+ ```{testcode}
77
+
78
+ fn.dprint()
79
+ ```
80
+
81
+ ```{testoutput}
82
+
83
+ Add [id A] 2
84
+ ├─ ExpandDims{axis=1} [id B] 1
85
+ │ └─ a [id C]
86
+ └─ ExpandDims{axis=0} [id D] 0
87
+ └─ b [id E]
88
+ ```
89
+
90
+
91
+ ## Index
92
+
93
+ :::{toctree}
94
+ :maxdepth: 1
95
+
96
+ module_functions
97
+ math
98
+ linalg
99
+ random
100
+ type
101
+ :::
@@ -0,0 +1,7 @@
1
+ (libdoc_xtensor_linalg)=
2
+ # `xtensor.linalg` -- Linear algebra operations
3
+
4
+ ```{eval-rst}
5
+ .. automodule:: pytensor.xtensor.linalg
6
+ :members:
7
+ ```
@@ -0,0 +1,8 @@
1
+ (libdoc_xtensor_math)=
2
+ # `xtensor.math` Mathematical operations
3
+
4
+ ```{eval-rst}
5
+ .. automodule:: pytensor.xtensor.math
6
+ :members:
7
+ :exclude-members: XDot, dot
8
+ ```
@@ -0,0 +1,7 @@
1
+ (libdoc_xtensor_module_function)=
2
+ # `xtensor` -- Module level operations
3
+
4
+ ```{eval-rst}
5
+ .. automodule:: pytensor.xtensor
6
+ :members: broadcast, concat, dot, full_like, ones_like, zeros_like
7
+ ```
@@ -0,0 +1,7 @@
1
+ (libdoc_xtensor_random)=
2
+ # `xtensor.random` Random number generator operations
3
+
4
+ ```{eval-rst}
5
+ .. automodule:: pytensor.xtensor.random
6
+ :members:
7
+ ```
@@ -0,0 +1,20 @@
1
+ (libdoc_xtenor_type)=
2
+
3
+ # `xtensor.type` -- Types and Variables
4
+
5
+ ## XTensorVariable creation functions
6
+
7
+ ```{eval-rst}
8
+ .. automodule:: pytensor.xtensor.type
9
+ :members: xtensor, xtensor_constant, as_xtensor
10
+
11
+ ```
12
+
13
+ ## XTensor Type and Variable classes
14
+
15
+ ```{eval-rst}
16
+ .. automodule:: pytensor.xtensor.type
17
+ :members: XTensorType, XTensorVariable, XTensorConstant
18
+ ```
19
+
20
+
@@ -78,7 +78,7 @@ tests = [
78
78
  "pytest-mock",
79
79
  "pytest-sphinx",
80
80
  ]
81
- rtd = ["sphinx>=5.1.0,<6", "pygments", "pydot", "pydot2", "pydot-ng"]
81
+ rtd = ["sphinx>=5.1.0,<6", "pygments", "pydot"]
82
82
  jax = ["jax", "jaxlib"]
83
83
  numba = ["numba>=0.57", "llvmlite"]
84
84
 
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-07-02T21:17:39+0200",
11
+ "date": "2025-07-26T12:45:37+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "815671d5f53ab7bf0cabe9ba685b70285da38a27",
15
- "version": "2.31.6"
14
+ "full-revisionid": "6f8bb55521559b0f5ebb14ef536becca7c70f2a7",
15
+ "version": "2.32.0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -1550,6 +1550,7 @@ class PatternNodeRewriter(NodeRewriter):
1550
1550
  tracks=(),
1551
1551
  get_nodes=None,
1552
1552
  values_eq_approx=None,
1553
+ allow_cast=True,
1553
1554
  ):
1554
1555
  """
1555
1556
 
@@ -1572,6 +1573,10 @@ class PatternNodeRewriter(NodeRewriter):
1572
1573
  If you provide `tracks`, you must provide this parameter. It must be a
1573
1574
  function that takes the tracked node and returns a list of nodes on
1574
1575
  which we will try this rewrite.
1576
+ values_eq_approx
1577
+ TODO
1578
+ allow_cast
1579
+ Automatically cast the output of the rewrite whenever new and old types differ
1575
1580
 
1576
1581
  Notes
1577
1582
  -----
@@ -1586,6 +1591,7 @@ class PatternNodeRewriter(NodeRewriter):
1586
1591
  self.in_pattern = convert_strs_to_vars(in_pattern, var_map=var_map)
1587
1592
  self.out_pattern = convert_strs_to_vars(out_pattern, var_map=var_map)
1588
1593
  self.values_eq_approx = values_eq_approx
1594
+ self.allow_cast = allow_cast
1589
1595
  if isinstance(in_pattern, list | tuple):
1590
1596
  self.op = self.in_pattern[0]
1591
1597
  elif isinstance(in_pattern, dict):
@@ -1630,6 +1636,10 @@ class PatternNodeRewriter(NodeRewriter):
1630
1636
  if node.op != self.op:
1631
1637
  return False
1632
1638
 
1639
+ if len(node.outputs) != 1:
1640
+ # PatternNodeRewriter doesn't support replacing multi-output nodes
1641
+ return False
1642
+
1633
1643
  s = unify(self.in_pattern, node.out)
1634
1644
 
1635
1645
  if s is False:
@@ -1652,19 +1662,20 @@ class PatternNodeRewriter(NodeRewriter):
1652
1662
  ):
1653
1663
  return False
1654
1664
 
1655
- if ret.owner:
1665
+ [old_out] = node.outputs
1666
+ if not old_out.type.is_super(ret.type):
1667
+ # Type doesn't match
1656
1668
  if not (
1657
- len(node.outputs) == len(ret.owner.outputs)
1658
- and all(
1659
- o.type.is_super(new_o.type)
1660
- for o, new_o in zip(node.outputs, ret.owner.outputs, strict=True)
1661
- )
1669
+ self.allow_cast
1670
+ and isinstance(old_out.type, pytensor.tensor.TensorType)
1671
+ and isinstance(ret.type, pytensor.tensor.TensorType)
1662
1672
  ):
1663
1673
  return False
1664
- else:
1665
- # ret is just an input variable
1666
- assert len(node.outputs) == 1
1667
- if not node.outputs[0].type.is_super(ret.type):
1674
+
1675
+ # Try to cast tensors
1676
+ ret = ret.astype(old_out.type.dtype)
1677
+ if not old_out.type.is_super(ret.type):
1678
+ # Still doesn't match
1668
1679
  return False
1669
1680
 
1670
1681
  return [ret]
@@ -10,10 +10,11 @@ from pytensor.compile import JAX
10
10
  from pytensor.compile.builders import OpFromGraph
11
11
  from pytensor.compile.ops import DeepCopyOp, TypeCastingOp
12
12
  from pytensor.configdefaults import config
13
+ from pytensor.graph import Constant
13
14
  from pytensor.graph.fg import FunctionGraph
14
15
  from pytensor.ifelse import IfElse
15
16
  from pytensor.link.utils import fgraph_to_python
16
- from pytensor.raise_op import Assert, CheckAndRaise
17
+ from pytensor.raise_op import CheckAndRaise
17
18
 
18
19
 
19
20
  if config.floatX == "float64":
@@ -73,11 +74,14 @@ def jax_funcify_IfElse(op, **kwargs):
73
74
  return ifelse
74
75
 
75
76
 
76
- @jax_funcify.register(Assert)
77
77
  @jax_funcify.register(CheckAndRaise)
78
- def jax_funcify_CheckAndRaise(op, **kwargs):
78
+ def jax_funcify_CheckAndRaise(op, node, **kwargs):
79
+ conds = node.inputs[1:]
80
+ if any(isinstance(cond, Constant) and not bool(cond.data) for cond in conds):
81
+ raise op.exc_type(op.msg)
82
+
79
83
  warnings.warn(
80
- f"""Skipping `CheckAndRaise` Op (assertion: {op.msg}) as JAX tracing would remove it.""",
84
+ f"""Skipping {op} Op (assertion: {op.msg}) as JAX tracing would remove it.""",
81
85
  stacklevel=2,
82
86
  )
83
87
 
@@ -0,0 +1,21 @@
1
+ import jax.numpy as jnp
2
+
3
+ from pytensor.link.jax.dispatch import jax_funcify
4
+ from pytensor.tensor.blockwise import Blockwise
5
+
6
+
7
+ @jax_funcify.register(Blockwise)
8
+ def jax_funcify_Blockwise(op: Blockwise, node, **kwargs):
9
+ signature = op.signature
10
+ core_node = op._create_dummy_core_node(
11
+ node.inputs, propagate_unbatched_core_inputs=True
12
+ )
13
+ core_fn = jax_funcify(core_node.op, node=core_node, **kwargs)
14
+
15
+ vect_fn = jnp.vectorize(core_fn, signature=signature)
16
+
17
+ def blockwise_fn(*inputs):
18
+ op._check_runtime_broadcast(node, inputs)
19
+ return vect_fn(*inputs)
20
+
21
+ return blockwise_fn
@@ -9,7 +9,6 @@ from pytensor.tensor.nlinalg import (
9
9
  KroneckerProduct,
10
10
  MatrixInverse,
11
11
  MatrixPinv,
12
- QRFull,
13
12
  SLogDet,
14
13
  )
15
14
 
@@ -67,16 +66,6 @@ def jax_funcify_MatrixInverse(op, **kwargs):
67
66
  return matrix_inverse
68
67
 
69
68
 
70
- @jax_funcify.register(QRFull)
71
- def jax_funcify_QRFull(op, **kwargs):
72
- mode = op.mode
73
-
74
- def qr_full(x, mode=mode):
75
- return jnp.linalg.qr(x, mode=mode)
76
-
77
- return qr_full
78
-
79
-
80
69
  @jax_funcify.register(MatrixPinv)
81
70
  def jax_funcify_Pinv(op, **kwargs):
82
71
  def pinv(x):
@@ -0,0 +1,24 @@
1
+ import jax
2
+
3
+ from pytensor.link.jax.dispatch import jax_funcify
4
+ from pytensor.tensor.basic import get_underlying_scalar_constant_value
5
+ from pytensor.tensor.exceptions import NotScalarConstantError
6
+ from pytensor.tensor.signal.conv import Convolve1d
7
+
8
+
9
+ @jax_funcify.register(Convolve1d)
10
+ def jax_funcify_Convolve1d(op, node, **kwargs):
11
+ _, _, full_mode = node.inputs
12
+ try:
13
+ full_mode = get_underlying_scalar_constant_value(full_mode)
14
+ except NotScalarConstantError:
15
+ raise NotImplementedError(
16
+ "Cannot compile Convolve1D to jax without static mode"
17
+ )
18
+ static_mode = "full" if full_mode else "valid"
19
+
20
+ def conv1d(data, kernel, _runtime_full_mode):
21
+ # _runtime_full_mode is not used, as we only support static mode
22
+ return jax.numpy.convolve(data, kernel, mode=static_mode)
23
+
24
+ return conv1d
@@ -5,6 +5,7 @@ import jax
5
5
  from pytensor.link.jax.dispatch.basic import jax_funcify
6
6
  from pytensor.tensor.slinalg import (
7
7
  LU,
8
+ QR,
8
9
  BlockDiagonal,
9
10
  Cholesky,
10
11
  CholeskySolve,
@@ -168,3 +169,13 @@ def jax_funcify_ChoSolve(op, **kwargs):
168
169
  )
169
170
 
170
171
  return cho_solve
172
+
173
+
174
+ @jax_funcify.register(QR)
175
+ def jax_funcify_QR(op, **kwargs):
176
+ mode = op.mode
177
+
178
+ def qr(x, mode=mode):
179
+ return jax.scipy.linalg.qr(x, mode=mode)
180
+
181
+ return qr
@@ -402,24 +402,22 @@ def numba_funcify_DeepCopyOp(op, node, **kwargs):
402
402
  return deepcopyop
403
403
 
404
404
 
405
- @numba_njit
406
- def makeslice(*x):
407
- return slice(*x)
408
-
409
-
410
405
  @numba_funcify.register(MakeSlice)
411
406
  def numba_funcify_MakeSlice(op, **kwargs):
412
- return global_numba_func(makeslice)
413
-
407
+ @numba_njit
408
+ def makeslice(*x):
409
+ return slice(*x)
414
410
 
415
- @numba_njit
416
- def shape(x):
417
- return np.asarray(np.shape(x))
411
+ return makeslice
418
412
 
419
413
 
420
414
  @numba_funcify.register(Shape)
421
415
  def numba_funcify_Shape(op, **kwargs):
422
- return global_numba_func(shape)
416
+ @numba_njit
417
+ def shape(x):
418
+ return np.asarray(np.shape(x))
419
+
420
+ return shape
423
421
 
424
422
 
425
423
  @numba_funcify.register(Shape_i)
@@ -16,7 +16,7 @@ from pytensor.tensor import TensorVariable, get_vector_length
16
16
  from pytensor.tensor.blockwise import Blockwise, BlockwiseWithCoreShape
17
17
 
18
18
 
19
- @numba_funcify.register
19
+ @numba_funcify.register(BlockwiseWithCoreShape)
20
20
  def numba_funcify_Blockwise(op: BlockwiseWithCoreShape, node, **kwargs):
21
21
  [blockwise_node] = op.fgraph.apply_nodes
22
22
  blockwise_op: Blockwise = blockwise_node.op
@@ -26,7 +26,8 @@ def numba_funcify_Blockwise(op: BlockwiseWithCoreShape, node, **kwargs):
26
26
  core_shapes_len = tuple(get_vector_length(sh) for sh in node.inputs[nin:])
27
27
 
28
28
  core_node = blockwise_op._create_dummy_core_node(
29
- cast(tuple[TensorVariable], blockwise_node.inputs)
29
+ cast(tuple[TensorVariable], node.inputs[:nin]),
30
+ propagate_unbatched_core_inputs=True,
30
31
  )
31
32
  core_op_fn = numba_funcify(
32
33
  core_op,
@@ -283,7 +283,6 @@ class _LAPACK:
283
283
 
284
284
  Called by scipy.linalg.lu_solve
285
285
  """
286
- ...
287
286
  lapack_ptr, float_pointer = _get_lapack_ptr_and_ptr_type(dtype, "getrs")
288
287
  functype = ctypes.CFUNCTYPE(
289
288
  None,
@@ -457,3 +456,90 @@ class _LAPACK:
457
456
  _ptr_int, # INFO
458
457
  )
459
458
  return functype(lapack_ptr)
459
+
460
+ @classmethod
461
+ def numba_xgeqrf(cls, dtype):
462
+ """
463
+ Compute the QR factorization of a general M-by-N matrix A.
464
+
465
+ Used in QR decomposition (no pivoting).
466
+ """
467
+ lapack_ptr, float_pointer = _get_lapack_ptr_and_ptr_type(dtype, "geqrf")
468
+ functype = ctypes.CFUNCTYPE(
469
+ None,
470
+ _ptr_int, # M
471
+ _ptr_int, # N
472
+ float_pointer, # A
473
+ _ptr_int, # LDA
474
+ float_pointer, # TAU
475
+ float_pointer, # WORK
476
+ _ptr_int, # LWORK
477
+ _ptr_int, # INFO
478
+ )
479
+ return functype(lapack_ptr)
480
+
481
+ @classmethod
482
+ def numba_xgeqp3(cls, dtype):
483
+ """
484
+ Compute the QR factorization with column pivoting of a general M-by-N matrix A.
485
+
486
+ Used in QR decomposition with pivoting.
487
+ """
488
+ lapack_ptr, float_pointer = _get_lapack_ptr_and_ptr_type(dtype, "geqp3")
489
+ functype = ctypes.CFUNCTYPE(
490
+ None,
491
+ _ptr_int, # M
492
+ _ptr_int, # N
493
+ float_pointer, # A
494
+ _ptr_int, # LDA
495
+ _ptr_int, # JPVT
496
+ float_pointer, # TAU
497
+ float_pointer, # WORK
498
+ _ptr_int, # LWORK
499
+ _ptr_int, # INFO
500
+ )
501
+ return functype(lapack_ptr)
502
+
503
+ @classmethod
504
+ def numba_xorgqr(cls, dtype):
505
+ """
506
+ Generate the orthogonal matrix Q from a QR factorization (real types).
507
+
508
+ Used in QR decomposition to form Q.
509
+ """
510
+ lapack_ptr, float_pointer = _get_lapack_ptr_and_ptr_type(dtype, "orgqr")
511
+ functype = ctypes.CFUNCTYPE(
512
+ None,
513
+ _ptr_int, # M
514
+ _ptr_int, # N
515
+ _ptr_int, # K
516
+ float_pointer, # A
517
+ _ptr_int, # LDA
518
+ float_pointer, # TAU
519
+ float_pointer, # WORK
520
+ _ptr_int, # LWORK
521
+ _ptr_int, # INFO
522
+ )
523
+ return functype(lapack_ptr)
524
+
525
+ @classmethod
526
+ def numba_xungqr(cls, dtype):
527
+ """
528
+ Generate the unitary matrix Q from a QR factorization (complex types).
529
+
530
+ Used in QR decomposition to form Q for complex types.
531
+ """
532
+ lapack_ptr, float_pointer = _get_lapack_ptr_and_ptr_type(dtype, "ungqr")
533
+ functype = ctypes.CFUNCTYPE(
534
+ None,
535
+ _ptr_int, # M
536
+ _ptr_int, # N
537
+ _ptr_int, # K
538
+ float_pointer, # A
539
+ _ptr_int, # LDA
540
+ float_pointer, # TAU
541
+ float_pointer, # WORK
542
+ _ptr_int, # LWORK
543
+ _ptr_int, # INFO
544
+ )
545
+ return functype(lapack_ptr)