pytensor 2.31.1__tar.gz → 2.31.3__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.1/pytensor.egg-info → pytensor-2.31.3}/PKG-INFO +1 -1
  2. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/_version.py +3 -3
  3. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/slinalg.py +15 -1
  4. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/tensor_basic.py +1 -8
  5. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/linker.py +38 -1
  6. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/basic.py +45 -37
  7. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/elemwise.py +1 -1
  8. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +1 -1
  9. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/nlinalg.py +3 -3
  10. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/scalar.py +20 -1
  11. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/tensor_basic.py +1 -9
  12. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/checkpoints.py +1 -4
  13. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/op.py +3 -2
  14. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/rewriting.py +24 -15
  15. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/sandbox/sp2.py +1 -1
  16. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/_linalg/solve/rewriting.py +19 -8
  17. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/basic.py +173 -161
  18. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/blas.py +14 -9
  19. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/blas_c.py +28 -19
  20. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/blockwise.py +22 -2
  21. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/elemwise.py +2 -2
  22. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/io.py +1 -1
  23. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/op.py +2 -0
  24. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/basic.py +26 -37
  25. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/blas.py +1 -1
  26. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/elemwise.py +83 -29
  27. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/signal/conv.py +84 -2
  28. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/type.py +1 -1
  29. {pytensor-2.31.1 → pytensor-2.31.3/pytensor.egg-info}/PKG-INFO +1 -1
  30. {pytensor-2.31.1 → pytensor-2.31.3}/LICENSE.txt +0 -0
  31. {pytensor-2.31.1 → pytensor-2.31.3}/MANIFEST.in +0 -0
  32. {pytensor-2.31.1 → pytensor-2.31.3}/README.rst +0 -0
  33. {pytensor-2.31.1 → pytensor-2.31.3}/doc/.templates/PLACEHOLDER +0 -0
  34. {pytensor-2.31.1 → pytensor-2.31.3}/doc/.templates/layout.html +0 -0
  35. {pytensor-2.31.1 → pytensor-2.31.3}/doc/.templates/nb-badges.html +0 -0
  36. {pytensor-2.31.1 → pytensor-2.31.3}/doc/.templates/rendered_citation.html +0 -0
  37. {pytensor-2.31.1 → pytensor-2.31.3}/doc/LICENSE.txt +0 -0
  38. {pytensor-2.31.1 → pytensor-2.31.3}/doc/README.md +0 -0
  39. {pytensor-2.31.1 → pytensor-2.31.3}/doc/acknowledgement.rst +0 -0
  40. {pytensor-2.31.1 → pytensor-2.31.3}/doc/bcast.png +0 -0
  41. {pytensor-2.31.1 → pytensor-2.31.3}/doc/bcast.svg +0 -0
  42. {pytensor-2.31.1 → pytensor-2.31.3}/doc/blog.md +0 -0
  43. {pytensor-2.31.1 → pytensor-2.31.3}/doc/conf.py +0 -0
  44. {pytensor-2.31.1 → pytensor-2.31.3}/doc/core_development_guide.rst +0 -0
  45. {pytensor-2.31.1 → pytensor-2.31.3}/doc/css.inc +0 -0
  46. {pytensor-2.31.1 → pytensor-2.31.3}/doc/dev_start_guide.rst +0 -0
  47. {pytensor-2.31.1 → pytensor-2.31.3}/doc/environment.yml +0 -0
  48. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/apply.png +0 -0
  49. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/apply.svg +0 -0
  50. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/apply2.svg +0 -0
  51. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/creating_a_c_op.rst +0 -0
  52. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  53. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/creating_an_op.rst +0 -0
  54. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/ctype.rst +0 -0
  55. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/extending_faq.rst +0 -0
  56. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/extending_pytensor_solution_1.py +0 -0
  57. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/graph_rewriting.rst +0 -0
  58. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/graphstructures.rst +0 -0
  59. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/index.rst +0 -0
  60. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/inplace.rst +0 -0
  61. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/op.rst +0 -0
  62. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/other_ops.rst +0 -0
  63. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  64. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  65. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/pipeline.rst +0 -0
  66. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/scan.rst +0 -0
  67. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/tips.rst +0 -0
  68. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/type.rst +0 -0
  69. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/unittest.rst +0 -0
  70. {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/using_params.rst +0 -0
  71. {pytensor-2.31.1 → pytensor-2.31.3}/doc/faq.rst +0 -0
  72. {pytensor-2.31.1 → pytensor-2.31.3}/doc/gallery/page_footer.md +0 -0
  73. {pytensor-2.31.1 → pytensor-2.31.3}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  74. {pytensor-2.31.1 → pytensor-2.31.3}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  75. {pytensor-2.31.1 → pytensor-2.31.3}/doc/generate_dtype_tensor_table.py +0 -0
  76. {pytensor-2.31.1 → pytensor-2.31.3}/doc/glossary.rst +0 -0
  77. {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/Elman_srnn.png +0 -0
  78. {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/PyTensor.png +0 -0
  79. {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/PyTensor_RGB.svg +0 -0
  80. {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/PyTensor_logo.png +0 -0
  81. {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/binder.svg +0 -0
  82. {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/blocksparse.png +0 -0
  83. {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/colab.svg +0 -0
  84. {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/github.svg +0 -0
  85. {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/lstm.png +0 -0
  86. {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/lstm_memorycell.png +0 -0
  87. {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/talk2010.gif +0 -0
  88. {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/talk2010.png +0 -0
  89. {pytensor-2.31.1 → pytensor-2.31.3}/doc/index.rst +0 -0
  90. {pytensor-2.31.1 → pytensor-2.31.3}/doc/install.rst +0 -0
  91. {pytensor-2.31.1 → pytensor-2.31.3}/doc/internal/how_to_release.rst +0 -0
  92. {pytensor-2.31.1 → pytensor-2.31.3}/doc/internal/index.rst +0 -0
  93. {pytensor-2.31.1 → pytensor-2.31.3}/doc/internal/metadocumentation.rst +0 -0
  94. {pytensor-2.31.1 → pytensor-2.31.3}/doc/introduction.rst +0 -0
  95. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/debugmode.rst +0 -0
  96. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/function.rst +0 -0
  97. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/index.rst +0 -0
  98. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/io.rst +0 -0
  99. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/mode.rst +0 -0
  100. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/nanguardmode.rst +0 -0
  101. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/opfromgraph.rst +0 -0
  102. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/ops.rst +0 -0
  103. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/profilemode.rst +0 -0
  104. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/shared.rst +0 -0
  105. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/config.rst +0 -0
  106. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  107. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  108. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  109. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  110. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  111. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  112. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  113. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp.html +0 -0
  114. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp.png +0 -0
  115. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp2.html +0 -0
  116. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  117. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp2.png +0 -0
  118. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/ofg.html +0 -0
  119. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/ofg2.html +0 -0
  120. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/index.ipynb +0 -0
  121. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/index.rst +0 -0
  122. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  123. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  124. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  125. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  126. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/features.rst +0 -0
  127. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/fgraph.rst +0 -0
  128. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/graph.rst +0 -0
  129. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/index.rst +0 -0
  130. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/op.rst +0 -0
  131. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/replace.rst +0 -0
  132. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/type.rst +0 -0
  133. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/utils.rst +0 -0
  134. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/index.rst +0 -0
  135. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/misc/pkl_utils.rst +0 -0
  136. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/printing.rst +0 -0
  137. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/scalar/index.rst +0 -0
  138. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/scan.rst +0 -0
  139. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/sparse/index.rst +0 -0
  140. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/sparse/sandbox.rst +0 -0
  141. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/basic.rst +0 -0
  142. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/basic_opt.rst +0 -0
  143. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/bcast.png +0 -0
  144. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/bcast.svg +0 -0
  145. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/conv.rst +0 -0
  146. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/elemwise.rst +0 -0
  147. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/extra_ops.rst +0 -0
  148. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/fft.rst +0 -0
  149. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/functional.rst +0 -0
  150. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/index.rst +0 -0
  151. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/io.rst +0 -0
  152. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/math_opt.rst +0 -0
  153. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/nlinalg.rst +0 -0
  154. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/plot_fft.png +0 -0
  155. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/random/distributions.rst +0 -0
  156. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/random/index.rst +0 -0
  157. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/slinalg.rst +0 -0
  158. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/utils.rst +0 -0
  159. {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/typed_list.rst +0 -0
  160. {pytensor-2.31.1 → pytensor-2.31.3}/doc/links.rst +0 -0
  161. {pytensor-2.31.1 → pytensor-2.31.3}/doc/optimizations.rst +0 -0
  162. {pytensor-2.31.1 → pytensor-2.31.3}/doc/pylintrc +0 -0
  163. {pytensor-2.31.1 → pytensor-2.31.3}/doc/robots.txt +0 -0
  164. {pytensor-2.31.1 → pytensor-2.31.3}/doc/troubleshooting.rst +0 -0
  165. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/adding.rst +0 -0
  166. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/adding_solution_1.py +0 -0
  167. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/aliasing.rst +0 -0
  168. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/apply.png +0 -0
  169. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/apply.svg +0 -0
  170. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/bcast.png +0 -0
  171. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/broadcasting.rst +0 -0
  172. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/conditions.rst +0 -0
  173. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/debug_faq.rst +0 -0
  174. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/dlogistic.png +0 -0
  175. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/examples.rst +0 -0
  176. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/faq_tutorial.rst +0 -0
  177. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/gradients.rst +0 -0
  178. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/index.rst +0 -0
  179. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/loading_and_saving.rst +0 -0
  180. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/logistic.gp +0 -0
  181. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/logistic.png +0 -0
  182. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/loop.rst +0 -0
  183. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/loop_solution_1.py +0 -0
  184. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/modes.rst +0 -0
  185. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/modes_solution_1.py +0 -0
  186. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/multi_cores.rst +0 -0
  187. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/nan_tutorial.rst +0 -0
  188. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/pics/d3viz.png +0 -0
  189. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  190. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  191. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  192. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/printing_drawing.rst +0 -0
  193. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/prng.rst +0 -0
  194. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/profiling.rst +0 -0
  195. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/profiling_example.py +0 -0
  196. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/profiling_example_out.prof +0 -0
  197. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/shape_info.rst +0 -0
  198. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/sparse.rst +0 -0
  199. {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/symbolic_graphs.rst +0 -0
  200. {pytensor-2.31.1 → pytensor-2.31.3}/doc/user_guide.rst +0 -0
  201. {pytensor-2.31.1 → pytensor-2.31.3}/pyproject.toml +0 -0
  202. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/__init__.py +0 -0
  203. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/bin/__init__.py +0 -0
  204. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/bin/pytensor_cache.py +0 -0
  205. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/breakpoint.py +0 -0
  206. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/__init__.py +0 -0
  207. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/builders.py +0 -0
  208. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/compiledir.py +0 -0
  209. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/compilelock.py +0 -0
  210. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/debugmode.py +0 -0
  211. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/function/__init__.py +0 -0
  212. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/function/pfunc.py +0 -0
  213. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/function/types.py +0 -0
  214. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/io.py +0 -0
  215. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/mode.py +0 -0
  216. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/monitormode.py +0 -0
  217. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/nanguardmode.py +0 -0
  218. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/ops.py +0 -0
  219. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/profiling.py +0 -0
  220. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/sharedvalue.py +0 -0
  221. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/configdefaults.py +0 -0
  222. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/configparser.py +0 -0
  223. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/__init__.py +0 -0
  224. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  225. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/css/d3viz.css +0 -0
  226. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/d3viz.py +0 -0
  227. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/formatting.py +0 -0
  228. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/html/template.html +0 -0
  229. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  230. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  231. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/js/d3viz.js +0 -0
  232. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  233. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  234. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/gradient.py +0 -0
  235. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/__init__.py +0 -0
  236. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/basic.py +0 -0
  237. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/destroyhandler.py +0 -0
  238. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/features.py +0 -0
  239. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/fg.py +0 -0
  240. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/null_type.py +0 -0
  241. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/op.py +0 -0
  242. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/replace.py +0 -0
  243. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/rewriting/__init__.py +0 -0
  244. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/rewriting/basic.py +0 -0
  245. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/rewriting/db.py +0 -0
  246. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/rewriting/kanren.py +0 -0
  247. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/rewriting/unify.py +0 -0
  248. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/rewriting/utils.py +0 -0
  249. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/type.py +0 -0
  250. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/utils.py +0 -0
  251. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/ifelse.py +0 -0
  252. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/__init__.py +0 -0
  253. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/basic.py +0 -0
  254. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/__init__.py +0 -0
  255. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/basic.py +0 -0
  256. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  257. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  258. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/cmodule.py +0 -0
  259. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/cutils.py +0 -0
  260. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/cvm.py +0 -0
  261. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/exceptions.py +0 -0
  262. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/interface.py +0 -0
  263. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/lazylinker_c.py +0 -0
  264. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/op.py +0 -0
  265. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/params_type.py +0 -0
  266. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/type.py +0 -0
  267. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/__init__.py +0 -0
  268. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/__init__.py +0 -0
  269. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/basic.py +0 -0
  270. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/blas.py +0 -0
  271. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  272. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/einsum.py +0 -0
  273. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  274. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  275. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/math.py +0 -0
  276. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  277. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/pad.py +0 -0
  278. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/random.py +0 -0
  279. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/scalar.py +0 -0
  280. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/scan.py +0 -0
  281. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/shape.py +0 -0
  282. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  283. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  284. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/sort.py +0 -0
  285. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/sparse.py +0 -0
  286. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  287. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/__init__.py +0 -0
  288. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/__init__.py +0 -0
  289. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  290. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  291. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  292. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
  293. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  294. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  295. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  296. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  297. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
  298. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +0 -0
  299. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -0
  300. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +0 -0
  301. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -0
  302. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -0
  303. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +0 -0
  304. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +0 -0
  305. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +0 -0
  306. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
  307. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  308. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/random.py +0 -0
  309. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/scan.py +0 -0
  310. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  311. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  312. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/slinalg.py +0 -0
  313. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/sparse.py +0 -0
  314. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  315. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  316. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/linker.py +0 -0
  317. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  318. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  319. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  320. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  321. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  322. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  323. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/math.py +0 -0
  324. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
  325. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  326. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  327. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  328. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  329. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/linker.py +0 -0
  330. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/utils.py +0 -0
  331. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/vm.py +0 -0
  332. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/__init__.py +0 -0
  333. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/check_blas.py +0 -0
  334. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/check_blas_many.sh +0 -0
  335. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/check_duplicate_key.py +0 -0
  336. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  337. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/elemwise_time_test.py +0 -0
  338. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/frozendict.py +0 -0
  339. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/may_share_memory.py +0 -0
  340. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/ordered_set.py +0 -0
  341. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/pkl_utils.py +0 -0
  342. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/npy_2_compat.py +0 -0
  343. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/printing.py +0 -0
  344. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/py.typed +0 -0
  345. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/raise_op.py +0 -0
  346. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/__init__.py +0 -0
  347. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/basic.py +0 -0
  348. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  349. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  350. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/c_code/gamma.c +0 -0
  351. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/c_code/incbet.c +0 -0
  352. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/loop.py +0 -0
  353. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/math.py +0 -0
  354. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/sharedvar.py +0 -0
  355. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/__init__.py +0 -0
  356. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/basic.py +0 -0
  357. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/scan_perform.pyx +0 -0
  358. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/scan_perform_ext.py +0 -0
  359. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/utils.py +0 -0
  360. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/views.py +0 -0
  361. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/__init__.py +0 -0
  362. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/basic.py +0 -0
  363. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/rewriting.py +0 -0
  364. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/sandbox/__init__.py +0 -0
  365. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/sandbox/sp.py +0 -0
  366. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/sharedvar.py +0 -0
  367. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/type.py +0 -0
  368. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/utils.py +0 -0
  369. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/__init__.py +0 -0
  370. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/_linalg/__init__.py +0 -0
  371. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
  372. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/blas_headers.py +0 -0
  373. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/blas_scipy.py +0 -0
  374. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  375. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  376. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  377. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/conv/__init__.py +0 -0
  378. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/conv/abstract_conv.py +0 -0
  379. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/einsum.py +0 -0
  380. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/elemwise_cgen.py +0 -0
  381. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/exceptions.py +0 -0
  382. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/extra_ops.py +0 -0
  383. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/fft.py +0 -0
  384. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/fourier.py +0 -0
  385. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/functional.py +0 -0
  386. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/inplace.py +0 -0
  387. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/interpolate.py +0 -0
  388. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/linalg.py +0 -0
  389. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/math.py +0 -0
  390. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/nlinalg.py +0 -0
  391. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/pad.py +0 -0
  392. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/__init__.py +0 -0
  393. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/basic.py +0 -0
  394. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  395. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/rewriting/basic.py +0 -0
  396. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/rewriting/jax.py +0 -0
  397. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/rewriting/numba.py +0 -0
  398. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/type.py +0 -0
  399. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/utils.py +0 -0
  400. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/var.py +0 -0
  401. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/__init__.py +0 -0
  402. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/blas_c.py +0 -0
  403. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
  404. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/blockwise.py +0 -0
  405. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/conv.py +0 -0
  406. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/einsum.py +0 -0
  407. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  408. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/jax.py +0 -0
  409. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/linalg.py +0 -0
  410. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/math.py +0 -0
  411. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/numba.py +0 -0
  412. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/ofg.py +0 -0
  413. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/shape.py +0 -0
  414. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/special.py +0 -0
  415. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/subtensor.py +0 -0
  416. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
  417. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  418. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/shape.py +0 -0
  419. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/sharedvar.py +0 -0
  420. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/signal/__init__.py +0 -0
  421. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/slinalg.py +0 -0
  422. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/sort.py +0 -0
  423. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/special.py +0 -0
  424. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/subtensor.py +0 -0
  425. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/type_other.py +0 -0
  426. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/utils.py +0 -0
  427. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/var.py +0 -0
  428. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/variable.py +0 -0
  429. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/xlogx.py +0 -0
  430. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/typed_list/__init__.py +0 -0
  431. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/typed_list/basic.py +0 -0
  432. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/typed_list/rewriting.py +0 -0
  433. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/typed_list/type.py +0 -0
  434. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/updates.py +0 -0
  435. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/utils.py +0 -0
  436. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor.egg-info/SOURCES.txt +0 -0
  437. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor.egg-info/dependency_links.txt +0 -0
  438. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor.egg-info/entry_points.txt +0 -0
  439. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor.egg-info/requires.txt +0 -0
  440. {pytensor-2.31.1 → pytensor-2.31.3}/pytensor.egg-info/top_level.txt +0 -0
  441. {pytensor-2.31.1 → pytensor-2.31.3}/scripts/mypy-failing.txt +0 -0
  442. {pytensor-2.31.1 → pytensor-2.31.3}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  443. {pytensor-2.31.1 → pytensor-2.31.3}/setup.cfg +0 -0
  444. {pytensor-2.31.1 → pytensor-2.31.3}/setup.py +0 -0
  445. {pytensor-2.31.1 → pytensor-2.31.3}/tests/link/c/c_code/test_cenum.h +0 -0
  446. {pytensor-2.31.1 → pytensor-2.31.3}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  447. {pytensor-2.31.1 → pytensor-2.31.3}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
  448. {pytensor-2.31.1 → pytensor-2.31.3}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
  449. {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_breakpoint.py +0 -0
  450. {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_config.py +0 -0
  451. {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_gradient.py +0 -0
  452. {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_ifelse.py +0 -0
  453. {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_printing.py +0 -0
  454. {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_raise_op.py +0 -0
  455. {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_rop.py +0 -0
  456. {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_updates.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 2.31.1
3
+ Version: 2.31.3
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-22T00:05:15+0800",
11
+ "date": "2025-06-02T15:09:01+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "4829455bac15db5db652e3ab73e6baf08f6ea8b9",
15
- "version": "2.31.1"
14
+ "full-revisionid": "ff98ab8f8d2e6b78539a9225bde5e18a49ae6b81",
15
+ "version": "2.31.3"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -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"):
@@ -87,14 +87,7 @@ def jax_funcify_Join(op, **kwargs):
87
87
  def join(axis, *tensors):
88
88
  # tensors could also be tuples, and in this case they don't have a ndim
89
89
  tensors = [jnp.asarray(tensor) for tensor in tensors]
90
- view = op.view
91
- if (view != -1) and all(
92
- tensor.shape[axis] == 0 for tensor in tensors[0:view] + tensors[view + 1 :]
93
- ):
94
- return tensors[view]
95
-
96
- else:
97
- return jnp.concatenate(tensors, axis=axis)
90
+ return jnp.concatenate(tensors, axis=axis)
98
91
 
99
92
  return join
100
93
 
@@ -9,8 +9,13 @@ from pytensor.link.basic import JITLinker
9
9
  class JAXLinker(JITLinker):
10
10
  """A `Linker` that JIT-compiles NumPy-based operations using JAX."""
11
11
 
12
+ def __init__(self, *args, **kwargs):
13
+ self.scalar_shape_inputs: tuple[int] = () # type: ignore[annotation-unchecked]
14
+ super().__init__(*args, **kwargs)
15
+
12
16
  def fgraph_convert(self, fgraph, input_storage, storage_map, **kwargs):
13
17
  from pytensor.link.jax.dispatch import jax_funcify
18
+ from pytensor.link.jax.dispatch.shape import JAXShapeTuple
14
19
  from pytensor.tensor.random.type import RandomType
15
20
 
16
21
  shared_rng_inputs = [
@@ -64,6 +69,23 @@ class JAXLinker(JITLinker):
64
69
  fgraph.inputs.remove(new_inp)
65
70
  fgraph.inputs.insert(old_inp_fgrap_index, new_inp)
66
71
 
72
+ fgraph_inputs = fgraph.inputs
73
+ clients = fgraph.clients
74
+ # Detect scalar shape inputs that are used only in JAXShapeTuple nodes
75
+ scalar_shape_inputs = [
76
+ inp
77
+ for node in fgraph.apply_nodes
78
+ if isinstance(node.op, JAXShapeTuple)
79
+ for inp in node.inputs
80
+ if inp in fgraph_inputs
81
+ and all(
82
+ isinstance(cl_node.op, JAXShapeTuple) for cl_node, _ in clients[inp]
83
+ )
84
+ ]
85
+ self.scalar_shape_inputs = tuple(
86
+ fgraph_inputs.index(inp) for inp in scalar_shape_inputs
87
+ )
88
+
67
89
  return jax_funcify(
68
90
  fgraph, input_storage=input_storage, storage_map=storage_map, **kwargs
69
91
  )
@@ -71,7 +93,22 @@ class JAXLinker(JITLinker):
71
93
  def jit_compile(self, fn):
72
94
  import jax
73
95
 
74
- return jax.jit(fn)
96
+ jit_fn = jax.jit(fn, static_argnums=self.scalar_shape_inputs)
97
+
98
+ if not self.scalar_shape_inputs:
99
+ return jit_fn
100
+
101
+ def convert_scalar_shape_inputs(
102
+ *args, scalar_shape_inputs=set(self.scalar_shape_inputs)
103
+ ):
104
+ return jit_fn(
105
+ *(
106
+ int(arg) if i in scalar_shape_inputs else arg
107
+ for i, arg in enumerate(args)
108
+ )
109
+ )
110
+
111
+ return convert_scalar_shape_inputs
75
112
 
76
113
  def create_thunk_inputs(self, storage_map):
77
114
  from pytensor.link.jax.dispatch import jax_typify
@@ -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
 
@@ -566,18 +565,19 @@ def numba_funcify_SpecifyShape(op, node, **kwargs):
566
565
  def int_to_float_fn(inputs, out_dtype):
567
566
  """Create a Numba function that converts integer and boolean ``ndarray``s to floats."""
568
567
 
569
- if all(
570
- input.type.numpy_dtype == np.dtype(out_dtype) for input in inputs
571
- ) and isinstance(np.dtype(out_dtype), np.floating):
568
+ if (
569
+ all(inp.type.dtype == out_dtype for inp in inputs)
570
+ and np.dtype(out_dtype).kind == "f"
571
+ ):
572
572
 
573
- @numba_njit
573
+ @numba_njit(inline="always")
574
574
  def inputs_cast(x):
575
575
  return x
576
576
 
577
- elif any(i.type.numpy_dtype.kind in "ib" for i in inputs):
577
+ elif any(i.type.numpy_dtype.kind in "uib" for i in inputs):
578
578
  args_dtype = np.dtype(f"f{out_dtype.itemsize}")
579
579
 
580
- @numba_njit
580
+ @numba_njit(inline="always")
581
581
  def inputs_cast(x):
582
582
  return x.astype(args_dtype)
583
583
 
@@ -585,7 +585,7 @@ def int_to_float_fn(inputs, out_dtype):
585
585
  args_dtype_sz = max(_arg.type.numpy_dtype.itemsize for _arg in inputs)
586
586
  args_dtype = np.dtype(f"f{args_dtype_sz}")
587
587
 
588
- @numba_njit
588
+ @numba_njit(inline="always")
589
589
  def inputs_cast(x):
590
590
  return x.astype(args_dtype)
591
591
 
@@ -594,36 +594,49 @@ def int_to_float_fn(inputs, out_dtype):
594
594
 
595
595
  @numba_funcify.register(Dot)
596
596
  def numba_funcify_Dot(op, node, **kwargs):
597
- # Numba's `np.dot` does not support integer dtypes, so we need to cast to
598
- # float.
597
+ # Numba's `np.dot` does not support integer dtypes, so we need to cast to float.
598
+ x, y = node.inputs
599
+ [out] = node.outputs
599
600
 
600
- out_dtype = node.outputs[0].type.numpy_dtype
601
- inputs_cast = int_to_float_fn(node.inputs, out_dtype)
601
+ x_dtype = x.type.dtype
602
+ y_dtype = y.type.dtype
603
+ dot_dtype = f"float{max((32, out.type.numpy_dtype.itemsize * 8))}"
604
+ out_dtype = out.type.dtype
602
605
 
603
- @numba_njit
604
- def dot(x, y):
605
- return np.asarray(np.dot(inputs_cast(x), inputs_cast(y))).astype(out_dtype)
606
+ if x_dtype == dot_dtype and y_dtype == dot_dtype:
607
+
608
+ @numba_njit
609
+ def dot(x, y):
610
+ return np.asarray(np.dot(x, y))
606
611
 
607
- return dot
612
+ elif x_dtype == dot_dtype and y_dtype != dot_dtype:
608
613
 
614
+ @numba_njit
615
+ def dot(x, y):
616
+ return np.asarray(np.dot(x, y.astype(dot_dtype)))
609
617
 
610
- @numba_funcify.register(Softplus)
611
- def numba_funcify_Softplus(op, node, **kwargs):
612
- x_dtype = np.dtype(node.inputs[0].dtype)
618
+ elif x_dtype != dot_dtype and y_dtype == dot_dtype:
613
619
 
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)
620
+ @numba_njit
621
+ def dot(x, y):
622
+ return np.asarray(np.dot(x.astype(dot_dtype), y))
625
623
 
626
- return softplus
624
+ else:
625
+
626
+ @numba_njit()
627
+ def dot(x, y):
628
+ return np.asarray(np.dot(x.astype(dot_dtype), y.astype(dot_dtype)))
629
+
630
+ if out_dtype == dot_dtype:
631
+ return dot
632
+
633
+ else:
634
+
635
+ @numba_njit
636
+ def dot_with_cast(x, y):
637
+ return dot(x, y).astype(out_dtype)
638
+
639
+ return dot_with_cast
627
640
 
628
641
 
629
642
  @numba_funcify.register(Solve)
@@ -689,11 +702,6 @@ def numba_funcify_BatchedDot(op, node, **kwargs):
689
702
  return batched_dot
690
703
 
691
704
 
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
705
  @numba_funcify.register(IfElse)
698
706
  def numba_funcify_IfElse(op, **kwargs):
699
707
  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
@@ -117,17 +117,9 @@ def numba_funcify_ARange(op, **kwargs):
117
117
 
118
118
  @numba_funcify.register(Join)
119
119
  def numba_funcify_Join(op, **kwargs):
120
- view = op.view
121
-
122
- if view != -1:
123
- # TODO: Where (and why) is this `Join.view` even being used? From a
124
- # quick search, the answer appears to be "nowhere", so we should
125
- # probably just remove it.
126
- raise NotImplementedError("The `view` parameter to `Join` is not supported")
127
-
128
120
  @numba_basic.numba_njit
129
121
  def join(axis, *tensors):
130
- return np.concatenate(tensors, numba_basic.to_scalar(axis))
122
+ return np.concatenate(tensors, axis.item())
131
123
 
132
124
  return join
133
125
 
@@ -1,6 +1,5 @@
1
1
  import pytensor.tensor.basic as ptb
2
2
  from pytensor.scan.basic import scan
3
- from pytensor.tensor.basic import Join
4
3
  from pytensor.tensor.math import ceil, eq, neq
5
4
  from pytensor.tensor.subtensor import set_subtensor
6
5
 
@@ -127,14 +126,12 @@ def scan_checkpoints(
127
126
 
128
127
  # Pad the sequences if needed
129
128
  if padding:
130
- # Since padding could be an empty tensor, Join returns a view of s.
131
- join = Join(view=0)
132
129
  for i, s in enumerate(sequences):
133
130
  overshoots_by = s.shape[0] % save_every_N
134
131
  overshoots = neq(overshoots_by, 0)
135
132
  n = (save_every_N - overshoots_by) * overshoots
136
133
  z = ptb.zeros((n, *s.shape[1:]), dtype=s.dtype)
137
- sequences[i] = join(0, s, z)
134
+ sequences[i] = ptb.join(0, s, z)
138
135
 
139
136
  # Establish the input variables of the outer scan
140
137
  o_sequences = [
@@ -1647,8 +1647,9 @@ class Scan(Op, ScanMethodsMixin, HasInnerGraph):
1647
1647
  p=p, i=node_input_storage, o=node_output_storage, n=node, allow_gc=allow_gc
1648
1648
  ):
1649
1649
  r = p(n, [x[0] for x in i], o)
1650
- for o in node.outputs:
1651
- compute_map[o][0] = True
1650
+ if compute_map is not None:
1651
+ for o in node.outputs:
1652
+ compute_map[o][0] = True
1652
1653
  if allow_gc:
1653
1654
  self.fn.free()
1654
1655
  return r
@@ -53,6 +53,7 @@ from pytensor.scan.utils import (
53
53
  from pytensor.tensor.basic import (
54
54
  Alloc,
55
55
  AllocEmpty,
56
+ atleast_Nd,
56
57
  get_scalar_constant_value,
57
58
  )
58
59
  from pytensor.tensor.elemwise import DimShuffle, Elemwise
@@ -1186,8 +1187,8 @@ def while_scan_merge_subtensor_last_element(fgraph, scan_node):
1186
1187
  return subtensor_merge_replacements
1187
1188
 
1188
1189
 
1189
- def _is_default_scan_buffer(x: TensorVariable) -> bool:
1190
- node = x.owner
1190
+ def _is_default_scan_buffer(final_buffer: TensorVariable, taps: int) -> bool:
1191
+ node = final_buffer.owner
1191
1192
 
1192
1193
  if node is None:
1193
1194
  return False
@@ -1200,8 +1201,10 @@ def _is_default_scan_buffer(x: TensorVariable) -> bool:
1200
1201
  ):
1201
1202
  return False
1202
1203
 
1203
- x, y, *_ = node.inputs
1204
- if not (x.owner is not None and isinstance(x.owner.op, AllocEmpty)):
1204
+ init_buffer, init_value, *_ = node.inputs
1205
+ if not (
1206
+ init_buffer.owner is not None and isinstance(init_buffer.owner.op, AllocEmpty)
1207
+ ):
1205
1208
  return False
1206
1209
 
1207
1210
  # The value may have been broadcast to fill in the initial taps.
@@ -1218,10 +1221,16 @@ def _is_default_scan_buffer(x: TensorVariable) -> bool:
1218
1221
  # 1. alloc_empty(2 + nsteps)[:2].broadcastable == x.broadcastable
1219
1222
  # But due to laziness we use the slightly more conservative check:
1220
1223
  # 2. alloc_empty(2 + nsteps).broadcastable == x.broadcastable
1221
- if broadcasted_by(y, x):
1222
- return False
1223
-
1224
- return True
1224
+ if taps > 1:
1225
+ return not broadcasted_by(init_value, init_buffer)
1226
+ else:
1227
+ # In this case we know we have alloc_empty(1 + nsteps, ...)[:1].set(init_value)
1228
+ # The first dimension cannot possibly broadcast in the subtensor assignment,
1229
+ # so we exclude it from `broadcasted_by`. To exclude it we squeeze it out,
1230
+ # after adding any other implicit expand_dims. We select into the first entry of
1231
+ # the buffer, to check for potential broadcasting in other dimensions.
1232
+ init_value_ = atleast_Nd(init_value, n=init_buffer.ndim)
1233
+ return not broadcasted_by(init_value_.squeeze(0), init_buffer[0])
1225
1234
 
1226
1235
 
1227
1236
  def scan_save_mem_rewrite(fgraph, node, backend_supports_output_pre_allocation: bool):
@@ -1574,15 +1583,16 @@ def scan_save_mem_rewrite(fgraph, node, backend_supports_output_pre_allocation:
1574
1583
  # If the memory for this output has been pre-allocated
1575
1584
  # before going into the scan op (by an alloc node)
1576
1585
  if idx < op_info.n_mit_sot + op_info.n_sit_sot:
1586
+ taps = init_l[i]
1577
1587
  nw_input = nw_inputs[offset + idx]
1578
1588
 
1579
1589
  # Recreate default buffers with new size
1580
- if _is_default_scan_buffer(nw_input):
1581
- extra_size = 1 if required_orphan else val - init_l[i]
1590
+ if _is_default_scan_buffer(nw_input, taps):
1591
+ extra_size = 1 if required_orphan else val - taps
1582
1592
  nw_input = expand_empty(nw_input.owner.inputs[1], extra_size)
1583
1593
  # Otherwise, just trim with a slice
1584
1594
  else:
1585
- stop = init_l[i] if required_orphan else val
1595
+ stop = taps if required_orphan else val
1586
1596
  nw_input = nw_input[:stop]
1587
1597
 
1588
1598
  nw_inputs[offset + idx] = nw_input
@@ -1626,14 +1636,13 @@ def scan_save_mem_rewrite(fgraph, node, backend_supports_output_pre_allocation:
1626
1636
  # val == 0 means that we want to keep all intermediate
1627
1637
  # results for that state, including the initial values.
1628
1638
  if idx < op_info.n_mit_sot + op_info.n_sit_sot:
1639
+ taps = init_l[op_info.n_mit_mot + idx]
1629
1640
  in_idx = offset + idx
1630
1641
  nw_input = nw_inputs[in_idx]
1631
- if _is_default_scan_buffer(nw_input):
1642
+ if _is_default_scan_buffer(nw_input, taps):
1632
1643
  nw_input = expand_empty(nw_input.owner.inputs[1], nw_steps)
1633
1644
  else:
1634
- # Number of steps in the initial state
1635
- init_l_pt = pt.as_tensor(init_l[op_info.n_mit_mot + idx])
1636
- nw_input = nw_input[: (init_l_pt + nw_steps)]
1645
+ nw_input = nw_input[: (taps + nw_steps)]
1637
1646
  nw_inputs[in_idx] = nw_input
1638
1647
 
1639
1648
  elif (
@@ -96,7 +96,7 @@ class Binomial(Op):
96
96
 
97
97
  def __init__(self, format, dtype):
98
98
  self.format = format
99
- self.dtype = dtype
99
+ self.dtype = np.dtype(dtype).name
100
100
 
101
101
  def make_node(self, n, p, shape):
102
102
  n = pt.as_tensor_variable(n)
@@ -14,16 +14,22 @@ from pytensor.tensor.slinalg import Solve, lu_factor, lu_solve
14
14
  from pytensor.tensor.variable import TensorVariable
15
15
 
16
16
 
17
- def decompose_A(A, assume_a):
17
+ def decompose_A(A, assume_a, check_finite):
18
18
  if assume_a == "gen":
19
- return lu_factor(A, check_finite=False)
19
+ return lu_factor(A, check_finite=check_finite)
20
20
  else:
21
21
  raise NotImplementedError
22
22
 
23
23
 
24
- def solve_lu_decomposed_system(A_decomp, b, b_ndim, assume_a, transposed=False):
25
- if assume_a == "gen":
26
- return lu_solve(A_decomp, b, b_ndim=b_ndim, trans=transposed)
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
+ )
27
33
  else:
28
34
  raise NotImplementedError
29
35
 
@@ -102,14 +108,19 @@ def _split_lu_solve_steps(
102
108
  ):
103
109
  return None
104
110
 
105
- A_decomp = decompose_A(A, assume_a=assume_a)
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)
106
118
 
107
119
  replacements = {}
108
120
  for client, transposed in A_solve_clients_and_transpose:
109
121
  _, b = client.inputs
110
- b_ndim = client.op.core_op.b_ndim
111
122
  new_x = solve_lu_decomposed_system(
112
- A_decomp, b, b_ndim=b_ndim, assume_a=assume_a, transposed=transposed
123
+ A_decomp, b, transposed=transposed, core_solve_op=client.op.core_op
113
124
  )
114
125
  [old_x] = client.outputs
115
126
  new_x = atleast_Nd(new_x, n=old_x.type.ndim).astype(old_x.type.dtype)