pytensor 2.28.3__tar.gz → 2.30.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 (448) hide show
  1. {pytensor-2.28.3/pytensor.egg-info → pytensor-2.30.0}/PKG-INFO +3 -2
  2. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/basic.rst +6 -9
  3. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/_version.py +3 -3
  4. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/function/pfunc.py +1 -7
  5. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/mode.py +15 -7
  6. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/configdefaults.py +3 -1
  7. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/op.py +1 -1
  8. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/ifelse.py +1 -2
  9. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/__init__.py +1 -0
  10. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/random.py +84 -110
  11. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/scan.py +1 -1
  12. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/shape.py +1 -9
  13. pytensor-2.30.0/pytensor/link/jax/dispatch/signal/__init__.py +1 -0
  14. pytensor-2.30.0/pytensor/link/jax/dispatch/signal/conv.py +14 -0
  15. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/slinalg.py +23 -5
  16. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/__init__.py +2 -0
  17. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/basic.py +14 -88
  18. {pytensor-2.28.3/pytensor/link/numba/dispatch → pytensor-2.30.0/pytensor/link/numba/dispatch/linalg}/_LAPACK.py +67 -0
  19. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +66 -0
  20. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +87 -0
  21. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/general.py +256 -0
  22. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/norm.py +58 -0
  23. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/posdef.py +223 -0
  24. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +228 -0
  25. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/triangular.py +116 -0
  26. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +299 -0
  27. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/utils.py +11 -0
  28. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/utils.py +108 -0
  29. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/scan.py +32 -7
  30. pytensor-2.30.0/pytensor/link/numba/dispatch/signal/__init__.py +1 -0
  31. pytensor-2.30.0/pytensor/link/numba/dispatch/signal/conv.py +16 -0
  32. pytensor-2.30.0/pytensor/link/numba/dispatch/slinalg.py +213 -0
  33. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/subtensor.py +60 -50
  34. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/tensor_basic.py +0 -10
  35. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/shape.py +1 -9
  36. pytensor-2.30.0/pytensor/misc/__init__.py +0 -0
  37. pytensor-2.30.0/pytensor/py.typed +0 -0
  38. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/basic.py +5 -5
  39. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/op.py +11 -2
  40. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/rewriting.py +135 -100
  41. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/utils.py +2 -2
  42. pytensor-2.30.0/pytensor/sparse/sandbox/__init__.py +0 -0
  43. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/__init__.py +1 -0
  44. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/basic.py +33 -32
  45. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/blas.py +53 -42
  46. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/einsum.py +13 -1
  47. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/math.py +158 -128
  48. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/nlinalg.py +77 -0
  49. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/basic.py +8 -1
  50. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/blas.py +2 -2
  51. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/shape.py +0 -77
  52. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/subtensor.py +0 -37
  53. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/shape.py +0 -116
  54. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/sharedvar.py +0 -6
  55. pytensor-2.30.0/pytensor/tensor/signal/__init__.py +4 -0
  56. pytensor-2.30.0/pytensor/tensor/signal/conv.py +132 -0
  57. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/slinalg.py +100 -24
  58. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/subtensor.py +45 -17
  59. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/utils.py +0 -8
  60. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/variable.py +1 -1
  61. {pytensor-2.28.3 → pytensor-2.30.0/pytensor.egg-info}/PKG-INFO +3 -2
  62. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor.egg-info/SOURCES.txt +20 -1
  63. {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_rop.py +0 -8
  64. pytensor-2.28.3/pytensor/link/numba/dispatch/slinalg.py +0 -1192
  65. {pytensor-2.28.3 → pytensor-2.30.0}/LICENSE.txt +0 -0
  66. {pytensor-2.28.3 → pytensor-2.30.0}/MANIFEST.in +0 -0
  67. {pytensor-2.28.3 → pytensor-2.30.0}/README.rst +0 -0
  68. {pytensor-2.28.3 → pytensor-2.30.0}/doc/.templates/PLACEHOLDER +0 -0
  69. {pytensor-2.28.3 → pytensor-2.30.0}/doc/.templates/layout.html +0 -0
  70. {pytensor-2.28.3 → pytensor-2.30.0}/doc/.templates/nb-badges.html +0 -0
  71. {pytensor-2.28.3 → pytensor-2.30.0}/doc/.templates/rendered_citation.html +0 -0
  72. {pytensor-2.28.3 → pytensor-2.30.0}/doc/LICENSE.txt +0 -0
  73. {pytensor-2.28.3 → pytensor-2.30.0}/doc/README.md +0 -0
  74. {pytensor-2.28.3 → pytensor-2.30.0}/doc/acknowledgement.rst +0 -0
  75. {pytensor-2.28.3 → pytensor-2.30.0}/doc/bcast.png +0 -0
  76. {pytensor-2.28.3 → pytensor-2.30.0}/doc/bcast.svg +0 -0
  77. {pytensor-2.28.3 → pytensor-2.30.0}/doc/blog.md +0 -0
  78. {pytensor-2.28.3 → pytensor-2.30.0}/doc/conf.py +0 -0
  79. {pytensor-2.28.3 → pytensor-2.30.0}/doc/core_development_guide.rst +0 -0
  80. {pytensor-2.28.3 → pytensor-2.30.0}/doc/css.inc +0 -0
  81. {pytensor-2.28.3 → pytensor-2.30.0}/doc/dev_start_guide.rst +0 -0
  82. {pytensor-2.28.3 → pytensor-2.30.0}/doc/environment.yml +0 -0
  83. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/apply.png +0 -0
  84. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/apply.svg +0 -0
  85. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/apply2.svg +0 -0
  86. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/creating_a_c_op.rst +0 -0
  87. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  88. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/creating_an_op.rst +0 -0
  89. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/ctype.rst +0 -0
  90. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/extending_faq.rst +0 -0
  91. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
  92. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/graph_rewriting.rst +0 -0
  93. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/graphstructures.rst +0 -0
  94. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/index.rst +0 -0
  95. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/inplace.rst +0 -0
  96. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/op.rst +0 -0
  97. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/other_ops.rst +0 -0
  98. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  99. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  100. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/pipeline.rst +0 -0
  101. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/scan.rst +0 -0
  102. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/tips.rst +0 -0
  103. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/type.rst +0 -0
  104. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/unittest.rst +0 -0
  105. {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/using_params.rst +0 -0
  106. {pytensor-2.28.3 → pytensor-2.30.0}/doc/faq.rst +0 -0
  107. {pytensor-2.28.3 → pytensor-2.30.0}/doc/gallery/page_footer.md +0 -0
  108. {pytensor-2.28.3 → pytensor-2.30.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  109. {pytensor-2.28.3 → pytensor-2.30.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  110. {pytensor-2.28.3 → pytensor-2.30.0}/doc/generate_dtype_tensor_table.py +0 -0
  111. {pytensor-2.28.3 → pytensor-2.30.0}/doc/glossary.rst +0 -0
  112. {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/Elman_srnn.png +0 -0
  113. {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/PyTensor.png +0 -0
  114. {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/PyTensor_RGB.svg +0 -0
  115. {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/PyTensor_logo.png +0 -0
  116. {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/binder.svg +0 -0
  117. {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/blocksparse.png +0 -0
  118. {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/colab.svg +0 -0
  119. {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/github.svg +0 -0
  120. {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/lstm.png +0 -0
  121. {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/lstm_memorycell.png +0 -0
  122. {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/talk2010.gif +0 -0
  123. {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/talk2010.png +0 -0
  124. {pytensor-2.28.3 → pytensor-2.30.0}/doc/index.rst +0 -0
  125. {pytensor-2.28.3 → pytensor-2.30.0}/doc/install.rst +0 -0
  126. {pytensor-2.28.3 → pytensor-2.30.0}/doc/internal/how_to_release.rst +0 -0
  127. {pytensor-2.28.3 → pytensor-2.30.0}/doc/internal/index.rst +0 -0
  128. {pytensor-2.28.3 → pytensor-2.30.0}/doc/internal/metadocumentation.rst +0 -0
  129. {pytensor-2.28.3 → pytensor-2.30.0}/doc/introduction.rst +0 -0
  130. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/debugmode.rst +0 -0
  131. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/function.rst +0 -0
  132. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/index.rst +0 -0
  133. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/io.rst +0 -0
  134. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/mode.rst +0 -0
  135. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/nanguardmode.rst +0 -0
  136. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/opfromgraph.rst +0 -0
  137. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/ops.rst +0 -0
  138. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/profilemode.rst +0 -0
  139. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/shared.rst +0 -0
  140. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/config.rst +0 -0
  141. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  142. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  143. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  144. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  145. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  146. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  147. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  148. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp.html +0 -0
  149. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp.png +0 -0
  150. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp2.html +0 -0
  151. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  152. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp2.png +0 -0
  153. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/ofg.html +0 -0
  154. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/ofg2.html +0 -0
  155. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/index.ipynb +0 -0
  156. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/index.rst +0 -0
  157. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  158. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  159. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  160. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  161. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/features.rst +0 -0
  162. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/fgraph.rst +0 -0
  163. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/graph.rst +0 -0
  164. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/index.rst +0 -0
  165. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/op.rst +0 -0
  166. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/replace.rst +0 -0
  167. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/type.rst +0 -0
  168. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/utils.rst +0 -0
  169. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/index.rst +0 -0
  170. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/misc/pkl_utils.rst +0 -0
  171. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/printing.rst +0 -0
  172. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/scalar/index.rst +0 -0
  173. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/scan.rst +0 -0
  174. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/sparse/index.rst +0 -0
  175. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/sparse/sandbox.rst +0 -0
  176. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/basic_opt.rst +0 -0
  177. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/bcast.png +0 -0
  178. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/bcast.svg +0 -0
  179. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/conv.rst +0 -0
  180. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/elemwise.rst +0 -0
  181. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/extra_ops.rst +0 -0
  182. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/fft.rst +0 -0
  183. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/functional.rst +0 -0
  184. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/index.rst +0 -0
  185. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/io.rst +0 -0
  186. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/math_opt.rst +0 -0
  187. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/nlinalg.rst +0 -0
  188. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/plot_fft.png +0 -0
  189. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/random/distributions.rst +0 -0
  190. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/random/index.rst +0 -0
  191. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/slinalg.rst +0 -0
  192. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/utils.rst +0 -0
  193. {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/typed_list.rst +0 -0
  194. {pytensor-2.28.3 → pytensor-2.30.0}/doc/links.rst +0 -0
  195. {pytensor-2.28.3 → pytensor-2.30.0}/doc/optimizations.rst +0 -0
  196. {pytensor-2.28.3 → pytensor-2.30.0}/doc/pylintrc +0 -0
  197. {pytensor-2.28.3 → pytensor-2.30.0}/doc/robots.txt +0 -0
  198. {pytensor-2.28.3 → pytensor-2.30.0}/doc/troubleshooting.rst +0 -0
  199. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/adding.rst +0 -0
  200. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/adding_solution_1.py +0 -0
  201. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/aliasing.rst +0 -0
  202. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/apply.png +0 -0
  203. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/apply.svg +0 -0
  204. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/bcast.png +0 -0
  205. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/broadcasting.rst +0 -0
  206. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/conditions.rst +0 -0
  207. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/debug_faq.rst +0 -0
  208. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/dlogistic.png +0 -0
  209. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/examples.rst +0 -0
  210. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/faq_tutorial.rst +0 -0
  211. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/gradients.rst +0 -0
  212. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/index.rst +0 -0
  213. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/loading_and_saving.rst +0 -0
  214. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/logistic.gp +0 -0
  215. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/logistic.png +0 -0
  216. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/loop.rst +0 -0
  217. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/loop_solution_1.py +0 -0
  218. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/modes.rst +0 -0
  219. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/modes_solution_1.py +0 -0
  220. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/multi_cores.rst +0 -0
  221. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/nan_tutorial.rst +0 -0
  222. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/pics/d3viz.png +0 -0
  223. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  224. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  225. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  226. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/printing_drawing.rst +0 -0
  227. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/prng.rst +0 -0
  228. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/profiling.rst +0 -0
  229. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/profiling_example.py +0 -0
  230. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/profiling_example_out.prof +0 -0
  231. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/shape_info.rst +0 -0
  232. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/sparse.rst +0 -0
  233. {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/symbolic_graphs.rst +0 -0
  234. {pytensor-2.28.3 → pytensor-2.30.0}/doc/user_guide.rst +0 -0
  235. {pytensor-2.28.3 → pytensor-2.30.0}/pyproject.toml +0 -0
  236. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/__init__.py +0 -0
  237. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/bin/__init__.py +0 -0
  238. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/bin/pytensor_cache.py +0 -0
  239. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/breakpoint.py +0 -0
  240. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/__init__.py +0 -0
  241. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/builders.py +0 -0
  242. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/compiledir.py +0 -0
  243. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/compilelock.py +0 -0
  244. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/debugmode.py +0 -0
  245. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/function/__init__.py +0 -0
  246. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/function/types.py +0 -0
  247. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/io.py +0 -0
  248. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/monitormode.py +0 -0
  249. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/nanguardmode.py +0 -0
  250. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/ops.py +0 -0
  251. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/profiling.py +0 -0
  252. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/sharedvalue.py +0 -0
  253. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/configparser.py +0 -0
  254. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/__init__.py +0 -0
  255. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  256. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/css/d3viz.css +0 -0
  257. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/d3viz.py +0 -0
  258. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/formatting.py +0 -0
  259. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  260. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  261. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/js/d3viz.js +0 -0
  262. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  263. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  264. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/gradient.py +0 -0
  265. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/__init__.py +0 -0
  266. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/basic.py +0 -0
  267. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/destroyhandler.py +0 -0
  268. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/features.py +0 -0
  269. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/fg.py +0 -0
  270. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/null_type.py +0 -0
  271. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/replace.py +0 -0
  272. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/rewriting/__init__.py +0 -0
  273. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/rewriting/basic.py +0 -0
  274. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/rewriting/db.py +0 -0
  275. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/rewriting/kanren.py +0 -0
  276. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/rewriting/unify.py +0 -0
  277. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/rewriting/utils.py +0 -0
  278. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/type.py +0 -0
  279. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/utils.py +0 -0
  280. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/__init__.py +0 -0
  281. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/basic.py +0 -0
  282. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/__init__.py +0 -0
  283. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/basic.py +0 -0
  284. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  285. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  286. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/cmodule.py +0 -0
  287. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/cutils.py +0 -0
  288. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/cvm.py +0 -0
  289. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/exceptions.py +0 -0
  290. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/interface.py +0 -0
  291. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/lazylinker_c.py +0 -0
  292. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/op.py +0 -0
  293. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/params_type.py +0 -0
  294. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/type.py +0 -0
  295. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/__init__.py +0 -0
  296. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/basic.py +0 -0
  297. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/blas.py +0 -0
  298. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  299. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
  300. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  301. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  302. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/math.py +0 -0
  303. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  304. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/pad.py +0 -0
  305. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/scalar.py +0 -0
  306. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/sort.py +0 -0
  307. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
  308. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  309. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  310. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/linker.py +0 -0
  311. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/__init__.py +0 -0
  312. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  313. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  314. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/elemwise.py +0 -0
  315. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  316. {pytensor-2.28.3/pytensor/misc → pytensor-2.30.0/pytensor/link/numba/dispatch/linalg}/__init__.py +0 -0
  317. {pytensor-2.28.3/pytensor/sparse/sandbox → pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/decomposition}/__init__.py +0 -0
  318. /pytensor-2.28.3/pytensor/py.typed → /pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
  319. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
  320. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/random.py +0 -0
  321. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/scalar.py +0 -0
  322. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/sparse.py +0 -0
  323. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  324. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/linker.py +0 -0
  325. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  326. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  327. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  328. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  329. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  330. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  331. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
  332. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
  333. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  334. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  335. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  336. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/linker.py +0 -0
  337. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/utils.py +0 -0
  338. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/vm.py +0 -0
  339. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/check_blas.py +0 -0
  340. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/check_blas_many.sh +0 -0
  341. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/check_duplicate_key.py +0 -0
  342. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  343. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/elemwise_time_test.py +0 -0
  344. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/frozendict.py +0 -0
  345. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/may_share_memory.py +0 -0
  346. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/ordered_set.py +0 -0
  347. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/pkl_utils.py +0 -0
  348. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/npy_2_compat.py +0 -0
  349. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/printing.py +0 -0
  350. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/raise_op.py +0 -0
  351. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/__init__.py +0 -0
  352. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/basic.py +0 -0
  353. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  354. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  355. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/c_code/gamma.c +0 -0
  356. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/c_code/incbet.c +0 -0
  357. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/loop.py +0 -0
  358. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/math.py +0 -0
  359. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/sharedvar.py +0 -0
  360. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/__init__.py +0 -0
  361. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/checkpoints.py +0 -0
  362. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/scan_perform.pyx +0 -0
  363. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/scan_perform_ext.py +0 -0
  364. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/views.py +0 -0
  365. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/__init__.py +0 -0
  366. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/basic.py +0 -0
  367. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/rewriting.py +0 -0
  368. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/sandbox/sp.py +0 -0
  369. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/sandbox/sp2.py +0 -0
  370. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/sharedvar.py +0 -0
  371. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/type.py +0 -0
  372. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/utils.py +0 -0
  373. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/blas_c.py +0 -0
  374. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/blas_headers.py +0 -0
  375. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/blas_scipy.py +0 -0
  376. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/blockwise.py +0 -0
  377. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  378. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  379. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  380. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/conv/__init__.py +0 -0
  381. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/conv/abstract_conv.py +0 -0
  382. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/elemwise.py +0 -0
  383. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/elemwise_cgen.py +0 -0
  384. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/exceptions.py +0 -0
  385. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/extra_ops.py +0 -0
  386. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/fft.py +0 -0
  387. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/fourier.py +0 -0
  388. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/functional.py +0 -0
  389. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/inplace.py +0 -0
  390. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/interpolate.py +0 -0
  391. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/io.py +0 -0
  392. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/linalg.py +0 -0
  393. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/pad.py +0 -0
  394. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/__init__.py +0 -0
  395. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/op.py +0 -0
  396. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  397. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
  398. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
  399. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
  400. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/type.py +0 -0
  401. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/utils.py +0 -0
  402. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/var.py +0 -0
  403. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/__init__.py +0 -0
  404. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/basic.py +0 -0
  405. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/blas_c.py +0 -0
  406. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
  407. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/blockwise.py +0 -0
  408. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/einsum.py +0 -0
  409. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/elemwise.py +0 -0
  410. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  411. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/jax.py +0 -0
  412. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/linalg.py +0 -0
  413. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/math.py +0 -0
  414. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/numba.py +0 -0
  415. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/ofg.py +0 -0
  416. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/special.py +0 -0
  417. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  418. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/sort.py +0 -0
  419. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/special.py +0 -0
  420. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/type.py +0 -0
  421. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/type_other.py +0 -0
  422. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/var.py +0 -0
  423. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/xlogx.py +0 -0
  424. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/typed_list/__init__.py +0 -0
  425. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/typed_list/basic.py +0 -0
  426. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/typed_list/rewriting.py +0 -0
  427. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/typed_list/type.py +0 -0
  428. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/updates.py +0 -0
  429. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/utils.py +0 -0
  430. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor.egg-info/dependency_links.txt +0 -0
  431. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor.egg-info/entry_points.txt +0 -0
  432. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor.egg-info/requires.txt +0 -0
  433. {pytensor-2.28.3 → pytensor-2.30.0}/pytensor.egg-info/top_level.txt +0 -0
  434. {pytensor-2.28.3 → pytensor-2.30.0}/scripts/mypy-failing.txt +0 -0
  435. {pytensor-2.28.3 → pytensor-2.30.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  436. {pytensor-2.28.3 → pytensor-2.30.0}/setup.cfg +0 -0
  437. {pytensor-2.28.3 → pytensor-2.30.0}/setup.py +0 -0
  438. {pytensor-2.28.3 → pytensor-2.30.0}/tests/link/c/c_code/test_cenum.h +0 -0
  439. {pytensor-2.28.3 → pytensor-2.30.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  440. {pytensor-2.28.3 → pytensor-2.30.0}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
  441. {pytensor-2.28.3 → pytensor-2.30.0}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
  442. {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_breakpoint.py +0 -0
  443. {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_config.py +0 -0
  444. {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_gradient.py +0 -0
  445. {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_ifelse.py +0 -0
  446. {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_printing.py +0 -0
  447. {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_raise_op.py +0 -0
  448. {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_updates.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 2.28.3
3
+ Version: 2.30.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: .. _license:
@@ -108,6 +108,7 @@ Requires-Dist: jaxlib; extra == "jax"
108
108
  Provides-Extra: numba
109
109
  Requires-Dist: numba>=0.57; extra == "numba"
110
110
  Requires-Dist: llvmlite; extra == "numba"
111
+ Dynamic: license-file
111
112
 
112
113
  .. image:: https://cdn.rawgit.com/pymc-devs/pytensor/main/doc/images/PyTensor_RGB.svg
113
114
  :height: 100px
@@ -619,9 +619,8 @@ dimensions, see :meth:`_tensor_py_operators.dimshuffle`.
619
619
 
620
620
  .. function:: shape_padleft(x, n_ones=1)
621
621
 
622
- Reshape `x` by left padding the shape with `n_ones` 1s. Note that all
623
- this new dimension will be broadcastable. To make them non-broadcastable
624
- see the :func:`unbroadcast`.
622
+ Reshape `x` by left padding the shape with `n_ones` 1s.
623
+ All new dimensions will be broadcastable.
625
624
 
626
625
  :param x: variable to be reshaped
627
626
  :type x: any `TensorVariable` (or compatible)
@@ -633,9 +632,8 @@ dimensions, see :meth:`_tensor_py_operators.dimshuffle`.
633
632
 
634
633
  .. function:: shape_padright(x, n_ones=1)
635
634
 
636
- Reshape `x` by right padding the shape with `n_ones` ones. Note that all
637
- this new dimension will be broadcastable. To make them non-broadcastable
638
- see the :func:`unbroadcast`.
635
+ Reshape `x` by right padding the shape with `n_ones` ones.
636
+ All new dimensions will be broadcastable.
639
637
 
640
638
  :param x: variable to be reshaped
641
639
  :type x: any TensorVariable (or compatible)
@@ -646,9 +644,8 @@ dimensions, see :meth:`_tensor_py_operators.dimshuffle`.
646
644
 
647
645
  .. function:: shape_padaxis(t, axis)
648
646
 
649
- Reshape `t` by inserting ``1`` at the dimension `axis`. Note that this new
650
- dimension will be broadcastable. To make it non-broadcastable
651
- see the :func:`unbroadcast`.
647
+ Reshape `t` by inserting ``1`` at the dimension `axis`.
648
+ All new dimensions will be broadcastable.
652
649
 
653
650
  :type x: any `TensorVariable` (or compatible)
654
651
  :param x: variable to be reshaped
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-03-05T13:02:56+0100",
11
+ "date": "2025-03-28T02:16:52+0800",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "89d5366c888f430003aa6f16a13ad9cdd2826d95",
15
- "version": "2.28.3"
14
+ "full-revisionid": "0b56ed9c6514e4ba641cb07fd7bbca629dd797c3",
15
+ "version": "2.30.0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -292,14 +292,8 @@ def rebuild_collect_shared(
292
292
  f" shared_var.type={store_into.type},"
293
293
  f" update_val={update_val}, update_val.type={getattr(update_val, 'type', None)})."
294
294
  )
295
- err_sug = (
296
- "If the difference is related to the broadcast pattern,"
297
- " you can call the"
298
- " tensor.shape.unbroadcast(var, axis_to_unbroadcast[, ...])"
299
- " function to mask broadcastable dimensions."
300
- )
301
295
 
302
- raise TypeError(err_msg, err_sug)
296
+ raise TypeError(err_msg)
303
297
  assert store_into.type.is_super(update_val.type)
304
298
 
305
299
  update_d[store_into] = update_val
@@ -454,6 +454,19 @@ else:
454
454
  RewriteDatabaseQuery(include=["fast_run", "py_only"]),
455
455
  )
456
456
 
457
+ NUMBA = Mode(
458
+ NumbaLinker(),
459
+ RewriteDatabaseQuery(
460
+ include=["fast_run", "numba"],
461
+ exclude=[
462
+ "cxx_only",
463
+ "BlasOpt",
464
+ "local_careduce_fusion",
465
+ "scan_save_mem_prealloc",
466
+ ],
467
+ ),
468
+ )
469
+
457
470
  JAX = Mode(
458
471
  JAXLinker(),
459
472
  RewriteDatabaseQuery(
@@ -463,6 +476,7 @@ JAX = Mode(
463
476
  "BlasOpt",
464
477
  "fusion",
465
478
  "inplace",
479
+ "scan_save_mem_prealloc",
466
480
  ],
467
481
  ),
468
482
  )
@@ -476,16 +490,10 @@ PYTORCH = Mode(
476
490
  "fusion",
477
491
  "inplace",
478
492
  "local_uint_constant_indices",
493
+ "scan_save_mem_prealloc",
479
494
  ],
480
495
  ),
481
496
  )
482
- NUMBA = Mode(
483
- NumbaLinker(),
484
- RewriteDatabaseQuery(
485
- include=["fast_run", "numba"],
486
- exclude=["cxx_only", "BlasOpt", "local_careduce_fusion"],
487
- ),
488
- )
489
497
 
490
498
 
491
499
  predefined_modes = {
@@ -1085,7 +1085,9 @@ def add_scan_configvars():
1085
1085
  "scan__allow_output_prealloc",
1086
1086
  "Allow/disallow memory preallocation for outputs inside of scan "
1087
1087
  "(default: True)",
1088
- BoolParam(True),
1088
+ # Non-mutable because ScanSaveMem rewrite checks it,
1089
+ # and we can't have the rewrite and the implementation mismatch
1090
+ BoolParam(True, mutable=False),
1089
1091
  in_c_key=False,
1090
1092
  )
1091
1093
 
@@ -366,7 +366,7 @@ class Op(MetaObject):
366
366
  .. [1] Giles, Mike. 2008. “An Extended Collection of Matrix Derivative Results for Forward and Reverse Mode Automatic Differentiation.”
367
367
 
368
368
  """
369
- raise NotImplementedError()
369
+ raise NotImplementedError(f"grad not implemented for Op {self}")
370
370
 
371
371
  def L_op(
372
372
  self,
@@ -26,7 +26,7 @@ from pytensor.graph.op import _NoPythonOp
26
26
  from pytensor.graph.replace import clone_replace
27
27
  from pytensor.graph.rewriting.basic import GraphRewriter, in2out, node_rewriter
28
28
  from pytensor.graph.type import HasDataType, HasShape
29
- from pytensor.tensor.shape import Reshape, Shape, SpecifyShape, Unbroadcast
29
+ from pytensor.tensor.shape import Reshape, Shape, SpecifyShape
30
30
 
31
31
 
32
32
  if TYPE_CHECKING:
@@ -481,7 +481,6 @@ acceptable_ops = (
481
481
  Shape,
482
482
  SpecifyShape,
483
483
  Reshape,
484
- Unbroadcast,
485
484
  pt.math.Dot,
486
485
  pt.math.Max,
487
486
  pt.math.Argmax,
@@ -14,6 +14,7 @@ import pytensor.link.jax.dispatch.random
14
14
  import pytensor.link.jax.dispatch.scalar
15
15
  import pytensor.link.jax.dispatch.scan
16
16
  import pytensor.link.jax.dispatch.shape
17
+ import pytensor.link.jax.dispatch.signal
17
18
  import pytensor.link.jax.dispatch.slinalg
18
19
  import pytensor.link.jax.dispatch.sort
19
20
  import pytensor.link.jax.dispatch.sparse
@@ -1,6 +1,7 @@
1
1
  from functools import singledispatch
2
2
 
3
3
  import jax
4
+ import jax.numpy as jnp
4
5
  import numpy as np
5
6
  from numpy.random import Generator
6
7
  from numpy.random.bit_generator import ( # type: ignore[attr-defined]
@@ -105,14 +106,24 @@ def jax_funcify_RandomVariable(op: ptr.RandomVariable, node, **kwargs):
105
106
  assert_size_argument_jax_compatible(node)
106
107
 
107
108
  def sample_fn(rng, size, *parameters):
108
- return jax_sample_fn(op, node=node)(rng, size, out_dtype, *parameters)
109
+ rng_key = rng["jax_state"]
110
+ rng_key, sampling_key = jax.random.split(rng_key, 2)
111
+ rng["jax_state"] = rng_key
112
+ sample = jax_sample_fn(op, node=node)(
113
+ sampling_key, size, out_dtype, *parameters
114
+ )
115
+ return (rng, sample)
109
116
 
110
117
  else:
111
118
 
112
119
  def sample_fn(rng, size, *parameters):
113
- return jax_sample_fn(op, node=node)(
114
- rng, static_size, out_dtype, *parameters
120
+ rng_key = rng["jax_state"]
121
+ rng_key, sampling_key = jax.random.split(rng_key, 2)
122
+ rng["jax_state"] = rng_key
123
+ sample = jax_sample_fn(op, node=node)(
124
+ sampling_key, static_size, out_dtype, *parameters
115
125
  )
126
+ return (rng, sample)
116
127
 
117
128
  return sample_fn
118
129
 
@@ -133,12 +144,9 @@ def jax_sample_fn_generic(op, node):
133
144
  name = op.name
134
145
  jax_op = getattr(jax.random, name)
135
146
 
136
- def sample_fn(rng, size, dtype, *parameters):
137
- rng_key = rng["jax_state"]
138
- rng_key, sampling_key = jax.random.split(rng_key, 2)
139
- sample = jax_op(sampling_key, *parameters, shape=size, dtype=dtype)
140
- rng["jax_state"] = rng_key
141
- return (rng, sample)
147
+ def sample_fn(rng_key, size, dtype, *parameters):
148
+ sample = jax_op(rng_key, *parameters, shape=size, dtype=dtype)
149
+ return sample
142
150
 
143
151
  return sample_fn
144
152
 
@@ -159,29 +167,23 @@ def jax_sample_fn_loc_scale(op, node):
159
167
  name = op.name
160
168
  jax_op = getattr(jax.random, name)
161
169
 
162
- def sample_fn(rng, size, dtype, *parameters):
163
- rng_key = rng["jax_state"]
164
- rng_key, sampling_key = jax.random.split(rng_key, 2)
170
+ def sample_fn(rng_key, size, dtype, *parameters):
165
171
  loc, scale = parameters
166
172
  if size is None:
167
173
  size = jax.numpy.broadcast_arrays(loc, scale)[0].shape
168
- sample = loc + jax_op(sampling_key, size, dtype) * scale
169
- rng["jax_state"] = rng_key
170
- return (rng, sample)
174
+ sample = loc + jax_op(rng_key, size, dtype) * scale
175
+ return sample
171
176
 
172
177
  return sample_fn
173
178
 
174
179
 
175
180
  @jax_sample_fn.register(ptr.MvNormalRV)
176
181
  def jax_sample_mvnormal(op, node):
177
- def sample_fn(rng, size, dtype, mean, cov):
178
- rng_key = rng["jax_state"]
179
- rng_key, sampling_key = jax.random.split(rng_key, 2)
182
+ def sample_fn(rng_key, size, dtype, mean, cov):
180
183
  sample = jax.random.multivariate_normal(
181
- sampling_key, mean, cov, shape=size, dtype=dtype, method=op.method
184
+ rng_key, mean, cov, shape=size, dtype=dtype, method=op.method
182
185
  )
183
- rng["jax_state"] = rng_key
184
- return (rng, sample)
186
+ return sample
185
187
 
186
188
  return sample_fn
187
189
 
@@ -191,12 +193,9 @@ def jax_sample_fn_bernoulli(op, node):
191
193
  """JAX implementation of `BernoulliRV`."""
192
194
 
193
195
  # We need a separate dispatch, because there is no dtype argument for Bernoulli in JAX
194
- def sample_fn(rng, size, dtype, p):
195
- rng_key = rng["jax_state"]
196
- rng_key, sampling_key = jax.random.split(rng_key, 2)
197
- sample = jax.random.bernoulli(sampling_key, p, shape=size)
198
- rng["jax_state"] = rng_key
199
- return (rng, sample)
196
+ def sample_fn(rng_key, size, dtype, p):
197
+ sample = jax.random.bernoulli(rng_key, p, shape=size)
198
+ return sample
200
199
 
201
200
  return sample_fn
202
201
 
@@ -206,14 +205,10 @@ def jax_sample_fn_categorical(op, node):
206
205
  """JAX implementation of `CategoricalRV`."""
207
206
 
208
207
  # We need a separate dispatch because Categorical expects logits in JAX
209
- def sample_fn(rng, size, dtype, p):
210
- rng_key = rng["jax_state"]
211
- rng_key, sampling_key = jax.random.split(rng_key, 2)
212
-
208
+ def sample_fn(rng_key, size, dtype, p):
213
209
  logits = jax.scipy.special.logit(p)
214
- sample = jax.random.categorical(sampling_key, logits=logits, shape=size)
215
- rng["jax_state"] = rng_key
216
- return (rng, sample)
210
+ sample = jax.random.categorical(rng_key, logits=logits, shape=size)
211
+ return sample
217
212
 
218
213
  return sample_fn
219
214
 
@@ -233,15 +228,10 @@ def jax_sample_fn_uniform(op, node):
233
228
  name = "randint"
234
229
  jax_op = getattr(jax.random, name)
235
230
 
236
- def sample_fn(rng, size, dtype, *parameters):
237
- rng_key = rng["jax_state"]
238
- rng_key, sampling_key = jax.random.split(rng_key, 2)
231
+ def sample_fn(rng_key, size, dtype, *parameters):
239
232
  minval, maxval = parameters
240
- sample = jax_op(
241
- sampling_key, shape=size, dtype=dtype, minval=minval, maxval=maxval
242
- )
243
- rng["jax_state"] = rng_key
244
- return (rng, sample)
233
+ sample = jax_op(rng_key, shape=size, dtype=dtype, minval=minval, maxval=maxval)
234
+ return sample
245
235
 
246
236
  return sample_fn
247
237
 
@@ -258,14 +248,11 @@ def jax_sample_fn_shape_scale(op, node):
258
248
  name = op.name
259
249
  jax_op = getattr(jax.random, name)
260
250
 
261
- def sample_fn(rng, size, dtype, shape, scale):
262
- rng_key = rng["jax_state"]
263
- rng_key, sampling_key = jax.random.split(rng_key, 2)
251
+ def sample_fn(rng_key, size, dtype, shape, scale):
264
252
  if size is None:
265
253
  size = jax.numpy.broadcast_arrays(shape, scale)[0].shape
266
- sample = jax_op(sampling_key, shape, size, dtype) * scale
267
- rng["jax_state"] = rng_key
268
- return (rng, sample)
254
+ sample = jax_op(rng_key, shape, size, dtype) * scale
255
+ return sample
269
256
 
270
257
  return sample_fn
271
258
 
@@ -274,14 +261,11 @@ def jax_sample_fn_shape_scale(op, node):
274
261
  def jax_sample_fn_exponential(op, node):
275
262
  """JAX implementation of `ExponentialRV`."""
276
263
 
277
- def sample_fn(rng, size, dtype, scale):
278
- rng_key = rng["jax_state"]
279
- rng_key, sampling_key = jax.random.split(rng_key, 2)
264
+ def sample_fn(rng_key, size, dtype, scale):
280
265
  if size is None:
281
266
  size = jax.numpy.asarray(scale).shape
282
- sample = jax.random.exponential(sampling_key, size, dtype) * scale
283
- rng["jax_state"] = rng_key
284
- return (rng, sample)
267
+ sample = jax.random.exponential(rng_key, size, dtype) * scale
268
+ return sample
285
269
 
286
270
  return sample_fn
287
271
 
@@ -290,14 +274,11 @@ def jax_sample_fn_exponential(op, node):
290
274
  def jax_sample_fn_t(op, node):
291
275
  """JAX implementation of `StudentTRV`."""
292
276
 
293
- def sample_fn(rng, size, dtype, df, loc, scale):
294
- rng_key = rng["jax_state"]
295
- rng_key, sampling_key = jax.random.split(rng_key, 2)
277
+ def sample_fn(rng_key, size, dtype, df, loc, scale):
296
278
  if size is None:
297
279
  size = jax.numpy.broadcast_arrays(df, loc, scale)[0].shape
298
- sample = loc + jax.random.t(sampling_key, df, size, dtype) * scale
299
- rng["jax_state"] = rng_key
300
- return (rng, sample)
280
+ sample = loc + jax.random.t(rng_key, df, size, dtype) * scale
281
+ return sample
301
282
 
302
283
  return sample_fn
303
284
 
@@ -315,10 +296,7 @@ def jax_funcify_choice(op: ptr.ChoiceWithoutReplacement, node):
315
296
  "A default JAX rewrite should have materialized the implicit arange"
316
297
  )
317
298
 
318
- def sample_fn(rng, size, dtype, *parameters):
319
- rng_key = rng["jax_state"]
320
- rng_key, sampling_key = jax.random.split(rng_key, 2)
321
-
299
+ def sample_fn(rng_key, size, dtype, *parameters):
322
300
  if op.has_p_param:
323
301
  a, p, core_shape = parameters
324
302
  else:
@@ -327,9 +305,7 @@ def jax_funcify_choice(op: ptr.ChoiceWithoutReplacement, node):
327
305
  core_shape = tuple(np.asarray(core_shape)[(0,) * batch_ndim])
328
306
 
329
307
  if batch_ndim == 0:
330
- sample = jax.random.choice(
331
- sampling_key, a, shape=core_shape, replace=False, p=p
332
- )
308
+ sample = jax.random.choice(rng_key, a, shape=core_shape, replace=False, p=p)
333
309
 
334
310
  else:
335
311
  if size is None:
@@ -345,7 +321,7 @@ def jax_funcify_choice(op: ptr.ChoiceWithoutReplacement, node):
345
321
  if p is not None:
346
322
  p = jax.numpy.broadcast_to(p, size + p.shape[batch_ndim:])
347
323
 
348
- batch_sampling_keys = jax.random.split(sampling_key, np.prod(size))
324
+ batch_sampling_keys = jax.random.split(rng_key, np.prod(size))
349
325
 
350
326
  # Ravel the batch dimensions because vmap only works along a single axis
351
327
  raveled_batch_a = a.reshape((-1,) + a.shape[batch_ndim:])
@@ -366,8 +342,7 @@ def jax_funcify_choice(op: ptr.ChoiceWithoutReplacement, node):
366
342
  # Reshape the batch dimensions
367
343
  sample = raveled_sample.reshape(size + raveled_sample.shape[1:])
368
344
 
369
- rng["jax_state"] = rng_key
370
- return (rng, sample)
345
+ return sample
371
346
 
372
347
  return sample_fn
373
348
 
@@ -378,9 +353,7 @@ def jax_sample_fn_permutation(op, node):
378
353
 
379
354
  batch_ndim = op.batch_ndim(node)
380
355
 
381
- def sample_fn(rng, size, dtype, *parameters):
382
- rng_key = rng["jax_state"]
383
- rng_key, sampling_key = jax.random.split(rng_key, 2)
356
+ def sample_fn(rng_key, size, dtype, *parameters):
384
357
  (x,) = parameters
385
358
  if batch_ndim:
386
359
  # jax.random.permutation has no concept of batch dims
@@ -389,17 +362,16 @@ def jax_sample_fn_permutation(op, node):
389
362
  else:
390
363
  x = jax.numpy.broadcast_to(x, size + x.shape[batch_ndim:])
391
364
 
392
- batch_sampling_keys = jax.random.split(sampling_key, np.prod(size))
365
+ batch_sampling_keys = jax.random.split(rng_key, np.prod(size))
393
366
  raveled_batch_x = x.reshape((-1,) + x.shape[batch_ndim:])
394
367
  raveled_sample = jax.vmap(lambda key, x: jax.random.permutation(key, x))(
395
368
  batch_sampling_keys, raveled_batch_x
396
369
  )
397
370
  sample = raveled_sample.reshape(size + raveled_sample.shape[1:])
398
371
  else:
399
- sample = jax.random.permutation(sampling_key, x)
372
+ sample = jax.random.permutation(rng_key, x)
400
373
 
401
- rng["jax_state"] = rng_key
402
- return (rng, sample)
374
+ return sample
403
375
 
404
376
  return sample_fn
405
377
 
@@ -414,38 +386,45 @@ def jax_sample_fn_binomial(op, node):
414
386
 
415
387
  from numpyro.distributions.util import binomial
416
388
 
417
- def sample_fn(rng, size, dtype, n, p):
418
- rng_key = rng["jax_state"]
419
- rng_key, sampling_key = jax.random.split(rng_key, 2)
420
-
421
- sample = binomial(key=sampling_key, n=n, p=p, shape=size)
422
-
423
- rng["jax_state"] = rng_key
424
-
425
- return (rng, sample)
389
+ def sample_fn(rng_key, size, dtype, n, p):
390
+ sample = binomial(key=rng_key, n=n, p=p, shape=size)
391
+ return sample
426
392
 
427
393
  return sample_fn
428
394
 
429
395
 
430
396
  @jax_sample_fn.register(ptr.MultinomialRV)
431
397
  def jax_sample_fn_multinomial(op, node):
432
- if not numpyro_available:
433
- raise NotImplementedError(
434
- f"No JAX implementation for the given distribution: {op.name}. "
435
- "Implementation is available if NumPyro is installed."
436
- )
437
-
438
- from numpyro.distributions.util import multinomial
439
-
440
- def sample_fn(rng, size, dtype, n, p):
441
- rng_key = rng["jax_state"]
442
- rng_key, sampling_key = jax.random.split(rng_key, 2)
443
-
444
- sample = multinomial(key=sampling_key, n=n, p=p, shape=size)
445
-
446
- rng["jax_state"] = rng_key
398
+ def sample_fn(rng_key, size, dtype, n, p):
399
+ if size is not None:
400
+ n = jnp.broadcast_to(n, size)
401
+ p = jnp.broadcast_to(p, size + jnp.shape(p)[-1:])
447
402
 
448
- return (rng, sample)
403
+ else:
404
+ broadcast_shape = jax.lax.broadcast_shapes(jnp.shape(n), jnp.shape(p)[:-1])
405
+ n = jnp.broadcast_to(n, broadcast_shape)
406
+ p = jnp.broadcast_to(p, broadcast_shape + jnp.shape(p)[-1:])
407
+
408
+ binom_p = jnp.moveaxis(p, -1, 0)[:-1, ...]
409
+ sampling_rng = jax.random.split(rng_key, binom_p.shape[0])
410
+
411
+ def _binomial_sample_fn(carry, p_rng):
412
+ s, rho = carry
413
+ p, rng = p_rng
414
+ samples = jax.random.binomial(rng, s, p / rho)
415
+ s = s - samples
416
+ rho = rho - p
417
+ return ((s, rho), samples)
418
+
419
+ (remain, _), samples = jax.lax.scan(
420
+ _binomial_sample_fn,
421
+ (n.astype(np.float64), jnp.ones(binom_p.shape[1:])),
422
+ (binom_p, sampling_rng),
423
+ )
424
+ sample = jnp.concatenate(
425
+ [jnp.moveaxis(samples, 0, -1), jnp.expand_dims(remain, -1)], axis=-1
426
+ )
427
+ return sample
449
428
 
450
429
  return sample_fn
451
430
 
@@ -460,17 +439,12 @@ def jax_sample_fn_vonmises(op, node):
460
439
 
461
440
  from numpyro.distributions.util import von_mises_centered
462
441
 
463
- def sample_fn(rng, size, dtype, mu, kappa):
464
- rng_key = rng["jax_state"]
465
- rng_key, sampling_key = jax.random.split(rng_key, 2)
466
-
442
+ def sample_fn(rng_key, size, dtype, mu, kappa):
467
443
  sample = von_mises_centered(
468
- key=sampling_key, concentration=kappa, shape=size, dtype=dtype
444
+ key=rng_key, concentration=kappa, shape=size, dtype=dtype
469
445
  )
470
446
  sample = (sample + mu + np.pi) % (2.0 * np.pi) - np.pi
471
447
 
472
- rng["jax_state"] = rng_key
473
-
474
- return (rng, sample)
448
+ return sample
475
449
 
476
450
  return sample_fn
@@ -29,7 +29,7 @@ def jax_funcify_Scan(op: Scan, **kwargs):
29
29
  # Extract JAX scan inputs
30
30
  outer_inputs = list(outer_inputs)
31
31
  n_steps = outer_inputs[0] # JAX `length`
32
- seqs = op.outer_seqs(outer_inputs) # JAX `xs`
32
+ seqs = [seq[:n_steps] for seq in op.outer_seqs(outer_inputs)] # JAX `xs`
33
33
 
34
34
  mit_sot_init = []
35
35
  for tap, seq in zip(
@@ -4,7 +4,7 @@ from pytensor.graph import Constant
4
4
  from pytensor.graph.basic import Apply
5
5
  from pytensor.graph.op import Op
6
6
  from pytensor.link.jax.dispatch.basic import jax_funcify
7
- from pytensor.tensor.shape import Reshape, Shape, Shape_i, SpecifyShape, Unbroadcast
7
+ from pytensor.tensor.shape import Reshape, Shape, Shape_i, SpecifyShape
8
8
  from pytensor.tensor.type import TensorType
9
9
 
10
10
 
@@ -104,11 +104,3 @@ def jax_funcify_SpecifyShape(op, node, **kwargs):
104
104
  return x
105
105
 
106
106
  return specifyshape
107
-
108
-
109
- @jax_funcify.register(Unbroadcast)
110
- def jax_funcify_Unbroadcast(op, **kwargs):
111
- def unbroadcast(x):
112
- return x
113
-
114
- return unbroadcast
@@ -0,0 +1 @@
1
+ import pytensor.link.jax.dispatch.signal.conv
@@ -0,0 +1,14 @@
1
+ import jax
2
+
3
+ from pytensor.link.jax.dispatch import jax_funcify
4
+ from pytensor.tensor.signal.conv import Conv1d
5
+
6
+
7
+ @jax_funcify.register(Conv1d)
8
+ def jax_funcify_Conv1d(op, node, **kwargs):
9
+ mode = op.mode
10
+
11
+ def conv1d(data, kernel):
12
+ return jax.numpy.convolve(data, kernel, mode=mode)
13
+
14
+ return conv1d
@@ -1,3 +1,5 @@
1
+ import warnings
2
+
1
3
  import jax
2
4
 
3
5
  from pytensor.link.jax.dispatch.basic import jax_funcify
@@ -39,13 +41,29 @@ def jax_funcify_Cholesky(op, **kwargs):
39
41
 
40
42
  @jax_funcify.register(Solve)
41
43
  def jax_funcify_Solve(op, **kwargs):
42
- if op.assume_a != "gen" and op.lower:
43
- lower = True
44
+ assume_a = op.assume_a
45
+ lower = op.lower
46
+
47
+ if assume_a == "tridiagonal":
48
+ # jax.scipy.solve does not yet support tridiagonal matrices
49
+ # But there's a jax.lax.linalg.tridiaonal_solve we can use instead.
50
+ def solve(a, b):
51
+ dl = jax.numpy.diagonal(a, offset=-1, axis1=-2, axis2=-1)
52
+ d = jax.numpy.diagonal(a, offset=0, axis1=-2, axis2=-1)
53
+ du = jax.numpy.diagonal(a, offset=1, axis1=-2, axis2=-1)
54
+ return jax.lax.linalg.tridiagonal_solve(dl, d, du, b, lower=lower)
55
+
44
56
  else:
45
- lower = False
57
+ if assume_a not in ("gen", "sym", "her", "pos"):
58
+ warnings.warn(
59
+ f"JAX solve does not support assume_a={op.assume_a}. Defaulting to assume_a='gen'.\n"
60
+ f"If appropriate, you may want to set assume_a to one of 'sym', 'pos', 'her' or 'tridiagonal' to improve performance.",
61
+ UserWarning,
62
+ )
63
+ assume_a = "gen"
46
64
 
47
- def solve(a, b, lower=lower):
48
- return jax.scipy.linalg.solve(a, b, lower=lower)
65
+ def solve(a, b):
66
+ return jax.scipy.linalg.solve(a, b, lower=lower, assume_a=assume_a)
49
67
 
50
68
  return solve
51
69
 
@@ -9,9 +9,11 @@ import pytensor.link.numba.dispatch.nlinalg
9
9
  import pytensor.link.numba.dispatch.random
10
10
  import pytensor.link.numba.dispatch.scan
11
11
  import pytensor.link.numba.dispatch.scalar
12
+ import pytensor.link.numba.dispatch.signal
12
13
  import pytensor.link.numba.dispatch.slinalg
13
14
  import pytensor.link.numba.dispatch.sparse
14
15
  import pytensor.link.numba.dispatch.subtensor
15
16
  import pytensor.link.numba.dispatch.tensor_basic
16
17
 
18
+
17
19
  # isort: on