pytensor 2.29.0__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.29.0/pytensor.egg-info → pytensor-2.30.0}/PKG-INFO +3 -2
  2. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/_version.py +3 -3
  3. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/op.py +1 -1
  4. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/__init__.py +1 -0
  5. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/random.py +84 -110
  6. pytensor-2.30.0/pytensor/link/jax/dispatch/signal/__init__.py +1 -0
  7. pytensor-2.30.0/pytensor/link/jax/dispatch/signal/conv.py +14 -0
  8. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/__init__.py +2 -0
  9. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/basic.py +14 -1
  10. {pytensor-2.29.0/pytensor/link/numba/dispatch → pytensor-2.30.0/pytensor/link/numba/dispatch/linalg}/_LAPACK.py +67 -0
  11. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +66 -0
  12. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +87 -0
  13. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/general.py +256 -0
  14. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/norm.py +58 -0
  15. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/posdef.py +223 -0
  16. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +228 -0
  17. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/triangular.py +116 -0
  18. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +299 -0
  19. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/utils.py +11 -0
  20. pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/utils.py +108 -0
  21. pytensor-2.30.0/pytensor/link/numba/dispatch/signal/__init__.py +1 -0
  22. pytensor-2.30.0/pytensor/link/numba/dispatch/signal/conv.py +16 -0
  23. pytensor-2.30.0/pytensor/link/numba/dispatch/slinalg.py +213 -0
  24. pytensor-2.30.0/pytensor/misc/__init__.py +0 -0
  25. pytensor-2.30.0/pytensor/py.typed +0 -0
  26. pytensor-2.30.0/pytensor/sparse/sandbox/__init__.py +0 -0
  27. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/__init__.py +1 -0
  28. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/basic.py +17 -1
  29. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/math.py +6 -0
  30. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/nlinalg.py +77 -0
  31. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/sharedvar.py +0 -6
  32. pytensor-2.30.0/pytensor/tensor/signal/__init__.py +4 -0
  33. pytensor-2.30.0/pytensor/tensor/signal/conv.py +132 -0
  34. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/slinalg.py +2 -1
  35. {pytensor-2.29.0 → pytensor-2.30.0/pytensor.egg-info}/PKG-INFO +3 -2
  36. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor.egg-info/SOURCES.txt +20 -1
  37. pytensor-2.29.0/pytensor/link/numba/dispatch/slinalg.py +0 -1197
  38. {pytensor-2.29.0 → pytensor-2.30.0}/LICENSE.txt +0 -0
  39. {pytensor-2.29.0 → pytensor-2.30.0}/MANIFEST.in +0 -0
  40. {pytensor-2.29.0 → pytensor-2.30.0}/README.rst +0 -0
  41. {pytensor-2.29.0 → pytensor-2.30.0}/doc/.templates/PLACEHOLDER +0 -0
  42. {pytensor-2.29.0 → pytensor-2.30.0}/doc/.templates/layout.html +0 -0
  43. {pytensor-2.29.0 → pytensor-2.30.0}/doc/.templates/nb-badges.html +0 -0
  44. {pytensor-2.29.0 → pytensor-2.30.0}/doc/.templates/rendered_citation.html +0 -0
  45. {pytensor-2.29.0 → pytensor-2.30.0}/doc/LICENSE.txt +0 -0
  46. {pytensor-2.29.0 → pytensor-2.30.0}/doc/README.md +0 -0
  47. {pytensor-2.29.0 → pytensor-2.30.0}/doc/acknowledgement.rst +0 -0
  48. {pytensor-2.29.0 → pytensor-2.30.0}/doc/bcast.png +0 -0
  49. {pytensor-2.29.0 → pytensor-2.30.0}/doc/bcast.svg +0 -0
  50. {pytensor-2.29.0 → pytensor-2.30.0}/doc/blog.md +0 -0
  51. {pytensor-2.29.0 → pytensor-2.30.0}/doc/conf.py +0 -0
  52. {pytensor-2.29.0 → pytensor-2.30.0}/doc/core_development_guide.rst +0 -0
  53. {pytensor-2.29.0 → pytensor-2.30.0}/doc/css.inc +0 -0
  54. {pytensor-2.29.0 → pytensor-2.30.0}/doc/dev_start_guide.rst +0 -0
  55. {pytensor-2.29.0 → pytensor-2.30.0}/doc/environment.yml +0 -0
  56. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/apply.png +0 -0
  57. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/apply.svg +0 -0
  58. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/apply2.svg +0 -0
  59. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/creating_a_c_op.rst +0 -0
  60. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  61. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/creating_an_op.rst +0 -0
  62. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/ctype.rst +0 -0
  63. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/extending_faq.rst +0 -0
  64. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
  65. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/graph_rewriting.rst +0 -0
  66. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/graphstructures.rst +0 -0
  67. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/index.rst +0 -0
  68. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/inplace.rst +0 -0
  69. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/op.rst +0 -0
  70. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/other_ops.rst +0 -0
  71. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  72. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  73. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/pipeline.rst +0 -0
  74. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/scan.rst +0 -0
  75. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/tips.rst +0 -0
  76. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/type.rst +0 -0
  77. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/unittest.rst +0 -0
  78. {pytensor-2.29.0 → pytensor-2.30.0}/doc/extending/using_params.rst +0 -0
  79. {pytensor-2.29.0 → pytensor-2.30.0}/doc/faq.rst +0 -0
  80. {pytensor-2.29.0 → pytensor-2.30.0}/doc/gallery/page_footer.md +0 -0
  81. {pytensor-2.29.0 → pytensor-2.30.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  82. {pytensor-2.29.0 → pytensor-2.30.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  83. {pytensor-2.29.0 → pytensor-2.30.0}/doc/generate_dtype_tensor_table.py +0 -0
  84. {pytensor-2.29.0 → pytensor-2.30.0}/doc/glossary.rst +0 -0
  85. {pytensor-2.29.0 → pytensor-2.30.0}/doc/images/Elman_srnn.png +0 -0
  86. {pytensor-2.29.0 → pytensor-2.30.0}/doc/images/PyTensor.png +0 -0
  87. {pytensor-2.29.0 → pytensor-2.30.0}/doc/images/PyTensor_RGB.svg +0 -0
  88. {pytensor-2.29.0 → pytensor-2.30.0}/doc/images/PyTensor_logo.png +0 -0
  89. {pytensor-2.29.0 → pytensor-2.30.0}/doc/images/binder.svg +0 -0
  90. {pytensor-2.29.0 → pytensor-2.30.0}/doc/images/blocksparse.png +0 -0
  91. {pytensor-2.29.0 → pytensor-2.30.0}/doc/images/colab.svg +0 -0
  92. {pytensor-2.29.0 → pytensor-2.30.0}/doc/images/github.svg +0 -0
  93. {pytensor-2.29.0 → pytensor-2.30.0}/doc/images/lstm.png +0 -0
  94. {pytensor-2.29.0 → pytensor-2.30.0}/doc/images/lstm_memorycell.png +0 -0
  95. {pytensor-2.29.0 → pytensor-2.30.0}/doc/images/talk2010.gif +0 -0
  96. {pytensor-2.29.0 → pytensor-2.30.0}/doc/images/talk2010.png +0 -0
  97. {pytensor-2.29.0 → pytensor-2.30.0}/doc/index.rst +0 -0
  98. {pytensor-2.29.0 → pytensor-2.30.0}/doc/install.rst +0 -0
  99. {pytensor-2.29.0 → pytensor-2.30.0}/doc/internal/how_to_release.rst +0 -0
  100. {pytensor-2.29.0 → pytensor-2.30.0}/doc/internal/index.rst +0 -0
  101. {pytensor-2.29.0 → pytensor-2.30.0}/doc/internal/metadocumentation.rst +0 -0
  102. {pytensor-2.29.0 → pytensor-2.30.0}/doc/introduction.rst +0 -0
  103. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/compile/debugmode.rst +0 -0
  104. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/compile/function.rst +0 -0
  105. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/compile/index.rst +0 -0
  106. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/compile/io.rst +0 -0
  107. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/compile/mode.rst +0 -0
  108. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/compile/nanguardmode.rst +0 -0
  109. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/compile/opfromgraph.rst +0 -0
  110. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/compile/ops.rst +0 -0
  111. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/compile/profilemode.rst +0 -0
  112. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/compile/shared.rst +0 -0
  113. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/config.rst +0 -0
  114. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  115. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  116. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  117. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  118. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  119. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  120. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  121. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp.html +0 -0
  122. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp.png +0 -0
  123. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp2.html +0 -0
  124. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  125. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp2.png +0 -0
  126. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/ofg.html +0 -0
  127. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/examples/ofg2.html +0 -0
  128. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/index.ipynb +0 -0
  129. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/index.rst +0 -0
  130. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  131. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  132. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  133. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  134. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/graph/features.rst +0 -0
  135. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/graph/fgraph.rst +0 -0
  136. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/graph/graph.rst +0 -0
  137. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/graph/index.rst +0 -0
  138. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/graph/op.rst +0 -0
  139. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/graph/replace.rst +0 -0
  140. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/graph/type.rst +0 -0
  141. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/graph/utils.rst +0 -0
  142. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/index.rst +0 -0
  143. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/misc/pkl_utils.rst +0 -0
  144. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/printing.rst +0 -0
  145. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/scalar/index.rst +0 -0
  146. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/scan.rst +0 -0
  147. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/sparse/index.rst +0 -0
  148. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/sparse/sandbox.rst +0 -0
  149. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/basic.rst +0 -0
  150. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/basic_opt.rst +0 -0
  151. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/bcast.png +0 -0
  152. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/bcast.svg +0 -0
  153. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/conv.rst +0 -0
  154. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/elemwise.rst +0 -0
  155. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/extra_ops.rst +0 -0
  156. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/fft.rst +0 -0
  157. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/functional.rst +0 -0
  158. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/index.rst +0 -0
  159. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/io.rst +0 -0
  160. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/math_opt.rst +0 -0
  161. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/nlinalg.rst +0 -0
  162. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/plot_fft.png +0 -0
  163. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/random/distributions.rst +0 -0
  164. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/random/index.rst +0 -0
  165. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/slinalg.rst +0 -0
  166. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/tensor/utils.rst +0 -0
  167. {pytensor-2.29.0 → pytensor-2.30.0}/doc/library/typed_list.rst +0 -0
  168. {pytensor-2.29.0 → pytensor-2.30.0}/doc/links.rst +0 -0
  169. {pytensor-2.29.0 → pytensor-2.30.0}/doc/optimizations.rst +0 -0
  170. {pytensor-2.29.0 → pytensor-2.30.0}/doc/pylintrc +0 -0
  171. {pytensor-2.29.0 → pytensor-2.30.0}/doc/robots.txt +0 -0
  172. {pytensor-2.29.0 → pytensor-2.30.0}/doc/troubleshooting.rst +0 -0
  173. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/adding.rst +0 -0
  174. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/adding_solution_1.py +0 -0
  175. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/aliasing.rst +0 -0
  176. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/apply.png +0 -0
  177. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/apply.svg +0 -0
  178. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/bcast.png +0 -0
  179. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/broadcasting.rst +0 -0
  180. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/conditions.rst +0 -0
  181. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/debug_faq.rst +0 -0
  182. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/dlogistic.png +0 -0
  183. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/examples.rst +0 -0
  184. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/faq_tutorial.rst +0 -0
  185. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/gradients.rst +0 -0
  186. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/index.rst +0 -0
  187. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/loading_and_saving.rst +0 -0
  188. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/logistic.gp +0 -0
  189. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/logistic.png +0 -0
  190. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/loop.rst +0 -0
  191. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/loop_solution_1.py +0 -0
  192. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/modes.rst +0 -0
  193. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/modes_solution_1.py +0 -0
  194. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/multi_cores.rst +0 -0
  195. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/nan_tutorial.rst +0 -0
  196. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/pics/d3viz.png +0 -0
  197. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  198. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  199. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  200. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/printing_drawing.rst +0 -0
  201. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/prng.rst +0 -0
  202. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/profiling.rst +0 -0
  203. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/profiling_example.py +0 -0
  204. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/profiling_example_out.prof +0 -0
  205. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/shape_info.rst +0 -0
  206. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/sparse.rst +0 -0
  207. {pytensor-2.29.0 → pytensor-2.30.0}/doc/tutorial/symbolic_graphs.rst +0 -0
  208. {pytensor-2.29.0 → pytensor-2.30.0}/doc/user_guide.rst +0 -0
  209. {pytensor-2.29.0 → pytensor-2.30.0}/pyproject.toml +0 -0
  210. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/__init__.py +0 -0
  211. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/bin/__init__.py +0 -0
  212. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/bin/pytensor_cache.py +0 -0
  213. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/breakpoint.py +0 -0
  214. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/__init__.py +0 -0
  215. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/builders.py +0 -0
  216. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/compiledir.py +0 -0
  217. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/compilelock.py +0 -0
  218. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/debugmode.py +0 -0
  219. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/function/__init__.py +0 -0
  220. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/function/pfunc.py +0 -0
  221. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/function/types.py +0 -0
  222. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/io.py +0 -0
  223. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/mode.py +0 -0
  224. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/monitormode.py +0 -0
  225. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/nanguardmode.py +0 -0
  226. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/ops.py +0 -0
  227. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/profiling.py +0 -0
  228. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/compile/sharedvalue.py +0 -0
  229. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/configdefaults.py +0 -0
  230. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/configparser.py +0 -0
  231. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/d3viz/__init__.py +0 -0
  232. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  233. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/d3viz/css/d3viz.css +0 -0
  234. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/d3viz/d3viz.py +0 -0
  235. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/d3viz/formatting.py +0 -0
  236. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  237. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  238. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/d3viz/js/d3viz.js +0 -0
  239. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  240. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  241. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/gradient.py +0 -0
  242. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/__init__.py +0 -0
  243. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/basic.py +0 -0
  244. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/destroyhandler.py +0 -0
  245. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/features.py +0 -0
  246. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/fg.py +0 -0
  247. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/null_type.py +0 -0
  248. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/replace.py +0 -0
  249. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/rewriting/__init__.py +0 -0
  250. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/rewriting/basic.py +0 -0
  251. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/rewriting/db.py +0 -0
  252. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/rewriting/kanren.py +0 -0
  253. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/rewriting/unify.py +0 -0
  254. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/rewriting/utils.py +0 -0
  255. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/type.py +0 -0
  256. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/graph/utils.py +0 -0
  257. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/ifelse.py +0 -0
  258. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/__init__.py +0 -0
  259. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/basic.py +0 -0
  260. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/c/__init__.py +0 -0
  261. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/c/basic.py +0 -0
  262. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  263. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  264. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/c/cmodule.py +0 -0
  265. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/c/cutils.py +0 -0
  266. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/c/cvm.py +0 -0
  267. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/c/exceptions.py +0 -0
  268. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/c/interface.py +0 -0
  269. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/c/lazylinker_c.py +0 -0
  270. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/c/op.py +0 -0
  271. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/c/params_type.py +0 -0
  272. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/c/type.py +0 -0
  273. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/__init__.py +0 -0
  274. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/basic.py +0 -0
  275. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/blas.py +0 -0
  276. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  277. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
  278. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  279. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  280. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/math.py +0 -0
  281. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  282. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/pad.py +0 -0
  283. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/scalar.py +0 -0
  284. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/scan.py +0 -0
  285. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/shape.py +0 -0
  286. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/slinalg.py +0 -0
  287. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/sort.py +0 -0
  288. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
  289. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  290. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  291. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/jax/linker.py +0 -0
  292. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/__init__.py +0 -0
  293. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  294. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  295. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/elemwise.py +0 -0
  296. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  297. {pytensor-2.29.0/pytensor/misc → pytensor-2.30.0/pytensor/link/numba/dispatch/linalg}/__init__.py +0 -0
  298. {pytensor-2.29.0/pytensor/sparse/sandbox → pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/decomposition}/__init__.py +0 -0
  299. /pytensor-2.29.0/pytensor/py.typed → /pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
  300. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
  301. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/random.py +0 -0
  302. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/scalar.py +0 -0
  303. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/scan.py +0 -0
  304. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/sparse.py +0 -0
  305. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  306. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  307. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  308. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/numba/linker.py +0 -0
  309. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  310. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  311. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  312. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  313. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  314. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  315. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
  316. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
  317. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  318. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  319. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  320. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  321. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/pytorch/linker.py +0 -0
  322. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/utils.py +0 -0
  323. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/link/vm.py +0 -0
  324. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/misc/check_blas.py +0 -0
  325. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/misc/check_blas_many.sh +0 -0
  326. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/misc/check_duplicate_key.py +0 -0
  327. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  328. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/misc/elemwise_time_test.py +0 -0
  329. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/misc/frozendict.py +0 -0
  330. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/misc/may_share_memory.py +0 -0
  331. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/misc/ordered_set.py +0 -0
  332. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/misc/pkl_utils.py +0 -0
  333. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/npy_2_compat.py +0 -0
  334. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/printing.py +0 -0
  335. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/raise_op.py +0 -0
  336. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scalar/__init__.py +0 -0
  337. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scalar/basic.py +0 -0
  338. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  339. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  340. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scalar/c_code/gamma.c +0 -0
  341. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scalar/c_code/incbet.c +0 -0
  342. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scalar/loop.py +0 -0
  343. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scalar/math.py +0 -0
  344. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scalar/sharedvar.py +0 -0
  345. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scan/__init__.py +0 -0
  346. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scan/basic.py +0 -0
  347. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scan/checkpoints.py +0 -0
  348. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scan/op.py +0 -0
  349. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scan/rewriting.py +0 -0
  350. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scan/scan_perform.pyx +0 -0
  351. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scan/scan_perform_ext.py +0 -0
  352. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scan/utils.py +0 -0
  353. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/scan/views.py +0 -0
  354. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/sparse/__init__.py +0 -0
  355. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/sparse/basic.py +0 -0
  356. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/sparse/rewriting.py +0 -0
  357. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/sparse/sandbox/sp.py +0 -0
  358. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/sparse/sandbox/sp2.py +0 -0
  359. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/sparse/sharedvar.py +0 -0
  360. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/sparse/type.py +0 -0
  361. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/sparse/utils.py +0 -0
  362. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/blas.py +0 -0
  363. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/blas_c.py +0 -0
  364. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/blas_headers.py +0 -0
  365. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/blas_scipy.py +0 -0
  366. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/blockwise.py +0 -0
  367. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  368. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  369. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  370. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/conv/__init__.py +0 -0
  371. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/conv/abstract_conv.py +0 -0
  372. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/einsum.py +0 -0
  373. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/elemwise.py +0 -0
  374. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/elemwise_cgen.py +0 -0
  375. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/exceptions.py +0 -0
  376. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/extra_ops.py +0 -0
  377. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/fft.py +0 -0
  378. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/fourier.py +0 -0
  379. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/functional.py +0 -0
  380. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/inplace.py +0 -0
  381. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/interpolate.py +0 -0
  382. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/io.py +0 -0
  383. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/linalg.py +0 -0
  384. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/pad.py +0 -0
  385. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/random/__init__.py +0 -0
  386. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/random/basic.py +0 -0
  387. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/random/op.py +0 -0
  388. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  389. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
  390. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
  391. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
  392. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/random/type.py +0 -0
  393. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/random/utils.py +0 -0
  394. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/random/var.py +0 -0
  395. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/__init__.py +0 -0
  396. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/basic.py +0 -0
  397. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/blas.py +0 -0
  398. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/blas_c.py +0 -0
  399. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
  400. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/blockwise.py +0 -0
  401. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/einsum.py +0 -0
  402. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/elemwise.py +0 -0
  403. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  404. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/jax.py +0 -0
  405. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/linalg.py +0 -0
  406. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/math.py +0 -0
  407. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/numba.py +0 -0
  408. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/ofg.py +0 -0
  409. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/shape.py +0 -0
  410. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/special.py +0 -0
  411. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/subtensor.py +0 -0
  412. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  413. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/shape.py +0 -0
  414. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/sort.py +0 -0
  415. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/special.py +0 -0
  416. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/subtensor.py +0 -0
  417. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/type.py +0 -0
  418. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/type_other.py +0 -0
  419. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/utils.py +0 -0
  420. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/var.py +0 -0
  421. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/variable.py +0 -0
  422. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/tensor/xlogx.py +0 -0
  423. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/typed_list/__init__.py +0 -0
  424. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/typed_list/basic.py +0 -0
  425. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/typed_list/rewriting.py +0 -0
  426. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/typed_list/type.py +0 -0
  427. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/updates.py +0 -0
  428. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor/utils.py +0 -0
  429. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor.egg-info/dependency_links.txt +0 -0
  430. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor.egg-info/entry_points.txt +0 -0
  431. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor.egg-info/requires.txt +0 -0
  432. {pytensor-2.29.0 → pytensor-2.30.0}/pytensor.egg-info/top_level.txt +0 -0
  433. {pytensor-2.29.0 → pytensor-2.30.0}/scripts/mypy-failing.txt +0 -0
  434. {pytensor-2.29.0 → pytensor-2.30.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  435. {pytensor-2.29.0 → pytensor-2.30.0}/setup.cfg +0 -0
  436. {pytensor-2.29.0 → pytensor-2.30.0}/setup.py +0 -0
  437. {pytensor-2.29.0 → pytensor-2.30.0}/tests/link/c/c_code/test_cenum.h +0 -0
  438. {pytensor-2.29.0 → pytensor-2.30.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  439. {pytensor-2.29.0 → pytensor-2.30.0}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
  440. {pytensor-2.29.0 → pytensor-2.30.0}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
  441. {pytensor-2.29.0 → pytensor-2.30.0}/tests/test_breakpoint.py +0 -0
  442. {pytensor-2.29.0 → pytensor-2.30.0}/tests/test_config.py +0 -0
  443. {pytensor-2.29.0 → pytensor-2.30.0}/tests/test_gradient.py +0 -0
  444. {pytensor-2.29.0 → pytensor-2.30.0}/tests/test_ifelse.py +0 -0
  445. {pytensor-2.29.0 → pytensor-2.30.0}/tests/test_printing.py +0 -0
  446. {pytensor-2.29.0 → pytensor-2.30.0}/tests/test_raise_op.py +0 -0
  447. {pytensor-2.29.0 → pytensor-2.30.0}/tests/test_rop.py +0 -0
  448. {pytensor-2.29.0 → 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.29.0
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
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-03-18T14:02:26+0100",
11
+ "date": "2025-03-28T02:16:52+0800",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "a149f6c996bd0499406150853bef517e7d7a3c4f",
15
- "version": "2.29.0"
14
+ "full-revisionid": "0b56ed9c6514e4ba641cb07fd7bbca629dd797c3",
15
+ "version": "2.30.0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -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,
@@ -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
@@ -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
@@ -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
@@ -33,6 +33,7 @@ from pytensor.link.utils import (
33
33
  from pytensor.scalar.basic import ScalarType
34
34
  from pytensor.scalar.math import Softplus
35
35
  from pytensor.sparse import SparseTensorType
36
+ from pytensor.tensor.basic import Nonzero
36
37
  from pytensor.tensor.blas import BatchedDot
37
38
  from pytensor.tensor.math import Dot
38
39
  from pytensor.tensor.shape import Reshape, Shape, Shape_i, SpecifyShape
@@ -74,7 +75,7 @@ def numba_njit(*args, fastmath=None, **kwargs):
74
75
  message=(
75
76
  "(\x1b\\[1m)*" # ansi escape code for bold text
76
77
  "Cannot cache compiled function "
77
- '"(numba_funcified_fgraph|store_core_outputs)" '
78
+ '"(numba_funcified_fgraph|store_core_outputs|cholesky|solve|solve_triangular|cho_solve)" '
78
79
  "as it uses dynamic globals"
79
80
  ),
80
81
  category=NumbaWarning,
@@ -657,3 +658,15 @@ def numba_funcify_IfElse(op, **kwargs):
657
658
  return res[0]
658
659
 
659
660
  return ifelse
661
+
662
+
663
+ @numba_funcify.register(Nonzero)
664
+ def numba_funcify_Nonzero(op, node, **kwargs):
665
+ @numba_njit
666
+ def nonzero(a):
667
+ result_tuple = np.nonzero(a)
668
+ if a.ndim == 1:
669
+ return result_tuple[0]
670
+ return list(result_tuple)
671
+
672
+ return nonzero
@@ -390,3 +390,70 @@ class _LAPACK:
390
390
  _ptr_int, # INFO
391
391
  )
392
392
  return functype(lapack_ptr)
393
+
394
+ @classmethod
395
+ def numba_xgttrf(cls, dtype):
396
+ """
397
+ Compute the LU factorization of a tridiagonal matrix A using row interchanges.
398
+
399
+ Called by scipy.linalg.lu_factor
400
+ """
401
+ lapack_ptr, float_pointer = _get_lapack_ptr_and_ptr_type(dtype, "gttrf")
402
+ functype = ctypes.CFUNCTYPE(
403
+ None,
404
+ _ptr_int, # N
405
+ float_pointer, # DL
406
+ float_pointer, # D
407
+ float_pointer, # DU
408
+ float_pointer, # DU2
409
+ _ptr_int, # IPIV
410
+ _ptr_int, # INFO
411
+ )
412
+ return functype(lapack_ptr)
413
+
414
+ @classmethod
415
+ def numba_xgttrs(cls, dtype):
416
+ """
417
+ Solve a system of linear equations A @ X = B with a tridiagonal matrix A using the LU factorization computed by numba_gttrf.
418
+
419
+ Called by scipy.linalg.lu_solve
420
+ """
421
+ lapack_ptr, float_pointer = _get_lapack_ptr_and_ptr_type(dtype, "gttrs")
422
+ functype = ctypes.CFUNCTYPE(
423
+ None,
424
+ _ptr_int, # TRANS
425
+ _ptr_int, # N
426
+ _ptr_int, # NRHS
427
+ float_pointer, # DL
428
+ float_pointer, # D
429
+ float_pointer, # DU
430
+ float_pointer, # DU2
431
+ _ptr_int, # IPIV
432
+ float_pointer, # B
433
+ _ptr_int, # LDB
434
+ _ptr_int, # INFO
435
+ )
436
+ return functype(lapack_ptr)
437
+
438
+ @classmethod
439
+ def numba_xgtcon(cls, dtype):
440
+ """
441
+ Estimate the reciprocal of the condition number of a tridiagonal matrix A using the LU factorization computed by numba_gttrf.
442
+ """
443
+ lapack_ptr, float_pointer = _get_lapack_ptr_and_ptr_type(dtype, "gtcon")
444
+ functype = ctypes.CFUNCTYPE(
445
+ None,
446
+ _ptr_int, # NORM
447
+ _ptr_int, # N
448
+ float_pointer, # DL
449
+ float_pointer, # D
450
+ float_pointer, # DU
451
+ float_pointer, # DU2
452
+ _ptr_int, # IPIV
453
+ float_pointer, # ANORM
454
+ float_pointer, # RCOND
455
+ float_pointer, # WORK
456
+ _ptr_int, # IWORK
457
+ _ptr_int, # INFO
458
+ )
459
+ return functype(lapack_ptr)
@@ -0,0 +1,66 @@
1
+ import numpy as np
2
+ from numba.core.extending import overload
3
+ from numba.np.linalg import _copy_to_fortran_order, ensure_lapack
4
+ from scipy import linalg
5
+
6
+ from pytensor.link.numba.dispatch.linalg._LAPACK import (
7
+ _LAPACK,
8
+ _get_underlying_float,
9
+ int_ptr_to_val,
10
+ val_to_int_ptr,
11
+ )
12
+ from pytensor.link.numba.dispatch.linalg.utils import _check_scipy_linalg_matrix
13
+
14
+
15
+ def _cholesky(a, lower=False, overwrite_a=False, check_finite=True):
16
+ return (
17
+ linalg.cholesky(
18
+ a, lower=lower, overwrite_a=overwrite_a, check_finite=check_finite
19
+ ),
20
+ 0,
21
+ )
22
+
23
+
24
+ @overload(_cholesky)
25
+ def cholesky_impl(A, lower=0, overwrite_a=False, check_finite=True):
26
+ ensure_lapack()
27
+ _check_scipy_linalg_matrix(A, "cholesky")
28
+ dtype = A.dtype
29
+ w_type = _get_underlying_float(dtype)
30
+ numba_potrf = _LAPACK().numba_xpotrf(dtype)
31
+
32
+ def impl(A, lower=0, overwrite_a=False, check_finite=True):
33
+ _N = np.int32(A.shape[-1])
34
+ if A.shape[-2] != _N:
35
+ raise linalg.LinAlgError("Last 2 dimensions of A must be square")
36
+
37
+ UPLO = val_to_int_ptr(ord("L") if lower else ord("U"))
38
+ N = val_to_int_ptr(_N)
39
+ LDA = val_to_int_ptr(_N)
40
+ INFO = val_to_int_ptr(0)
41
+
42
+ if overwrite_a and A.flags.f_contiguous:
43
+ A_copy = A
44
+ else:
45
+ A_copy = _copy_to_fortran_order(A)
46
+
47
+ numba_potrf(
48
+ UPLO,
49
+ N,
50
+ A_copy.view(w_type).ctypes,
51
+ LDA,
52
+ INFO,
53
+ )
54
+
55
+ if lower:
56
+ for j in range(1, _N):
57
+ for i in range(j):
58
+ A_copy[i, j] = 0.0
59
+ else:
60
+ for j in range(_N):
61
+ for i in range(j + 1, _N):
62
+ A_copy[i, j] = 0.0
63
+
64
+ return A_copy, int_ptr_to_val(INFO)
65
+
66
+ return impl