pytensor 2.31.1__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.1/pytensor.egg-info → pytensor-2.31.2}/PKG-INFO +1 -1
  2. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/_version.py +3 -3
  3. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/slinalg.py +15 -1
  4. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/basic.py +1 -26
  5. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/elemwise.py +1 -1
  6. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +1 -1
  7. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/nlinalg.py +3 -3
  8. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/scalar.py +20 -1
  9. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/_linalg/solve/rewriting.py +19 -8
  10. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/blas.py +14 -9
  11. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/blas_c.py +28 -19
  12. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/blockwise.py +22 -2
  13. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/blas.py +1 -1
  14. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/signal/conv.py +84 -2
  15. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/type.py +1 -1
  16. {pytensor-2.31.1 → pytensor-2.31.2/pytensor.egg-info}/PKG-INFO +1 -1
  17. {pytensor-2.31.1 → pytensor-2.31.2}/LICENSE.txt +0 -0
  18. {pytensor-2.31.1 → pytensor-2.31.2}/MANIFEST.in +0 -0
  19. {pytensor-2.31.1 → pytensor-2.31.2}/README.rst +0 -0
  20. {pytensor-2.31.1 → pytensor-2.31.2}/doc/.templates/PLACEHOLDER +0 -0
  21. {pytensor-2.31.1 → pytensor-2.31.2}/doc/.templates/layout.html +0 -0
  22. {pytensor-2.31.1 → pytensor-2.31.2}/doc/.templates/nb-badges.html +0 -0
  23. {pytensor-2.31.1 → pytensor-2.31.2}/doc/.templates/rendered_citation.html +0 -0
  24. {pytensor-2.31.1 → pytensor-2.31.2}/doc/LICENSE.txt +0 -0
  25. {pytensor-2.31.1 → pytensor-2.31.2}/doc/README.md +0 -0
  26. {pytensor-2.31.1 → pytensor-2.31.2}/doc/acknowledgement.rst +0 -0
  27. {pytensor-2.31.1 → pytensor-2.31.2}/doc/bcast.png +0 -0
  28. {pytensor-2.31.1 → pytensor-2.31.2}/doc/bcast.svg +0 -0
  29. {pytensor-2.31.1 → pytensor-2.31.2}/doc/blog.md +0 -0
  30. {pytensor-2.31.1 → pytensor-2.31.2}/doc/conf.py +0 -0
  31. {pytensor-2.31.1 → pytensor-2.31.2}/doc/core_development_guide.rst +0 -0
  32. {pytensor-2.31.1 → pytensor-2.31.2}/doc/css.inc +0 -0
  33. {pytensor-2.31.1 → pytensor-2.31.2}/doc/dev_start_guide.rst +0 -0
  34. {pytensor-2.31.1 → pytensor-2.31.2}/doc/environment.yml +0 -0
  35. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/apply.png +0 -0
  36. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/apply.svg +0 -0
  37. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/apply2.svg +0 -0
  38. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/creating_a_c_op.rst +0 -0
  39. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  40. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/creating_an_op.rst +0 -0
  41. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/ctype.rst +0 -0
  42. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/extending_faq.rst +0 -0
  43. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/extending_pytensor_solution_1.py +0 -0
  44. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/graph_rewriting.rst +0 -0
  45. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/graphstructures.rst +0 -0
  46. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/index.rst +0 -0
  47. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/inplace.rst +0 -0
  48. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/op.rst +0 -0
  49. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/other_ops.rst +0 -0
  50. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  51. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  52. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/pipeline.rst +0 -0
  53. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/scan.rst +0 -0
  54. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/tips.rst +0 -0
  55. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/type.rst +0 -0
  56. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/unittest.rst +0 -0
  57. {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/using_params.rst +0 -0
  58. {pytensor-2.31.1 → pytensor-2.31.2}/doc/faq.rst +0 -0
  59. {pytensor-2.31.1 → pytensor-2.31.2}/doc/gallery/page_footer.md +0 -0
  60. {pytensor-2.31.1 → pytensor-2.31.2}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  61. {pytensor-2.31.1 → pytensor-2.31.2}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  62. {pytensor-2.31.1 → pytensor-2.31.2}/doc/generate_dtype_tensor_table.py +0 -0
  63. {pytensor-2.31.1 → pytensor-2.31.2}/doc/glossary.rst +0 -0
  64. {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/Elman_srnn.png +0 -0
  65. {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/PyTensor.png +0 -0
  66. {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/PyTensor_RGB.svg +0 -0
  67. {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/PyTensor_logo.png +0 -0
  68. {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/binder.svg +0 -0
  69. {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/blocksparse.png +0 -0
  70. {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/colab.svg +0 -0
  71. {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/github.svg +0 -0
  72. {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/lstm.png +0 -0
  73. {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/lstm_memorycell.png +0 -0
  74. {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/talk2010.gif +0 -0
  75. {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/talk2010.png +0 -0
  76. {pytensor-2.31.1 → pytensor-2.31.2}/doc/index.rst +0 -0
  77. {pytensor-2.31.1 → pytensor-2.31.2}/doc/install.rst +0 -0
  78. {pytensor-2.31.1 → pytensor-2.31.2}/doc/internal/how_to_release.rst +0 -0
  79. {pytensor-2.31.1 → pytensor-2.31.2}/doc/internal/index.rst +0 -0
  80. {pytensor-2.31.1 → pytensor-2.31.2}/doc/internal/metadocumentation.rst +0 -0
  81. {pytensor-2.31.1 → pytensor-2.31.2}/doc/introduction.rst +0 -0
  82. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/debugmode.rst +0 -0
  83. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/function.rst +0 -0
  84. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/index.rst +0 -0
  85. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/io.rst +0 -0
  86. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/mode.rst +0 -0
  87. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/nanguardmode.rst +0 -0
  88. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/opfromgraph.rst +0 -0
  89. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/ops.rst +0 -0
  90. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/profilemode.rst +0 -0
  91. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/shared.rst +0 -0
  92. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/config.rst +0 -0
  93. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  94. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  95. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  96. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  97. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  98. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  99. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  100. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp.html +0 -0
  101. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp.png +0 -0
  102. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp2.html +0 -0
  103. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  104. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp2.png +0 -0
  105. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/ofg.html +0 -0
  106. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/ofg2.html +0 -0
  107. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/index.ipynb +0 -0
  108. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/index.rst +0 -0
  109. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  110. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  111. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  112. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  113. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/features.rst +0 -0
  114. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/fgraph.rst +0 -0
  115. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/graph.rst +0 -0
  116. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/index.rst +0 -0
  117. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/op.rst +0 -0
  118. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/replace.rst +0 -0
  119. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/type.rst +0 -0
  120. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/utils.rst +0 -0
  121. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/index.rst +0 -0
  122. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/misc/pkl_utils.rst +0 -0
  123. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/printing.rst +0 -0
  124. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/scalar/index.rst +0 -0
  125. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/scan.rst +0 -0
  126. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/sparse/index.rst +0 -0
  127. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/sparse/sandbox.rst +0 -0
  128. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/basic.rst +0 -0
  129. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/basic_opt.rst +0 -0
  130. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/bcast.png +0 -0
  131. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/bcast.svg +0 -0
  132. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/conv.rst +0 -0
  133. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/elemwise.rst +0 -0
  134. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/extra_ops.rst +0 -0
  135. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/fft.rst +0 -0
  136. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/functional.rst +0 -0
  137. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/index.rst +0 -0
  138. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/io.rst +0 -0
  139. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/math_opt.rst +0 -0
  140. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/nlinalg.rst +0 -0
  141. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/plot_fft.png +0 -0
  142. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/random/distributions.rst +0 -0
  143. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/random/index.rst +0 -0
  144. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/slinalg.rst +0 -0
  145. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/utils.rst +0 -0
  146. {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/typed_list.rst +0 -0
  147. {pytensor-2.31.1 → pytensor-2.31.2}/doc/links.rst +0 -0
  148. {pytensor-2.31.1 → pytensor-2.31.2}/doc/optimizations.rst +0 -0
  149. {pytensor-2.31.1 → pytensor-2.31.2}/doc/pylintrc +0 -0
  150. {pytensor-2.31.1 → pytensor-2.31.2}/doc/robots.txt +0 -0
  151. {pytensor-2.31.1 → pytensor-2.31.2}/doc/troubleshooting.rst +0 -0
  152. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/adding.rst +0 -0
  153. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/adding_solution_1.py +0 -0
  154. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/aliasing.rst +0 -0
  155. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/apply.png +0 -0
  156. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/apply.svg +0 -0
  157. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/bcast.png +0 -0
  158. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/broadcasting.rst +0 -0
  159. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/conditions.rst +0 -0
  160. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/debug_faq.rst +0 -0
  161. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/dlogistic.png +0 -0
  162. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/examples.rst +0 -0
  163. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/faq_tutorial.rst +0 -0
  164. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/gradients.rst +0 -0
  165. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/index.rst +0 -0
  166. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/loading_and_saving.rst +0 -0
  167. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/logistic.gp +0 -0
  168. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/logistic.png +0 -0
  169. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/loop.rst +0 -0
  170. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/loop_solution_1.py +0 -0
  171. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/modes.rst +0 -0
  172. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/modes_solution_1.py +0 -0
  173. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/multi_cores.rst +0 -0
  174. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/nan_tutorial.rst +0 -0
  175. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/pics/d3viz.png +0 -0
  176. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  177. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  178. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  179. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/printing_drawing.rst +0 -0
  180. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/prng.rst +0 -0
  181. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/profiling.rst +0 -0
  182. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/profiling_example.py +0 -0
  183. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/profiling_example_out.prof +0 -0
  184. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/shape_info.rst +0 -0
  185. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/sparse.rst +0 -0
  186. {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/symbolic_graphs.rst +0 -0
  187. {pytensor-2.31.1 → pytensor-2.31.2}/doc/user_guide.rst +0 -0
  188. {pytensor-2.31.1 → pytensor-2.31.2}/pyproject.toml +0 -0
  189. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/__init__.py +0 -0
  190. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/bin/__init__.py +0 -0
  191. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/bin/pytensor_cache.py +0 -0
  192. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/breakpoint.py +0 -0
  193. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/__init__.py +0 -0
  194. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/builders.py +0 -0
  195. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/compiledir.py +0 -0
  196. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/compilelock.py +0 -0
  197. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/debugmode.py +0 -0
  198. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/function/__init__.py +0 -0
  199. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/function/pfunc.py +0 -0
  200. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/function/types.py +0 -0
  201. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/io.py +0 -0
  202. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/mode.py +0 -0
  203. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/monitormode.py +0 -0
  204. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/nanguardmode.py +0 -0
  205. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/ops.py +0 -0
  206. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/profiling.py +0 -0
  207. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/sharedvalue.py +0 -0
  208. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/configdefaults.py +0 -0
  209. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/configparser.py +0 -0
  210. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/__init__.py +0 -0
  211. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  212. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/css/d3viz.css +0 -0
  213. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/d3viz.py +0 -0
  214. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/formatting.py +0 -0
  215. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/html/template.html +0 -0
  216. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  217. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  218. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/js/d3viz.js +0 -0
  219. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  220. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  221. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/gradient.py +0 -0
  222. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/__init__.py +0 -0
  223. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/basic.py +0 -0
  224. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/destroyhandler.py +0 -0
  225. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/features.py +0 -0
  226. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/fg.py +0 -0
  227. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/null_type.py +0 -0
  228. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/op.py +0 -0
  229. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/replace.py +0 -0
  230. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/rewriting/__init__.py +0 -0
  231. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/rewriting/basic.py +0 -0
  232. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/rewriting/db.py +0 -0
  233. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/rewriting/kanren.py +0 -0
  234. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/rewriting/unify.py +0 -0
  235. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/rewriting/utils.py +0 -0
  236. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/type.py +0 -0
  237. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/utils.py +0 -0
  238. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/ifelse.py +0 -0
  239. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/__init__.py +0 -0
  240. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/basic.py +0 -0
  241. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/__init__.py +0 -0
  242. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/basic.py +0 -0
  243. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  244. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  245. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/cmodule.py +0 -0
  246. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/cutils.py +0 -0
  247. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/cvm.py +0 -0
  248. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/exceptions.py +0 -0
  249. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/interface.py +0 -0
  250. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/lazylinker_c.py +0 -0
  251. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/op.py +0 -0
  252. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/params_type.py +0 -0
  253. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/type.py +0 -0
  254. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/__init__.py +0 -0
  255. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/__init__.py +0 -0
  256. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/basic.py +0 -0
  257. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/blas.py +0 -0
  258. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  259. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/einsum.py +0 -0
  260. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  261. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  262. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/math.py +0 -0
  263. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  264. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/pad.py +0 -0
  265. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/random.py +0 -0
  266. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/scalar.py +0 -0
  267. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/scan.py +0 -0
  268. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/shape.py +0 -0
  269. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  270. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  271. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/sort.py +0 -0
  272. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/sparse.py +0 -0
  273. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  274. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  275. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/linker.py +0 -0
  276. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/__init__.py +0 -0
  277. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/__init__.py +0 -0
  278. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  279. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  280. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  281. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
  282. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  283. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  284. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  285. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  286. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
  287. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +0 -0
  288. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -0
  289. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +0 -0
  290. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -0
  291. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -0
  292. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +0 -0
  293. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +0 -0
  294. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +0 -0
  295. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
  296. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  297. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/random.py +0 -0
  298. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/scan.py +0 -0
  299. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  300. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  301. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/slinalg.py +0 -0
  302. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/sparse.py +0 -0
  303. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  304. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  305. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  306. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/linker.py +0 -0
  307. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  308. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  309. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  310. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  311. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  312. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  313. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/math.py +0 -0
  314. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
  315. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  316. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  317. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  318. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  319. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/linker.py +0 -0
  320. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/utils.py +0 -0
  321. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/vm.py +0 -0
  322. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/__init__.py +0 -0
  323. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/check_blas.py +0 -0
  324. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/check_blas_many.sh +0 -0
  325. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/check_duplicate_key.py +0 -0
  326. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  327. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/elemwise_time_test.py +0 -0
  328. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/frozendict.py +0 -0
  329. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/may_share_memory.py +0 -0
  330. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/ordered_set.py +0 -0
  331. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/pkl_utils.py +0 -0
  332. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/npy_2_compat.py +0 -0
  333. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/printing.py +0 -0
  334. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/py.typed +0 -0
  335. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/raise_op.py +0 -0
  336. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/__init__.py +0 -0
  337. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/basic.py +0 -0
  338. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  339. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  340. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/c_code/gamma.c +0 -0
  341. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/c_code/incbet.c +0 -0
  342. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/loop.py +0 -0
  343. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/math.py +0 -0
  344. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/sharedvar.py +0 -0
  345. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/__init__.py +0 -0
  346. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/basic.py +0 -0
  347. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/checkpoints.py +0 -0
  348. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/op.py +0 -0
  349. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/rewriting.py +0 -0
  350. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/scan_perform.pyx +0 -0
  351. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/scan_perform_ext.py +0 -0
  352. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/utils.py +0 -0
  353. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/views.py +0 -0
  354. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/__init__.py +0 -0
  355. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/basic.py +0 -0
  356. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/rewriting.py +0 -0
  357. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/sandbox/__init__.py +0 -0
  358. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/sandbox/sp.py +0 -0
  359. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/sandbox/sp2.py +0 -0
  360. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/sharedvar.py +0 -0
  361. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/type.py +0 -0
  362. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/utils.py +0 -0
  363. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/__init__.py +0 -0
  364. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/_linalg/__init__.py +0 -0
  365. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
  366. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/basic.py +0 -0
  367. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/blas_headers.py +0 -0
  368. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/blas_scipy.py +0 -0
  369. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  370. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  371. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  372. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/conv/__init__.py +0 -0
  373. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/conv/abstract_conv.py +0 -0
  374. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/einsum.py +0 -0
  375. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/elemwise.py +0 -0
  376. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/elemwise_cgen.py +0 -0
  377. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/exceptions.py +0 -0
  378. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/extra_ops.py +0 -0
  379. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/fft.py +0 -0
  380. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/fourier.py +0 -0
  381. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/functional.py +0 -0
  382. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/inplace.py +0 -0
  383. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/interpolate.py +0 -0
  384. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/io.py +0 -0
  385. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/linalg.py +0 -0
  386. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/math.py +0 -0
  387. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/nlinalg.py +0 -0
  388. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/pad.py +0 -0
  389. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/__init__.py +0 -0
  390. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/basic.py +0 -0
  391. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/op.py +0 -0
  392. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  393. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/basic.py +0 -0
  394. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/jax.py +0 -0
  395. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/numba.py +0 -0
  396. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/type.py +0 -0
  397. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/utils.py +0 -0
  398. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/var.py +0 -0
  399. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/__init__.py +0 -0
  400. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/basic.py +0 -0
  401. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/blas_c.py +0 -0
  402. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
  403. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/blockwise.py +0 -0
  404. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/conv.py +0 -0
  405. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/einsum.py +0 -0
  406. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/elemwise.py +0 -0
  407. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  408. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/jax.py +0 -0
  409. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/linalg.py +0 -0
  410. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/math.py +0 -0
  411. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/numba.py +0 -0
  412. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/ofg.py +0 -0
  413. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/shape.py +0 -0
  414. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/special.py +0 -0
  415. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/subtensor.py +0 -0
  416. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
  417. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  418. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/shape.py +0 -0
  419. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/sharedvar.py +0 -0
  420. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/signal/__init__.py +0 -0
  421. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/slinalg.py +0 -0
  422. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/sort.py +0 -0
  423. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/special.py +0 -0
  424. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/subtensor.py +0 -0
  425. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/type_other.py +0 -0
  426. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/utils.py +0 -0
  427. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/var.py +0 -0
  428. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/variable.py +0 -0
  429. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/xlogx.py +0 -0
  430. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/typed_list/__init__.py +0 -0
  431. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/typed_list/basic.py +0 -0
  432. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/typed_list/rewriting.py +0 -0
  433. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/typed_list/type.py +0 -0
  434. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/updates.py +0 -0
  435. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/utils.py +0 -0
  436. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor.egg-info/SOURCES.txt +0 -0
  437. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor.egg-info/dependency_links.txt +0 -0
  438. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor.egg-info/entry_points.txt +0 -0
  439. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor.egg-info/requires.txt +0 -0
  440. {pytensor-2.31.1 → pytensor-2.31.2}/pytensor.egg-info/top_level.txt +0 -0
  441. {pytensor-2.31.1 → pytensor-2.31.2}/scripts/mypy-failing.txt +0 -0
  442. {pytensor-2.31.1 → pytensor-2.31.2}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  443. {pytensor-2.31.1 → pytensor-2.31.2}/setup.cfg +0 -0
  444. {pytensor-2.31.1 → pytensor-2.31.2}/setup.py +0 -0
  445. {pytensor-2.31.1 → pytensor-2.31.2}/tests/link/c/c_code/test_cenum.h +0 -0
  446. {pytensor-2.31.1 → pytensor-2.31.2}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  447. {pytensor-2.31.1 → pytensor-2.31.2}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
  448. {pytensor-2.31.1 → pytensor-2.31.2}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
  449. {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_breakpoint.py +0 -0
  450. {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_config.py +0 -0
  451. {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_gradient.py +0 -0
  452. {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_ifelse.py +0 -0
  453. {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_printing.py +0 -0
  454. {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_raise_op.py +0 -0
  455. {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_rop.py +0 -0
  456. {pytensor-2.31.1 → 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.1
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-22T00:05:15+0800",
11
+ "date": "2025-05-24T11:34:23+0800",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "4829455bac15db5db652e3ab73e6baf08f6ea8b9",
15
- "version": "2.31.1"
14
+ "full-revisionid": "2d414d4129882861b867aaf0d9abcf3135e3d5eb",
15
+ "version": "2.31.2"
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"):
@@ -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
@@ -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)
@@ -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
@@ -336,11 +336,12 @@ cger_no_inplace = CGer(False)
336
336
  # ##### ####### #######
337
337
 
338
338
 
339
- def gemv_c_code(y, A, x, z, alpha, beta, fail, force_init_beta=False, params=None):
339
+ def gemv_c_code(y, A, x, z, alpha, beta, fail, must_initialize_y=False, params=None):
340
340
  """
341
341
  z <- beta * y + alpha * dot(A, x)
342
342
 
343
343
  where A is a matrix, y and x are vectors (ergo z is vector)
344
+ z = y if inplace else y.copy()
344
345
  """
345
346
  code = """
346
347
 
@@ -400,17 +401,11 @@ def gemv_c_code(y, A, x, z, alpha, beta, fail, force_init_beta=False, params=Non
400
401
  }
401
402
  if (dbeta != 0)
402
403
  {
404
+ // If dbeta is zero, we avoid doing the copy
403
405
  if (PyArray_CopyInto(%(z)s, %(y)s) != 0) {
404
406
  %(fail)s
405
407
  }
406
408
  }
407
- else if (%(force_init_beta)d)
408
- {
409
- PyObject *zero = PyFloat_FromDouble(0.);
410
- if (zero == NULL) %(fail)s;
411
- if (PyArray_FillWithScalar(%(z)s, zero) != 0) %(fail)s;
412
- Py_DECREF(zero);
413
- }
414
409
  }
415
410
  else
416
411
  {
@@ -422,6 +417,20 @@ def gemv_c_code(y, A, x, z, alpha, beta, fail, force_init_beta=False, params=Non
422
417
  }
423
418
  }
424
419
 
420
+ if (%(must_initialize_y)d && dbeta == 0)
421
+ {
422
+ // Most BLAS implementations of GEMV ignore y=nan when beta=0
423
+ // PyTensor considers that the correct behavior,
424
+ // and even exploits it to avoid copying or initializing outputs.
425
+ // By deciding to exploit this, however, it becomes our responsibility
426
+ // to ensure the behavior even in the rare cases BLAS deviates,
427
+ // or users will get errors, even for graphs that had no nan to begin with.
428
+ PyObject *zero = PyFloat_FromDouble(0.);
429
+ if (zero == NULL) %(fail)s;
430
+ if (PyArray_FillWithScalar(%(z)s, zero) != 0) %(fail)s;
431
+ Py_DECREF(zero);
432
+ }
433
+
425
434
  {
426
435
  int NA0 = PyArray_DIMS(%(A)s)[0];
427
436
  int NA1 = PyArray_DIMS(%(A)s)[1];
@@ -491,13 +500,13 @@ def gemv_c_code(y, A, x, z, alpha, beta, fail, force_init_beta=False, params=Non
491
500
 
492
501
  if (is_float)
493
502
  {
494
- z_data[0] *= fbeta;
503
+ z_data[0] = dbeta != 0 ? dbeta * z_data[0] : 0.f;
495
504
  z_data[0] += alpha * sdot_(&NA1, (float*)(A_data), &SA1,
496
505
  (float*)x_data, &Sx);
497
506
  }
498
507
  else
499
508
  {
500
- z_data[0] *= dbeta;
509
+ z_data[0] = dbeta != 0 ? dbeta * z_data[0] : 0.;
501
510
  z_data[0] += alpha * ddot_(&NA1, (double*)(A_data), &SA1,
502
511
  (double*)x_data, &Sx);
503
512
  }
@@ -583,21 +592,21 @@ class CGemv(BaseBLAS, Gemv):
583
592
  alpha,
584
593
  beta,
585
594
  fail=sub["fail"],
586
- force_init_beta=check_force_gemv_init(),
595
+ must_initialize_y=must_initialize_y_gemv(),
587
596
  params=sub["params"],
588
597
  )
589
598
  return code
590
599
 
591
600
  def c_code_cache_version(self):
592
- return (16, blas_header_version(), check_force_gemv_init())
601
+ return (17, blas_header_version(), must_initialize_y_gemv())
593
602
 
594
603
 
595
604
  cgemv_inplace = CGemv(inplace=True)
596
605
  cgemv_no_inplace = CGemv(inplace=False)
597
606
 
598
607
 
599
- def check_force_gemv_init():
600
- if check_force_gemv_init._force_init_beta is None:
608
+ def must_initialize_y_gemv():
609
+ if must_initialize_y_gemv._force_init_beta is None:
601
610
  from pytensor.link.c.cmodule import GCC_compiler
602
611
 
603
612
  """
@@ -643,13 +652,13 @@ int main() {
643
652
  )
644
653
  if res:
645
654
  if res[0]:
646
- check_force_gemv_init._force_init_beta = res[1]
655
+ must_initialize_y_gemv._force_init_beta = res[1]
647
656
  else:
648
- check_force_gemv_init._force_init_beta = False
657
+ must_initialize_y_gemv._force_init_beta = False
649
658
  else:
650
- check_force_gemv_init._force_init_beta = False
659
+ must_initialize_y_gemv._force_init_beta = False
651
660
 
652
- return check_force_gemv_init._force_init_beta
661
+ return must_initialize_y_gemv._force_init_beta
653
662
 
654
663
 
655
- check_force_gemv_init._force_init_beta = None
664
+ must_initialize_y_gemv._force_init_beta = None
@@ -16,6 +16,7 @@ from pytensor.graph.replace import (
16
16
  _vectorize_not_needed,
17
17
  vectorize_graph,
18
18
  )
19
+ from pytensor.link.c.op import COp
19
20
  from pytensor.scalar import ScalarType
20
21
  from pytensor.tensor import as_tensor_variable
21
22
  from pytensor.tensor.shape import shape_padleft
@@ -43,7 +44,18 @@ def _vectorize_node_perform(
43
44
  """
44
45
 
45
46
  storage_map = {var: [None] for var in core_node.inputs + core_node.outputs}
46
- core_thunk = core_node.op.make_thunk(core_node, storage_map, None, [], impl=impl)
47
+ try:
48
+ core_thunk = core_node.op.make_thunk(
49
+ core_node, storage_map, None, [], impl=impl
50
+ )
51
+ except NotImplementedError:
52
+ if impl == "c":
53
+ # Try again with py impl
54
+ core_thunk = core_node.op.make_thunk(
55
+ core_node, storage_map, None, [], impl="py"
56
+ )
57
+ else:
58
+ raise
47
59
  single_in = len(core_node.inputs) == 1
48
60
  core_input_storage = [storage_map[inp] for inp in core_node.inputs]
49
61
  core_output_storage = [storage_map[out] for out in core_node.outputs]
@@ -128,7 +140,7 @@ def _check_runtime_broadcast_core(numerical_inputs, batch_bcast_patterns, batch_
128
140
  )
129
141
 
130
142
 
131
- class Blockwise(Op):
143
+ class Blockwise(COp):
132
144
  """Generalizes a core `Op` to work with batched dimensions.
133
145
 
134
146
  TODO: Dispatch JAX (should be easy with the vectorize macro)
@@ -483,6 +495,14 @@ class Blockwise(Op):
483
495
  else:
484
496
  return self.name
485
497
 
498
+ def c_code(self, *args, **kwargs):
499
+ # Blockwise is a C_Op just so we can propagate compilation mode to the inner Op.
500
+ # It doesn't itself have a C implementation yet.
501
+ raise NotImplementedError()
502
+
503
+ def c_code_cache_version(self):
504
+ return (-1,)
505
+
486
506
 
487
507
  @_vectorize_node.register(Op)
488
508
  def vectorize_node_fallback(op: Op, node: Apply, *bached_inputs) -> Apply:
@@ -700,7 +700,7 @@ def local_dot22_to_ger_or_gemv(fgraph, node):
700
700
  new_out = [rval]
701
701
  elif xb[0] and yb[1]:
702
702
  # x and y are both vectors so this qualifies for a sdot / ddot
703
- # TODO: PyTensor doesn't have a sdot, but gemv is better than _dot22
703
+ # PyTensor's CGemv will call sdot/ddot at runtime, the Scipy Gemv may not
704
704
  xv = x.dimshuffle(1)
705
705
  zeros = ptb.AllocEmpty(x.dtype)(1)
706
706
  rval = gemv_no_inplace(zeros, one, y.T, xv, zero)
@@ -2,7 +2,8 @@ from typing import TYPE_CHECKING, Literal, cast
2
2
 
3
3
  from numpy import convolve as numpy_convolve
4
4
 
5
- from pytensor.graph import Apply, Op
5
+ from pytensor.graph import Apply
6
+ from pytensor.link.c.op import COp
6
7
  from pytensor.scalar.basic import upcast
7
8
  from pytensor.tensor.basic import as_tensor_variable, join, zeros
8
9
  from pytensor.tensor.blockwise import Blockwise
@@ -15,7 +16,7 @@ if TYPE_CHECKING:
15
16
  from pytensor.tensor import TensorLike
16
17
 
17
18
 
18
- class Convolve1d(Op):
19
+ class Convolve1d(COp):
19
20
  __props__ = ("mode",)
20
21
  gufunc_signature = "(n),(k)->(o)"
21
22
 
@@ -86,6 +87,87 @@ class Convolve1d(Op):
86
87
 
87
88
  return [in1_bar, in2_bar]
88
89
 
90
+ def c_code_cache_version(self):
91
+ return (1,)
92
+
93
+ def c_code(self, node, name, inputs, outputs, sub):
94
+ # raise NotImplementedError()
95
+ in1, in2 = inputs
96
+ [out] = outputs
97
+ mode_str = self.mode
98
+
99
+ if mode_str == "full":
100
+ np_mode_val = 2 # NPY_CONVOLVE_FULL
101
+ elif mode_str == "valid":
102
+ np_mode_val = 0 # NPY_CONVOLVE_VALID
103
+ else:
104
+ # This case should ideally be prevented by __init__ or make_node
105
+ raise ValueError(f"Unsupported mode {mode_str}")
106
+
107
+ code = f"""
108
+ {{
109
+ PyArrayObject* in2_flipped_view = NULL;
110
+
111
+ if (PyArray_NDIM({in1}) != 1 || PyArray_NDIM({in2}) != 1) {{
112
+ PyErr_SetString(PyExc_ValueError, "Convolve1d C code expects 1D arrays.");
113
+ {sub['fail']};
114
+ }}
115
+
116
+ npy_intp n_in2 = PyArray_DIM({in2}, 0);
117
+
118
+ // Create a reversed view of in2
119
+ if (n_in2 == 0) {{
120
+ PyErr_SetString(PyExc_ValueError, "Convolve1d: second input (kernel) cannot be empty.");
121
+ {sub['fail']};
122
+ }} else {{
123
+ npy_intp view_dims[1];
124
+ view_dims[0] = n_in2;
125
+
126
+ npy_intp view_strides[1];
127
+ view_strides[0] = -PyArray_STRIDES({in2})[0];
128
+
129
+ void* view_data = (char*)PyArray_DATA({in2}) + (n_in2 - 1) * PyArray_STRIDES({in2})[0];
130
+
131
+ Py_INCREF(PyArray_DESCR({in2}));
132
+ in2_flipped_view = (PyArrayObject*)PyArray_NewFromDescr(
133
+ Py_TYPE({in2}),
134
+ PyArray_DESCR({in2}),
135
+ 1, // ndim
136
+ view_dims,
137
+ view_strides,
138
+ view_data,
139
+ (PyArray_FLAGS({in2}) & ~NPY_ARRAY_WRITEABLE),
140
+ NULL
141
+ );
142
+
143
+ if (!in2_flipped_view) {{
144
+ PyErr_SetString(PyExc_RuntimeError, "Failed to create flipped kernel view for Convolve1d.");
145
+ {sub['fail']};
146
+ }}
147
+
148
+ Py_INCREF({in2});
149
+ if (PyArray_SetBaseObject(in2_flipped_view, (PyObject*){in2}) < 0) {{
150
+ Py_DECREF({in2}); // SetBaseObject failed, release the extra INCREF
151
+ Py_DECREF(in2_flipped_view);
152
+ in2_flipped_view = NULL;
153
+ PyErr_SetString(PyExc_RuntimeError, "Failed to set base object for flipped kernel view in Convolve1d.");
154
+ {sub['fail']};
155
+ }}
156
+ PyArray_UpdateFlags(in2_flipped_view, (NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_F_CONTIGUOUS));
157
+ }}
158
+
159
+ // TODO: Use lower level implementation that allows reusing the output buffer
160
+ Py_XDECREF({out});
161
+ {out} = (PyArrayObject*) PyArray_Correlate2((PyObject*){in1}, (PyObject*)in2_flipped_view, {np_mode_val});
162
+ Py_XDECREF(in2_flipped_view); // Clean up the view if correlate fails
163
+ if (!{out}) {{
164
+ // PyArray_Correlate already set an error
165
+ {sub['fail']};
166
+ }}
167
+ }}
168
+ """
169
+ return code
170
+
89
171
 
90
172
  def convolve1d(
91
173
  in1: "TensorLike",
@@ -793,7 +793,7 @@ def tensor(
793
793
  try:
794
794
  # Help catching errors with the new tensor API
795
795
  # Many single letter strings are valid sctypes
796
- if str(name) == "floatX" or (len(str(name)) > 1 and np.dtype(name).type):
796
+ if str(name) == "floatX" or (len(str(name)) > 2 and np.dtype(name).type):
797
797
  raise ValueError(
798
798
  f"The first and only positional argument of tensor is now `name`. Got {name}.\n"
799
799
  "This name looks like a dtype, which you should pass as a keyword argument only."
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 2.31.1
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes