pytensor 2.31.0__tar.gz → 2.31.2__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 (456) hide show
  1. {pytensor-2.31.0/pytensor.egg-info → pytensor-2.31.2}/PKG-INFO +1 -1
  2. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/_version.py +3 -3
  3. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/mode.py +2 -0
  4. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/slinalg.py +15 -1
  5. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/basic.py +1 -26
  6. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/elemwise.py +1 -1
  7. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +1 -1
  8. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/nlinalg.py +3 -3
  9. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/scalar.py +20 -1
  10. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/rewriting.py +4 -6
  11. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/__init__.py +1 -0
  12. pytensor-2.31.2/pytensor/tensor/_linalg/__init__.py +2 -0
  13. pytensor-2.31.2/pytensor/tensor/_linalg/solve/__init__.py +2 -0
  14. pytensor-2.31.2/pytensor/tensor/_linalg/solve/rewriting.py +209 -0
  15. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/blas.py +14 -9
  16. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/blas_c.py +113 -128
  17. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/blockwise.py +22 -2
  18. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/blas.py +1 -1
  19. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/linalg.py +7 -0
  20. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/subtensor.py +10 -1
  21. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/signal/conv.py +84 -2
  22. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/type.py +1 -1
  23. {pytensor-2.31.0 → pytensor-2.31.2/pytensor.egg-info}/PKG-INFO +1 -1
  24. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor.egg-info/SOURCES.txt +3 -0
  25. {pytensor-2.31.0 → pytensor-2.31.2}/LICENSE.txt +0 -0
  26. {pytensor-2.31.0 → pytensor-2.31.2}/MANIFEST.in +0 -0
  27. {pytensor-2.31.0 → pytensor-2.31.2}/README.rst +0 -0
  28. {pytensor-2.31.0 → pytensor-2.31.2}/doc/.templates/PLACEHOLDER +0 -0
  29. {pytensor-2.31.0 → pytensor-2.31.2}/doc/.templates/layout.html +0 -0
  30. {pytensor-2.31.0 → pytensor-2.31.2}/doc/.templates/nb-badges.html +0 -0
  31. {pytensor-2.31.0 → pytensor-2.31.2}/doc/.templates/rendered_citation.html +0 -0
  32. {pytensor-2.31.0 → pytensor-2.31.2}/doc/LICENSE.txt +0 -0
  33. {pytensor-2.31.0 → pytensor-2.31.2}/doc/README.md +0 -0
  34. {pytensor-2.31.0 → pytensor-2.31.2}/doc/acknowledgement.rst +0 -0
  35. {pytensor-2.31.0 → pytensor-2.31.2}/doc/bcast.png +0 -0
  36. {pytensor-2.31.0 → pytensor-2.31.2}/doc/bcast.svg +0 -0
  37. {pytensor-2.31.0 → pytensor-2.31.2}/doc/blog.md +0 -0
  38. {pytensor-2.31.0 → pytensor-2.31.2}/doc/conf.py +0 -0
  39. {pytensor-2.31.0 → pytensor-2.31.2}/doc/core_development_guide.rst +0 -0
  40. {pytensor-2.31.0 → pytensor-2.31.2}/doc/css.inc +0 -0
  41. {pytensor-2.31.0 → pytensor-2.31.2}/doc/dev_start_guide.rst +0 -0
  42. {pytensor-2.31.0 → pytensor-2.31.2}/doc/environment.yml +0 -0
  43. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/apply.png +0 -0
  44. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/apply.svg +0 -0
  45. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/apply2.svg +0 -0
  46. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/creating_a_c_op.rst +0 -0
  47. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  48. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/creating_an_op.rst +0 -0
  49. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/ctype.rst +0 -0
  50. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/extending_faq.rst +0 -0
  51. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/extending_pytensor_solution_1.py +0 -0
  52. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/graph_rewriting.rst +0 -0
  53. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/graphstructures.rst +0 -0
  54. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/index.rst +0 -0
  55. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/inplace.rst +0 -0
  56. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/op.rst +0 -0
  57. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/other_ops.rst +0 -0
  58. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  59. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  60. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/pipeline.rst +0 -0
  61. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/scan.rst +0 -0
  62. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/tips.rst +0 -0
  63. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/type.rst +0 -0
  64. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/unittest.rst +0 -0
  65. {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/using_params.rst +0 -0
  66. {pytensor-2.31.0 → pytensor-2.31.2}/doc/faq.rst +0 -0
  67. {pytensor-2.31.0 → pytensor-2.31.2}/doc/gallery/page_footer.md +0 -0
  68. {pytensor-2.31.0 → pytensor-2.31.2}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  69. {pytensor-2.31.0 → pytensor-2.31.2}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  70. {pytensor-2.31.0 → pytensor-2.31.2}/doc/generate_dtype_tensor_table.py +0 -0
  71. {pytensor-2.31.0 → pytensor-2.31.2}/doc/glossary.rst +0 -0
  72. {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/Elman_srnn.png +0 -0
  73. {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/PyTensor.png +0 -0
  74. {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/PyTensor_RGB.svg +0 -0
  75. {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/PyTensor_logo.png +0 -0
  76. {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/binder.svg +0 -0
  77. {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/blocksparse.png +0 -0
  78. {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/colab.svg +0 -0
  79. {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/github.svg +0 -0
  80. {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/lstm.png +0 -0
  81. {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/lstm_memorycell.png +0 -0
  82. {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/talk2010.gif +0 -0
  83. {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/talk2010.png +0 -0
  84. {pytensor-2.31.0 → pytensor-2.31.2}/doc/index.rst +0 -0
  85. {pytensor-2.31.0 → pytensor-2.31.2}/doc/install.rst +0 -0
  86. {pytensor-2.31.0 → pytensor-2.31.2}/doc/internal/how_to_release.rst +0 -0
  87. {pytensor-2.31.0 → pytensor-2.31.2}/doc/internal/index.rst +0 -0
  88. {pytensor-2.31.0 → pytensor-2.31.2}/doc/internal/metadocumentation.rst +0 -0
  89. {pytensor-2.31.0 → pytensor-2.31.2}/doc/introduction.rst +0 -0
  90. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/debugmode.rst +0 -0
  91. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/function.rst +0 -0
  92. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/index.rst +0 -0
  93. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/io.rst +0 -0
  94. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/mode.rst +0 -0
  95. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/nanguardmode.rst +0 -0
  96. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/opfromgraph.rst +0 -0
  97. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/ops.rst +0 -0
  98. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/profilemode.rst +0 -0
  99. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/shared.rst +0 -0
  100. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/config.rst +0 -0
  101. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  102. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  103. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  104. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  105. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  106. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  107. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  108. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp.html +0 -0
  109. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp.png +0 -0
  110. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp2.html +0 -0
  111. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  112. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp2.png +0 -0
  113. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/ofg.html +0 -0
  114. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/ofg2.html +0 -0
  115. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/index.ipynb +0 -0
  116. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/index.rst +0 -0
  117. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  118. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  119. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  120. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  121. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/features.rst +0 -0
  122. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/fgraph.rst +0 -0
  123. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/graph.rst +0 -0
  124. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/index.rst +0 -0
  125. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/op.rst +0 -0
  126. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/replace.rst +0 -0
  127. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/type.rst +0 -0
  128. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/utils.rst +0 -0
  129. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/index.rst +0 -0
  130. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/misc/pkl_utils.rst +0 -0
  131. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/printing.rst +0 -0
  132. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/scalar/index.rst +0 -0
  133. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/scan.rst +0 -0
  134. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/sparse/index.rst +0 -0
  135. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/sparse/sandbox.rst +0 -0
  136. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/basic.rst +0 -0
  137. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/basic_opt.rst +0 -0
  138. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/bcast.png +0 -0
  139. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/bcast.svg +0 -0
  140. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/conv.rst +0 -0
  141. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/elemwise.rst +0 -0
  142. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/extra_ops.rst +0 -0
  143. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/fft.rst +0 -0
  144. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/functional.rst +0 -0
  145. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/index.rst +0 -0
  146. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/io.rst +0 -0
  147. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/math_opt.rst +0 -0
  148. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/nlinalg.rst +0 -0
  149. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/plot_fft.png +0 -0
  150. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/random/distributions.rst +0 -0
  151. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/random/index.rst +0 -0
  152. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/slinalg.rst +0 -0
  153. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/utils.rst +0 -0
  154. {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/typed_list.rst +0 -0
  155. {pytensor-2.31.0 → pytensor-2.31.2}/doc/links.rst +0 -0
  156. {pytensor-2.31.0 → pytensor-2.31.2}/doc/optimizations.rst +0 -0
  157. {pytensor-2.31.0 → pytensor-2.31.2}/doc/pylintrc +0 -0
  158. {pytensor-2.31.0 → pytensor-2.31.2}/doc/robots.txt +0 -0
  159. {pytensor-2.31.0 → pytensor-2.31.2}/doc/troubleshooting.rst +0 -0
  160. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/adding.rst +0 -0
  161. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/adding_solution_1.py +0 -0
  162. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/aliasing.rst +0 -0
  163. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/apply.png +0 -0
  164. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/apply.svg +0 -0
  165. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/bcast.png +0 -0
  166. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/broadcasting.rst +0 -0
  167. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/conditions.rst +0 -0
  168. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/debug_faq.rst +0 -0
  169. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/dlogistic.png +0 -0
  170. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/examples.rst +0 -0
  171. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/faq_tutorial.rst +0 -0
  172. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/gradients.rst +0 -0
  173. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/index.rst +0 -0
  174. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/loading_and_saving.rst +0 -0
  175. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/logistic.gp +0 -0
  176. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/logistic.png +0 -0
  177. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/loop.rst +0 -0
  178. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/loop_solution_1.py +0 -0
  179. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/modes.rst +0 -0
  180. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/modes_solution_1.py +0 -0
  181. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/multi_cores.rst +0 -0
  182. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/nan_tutorial.rst +0 -0
  183. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/pics/d3viz.png +0 -0
  184. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  185. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  186. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  187. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/printing_drawing.rst +0 -0
  188. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/prng.rst +0 -0
  189. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/profiling.rst +0 -0
  190. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/profiling_example.py +0 -0
  191. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/profiling_example_out.prof +0 -0
  192. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/shape_info.rst +0 -0
  193. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/sparse.rst +0 -0
  194. {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/symbolic_graphs.rst +0 -0
  195. {pytensor-2.31.0 → pytensor-2.31.2}/doc/user_guide.rst +0 -0
  196. {pytensor-2.31.0 → pytensor-2.31.2}/pyproject.toml +0 -0
  197. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/__init__.py +0 -0
  198. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/bin/__init__.py +0 -0
  199. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/bin/pytensor_cache.py +0 -0
  200. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/breakpoint.py +0 -0
  201. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/__init__.py +0 -0
  202. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/builders.py +0 -0
  203. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/compiledir.py +0 -0
  204. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/compilelock.py +0 -0
  205. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/debugmode.py +0 -0
  206. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/function/__init__.py +0 -0
  207. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/function/pfunc.py +0 -0
  208. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/function/types.py +0 -0
  209. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/io.py +0 -0
  210. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/monitormode.py +0 -0
  211. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/nanguardmode.py +0 -0
  212. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/ops.py +0 -0
  213. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/profiling.py +0 -0
  214. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/sharedvalue.py +0 -0
  215. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/configdefaults.py +0 -0
  216. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/configparser.py +0 -0
  217. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/__init__.py +0 -0
  218. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  219. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/css/d3viz.css +0 -0
  220. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/d3viz.py +0 -0
  221. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/formatting.py +0 -0
  222. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/html/template.html +0 -0
  223. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  224. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  225. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/js/d3viz.js +0 -0
  226. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  227. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  228. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/gradient.py +0 -0
  229. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/__init__.py +0 -0
  230. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/basic.py +0 -0
  231. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/destroyhandler.py +0 -0
  232. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/features.py +0 -0
  233. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/fg.py +0 -0
  234. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/null_type.py +0 -0
  235. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/op.py +0 -0
  236. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/replace.py +0 -0
  237. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/rewriting/__init__.py +0 -0
  238. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/rewriting/basic.py +0 -0
  239. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/rewriting/db.py +0 -0
  240. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/rewriting/kanren.py +0 -0
  241. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/rewriting/unify.py +0 -0
  242. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/rewriting/utils.py +0 -0
  243. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/type.py +0 -0
  244. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/utils.py +0 -0
  245. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/ifelse.py +0 -0
  246. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/__init__.py +0 -0
  247. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/basic.py +0 -0
  248. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/__init__.py +0 -0
  249. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/basic.py +0 -0
  250. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  251. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  252. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/cmodule.py +0 -0
  253. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/cutils.py +0 -0
  254. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/cvm.py +0 -0
  255. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/exceptions.py +0 -0
  256. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/interface.py +0 -0
  257. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/lazylinker_c.py +0 -0
  258. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/op.py +0 -0
  259. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/params_type.py +0 -0
  260. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/type.py +0 -0
  261. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/__init__.py +0 -0
  262. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/__init__.py +0 -0
  263. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/basic.py +0 -0
  264. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/blas.py +0 -0
  265. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  266. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/einsum.py +0 -0
  267. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  268. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  269. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/math.py +0 -0
  270. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  271. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/pad.py +0 -0
  272. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/random.py +0 -0
  273. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/scalar.py +0 -0
  274. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/scan.py +0 -0
  275. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/shape.py +0 -0
  276. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  277. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  278. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/sort.py +0 -0
  279. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/sparse.py +0 -0
  280. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  281. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  282. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/linker.py +0 -0
  283. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/__init__.py +0 -0
  284. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/__init__.py +0 -0
  285. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  286. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  287. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  288. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
  289. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  290. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  291. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  292. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  293. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
  294. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +0 -0
  295. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -0
  296. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +0 -0
  297. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -0
  298. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -0
  299. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +0 -0
  300. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +0 -0
  301. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +0 -0
  302. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
  303. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  304. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/random.py +0 -0
  305. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/scan.py +0 -0
  306. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  307. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  308. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/slinalg.py +0 -0
  309. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/sparse.py +0 -0
  310. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  311. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  312. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  313. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/linker.py +0 -0
  314. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  315. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  316. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  317. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  318. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  319. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  320. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/math.py +0 -0
  321. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
  322. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  323. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  324. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  325. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  326. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/linker.py +0 -0
  327. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/utils.py +0 -0
  328. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/vm.py +0 -0
  329. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/__init__.py +0 -0
  330. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/check_blas.py +0 -0
  331. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/check_blas_many.sh +0 -0
  332. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/check_duplicate_key.py +0 -0
  333. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  334. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/elemwise_time_test.py +0 -0
  335. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/frozendict.py +0 -0
  336. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/may_share_memory.py +0 -0
  337. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/ordered_set.py +0 -0
  338. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/pkl_utils.py +0 -0
  339. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/npy_2_compat.py +0 -0
  340. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/printing.py +0 -0
  341. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/py.typed +0 -0
  342. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/raise_op.py +0 -0
  343. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/__init__.py +0 -0
  344. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/basic.py +0 -0
  345. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  346. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  347. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/c_code/gamma.c +0 -0
  348. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/c_code/incbet.c +0 -0
  349. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/loop.py +0 -0
  350. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/math.py +0 -0
  351. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/sharedvar.py +0 -0
  352. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/__init__.py +0 -0
  353. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/basic.py +0 -0
  354. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/checkpoints.py +0 -0
  355. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/op.py +0 -0
  356. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/scan_perform.pyx +0 -0
  357. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/scan_perform_ext.py +0 -0
  358. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/utils.py +0 -0
  359. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/views.py +0 -0
  360. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/__init__.py +0 -0
  361. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/basic.py +0 -0
  362. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/rewriting.py +0 -0
  363. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/sandbox/__init__.py +0 -0
  364. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/sandbox/sp.py +0 -0
  365. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/sandbox/sp2.py +0 -0
  366. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/sharedvar.py +0 -0
  367. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/type.py +0 -0
  368. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/utils.py +0 -0
  369. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/basic.py +0 -0
  370. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/blas_headers.py +0 -0
  371. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/blas_scipy.py +0 -0
  372. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  373. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  374. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  375. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/conv/__init__.py +0 -0
  376. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/conv/abstract_conv.py +0 -0
  377. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/einsum.py +0 -0
  378. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/elemwise.py +0 -0
  379. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/elemwise_cgen.py +0 -0
  380. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/exceptions.py +0 -0
  381. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/extra_ops.py +0 -0
  382. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/fft.py +0 -0
  383. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/fourier.py +0 -0
  384. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/functional.py +0 -0
  385. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/inplace.py +0 -0
  386. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/interpolate.py +0 -0
  387. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/io.py +0 -0
  388. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/linalg.py +0 -0
  389. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/math.py +0 -0
  390. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/nlinalg.py +0 -0
  391. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/pad.py +0 -0
  392. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/__init__.py +0 -0
  393. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/basic.py +0 -0
  394. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/op.py +0 -0
  395. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  396. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/basic.py +0 -0
  397. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/jax.py +0 -0
  398. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/numba.py +0 -0
  399. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/type.py +0 -0
  400. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/utils.py +0 -0
  401. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/var.py +0 -0
  402. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/__init__.py +0 -0
  403. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/basic.py +0 -0
  404. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/blas_c.py +0 -0
  405. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
  406. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/blockwise.py +0 -0
  407. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/conv.py +0 -0
  408. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/einsum.py +0 -0
  409. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/elemwise.py +0 -0
  410. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  411. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/jax.py +0 -0
  412. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/math.py +0 -0
  413. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/numba.py +0 -0
  414. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/ofg.py +0 -0
  415. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/shape.py +0 -0
  416. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/special.py +0 -0
  417. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
  418. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  419. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/shape.py +0 -0
  420. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/sharedvar.py +0 -0
  421. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/signal/__init__.py +0 -0
  422. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/slinalg.py +0 -0
  423. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/sort.py +0 -0
  424. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/special.py +0 -0
  425. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/subtensor.py +0 -0
  426. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/type_other.py +0 -0
  427. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/utils.py +0 -0
  428. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/var.py +0 -0
  429. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/variable.py +0 -0
  430. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/xlogx.py +0 -0
  431. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/typed_list/__init__.py +0 -0
  432. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/typed_list/basic.py +0 -0
  433. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/typed_list/rewriting.py +0 -0
  434. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/typed_list/type.py +0 -0
  435. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/updates.py +0 -0
  436. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/utils.py +0 -0
  437. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor.egg-info/dependency_links.txt +0 -0
  438. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor.egg-info/entry_points.txt +0 -0
  439. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor.egg-info/requires.txt +0 -0
  440. {pytensor-2.31.0 → pytensor-2.31.2}/pytensor.egg-info/top_level.txt +0 -0
  441. {pytensor-2.31.0 → pytensor-2.31.2}/scripts/mypy-failing.txt +0 -0
  442. {pytensor-2.31.0 → pytensor-2.31.2}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  443. {pytensor-2.31.0 → pytensor-2.31.2}/setup.cfg +0 -0
  444. {pytensor-2.31.0 → pytensor-2.31.2}/setup.py +0 -0
  445. {pytensor-2.31.0 → pytensor-2.31.2}/tests/link/c/c_code/test_cenum.h +0 -0
  446. {pytensor-2.31.0 → pytensor-2.31.2}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  447. {pytensor-2.31.0 → pytensor-2.31.2}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
  448. {pytensor-2.31.0 → pytensor-2.31.2}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
  449. {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_breakpoint.py +0 -0
  450. {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_config.py +0 -0
  451. {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_gradient.py +0 -0
  452. {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_ifelse.py +0 -0
  453. {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_printing.py +0 -0
  454. {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_raise_op.py +0 -0
  455. {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_rop.py +0 -0
  456. {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_updates.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 2.31.0
3
+ Version: 2.31.2
4
4
  Summary: Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs.
5
5
  Author-email: pymc-devs <pymc.devs@gmail.com>
6
6
  License-Expression: BSD-3-Clause
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-05-19T16:51:53+0200",
11
+ "date": "2025-05-24T11:34:23+0800",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "5ffe17ad7e1d2bc0841b69d0b57cfc9e142771c6",
15
- "version": "2.31.0"
14
+ "full-revisionid": "2d414d4129882861b867aaf0d9abcf3135e3d5eb",
15
+ "version": "2.31.2"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -490,6 +490,8 @@ PYTORCH = Mode(
490
490
  "fusion",
491
491
  "inplace",
492
492
  "scan_save_mem_prealloc",
493
+ "reuse_lu_decomposition_multiple_solves",
494
+ "scan_split_non_sequence_lu_decomposition_solve",
493
495
  ],
494
496
  ),
495
497
  )
@@ -46,6 +46,7 @@ def jax_funcify_Cholesky(op, **kwargs):
46
46
  def jax_funcify_Solve(op, **kwargs):
47
47
  assume_a = op.assume_a
48
48
  lower = op.lower
49
+ b_is_vec = op.b_ndim == 1
49
50
 
50
51
  if assume_a == "tridiagonal":
51
52
  # jax.scipy.solve does not yet support tridiagonal matrices
@@ -54,7 +55,20 @@ def jax_funcify_Solve(op, **kwargs):
54
55
  dl = jax.numpy.diagonal(a, offset=-1, axis1=-2, axis2=-1)
55
56
  d = jax.numpy.diagonal(a, offset=0, axis1=-2, axis2=-1)
56
57
  du = jax.numpy.diagonal(a, offset=1, axis1=-2, axis2=-1)
57
- return jax.lax.linalg.tridiagonal_solve(dl, d, du, b, lower=lower)
58
+
59
+ # jax requires dl and du to have the same shape as d
60
+ dl = jax.numpy.pad(dl, (1, 0))
61
+ du = jax.numpy.pad(du, (0, 1))
62
+
63
+ if b_is_vec:
64
+ b = jax.numpy.expand_dims(b, -1)
65
+
66
+ res = jax.lax.linalg.tridiagonal_solve(dl, d, du, b)
67
+
68
+ if b_is_vec:
69
+ return jax.numpy.squeeze(res, -1)
70
+
71
+ return res
58
72
 
59
73
  else:
60
74
  if assume_a not in ("gen", "sym", "her", "pos"):
@@ -31,7 +31,6 @@ from pytensor.link.utils import (
31
31
  fgraph_to_python,
32
32
  )
33
33
  from pytensor.scalar.basic import ScalarType
34
- from pytensor.scalar.math import Softplus
35
34
  from pytensor.sparse import SparseTensorType
36
35
  from pytensor.tensor.basic import Nonzero
37
36
  from pytensor.tensor.blas import BatchedDot
@@ -466,7 +465,7 @@ def numba_funcify_ArgSortOp(op, node, **kwargs):
466
465
  axis = axis.item()
467
466
 
468
467
  Y = np.swapaxes(X, axis, 0)
469
- result = np.empty_like(Y)
468
+ result = np.empty_like(Y, dtype="int64")
470
469
 
471
470
  indices = list(np.ndindex(Y.shape[1:]))
472
471
 
@@ -607,25 +606,6 @@ def numba_funcify_Dot(op, node, **kwargs):
607
606
  return dot
608
607
 
609
608
 
610
- @numba_funcify.register(Softplus)
611
- def numba_funcify_Softplus(op, node, **kwargs):
612
- x_dtype = np.dtype(node.inputs[0].dtype)
613
-
614
- @numba_njit
615
- def softplus(x):
616
- if x < -37.0:
617
- value = np.exp(x)
618
- elif x < 18.0:
619
- value = np.log1p(np.exp(x))
620
- elif x < 33.3:
621
- value = x + np.exp(-x)
622
- else:
623
- value = x
624
- return direct_cast(value, x_dtype)
625
-
626
- return softplus
627
-
628
-
629
609
  @numba_funcify.register(Solve)
630
610
  def numba_funcify_Solve(op, node, **kwargs):
631
611
  assume_a = op.assume_a
@@ -689,11 +669,6 @@ def numba_funcify_BatchedDot(op, node, **kwargs):
689
669
  return batched_dot
690
670
 
691
671
 
692
- # NOTE: The remaining `pytensor.tensor.blas` `Op`s appear unnecessary, because
693
- # they're only used to optimize basic `Dot` nodes, and those GEMV and GEMM
694
- # optimizations are apparently already performed by Numba
695
-
696
-
697
672
  @numba_funcify.register(IfElse)
698
673
  def numba_funcify_IfElse(op, **kwargs):
699
674
  n_outs = op.n_outs
@@ -561,7 +561,7 @@ def numba_funcify_Argmax(op, node, **kwargs):
561
561
 
562
562
  @numba_basic.numba_njit(inline="always")
563
563
  def argmax(x):
564
- return 0
564
+ return np.array(0, dtype="int64")
565
565
 
566
566
  else:
567
567
  axes = tuple(int(ax) for ax in axis)
@@ -30,7 +30,7 @@ def _lu_factor_to_lu(a, dtype, overwrite_a):
30
30
  # Fortran is 1 indexed, so we need to subtract 1 from the IPIV array
31
31
  IPIV = IPIV - 1
32
32
  p_inv = _pivot_to_permutation(IPIV, dtype=dtype)
33
- perm = np.argsort(p_inv)
33
+ perm = np.argsort(p_inv).astype("int32")
34
34
 
35
35
  return perm, L, U
36
36
 
@@ -52,7 +52,7 @@ def numba_funcify_Det(op, node, **kwargs):
52
52
 
53
53
  @numba_basic.numba_njit(inline="always")
54
54
  def det(x):
55
- return numba_basic.direct_cast(np.linalg.det(inputs_cast(x)), out_dtype)
55
+ return np.array(np.linalg.det(inputs_cast(x))).astype(out_dtype)
56
56
 
57
57
  return det
58
58
 
@@ -68,8 +68,8 @@ def numba_funcify_SLogDet(op, node, **kwargs):
68
68
  def slogdet(x):
69
69
  sign, det = np.linalg.slogdet(inputs_cast(x))
70
70
  return (
71
- numba_basic.direct_cast(sign, out_dtype_1),
72
- numba_basic.direct_cast(det, out_dtype_2),
71
+ np.array(sign).astype(out_dtype_1),
72
+ np.array(det).astype(out_dtype_2),
73
73
  )
74
74
 
75
75
  return slogdet
@@ -28,7 +28,7 @@ from pytensor.scalar.basic import (
28
28
  Second,
29
29
  Switch,
30
30
  )
31
- from pytensor.scalar.math import Erf, Erfc, GammaLn, Log1mexp, Sigmoid
31
+ from pytensor.scalar.math import Erf, Erfc, GammaLn, Log1mexp, Sigmoid, Softplus
32
32
 
33
33
 
34
34
  @numba_funcify.register(ScalarOp)
@@ -312,3 +312,22 @@ def erfc(x):
312
312
  @numba_funcify.register(Erfc)
313
313
  def numba_funcify_Erfc(op, **kwargs):
314
314
  return numba_basic.global_numba_func(erfc)
315
+
316
+
317
+ @numba_funcify.register(Softplus)
318
+ def numba_funcify_Softplus(op, node, **kwargs):
319
+ out_dtype = np.dtype(node.outputs[0].type.dtype)
320
+
321
+ @numba_basic.numba_njit
322
+ def softplus(x):
323
+ if x < -37.0:
324
+ value = np.exp(x)
325
+ elif x < 18.0:
326
+ value = np.log1p(np.exp(x))
327
+ elif x < 33.3:
328
+ value = x + np.exp(-x)
329
+ else:
330
+ value = x
331
+ return numba_basic.direct_cast(value, out_dtype)
332
+
333
+ return softplus
@@ -2561,7 +2561,6 @@ scan_seqopt1.register(
2561
2561
  position=1,
2562
2562
  )
2563
2563
 
2564
-
2565
2564
  scan_seqopt1.register(
2566
2565
  "scan_push_out_non_seq",
2567
2566
  in2out(scan_push_out_non_seq, ignore_newtrees=True),
@@ -2569,10 +2568,9 @@ scan_seqopt1.register(
2569
2568
  "fast_run",
2570
2569
  "scan",
2571
2570
  "scan_pushout",
2572
- position=2,
2571
+ position=3,
2573
2572
  )
2574
2573
 
2575
-
2576
2574
  scan_seqopt1.register(
2577
2575
  "scan_push_out_seq",
2578
2576
  in2out(scan_push_out_seq, ignore_newtrees=True),
@@ -2580,7 +2578,7 @@ scan_seqopt1.register(
2580
2578
  "fast_run",
2581
2579
  "scan",
2582
2580
  "scan_pushout",
2583
- position=3,
2581
+ position=4,
2584
2582
  )
2585
2583
 
2586
2584
 
@@ -2592,7 +2590,7 @@ scan_seqopt1.register(
2592
2590
  "more_mem",
2593
2591
  "scan",
2594
2592
  "scan_pushout",
2595
- position=4,
2593
+ position=5,
2596
2594
  )
2597
2595
 
2598
2596
 
@@ -2605,7 +2603,7 @@ scan_seqopt1.register(
2605
2603
  "more_mem",
2606
2604
  "scan",
2607
2605
  "scan_pushout",
2608
- position=5,
2606
+ position=6,
2609
2607
  )
2610
2608
 
2611
2609
  scan_eqopt2.register(
@@ -114,6 +114,7 @@ from pytensor.tensor import (
114
114
 
115
115
 
116
116
  # isort: off
117
+ import pytensor.tensor._linalg
117
118
  from pytensor.tensor import linalg
118
119
  from pytensor.tensor import special
119
120
  from pytensor.tensor import signal
@@ -0,0 +1,2 @@
1
+ # Register rewrites
2
+ import pytensor.tensor._linalg.solve
@@ -0,0 +1,2 @@
1
+ # Register rewrites in the database
2
+ import pytensor.tensor._linalg.solve.rewriting
@@ -0,0 +1,209 @@
1
+ from collections.abc import Container
2
+ from copy import copy
3
+
4
+ from pytensor.graph import Constant, graph_inputs
5
+ from pytensor.graph.rewriting.basic import copy_stack_trace, in2out, node_rewriter
6
+ from pytensor.scan.op import Scan
7
+ from pytensor.scan.rewriting import scan_seqopt1
8
+ from pytensor.tensor.basic import atleast_Nd
9
+ from pytensor.tensor.blockwise import Blockwise
10
+ from pytensor.tensor.elemwise import DimShuffle
11
+ from pytensor.tensor.rewriting.basic import register_specialize
12
+ from pytensor.tensor.rewriting.linalg import is_matrix_transpose
13
+ from pytensor.tensor.slinalg import Solve, lu_factor, lu_solve
14
+ from pytensor.tensor.variable import TensorVariable
15
+
16
+
17
+ def decompose_A(A, assume_a, check_finite):
18
+ if assume_a == "gen":
19
+ return lu_factor(A, check_finite=check_finite)
20
+ else:
21
+ raise NotImplementedError
22
+
23
+
24
+ def solve_lu_decomposed_system(A_decomp, b, transposed=False, *, core_solve_op: Solve):
25
+ if core_solve_op.assume_a == "gen":
26
+ return lu_solve(
27
+ A_decomp,
28
+ b,
29
+ trans=transposed,
30
+ b_ndim=core_solve_op.b_ndim,
31
+ check_finite=core_solve_op.check_finite,
32
+ )
33
+ else:
34
+ raise NotImplementedError
35
+
36
+
37
+ def _split_lu_solve_steps(
38
+ fgraph, node, *, eager: bool, allowed_assume_a: Container[str]
39
+ ):
40
+ if not isinstance(node.op.core_op, Solve):
41
+ return None
42
+
43
+ def get_root_A(a: TensorVariable) -> tuple[TensorVariable, bool]:
44
+ # Find the root variable of the first input to Solve
45
+ # If `a` is a left expand_dims or matrix transpose (DimShuffle variants),
46
+ # the root variable is the pre-DimShuffled input.
47
+ # Otherwise, `a` is considered the root variable.
48
+ # We also return whether the root `a` is transposed.
49
+ transposed = False
50
+ if a.owner is not None and isinstance(a.owner.op, DimShuffle):
51
+ if a.owner.op.is_left_expand_dims:
52
+ [a] = a.owner.inputs
53
+ elif is_matrix_transpose(a):
54
+ [a] = a.owner.inputs
55
+ transposed = True
56
+ return a, transposed
57
+
58
+ def find_solve_clients(var, assume_a):
59
+ clients = []
60
+ for cl, idx in fgraph.clients[var]:
61
+ if (
62
+ idx == 0
63
+ and isinstance(cl.op, Blockwise)
64
+ and isinstance(cl.op.core_op, Solve)
65
+ and (cl.op.core_op.assume_a == assume_a)
66
+ ):
67
+ clients.append(cl)
68
+ elif isinstance(cl.op, DimShuffle) and cl.op.is_left_expand_dims:
69
+ # If it's a left expand_dims, recurse on the output
70
+ clients.extend(find_solve_clients(cl.outputs[0], assume_a))
71
+ return clients
72
+
73
+ assume_a = node.op.core_op.assume_a
74
+
75
+ if assume_a not in allowed_assume_a:
76
+ return None
77
+
78
+ A, _ = get_root_A(node.inputs[0])
79
+
80
+ # Find Solve using A (or left expand_dims of A)
81
+ # TODO: We could handle arbitrary shuffle of the batch dimensions, just need to propagate
82
+ # that to the A_decomp outputs
83
+ A_solve_clients_and_transpose = [
84
+ (client, False) for client in find_solve_clients(A, assume_a)
85
+ ]
86
+
87
+ # Find Solves using A.T
88
+ for cl, _ in fgraph.clients[A]:
89
+ if isinstance(cl.op, DimShuffle) and is_matrix_transpose(cl.out):
90
+ A_T = cl.out
91
+ A_solve_clients_and_transpose.extend(
92
+ (client, True) for client in find_solve_clients(A_T, assume_a)
93
+ )
94
+
95
+ if not eager and len(A_solve_clients_and_transpose) == 1:
96
+ # If theres' a single use don't do it... unless it's being broadcast in a Blockwise (or we're eager)
97
+ # That's a "reuse" inside the inner vectorized loop
98
+ batch_ndim = node.op.batch_ndim(node)
99
+ (client, _) = A_solve_clients_and_transpose[0]
100
+ original_A, b = client.inputs
101
+ if not any(
102
+ a_bcast and not b_bcast
103
+ for a_bcast, b_bcast in zip(
104
+ original_A.type.broadcastable[:batch_ndim],
105
+ b.type.broadcastable[:batch_ndim],
106
+ strict=True,
107
+ )
108
+ ):
109
+ return None
110
+
111
+ # If any Op had check_finite=True, we also do it for the LU decomposition
112
+ check_finite_decomp = False
113
+ for client, _ in A_solve_clients_and_transpose:
114
+ if client.op.core_op.check_finite:
115
+ check_finite_decomp = True
116
+ break
117
+ A_decomp = decompose_A(A, assume_a=assume_a, check_finite=check_finite_decomp)
118
+
119
+ replacements = {}
120
+ for client, transposed in A_solve_clients_and_transpose:
121
+ _, b = client.inputs
122
+ new_x = solve_lu_decomposed_system(
123
+ A_decomp, b, transposed=transposed, core_solve_op=client.op.core_op
124
+ )
125
+ [old_x] = client.outputs
126
+ new_x = atleast_Nd(new_x, n=old_x.type.ndim).astype(old_x.type.dtype)
127
+ copy_stack_trace(old_x, new_x)
128
+ replacements[old_x] = new_x
129
+
130
+ return replacements
131
+
132
+
133
+ def _scan_split_non_sequence_lu_decomposition_solve(
134
+ fgraph, node, *, allowed_assume_a: Container[str]
135
+ ):
136
+ """If the A of a Solve within a Scan is a function of non-sequences, split the LU decomposition step.
137
+
138
+ The LU decomposition step can then be pushed out of the inner loop by the `scan_pushout_non_sequences` rewrite.
139
+ """
140
+ scan_op: Scan = node.op
141
+ non_sequences = set(scan_op.inner_non_seqs(scan_op.inner_inputs))
142
+ new_scan_fgraph = scan_op.fgraph
143
+
144
+ changed = False
145
+ while True:
146
+ for inner_node in new_scan_fgraph.toposort():
147
+ if (
148
+ isinstance(inner_node.op, Blockwise)
149
+ and isinstance(inner_node.op.core_op, Solve)
150
+ and inner_node.op.core_op.assume_a in allowed_assume_a
151
+ ):
152
+ A, b = inner_node.inputs
153
+ if all(
154
+ (isinstance(root_inp, Constant) or (root_inp in non_sequences))
155
+ for root_inp in graph_inputs([A])
156
+ ):
157
+ if new_scan_fgraph is scan_op.fgraph:
158
+ # Clone the first time to avoid mutating the original fgraph
159
+ new_scan_fgraph, equiv = new_scan_fgraph.clone_get_equiv()
160
+ non_sequences = {equiv[non_seq] for non_seq in non_sequences}
161
+ inner_node = equiv[inner_node] # type: ignore
162
+
163
+ replace_dict = _split_lu_solve_steps(
164
+ new_scan_fgraph,
165
+ inner_node,
166
+ eager=True,
167
+ allowed_assume_a=allowed_assume_a,
168
+ )
169
+ assert (
170
+ isinstance(replace_dict, dict) and len(replace_dict) > 0
171
+ ), "Rewrite failed"
172
+ new_scan_fgraph.replace_all(replace_dict.items())
173
+ changed = True
174
+ break # Break to start over with a fresh toposort
175
+ else: # no_break
176
+ break # Nothing else changed
177
+
178
+ if not changed:
179
+ return
180
+
181
+ # Return a new scan to indicate that a rewrite was done
182
+ new_scan_op = copy(scan_op)
183
+ new_scan_op.fgraph = new_scan_fgraph
184
+ new_outs = new_scan_op.make_node(*node.inputs).outputs
185
+ copy_stack_trace(node.outputs, new_outs)
186
+ return new_outs
187
+
188
+
189
+ @register_specialize
190
+ @node_rewriter([Blockwise])
191
+ def reuse_lu_decomposition_multiple_solves(fgraph, node):
192
+ return _split_lu_solve_steps(fgraph, node, eager=False, allowed_assume_a={"gen"})
193
+
194
+
195
+ @node_rewriter([Scan])
196
+ def scan_split_non_sequence_lu_decomposition_solve(fgraph, node):
197
+ return _scan_split_non_sequence_lu_decomposition_solve(
198
+ fgraph, node, allowed_assume_a={"gen"}
199
+ )
200
+
201
+
202
+ scan_seqopt1.register(
203
+ "scan_split_non_sequence_lu_decomposition_solve",
204
+ in2out(scan_split_non_sequence_lu_decomposition_solve, ignore_newtrees=True),
205
+ "fast_run",
206
+ "scan",
207
+ "scan_pushout",
208
+ position=2,
209
+ )
@@ -113,23 +113,22 @@ from pytensor.tensor.type import DenseTensorType, tensor
113
113
  _logger = logging.getLogger("pytensor.tensor.blas")
114
114
 
115
115
 
116
- # If check_init_y() == True we need to initialize y when beta == 0.
117
- def check_init_y():
118
- # TODO: What is going on here?
116
+ def must_initialize_y_gemv():
117
+ # Check whether Scipy GEMV could output nan if y in not initialized
119
118
  from scipy.linalg.blas import get_blas_funcs
120
119
 
121
- if check_init_y._result is None:
122
- y = float("NaN") * np.ones((2,))
120
+ if must_initialize_y_gemv._result is None:
121
+ y = np.full((2,), np.nan)
123
122
  x = np.ones((2,))
124
123
  A = np.ones((2, 2))
125
124
  gemv = get_blas_funcs("gemv", dtype=y.dtype)
126
125
  gemv(1.0, A.T, x, 0.0, y, overwrite_y=True, trans=True)
127
- check_init_y._result = np.isnan(y).any()
126
+ must_initialize_y_gemv._result = np.isnan(y).any()
128
127
 
129
- return check_init_y._result
128
+ return must_initialize_y_gemv._result
130
129
 
131
130
 
132
- check_init_y._result = None # type: ignore
131
+ must_initialize_y_gemv._result = None # type: ignore
133
132
 
134
133
 
135
134
  class Gemv(Op):
@@ -197,7 +196,13 @@ class Gemv(Op):
197
196
  f"(beta * y + alpha * dot(A, x)). y: {y.shape}, A: {A.shape}, x: {x.shape}"
198
197
  )
199
198
 
200
- if beta == 0 and check_init_y():
199
+ if beta == 0 and must_initialize_y_gemv():
200
+ # Most BLAS implementations of GEMV ignore y=nan when beta=0
201
+ # PyTensor considers that the correct behavior,
202
+ # and even exploits it to avoid copying or initializing outputs.
203
+ # By deciding to exploit this, however, it becomes our responsibility
204
+ # to ensure the behavior even in the rare cases BLAS deviates,
205
+ # or users will get errors, even for graphs that had no nan to begin with.
201
206
  y.fill(0)
202
207
 
203
208
  # Here I suppose that A is in c order. If we don't make it