pytensor 2.36.3__tar.gz → 2.38.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. {pytensor-2.36.3/pytensor.egg-info → pytensor-2.38.0}/PKG-INFO +1 -1
  2. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/creating_an_op.rst +3 -3
  3. pytensor-2.38.0/doc/library/xtensor/signal.md +7 -0
  4. {pytensor-2.36.3 → pytensor-2.38.0}/pyproject.toml +8 -13
  5. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/_version.py +3 -3
  6. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/breakpoint.py +2 -2
  7. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/gradient.py +15 -14
  8. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/replace.py +25 -10
  9. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/basic.py +1 -1
  10. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/slinalg.py +30 -10
  11. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/linker.py +1 -1
  12. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/basic.py +16 -9
  13. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/blockwise.py +3 -0
  14. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/compile_ops.py +1 -1
  15. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/elemwise.py +1 -0
  16. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +581 -201
  17. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +11 -13
  18. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +6 -15
  19. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +4 -3
  20. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +13 -244
  21. pytensor-2.38.0/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +1320 -0
  22. pytensor-2.38.0/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +228 -0
  23. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +9 -8
  24. pytensor-2.38.0/pytensor/link/numba/dispatch/linalg/solve/general.py +85 -0
  25. pytensor-2.38.0/pytensor/link/numba/dispatch/linalg/solve/linear_control.py +100 -0
  26. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +5 -12
  27. pytensor-2.38.0/pytensor/link/numba/dispatch/linalg/solve/posdef.py +116 -0
  28. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +44 -130
  29. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +6 -8
  30. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +16 -92
  31. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/utils.py +2 -64
  32. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/random.py +1 -0
  33. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/scalar.py +1 -1
  34. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/scan.py +3 -1
  35. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/slinalg.py +221 -111
  36. pytensor-2.38.0/pytensor/link/numba/dispatch/sparse/__init__.py +1 -0
  37. pytensor-2.38.0/pytensor/link/numba/dispatch/sparse/basic.py +240 -0
  38. pytensor-2.38.0/pytensor/link/numba/dispatch/sparse/math.py +649 -0
  39. pytensor-2.38.0/pytensor/link/numba/dispatch/sparse/variable.py +598 -0
  40. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/tensor_basic.py +2 -2
  41. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/typed_list.py +13 -0
  42. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +19 -8
  43. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/linker.py +1 -1
  44. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/vm.py +1 -1
  45. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/raise_op.py +5 -2
  46. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/basic.py +3 -3
  47. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/basic.py +9 -11
  48. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/op.py +56 -51
  49. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/rewriting.py +5 -7
  50. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/utils.py +16 -18
  51. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/basic.py +73 -28
  52. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/math.py +95 -71
  53. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/variable.py +9 -7
  54. pytensor-2.38.0/pytensor/tensor/_linalg/solve/linear_control.py +457 -0
  55. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/_linalg/solve/rewriting.py +41 -18
  56. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/basic.py +16 -15
  57. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/elemwise.py +3 -3
  58. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/extra_ops.py +3 -4
  59. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/fft.py +3 -3
  60. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/linalg.py +1 -0
  61. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/nlinalg.py +8 -4
  62. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/optimize.py +303 -238
  63. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/reshape.py +112 -130
  64. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/basic.py +7 -3
  65. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/blas_c.py +1 -0
  66. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/blockwise.py +11 -5
  67. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/linalg.py +179 -51
  68. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/math.py +46 -26
  69. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/reshape.py +3 -2
  70. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/shape.py +31 -8
  71. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/subtensor.py +1 -1
  72. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/shape.py +7 -6
  73. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/signal/conv.py +7 -6
  74. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/slinalg.py +688 -433
  75. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/subtensor.py +14 -12
  76. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/type.py +4 -2
  77. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/type_other.py +2 -2
  78. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/utils.py +11 -0
  79. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/__init__.py +1 -1
  80. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/basic.py +50 -0
  81. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/indexing.py +48 -2
  82. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/linalg.py +8 -19
  83. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/reduction.py +17 -6
  84. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/utils.py +10 -2
  85. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/shape.py +50 -42
  86. pytensor-2.38.0/pytensor/xtensor/signal.py +74 -0
  87. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/type.py +79 -20
  88. pytensor-2.38.0/pytensor/xtensor/vectorization.py +664 -0
  89. {pytensor-2.36.3 → pytensor-2.38.0/pytensor.egg-info}/PKG-INFO +1 -1
  90. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor.egg-info/SOURCES.txt +10 -2
  91. {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_gradient.py +12 -0
  92. {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_raise_op.py +1 -6
  93. pytensor-2.36.3/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -147
  94. pytensor-2.36.3/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -55
  95. pytensor-2.36.3/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -224
  96. pytensor-2.36.3/pytensor/link/numba/dispatch/sparse.py +0 -206
  97. pytensor-2.36.3/pytensor/xtensor/vectorization.py +0 -278
  98. {pytensor-2.36.3 → pytensor-2.38.0}/LICENSE.txt +0 -0
  99. {pytensor-2.36.3 → pytensor-2.38.0}/MANIFEST.in +0 -0
  100. {pytensor-2.36.3 → pytensor-2.38.0}/README.rst +0 -0
  101. {pytensor-2.36.3 → pytensor-2.38.0}/doc/.templates/PLACEHOLDER +0 -0
  102. {pytensor-2.36.3 → pytensor-2.38.0}/doc/.templates/layout.html +0 -0
  103. {pytensor-2.36.3 → pytensor-2.38.0}/doc/.templates/nb-badges.html +0 -0
  104. {pytensor-2.36.3 → pytensor-2.38.0}/doc/.templates/rendered_citation.html +0 -0
  105. {pytensor-2.36.3 → pytensor-2.38.0}/doc/LICENSE.txt +0 -0
  106. {pytensor-2.36.3 → pytensor-2.38.0}/doc/README.md +0 -0
  107. {pytensor-2.36.3 → pytensor-2.38.0}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  108. {pytensor-2.36.3 → pytensor-2.38.0}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  109. {pytensor-2.36.3 → pytensor-2.38.0}/doc/acknowledgement.rst +0 -0
  110. {pytensor-2.36.3 → pytensor-2.38.0}/doc/bcast.png +0 -0
  111. {pytensor-2.36.3 → pytensor-2.38.0}/doc/bcast.svg +0 -0
  112. {pytensor-2.36.3 → pytensor-2.38.0}/doc/blog.md +0 -0
  113. {pytensor-2.36.3 → pytensor-2.38.0}/doc/conf.py +0 -0
  114. {pytensor-2.36.3 → pytensor-2.38.0}/doc/core_development_guide.rst +0 -0
  115. {pytensor-2.36.3 → pytensor-2.38.0}/doc/css.inc +0 -0
  116. {pytensor-2.36.3 → pytensor-2.38.0}/doc/dev_start_guide.rst +0 -0
  117. {pytensor-2.36.3 → pytensor-2.38.0}/doc/environment.yml +0 -0
  118. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/apply.png +0 -0
  119. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/apply.svg +0 -0
  120. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/apply2.svg +0 -0
  121. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/creating_a_c_op.rst +0 -0
  122. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  123. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/ctype.rst +0 -0
  124. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/extending_faq.rst +0 -0
  125. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
  126. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/graph_rewriting.rst +0 -0
  127. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/graphstructures.rst +0 -0
  128. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/index.rst +0 -0
  129. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/inplace.rst +0 -0
  130. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/op.rst +0 -0
  131. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/other_ops.rst +0 -0
  132. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  133. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  134. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/pipeline.rst +0 -0
  135. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/scan.rst +0 -0
  136. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/tips.rst +0 -0
  137. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/type.rst +0 -0
  138. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/unittest.rst +0 -0
  139. {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/using_params.rst +0 -0
  140. {pytensor-2.36.3 → pytensor-2.38.0}/doc/faq.rst +0 -0
  141. {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  142. {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
  143. {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
  144. {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/optimize/root.ipynb +0 -0
  145. {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/page_footer.md +0 -0
  146. {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  147. {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  148. {pytensor-2.36.3 → pytensor-2.38.0}/doc/generate_dtype_tensor_table.py +0 -0
  149. {pytensor-2.36.3 → pytensor-2.38.0}/doc/glossary.rst +0 -0
  150. {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/Elman_srnn.png +0 -0
  151. {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/PyTensor.png +0 -0
  152. {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/PyTensor_RGB.svg +0 -0
  153. {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/PyTensor_logo.png +0 -0
  154. {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/binder.svg +0 -0
  155. {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/blocksparse.png +0 -0
  156. {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/colab.svg +0 -0
  157. {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/github.svg +0 -0
  158. {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/lstm.png +0 -0
  159. {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/lstm_memorycell.png +0 -0
  160. {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/talk2010.gif +0 -0
  161. {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/talk2010.png +0 -0
  162. {pytensor-2.36.3 → pytensor-2.38.0}/doc/index.rst +0 -0
  163. {pytensor-2.36.3 → pytensor-2.38.0}/doc/install.rst +0 -0
  164. {pytensor-2.36.3 → pytensor-2.38.0}/doc/internal/how_to_release.rst +0 -0
  165. {pytensor-2.36.3 → pytensor-2.38.0}/doc/internal/index.rst +0 -0
  166. {pytensor-2.36.3 → pytensor-2.38.0}/doc/internal/metadocumentation.rst +0 -0
  167. {pytensor-2.36.3 → pytensor-2.38.0}/doc/introduction.rst +0 -0
  168. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/debugmode.rst +0 -0
  169. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/function.rst +0 -0
  170. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/index.rst +0 -0
  171. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/io.rst +0 -0
  172. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/mode.rst +0 -0
  173. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/nanguardmode.rst +0 -0
  174. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/opfromgraph.rst +0 -0
  175. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/ops.rst +0 -0
  176. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/profilemode.rst +0 -0
  177. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/shared.rst +0 -0
  178. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/config.rst +0 -0
  179. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  180. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  181. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  182. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  183. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  184. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  185. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  186. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/mlp.html +0 -0
  187. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/mlp.png +0 -0
  188. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/mlp2.html +0 -0
  189. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  190. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/mlp2.png +0 -0
  191. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/ofg.html +0 -0
  192. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/ofg2.html +0 -0
  193. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/index.ipynb +0 -0
  194. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/index.rst +0 -0
  195. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  196. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  197. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  198. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  199. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/features.rst +0 -0
  200. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/fgraph.rst +0 -0
  201. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/graph.rst +0 -0
  202. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/index.rst +0 -0
  203. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/op.rst +0 -0
  204. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/replace.rst +0 -0
  205. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/type.rst +0 -0
  206. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/utils.rst +0 -0
  207. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/index.rst +0 -0
  208. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/misc/pkl_utils.rst +0 -0
  209. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/printing.rst +0 -0
  210. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/scalar/index.rst +0 -0
  211. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/scan.rst +0 -0
  212. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/sparse/index.rst +0 -0
  213. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/sparse/sandbox.rst +0 -0
  214. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/basic.rst +0 -0
  215. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/basic_opt.rst +0 -0
  216. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/bcast.png +0 -0
  217. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/bcast.svg +0 -0
  218. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/elemwise.rst +0 -0
  219. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/extra_ops.rst +0 -0
  220. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/fft.rst +0 -0
  221. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/functional.rst +0 -0
  222. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/index.rst +0 -0
  223. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/io.rst +0 -0
  224. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/math_opt.rst +0 -0
  225. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/nlinalg.rst +0 -0
  226. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/optimize.rst +0 -0
  227. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/plot_fft.png +0 -0
  228. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/random/distributions.rst +0 -0
  229. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/random/index.rst +0 -0
  230. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/slinalg.rst +0 -0
  231. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/utils.rst +0 -0
  232. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/typed_list.rst +0 -0
  233. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/xtensor/index.md +0 -0
  234. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/xtensor/linalg.md +0 -0
  235. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/xtensor/math.md +0 -0
  236. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/xtensor/module_functions.md +0 -0
  237. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/xtensor/random.md +0 -0
  238. {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/xtensor/type.md +0 -0
  239. {pytensor-2.36.3 → pytensor-2.38.0}/doc/links.rst +0 -0
  240. {pytensor-2.36.3 → pytensor-2.38.0}/doc/optimizations.rst +0 -0
  241. {pytensor-2.36.3 → pytensor-2.38.0}/doc/pylintrc +0 -0
  242. {pytensor-2.36.3 → pytensor-2.38.0}/doc/robots.txt +0 -0
  243. {pytensor-2.36.3 → pytensor-2.38.0}/doc/troubleshooting.rst +0 -0
  244. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/adding.rst +0 -0
  245. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/adding_solution_1.py +0 -0
  246. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/aliasing.rst +0 -0
  247. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/apply.png +0 -0
  248. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/apply.svg +0 -0
  249. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/bcast.png +0 -0
  250. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/broadcasting.rst +0 -0
  251. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/conditions.rst +0 -0
  252. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/debug_faq.rst +0 -0
  253. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/dlogistic.png +0 -0
  254. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/examples.rst +0 -0
  255. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/faq_tutorial.rst +0 -0
  256. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/gradients.rst +0 -0
  257. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/index.rst +0 -0
  258. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/loading_and_saving.rst +0 -0
  259. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/logistic.gp +0 -0
  260. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/logistic.png +0 -0
  261. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/loop.rst +0 -0
  262. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/loop_solution_1.py +0 -0
  263. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/modes.rst +0 -0
  264. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/modes_solution_1.py +0 -0
  265. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/multi_cores.rst +0 -0
  266. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/nan_tutorial.rst +0 -0
  267. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/pics/d3viz.png +0 -0
  268. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  269. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  270. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  271. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/printing_drawing.rst +0 -0
  272. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/prng.rst +0 -0
  273. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/profiling.rst +0 -0
  274. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/profiling_example.py +0 -0
  275. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/profiling_example_out.prof +0 -0
  276. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/shape_info.rst +0 -0
  277. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/sparse.rst +0 -0
  278. {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/symbolic_graphs.rst +0 -0
  279. {pytensor-2.36.3 → pytensor-2.38.0}/doc/user_guide.rst +0 -0
  280. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/__init__.py +0 -0
  281. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/bin/__init__.py +0 -0
  282. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/bin/pytensor_cache.py +0 -0
  283. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/__init__.py +0 -0
  284. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/builders.py +0 -0
  285. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/compiledir.py +0 -0
  286. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/compilelock.py +0 -0
  287. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/debugmode.py +0 -0
  288. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/function/__init__.py +0 -0
  289. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/function/pfunc.py +0 -0
  290. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/function/types.py +0 -0
  291. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/io.py +0 -0
  292. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/mode.py +0 -0
  293. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/monitormode.py +0 -0
  294. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/nanguardmode.py +0 -0
  295. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/ops.py +0 -0
  296. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/profiling.py +0 -0
  297. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/sharedvalue.py +0 -0
  298. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/configdefaults.py +0 -0
  299. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/configparser.py +0 -0
  300. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/__init__.py +0 -0
  301. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  302. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/css/d3viz.css +0 -0
  303. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/d3viz.py +0 -0
  304. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/formatting.py +0 -0
  305. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/html/template.html +0 -0
  306. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  307. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  308. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/js/d3viz.js +0 -0
  309. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  310. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  311. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/__init__.py +0 -0
  312. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/basic.py +0 -0
  313. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/destroyhandler.py +0 -0
  314. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/features.py +0 -0
  315. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/fg.py +0 -0
  316. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/null_type.py +0 -0
  317. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/op.py +0 -0
  318. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/rewriting/__init__.py +0 -0
  319. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/rewriting/basic.py +0 -0
  320. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/rewriting/db.py +0 -0
  321. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/rewriting/kanren.py +0 -0
  322. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/rewriting/unify.py +0 -0
  323. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/rewriting/utils.py +0 -0
  324. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/traversal.py +0 -0
  325. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/type.py +0 -0
  326. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/utils.py +0 -0
  327. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/ifelse.py +0 -0
  328. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/ipython.py +0 -0
  329. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/__init__.py +0 -0
  330. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/__init__.py +0 -0
  331. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/basic.py +0 -0
  332. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  333. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  334. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/cmodule.py +0 -0
  335. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/cutils.py +0 -0
  336. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/cvm.py +0 -0
  337. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/exceptions.py +0 -0
  338. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/interface.py +0 -0
  339. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/lazylinker_c.py +0 -0
  340. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/op.py +0 -0
  341. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/params_type.py +0 -0
  342. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/type.py +0 -0
  343. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/__init__.py +0 -0
  344. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/__init__.py +0 -0
  345. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/basic.py +0 -0
  346. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/blas.py +0 -0
  347. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  348. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
  349. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  350. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  351. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/math.py +0 -0
  352. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  353. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/pad.py +0 -0
  354. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/random.py +0 -0
  355. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/scalar.py +0 -0
  356. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/scan.py +0 -0
  357. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/shape.py +0 -0
  358. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  359. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  360. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/sort.py +0 -0
  361. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
  362. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  363. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  364. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/ops.py +0 -0
  365. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/__init__.py +0 -0
  366. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/__init__.py +0 -0
  367. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/basic.py +0 -0
  368. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
  369. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/core.py +0 -0
  370. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
  371. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
  372. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/math.py +0 -0
  373. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/nlinalg.py +0 -0
  374. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/shape.py +0 -0
  375. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  376. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  377. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/slinalg.py +0 -0
  378. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/sort.py +0 -0
  379. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
  380. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/linker.py +0 -0
  381. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/__init__.py +0 -0
  382. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/cache.py +0 -0
  383. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/__init__.py +0 -0
  384. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  385. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  386. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  387. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  388. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
  389. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
  390. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
  391. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/shape.py +0 -0
  392. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  393. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  394. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/sort.py +0 -0
  395. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
  396. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  397. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  398. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  399. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  400. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  401. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  402. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  403. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
  404. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
  405. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  406. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  407. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/slinalg.py +0 -0
  408. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  409. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  410. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/linker.py +0 -0
  411. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/utils.py +0 -0
  412. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/__init__.py +0 -0
  413. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/check_blas.py +0 -0
  414. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/check_blas_many.sh +0 -0
  415. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/check_duplicate_key.py +0 -0
  416. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  417. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/elemwise_time_test.py +0 -0
  418. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/frozendict.py +0 -0
  419. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/may_share_memory.py +0 -0
  420. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/ordered_set.py +0 -0
  421. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/pkl_utils.py +0 -0
  422. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/npy_2_compat.py +0 -0
  423. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/printing.py +0 -0
  424. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/py.typed +0 -0
  425. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/__init__.py +0 -0
  426. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  427. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  428. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/c_code/gamma.c +0 -0
  429. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/c_code/incbet.c +0 -0
  430. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/loop.py +0 -0
  431. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/math.py +0 -0
  432. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/sharedvar.py +0 -0
  433. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/__init__.py +0 -0
  434. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/checkpoints.py +0 -0
  435. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/scan_perform.pyx +0 -0
  436. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/scan_perform_ext.py +0 -0
  437. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/views.py +0 -0
  438. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/__init__.py +0 -0
  439. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/linalg.py +0 -0
  440. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/rewriting.py +0 -0
  441. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/sharedvar.py +0 -0
  442. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/type.py +0 -0
  443. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/utils.py +0 -0
  444. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/__init__.py +0 -0
  445. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/_linalg/__init__.py +0 -0
  446. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
  447. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/_linalg/solve/tridiagonal.py +0 -0
  448. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/blas.py +0 -0
  449. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/blas_c.py +0 -0
  450. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/blas_headers.py +0 -0
  451. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/blockwise.py +0 -0
  452. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  453. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  454. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  455. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/einsum.py +0 -0
  456. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/elemwise_cgen.py +0 -0
  457. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/exceptions.py +0 -0
  458. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/fourier.py +0 -0
  459. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/functional.py +0 -0
  460. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/interpolate.py +0 -0
  461. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/math.py +0 -0
  462. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/pad.py +0 -0
  463. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/__init__.py +0 -0
  464. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/basic.py +0 -0
  465. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/op.py +0 -0
  466. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  467. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
  468. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
  469. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
  470. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/type.py +0 -0
  471. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/utils.py +0 -0
  472. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/var.py +0 -0
  473. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/__init__.py +0 -0
  474. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/blas.py +0 -0
  475. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/einsum.py +0 -0
  476. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/elemwise.py +0 -0
  477. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  478. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/jax.py +0 -0
  479. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/numba.py +0 -0
  480. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/ofg.py +0 -0
  481. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/special.py +0 -0
  482. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
  483. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  484. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/sharedvar.py +0 -0
  485. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/signal/__init__.py +0 -0
  486. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/sort.py +0 -0
  487. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/special.py +0 -0
  488. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/utils.py +0 -0
  489. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/var.py +0 -0
  490. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/variable.py +0 -0
  491. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/xlogx.py +0 -0
  492. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/typed_list/__init__.py +0 -0
  493. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/typed_list/basic.py +0 -0
  494. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/typed_list/rewriting.py +0 -0
  495. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/typed_list/type.py +0 -0
  496. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/updates.py +0 -0
  497. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/math.py +0 -0
  498. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/random.py +0 -0
  499. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/__init__.py +0 -0
  500. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/basic.py +0 -0
  501. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/indexing.py +0 -0
  502. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/math.py +0 -0
  503. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/reduction.py +0 -0
  504. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/shape.py +0 -0
  505. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  506. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor.egg-info/dependency_links.txt +0 -0
  507. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor.egg-info/entry_points.txt +0 -0
  508. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor.egg-info/requires.txt +0 -0
  509. {pytensor-2.36.3 → pytensor-2.38.0}/pytensor.egg-info/top_level.txt +0 -0
  510. {pytensor-2.36.3 → pytensor-2.38.0}/scripts/mypy-failing.txt +0 -0
  511. {pytensor-2.36.3 → pytensor-2.38.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  512. {pytensor-2.36.3 → pytensor-2.38.0}/setup.cfg +0 -0
  513. {pytensor-2.36.3 → pytensor-2.38.0}/setup.py +0 -0
  514. {pytensor-2.36.3 → pytensor-2.38.0}/tests/link/c/c_code/test_cenum.h +0 -0
  515. {pytensor-2.36.3 → pytensor-2.38.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  516. {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_breakpoint.py +0 -0
  517. {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_config.py +0 -0
  518. {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_ifelse.py +0 -0
  519. {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_printing.py +0 -0
  520. {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_rop.py +0 -0
  521. {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_updates.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 2.36.3
3
+ Version: 2.38.0
4
4
  Summary: Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs.
5
5
  Author-email: pymc-devs <pymc.devs@gmail.com>
6
6
  License-Expression: BSD-3-Clause
@@ -495,7 +495,7 @@ If both outputs are disconnected PyTensor will not bother calling the :meth:`L_o
495
495
 
496
496
  from pytensor.graph.op import Op
497
497
  from pytensor.graph.basic import Apply
498
- from pytensor.gradient import DisconnectedType
498
+ from pytensor.gradient import DisconnectedType, disconnected_type
499
499
 
500
500
  class TransposeAndSumOp(Op):
501
501
  __props__ = ()
@@ -539,13 +539,13 @@ If both outputs are disconnected PyTensor will not bother calling the :meth:`L_o
539
539
  out1_grad, out2_grad = output_grads
540
540
 
541
541
  if isinstance(out1_grad.type, DisconnectedType):
542
- x_grad = DisconnectedType()()
542
+ x_grad = disconnected_type()
543
543
  else:
544
544
  # Transpose the last two dimensions of the output gradient
545
545
  x_grad = pt.swapaxes(out1_grad, -1, -2)
546
546
 
547
547
  if isinstance(out2_grad.type, DisconnectedType):
548
- y_grad = DisconnectedType()()
548
+ y_grad = disconnected_type()
549
549
  else:
550
550
  # Broadcast the output gradient to the same shape as y
551
551
  y_grad = pt.broadcast_to(pt.expand_dims(out2_grad, -1), y.shape)
@@ -0,0 +1,7 @@
1
+ (libdoc_xtensor_linalg)=
2
+ # `xtensor.signal` -- Signal processing operations
3
+
4
+ ```{eval-rst}
5
+ .. automodule:: pytensor.xtensor.signal
6
+ :members:
7
+ ```
@@ -149,27 +149,22 @@ lines-after-imports = 2
149
149
  # TODO: Get rid of these:
150
150
  "**/__init__.py" = ["F401", "E402", "F403"]
151
151
  "pytensor/tensor/linalg.py" = ["F403"]
152
+ # Modules that use print-statements, skip "T201"
152
153
  "pytensor/link/c/cmodule.py" = ["PTH", "T201"]
153
154
  "pytensor/misc/elemwise_time_test.py" = ["T201"]
154
155
  "pytensor/misc/elemwise_openmp_speedup.py" = ["T201"]
155
156
  "pytensor/misc/check_duplicate_key.py" = ["T201"]
156
157
  "pytensor/misc/check_blas.py" = ["T201"]
157
158
  "pytensor/bin/pytensor_cache.py" = ["T201"]
158
- # For the tests we skip `E402` because `pytest.importorskip` is used:
159
- "tests/link/jax/test_scalar.py" = ["E402"]
160
- "tests/link/jax/test_tensor_basic.py" = ["E402"]
161
- "tests/link/numba/test_basic.py" = ["E402"]
162
- "tests/link/numba/test_cython_support.py" = ["E402"]
163
- "tests/link/numba/test_performance.py" = ["E402"]
164
- "tests/link/numba/test_sparse.py" = ["E402"]
165
- "tests/link/numba/test_tensor_basic.py" = ["E402"]
166
- "tests/tensor/test_math_scipy.py" = ["E402"]
167
- "tests/sparse/test_basic.py" = ["E402"]
168
- "tests/sparse/test_sp2.py" = ["E402"]
169
- "tests/sparse/test_utils.py" = ["E402"]
170
- "tests/sparse/sandbox/test_sp.py" = ["E402", "F401"]
171
159
  "tests/compile/test_monitormode.py" = ["T201"]
172
160
  "scripts/run_mypy.py" = ["T201"]
161
+ # Test modules of optional backends that use `pytest.importorskip`, skip "E402"
162
+ "tests/link/jax/**/test_*.py" = ["E402"]
163
+ "tests/link/numba/**/test_*.py" = ["E402"]
164
+ "tests/link/pytorch/**/test_*.py" = ["E402"]
165
+ "tests/link/mlx/**/test_*.py" = ["E402"]
166
+ "tests/xtensor/**/*.py" = ["E402"]
167
+
173
168
 
174
169
 
175
170
  [tool.mypy]
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2026-01-07T19:04:45+0100",
11
+ "date": "2026-02-19T15:15:27+0100",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "ac11da625fc3155790bc0b4794807232b73de0b8",
15
- "version": "2.36.3"
14
+ "full-revisionid": "87470065d89190405c9291235daf621d17de17ed",
15
+ "version": "2.38.0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -1,6 +1,6 @@
1
1
  import numpy as np
2
2
 
3
- from pytensor.gradient import DisconnectedType
3
+ from pytensor.gradient import disconnected_type
4
4
  from pytensor.graph.basic import Apply, Variable
5
5
  from pytensor.graph.op import Op
6
6
  from pytensor.tensor.basic import as_tensor_variable
@@ -142,7 +142,7 @@ class PdbBreakpoint(Op):
142
142
  output_storage[i][0] = inputs[i + 1]
143
143
 
144
144
  def grad(self, inputs, output_gradients):
145
- return [DisconnectedType()(), *output_gradients]
145
+ return [disconnected_type(), *output_gradients]
146
146
 
147
147
  def infer_shape(self, fgraph, inputs, input_shapes):
148
148
  # Return the shape of every input but the condition (first input)
@@ -494,22 +494,25 @@ def Lop(
494
494
  coordinates of the tensor elements.
495
495
  If `f` is a list/tuple, then return a list/tuple with the results.
496
496
  """
497
- if not isinstance(eval_points, list | tuple):
498
- _eval_points: list[Variable] = [pytensor.tensor.as_tensor_variable(eval_points)]
499
- else:
500
- _eval_points = [pytensor.tensor.as_tensor_variable(x) for x in eval_points]
497
+ from pytensor.tensor import as_tensor_variable
501
498
 
502
- if not isinstance(f, list | tuple):
503
- _f: list[Variable] = [pytensor.tensor.as_tensor_variable(f)]
504
- else:
505
- _f = [pytensor.tensor.as_tensor_variable(x) for x in f]
499
+ if not isinstance(eval_points, Sequence):
500
+ eval_points = [eval_points]
501
+ _eval_points = [
502
+ x if isinstance(x, Variable) else as_tensor_variable(x) for x in eval_points
503
+ ]
504
+
505
+ if not isinstance(f, Sequence):
506
+ f = [f]
507
+ _f = [x if isinstance(x, Variable) else as_tensor_variable(x) for x in f]
506
508
 
507
509
  grads = list(_eval_points)
508
510
 
509
- if not isinstance(wrt, list | tuple):
510
- _wrt: list[Variable] = [pytensor.tensor.as_tensor_variable(wrt)]
511
- else:
512
- _wrt = [pytensor.tensor.as_tensor_variable(x) for x in wrt]
511
+ using_list = isinstance(wrt, list)
512
+ using_tuple = isinstance(wrt, tuple)
513
+ if not isinstance(wrt, Sequence):
514
+ wrt = [wrt]
515
+ _wrt = [x if isinstance(x, Variable) else as_tensor_variable(x) for x in wrt]
513
516
 
514
517
  assert len(_f) == len(grads)
515
518
  known = dict(zip(_f, grads, strict=True))
@@ -523,8 +526,6 @@ def Lop(
523
526
  return_disconnected=return_disconnected,
524
527
  )
525
528
 
526
- using_list = isinstance(wrt, list)
527
- using_tuple = isinstance(wrt, tuple)
528
529
  return as_list_or_tuple(using_list, using_tuple, ret)
529
530
 
530
531
 
@@ -208,19 +208,13 @@ def graph_replace(
208
208
 
209
209
 
210
210
  @singledispatch
211
- def _vectorize_node(op: Op, node: Apply, *batched_inputs) -> Apply:
211
+ def _vectorize_node(op: Op, node: Apply, *batched_inputs) -> Apply | Sequence[Variable]:
212
212
  # Default implementation is provided in pytensor.tensor.blockwise
213
213
  raise NotImplementedError
214
214
 
215
215
 
216
- def vectorize_node(node: Apply, *batched_inputs) -> Apply:
217
- """Returns vectorized version of node with new batched inputs."""
218
- op = node.op
219
- return _vectorize_node(op, node, *batched_inputs)
220
-
221
-
222
216
  def _vectorize_not_needed(op, node, *batched_inputs):
223
- return op.make_node(*batched_inputs)
217
+ return op.make_node(*batched_inputs).outputs
224
218
 
225
219
 
226
220
  @overload
@@ -289,19 +283,40 @@ def vectorize_graph(
289
283
  # [array([-10., -11.]), array([10., 11.])]
290
284
 
291
285
  """
286
+ # TODO: Move this to tensor.vectorize, and make this helper type agnostic.
287
+ #
288
+ # This helper may dispatch to tensor.vectorize_graph or xtensor.vectorize_graph depending on the replacement types
289
+ # The behavior is distinct, because tensor vectorization depends on axis-position while xtensor depends on dimension labels
290
+ #
291
+ # xtensor.vectorize_graph will be able to handle batched inner tensor operations, while tensor.vectorize_graph won't,
292
+ # as it is by design unaware of xtensors and their semantics.
292
293
  if isinstance(outputs, Sequence):
293
294
  seq_outputs = outputs
294
295
  else:
295
296
  seq_outputs = [outputs]
296
297
 
298
+ if not all(
299
+ isinstance(key, Variable) and isinstance(value, Variable)
300
+ for key, value in replace.items()
301
+ ):
302
+ raise ValueError(f"Some of the replaced items are not Variables: {replace}")
303
+
297
304
  inputs = truncated_graph_inputs(seq_outputs, ancestors_to_include=replace.keys())
298
305
  new_inputs = [replace.get(inp, inp) for inp in inputs]
299
306
 
300
307
  vect_vars = dict(zip(inputs, new_inputs, strict=True))
301
308
  for node in toposort(seq_outputs, blockers=inputs):
302
309
  vect_inputs = [vect_vars.get(inp, inp) for inp in node.inputs]
303
- vect_node = vectorize_node(node, *vect_inputs)
304
- for output, vect_output in zip(node.outputs, vect_node.outputs, strict=True):
310
+
311
+ vect_node_or_outputs = _vectorize_node(node.op, node, *vect_inputs)
312
+ # Compatibility with the old API
313
+ vect_outputs = (
314
+ vect_node_or_outputs.outputs
315
+ if isinstance(vect_node_or_outputs, Apply)
316
+ else vect_node_or_outputs
317
+ )
318
+
319
+ for output, vect_output in zip(node.outputs, vect_outputs, strict=True):
305
320
  if output in vect_vars:
306
321
  # This can happen when some outputs of a multi-output node are given a replacement,
307
322
  # while some of the remaining outputs are still needed in the graph.
@@ -284,7 +284,7 @@ class PerformLinker(LocalLinker):
284
284
  """
285
285
 
286
286
  required_rewrites: tuple[str, ...] = ("minimum_compile", "py_only")
287
- incompatible_rewrites: tuple[str, ...] = ("cxx",)
287
+ incompatible_rewrites: tuple[str, ...] = ("cxx_only",)
288
288
 
289
289
  def __init__(
290
290
  self, allow_gc: bool | None = None, schedule: Callable | None = None
@@ -3,6 +3,7 @@ import warnings
3
3
  import jax
4
4
 
5
5
  from pytensor.link.jax.dispatch.basic import jax_funcify
6
+ from pytensor.tensor._linalg.solve.linear_control import SolveSylvester
6
7
  from pytensor.tensor.slinalg import (
7
8
  LU,
8
9
  QR,
@@ -13,6 +14,7 @@ from pytensor.tensor.slinalg import (
13
14
  Expm,
14
15
  LUFactor,
15
16
  PivotToPermutations,
17
+ Schur,
16
18
  Solve,
17
19
  SolveTriangular,
18
20
  )
@@ -92,7 +94,6 @@ def jax_funcify_Solve(op, **kwargs):
92
94
  def jax_funcify_SolveTriangular(op, **kwargs):
93
95
  lower = op.lower
94
96
  unit_diagonal = op.unit_diagonal
95
- check_finite = op.check_finite
96
97
 
97
98
  def solve_triangular(A, b):
98
99
  return jax.scipy.linalg.solve_triangular(
@@ -101,7 +102,7 @@ def jax_funcify_SolveTriangular(op, **kwargs):
101
102
  lower=lower,
102
103
  trans=0, # this is handled by explicitly transposing A, so it will always be 0 when we get to here.
103
104
  unit_diagonal=unit_diagonal,
104
- check_finite=check_finite,
105
+ check_finite=False,
105
106
  )
106
107
 
107
108
  return solve_triangular
@@ -132,27 +133,23 @@ def jax_funcify_PivotToPermutation(op, **kwargs):
132
133
  def jax_funcify_LU(op, **kwargs):
133
134
  permute_l = op.permute_l
134
135
  p_indices = op.p_indices
135
- check_finite = op.check_finite
136
136
 
137
137
  if p_indices:
138
138
  raise ValueError("JAX does not support the p_indices argument")
139
139
 
140
140
  def lu(*inputs):
141
- return jax.scipy.linalg.lu(
142
- *inputs, permute_l=permute_l, check_finite=check_finite
143
- )
141
+ return jax.scipy.linalg.lu(*inputs, permute_l=permute_l, check_finite=False)
144
142
 
145
143
  return lu
146
144
 
147
145
 
148
146
  @jax_funcify.register(LUFactor)
149
147
  def jax_funcify_LUFactor(op, **kwargs):
150
- check_finite = op.check_finite
151
148
  overwrite_a = op.overwrite_a
152
149
 
153
150
  def lu_factor(a):
154
151
  return jax.scipy.linalg.lu_factor(
155
- a, check_finite=check_finite, overwrite_a=overwrite_a
152
+ a, check_finite=False, overwrite_a=overwrite_a
156
153
  )
157
154
 
158
155
  return lu_factor
@@ -161,12 +158,11 @@ def jax_funcify_LUFactor(op, **kwargs):
161
158
  @jax_funcify.register(CholeskySolve)
162
159
  def jax_funcify_ChoSolve(op, **kwargs):
163
160
  lower = op.lower
164
- check_finite = op.check_finite
165
161
  overwrite_b = op.overwrite_b
166
162
 
167
163
  def cho_solve(c, b):
168
164
  return jax.scipy.linalg.cho_solve(
169
- (c, lower), b, check_finite=check_finite, overwrite_b=overwrite_b
165
+ (c, lower), b, check_finite=False, overwrite_b=overwrite_b
170
166
  )
171
167
 
172
168
  return cho_solve
@@ -189,3 +185,27 @@ def jax_funcify_Expm(op, **kwargs):
189
185
  return jax.scipy.linalg.expm(x)
190
186
 
191
187
  return expm
188
+
189
+
190
+ @jax_funcify.register(Schur)
191
+ def jax_funcify_Schur(op, **kwargs):
192
+ output = op.output
193
+
194
+ if op.sort is not None:
195
+ warnings.warn(
196
+ "jax.scipy.linalg.schur only supports sort=None. The sort argument is ignored."
197
+ )
198
+
199
+ def schur(a):
200
+ T, Z = jax.scipy.linalg.schur(a, output=output)
201
+ return T, Z
202
+
203
+ return schur
204
+
205
+
206
+ @jax_funcify.register(SolveSylvester)
207
+ def jax_funcify_SolveSylsterer(op, **kwargs):
208
+ def solve_sylvester(a, b, c):
209
+ return jax.scipy.linalg.solve_sylvester(a, b, c)
210
+
211
+ return solve_sylvester
@@ -14,7 +14,7 @@ class JAXLinker(JITLinker):
14
14
  "jax",
15
15
  ) # TODO: Distinguish between optional "jax" and "minimum_compile_jax"
16
16
  incompatible_rewrites = (
17
- "cxx",
17
+ "cxx_only",
18
18
  "BlasOpt",
19
19
  "local_careduce_fusion",
20
20
  "scan_save_mem_prealloc",
@@ -14,14 +14,13 @@ from pytensor.graph.basic import Apply, Constant, Variable
14
14
  from pytensor.graph.fg import FunctionGraph
15
15
  from pytensor.graph.type import Type
16
16
  from pytensor.link.numba.cache import compile_numba_function_src, hash_from_pickle_dump
17
- from pytensor.link.numba.dispatch.sparse import CSCMatrixType, CSRMatrixType
18
17
  from pytensor.link.utils import (
19
18
  fgraph_to_python,
20
19
  )
21
20
  from pytensor.scalar.basic import ScalarType
22
21
  from pytensor.sparse import SparseTensorType
23
22
  from pytensor.tensor.random.type import RandomGeneratorType
24
- from pytensor.tensor.type import TensorType
23
+ from pytensor.tensor.type import DenseTensorType
25
24
  from pytensor.tensor.utils import hash_from_ndarray
26
25
  from pytensor.typed_list import TypedListType
27
26
 
@@ -112,7 +111,7 @@ def get_numba_type(
112
111
  Return Numba scalars for zero dimensional :class:`TensorType`\s.
113
112
  """
114
113
 
115
- if isinstance(pytensor_type, TensorType):
114
+ if isinstance(pytensor_type, DenseTensorType):
116
115
  dtype = pytensor_type.numpy_dtype
117
116
  numba_dtype = numba.from_dtype(dtype)
118
117
  if force_scalar or (
@@ -125,18 +124,26 @@ def get_numba_type(
125
124
  numba_dtype = numba.from_dtype(dtype)
126
125
  return numba_dtype
127
126
  elif isinstance(pytensor_type, SparseTensorType):
128
- dtype = pytensor_type.numpy_dtype
129
- numba_dtype = numba.from_dtype(dtype)
127
+ from pytensor.link.numba.dispatch.sparse.variable import (
128
+ CSCMatrixType,
129
+ CSRMatrixType,
130
+ )
131
+
132
+ data_array = numba.types.Array(
133
+ numba.from_dtype(pytensor_type.numpy_dtype), 1, layout
134
+ )
135
+ indices_array = numba.types.Array(numba.from_dtype(np.int32), 1, layout)
136
+ indptr_array = numba.types.Array(numba.from_dtype(np.int32), 1, layout)
130
137
  if pytensor_type.format == "csr":
131
- return CSRMatrixType(numba_dtype)
138
+ return CSRMatrixType(data_array, indices_array, indptr_array)
132
139
  if pytensor_type.format == "csc":
133
- return CSCMatrixType(numba_dtype)
140
+ return CSCMatrixType(data_array, indices_array, indptr_array)
134
141
  elif isinstance(pytensor_type, RandomGeneratorType):
135
142
  return numba.types.NumPyRandomGeneratorType("NumPyRandomGeneratorType")
136
143
  elif isinstance(pytensor_type, TypedListType):
137
144
  return numba.types.List(get_numba_type(pytensor_type.ttype))
138
- else:
139
- raise NotImplementedError(f"Numba type not implemented for {pytensor_type}")
145
+
146
+ raise NotImplementedError(f"Numba type not implemented for {pytensor_type}")
140
147
 
141
148
 
142
149
  def create_numba_signature(
@@ -86,6 +86,7 @@ def numba_funcify_Blockwise(op: BlockwiseWithCoreShape, node, **kwargs):
86
86
  output_bc_patterns,
87
87
  output_dtypes,
88
88
  inplace_pattern,
89
+ False, # allow_core_scalar
89
90
  (), # constant_inputs
90
91
  inputs,
91
92
  tuple_core_shapes,
@@ -98,6 +99,7 @@ def numba_funcify_Blockwise(op: BlockwiseWithCoreShape, node, **kwargs):
98
99
  # If the core op cannot be cached, the Blockwise wrapper cannot be cached either
99
100
  blockwise_key = None
100
101
  else:
102
+ blockwise_cache_version = 1
101
103
  blockwise_key = "_".join(
102
104
  map(
103
105
  str,
@@ -108,6 +110,7 @@ def numba_funcify_Blockwise(op: BlockwiseWithCoreShape, node, **kwargs):
108
110
  blockwise_op.signature,
109
111
  input_bc_patterns,
110
112
  core_op_key,
113
+ blockwise_cache_version,
111
114
  ),
112
115
  )
113
116
  )
@@ -68,7 +68,7 @@ def numba_funcify_OpFromGraph(op, node=None, **kwargs):
68
68
  output_specs = [Out(o, borrow=False) for o in fgraph.outputs]
69
69
  insert_deepcopy(fgraph, wrapped_inputs=input_specs, wrapped_outputs=output_specs)
70
70
  fgraph_fn, fgraph_cache_key = numba_funcify_and_cache_key(
71
- fgraph, squeeze_output=True, **kwargs
71
+ fgraph, squeeze_output=True, fgraph_name="numba_ofg", **kwargs
72
72
  )
73
73
 
74
74
  if fgraph_cache_key is None:
@@ -365,6 +365,7 @@ def numba_funcify_Elemwise(op, node, **kwargs):
365
365
  output_bc_patterns_enc,
366
366
  output_dtypes_enc,
367
367
  inplace_pattern_enc,
368
+ True, # allow_core_scalar
368
369
  (), # constant_inputs
369
370
  inputs,
370
371
  core_output_shapes, # core_shapes