pytensor 2.36.2__tar.gz → 2.37.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 (523) hide show
  1. {pytensor-2.36.2/pytensor.egg-info → pytensor-2.37.0}/PKG-INFO +1 -1
  2. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/creating_an_op.rst +3 -3
  3. {pytensor-2.36.2 → pytensor-2.37.0}/pyproject.toml +7 -13
  4. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/_version.py +3 -3
  5. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/breakpoint.py +2 -2
  6. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/configdefaults.py +0 -9
  7. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/configparser.py +0 -1
  8. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/gradient.py +17 -19
  9. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/basic.py +1 -1
  10. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/scan.py +7 -2
  11. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/slinalg.py +30 -10
  12. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/tensor_basic.py +3 -20
  13. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/linker.py +1 -1
  14. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/core.py +0 -18
  15. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/cache.py +49 -0
  16. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/basic.py +16 -43
  17. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/blockwise.py +3 -0
  18. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/compile_ops.py +1 -1
  19. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/elemwise.py +13 -2
  20. pytensor-2.37.0/pytensor/link/numba/dispatch/linalg/_LAPACK.py +948 -0
  21. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +11 -13
  22. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +6 -15
  23. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +4 -3
  24. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +73 -312
  25. pytensor-2.37.0/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +228 -0
  26. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +9 -8
  27. pytensor-2.37.0/pytensor/link/numba/dispatch/linalg/solve/general.py +85 -0
  28. pytensor-2.37.0/pytensor/link/numba/dispatch/linalg/solve/linear_control.py +100 -0
  29. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +5 -12
  30. pytensor-2.37.0/pytensor/link/numba/dispatch/linalg/solve/posdef.py +116 -0
  31. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +44 -130
  32. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +6 -8
  33. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +22 -94
  34. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/utils.py +2 -64
  35. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/random.py +1 -0
  36. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/scalar.py +1 -1
  37. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/scan.py +4 -2
  38. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/slinalg.py +190 -123
  39. pytensor-2.37.0/pytensor/link/numba/dispatch/sparse/__init__.py +1 -0
  40. pytensor-2.37.0/pytensor/link/numba/dispatch/sparse/basic.py +86 -0
  41. pytensor-2.37.0/pytensor/link/numba/dispatch/sparse/math.py +372 -0
  42. pytensor-2.37.0/pytensor/link/numba/dispatch/sparse/variable.py +420 -0
  43. pytensor-2.37.0/pytensor/link/numba/dispatch/string_codegen.py +31 -0
  44. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/subtensor.py +1 -1
  45. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/tensor_basic.py +3 -3
  46. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/typed_list.py +13 -0
  47. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +19 -8
  48. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/linker.py +1 -1
  49. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/vm.py +1 -1
  50. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/raise_op.py +5 -2
  51. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scalar/basic.py +26 -45
  52. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scan/basic.py +9 -11
  53. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scan/op.py +56 -51
  54. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scan/rewriting.py +5 -7
  55. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scan/utils.py +16 -18
  56. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/sparse/basic.py +27 -18
  57. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/sparse/math.py +88 -67
  58. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/sparse/variable.py +9 -7
  59. pytensor-2.37.0/pytensor/tensor/_linalg/solve/linear_control.py +366 -0
  60. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/_linalg/solve/rewriting.py +41 -18
  61. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/basic.py +20 -50
  62. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/blockwise.py +15 -4
  63. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/extra_ops.py +1 -2
  64. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/fft.py +3 -3
  65. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/linalg.py +1 -0
  66. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/nlinalg.py +3 -3
  67. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/optimize.py +302 -238
  68. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/reshape.py +131 -122
  69. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/blas_c.py +1 -0
  70. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/linalg.py +179 -51
  71. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/math.py +48 -24
  72. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/reshape.py +3 -2
  73. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/subtensor_lift.py +5 -1
  74. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/shape.py +6 -5
  75. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/signal/conv.py +2 -7
  76. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/slinalg.py +270 -430
  77. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/subtensor.py +12 -11
  78. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/type.py +12 -13
  79. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/type_other.py +2 -2
  80. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/linalg.py +8 -19
  81. {pytensor-2.36.2 → pytensor-2.37.0/pytensor.egg-info}/PKG-INFO +1 -1
  82. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor.egg-info/SOURCES.txt +9 -8
  83. {pytensor-2.36.2 → pytensor-2.37.0}/tests/test_gradient.py +12 -0
  84. {pytensor-2.36.2 → pytensor-2.37.0}/tests/test_raise_op.py +1 -6
  85. pytensor-2.36.2/doc/library/tensor/conv.rst +0 -11
  86. pytensor-2.36.2/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -557
  87. pytensor-2.36.2/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -147
  88. pytensor-2.36.2/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -55
  89. pytensor-2.36.2/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -224
  90. pytensor-2.36.2/pytensor/link/numba/dispatch/sparse.py +0 -206
  91. pytensor-2.36.2/pytensor/tensor/conv/__init__.py +0 -10
  92. pytensor-2.36.2/pytensor/tensor/conv/abstract_conv.py +0 -3720
  93. pytensor-2.36.2/tests/tensor/conv/c_code/corr3d_gemm.c +0 -421
  94. pytensor-2.36.2/tests/tensor/conv/c_code/corr_gemm.c +0 -570
  95. {pytensor-2.36.2 → pytensor-2.37.0}/LICENSE.txt +0 -0
  96. {pytensor-2.36.2 → pytensor-2.37.0}/MANIFEST.in +0 -0
  97. {pytensor-2.36.2 → pytensor-2.37.0}/README.rst +0 -0
  98. {pytensor-2.36.2 → pytensor-2.37.0}/doc/.templates/PLACEHOLDER +0 -0
  99. {pytensor-2.36.2 → pytensor-2.37.0}/doc/.templates/layout.html +0 -0
  100. {pytensor-2.36.2 → pytensor-2.37.0}/doc/.templates/nb-badges.html +0 -0
  101. {pytensor-2.36.2 → pytensor-2.37.0}/doc/.templates/rendered_citation.html +0 -0
  102. {pytensor-2.36.2 → pytensor-2.37.0}/doc/LICENSE.txt +0 -0
  103. {pytensor-2.36.2 → pytensor-2.37.0}/doc/README.md +0 -0
  104. {pytensor-2.36.2 → pytensor-2.37.0}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  105. {pytensor-2.36.2 → pytensor-2.37.0}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  106. {pytensor-2.36.2 → pytensor-2.37.0}/doc/acknowledgement.rst +0 -0
  107. {pytensor-2.36.2 → pytensor-2.37.0}/doc/bcast.png +0 -0
  108. {pytensor-2.36.2 → pytensor-2.37.0}/doc/bcast.svg +0 -0
  109. {pytensor-2.36.2 → pytensor-2.37.0}/doc/blog.md +0 -0
  110. {pytensor-2.36.2 → pytensor-2.37.0}/doc/conf.py +0 -0
  111. {pytensor-2.36.2 → pytensor-2.37.0}/doc/core_development_guide.rst +0 -0
  112. {pytensor-2.36.2 → pytensor-2.37.0}/doc/css.inc +0 -0
  113. {pytensor-2.36.2 → pytensor-2.37.0}/doc/dev_start_guide.rst +0 -0
  114. {pytensor-2.36.2 → pytensor-2.37.0}/doc/environment.yml +0 -0
  115. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/apply.png +0 -0
  116. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/apply.svg +0 -0
  117. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/apply2.svg +0 -0
  118. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/creating_a_c_op.rst +0 -0
  119. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  120. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/ctype.rst +0 -0
  121. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/extending_faq.rst +0 -0
  122. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
  123. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/graph_rewriting.rst +0 -0
  124. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/graphstructures.rst +0 -0
  125. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/index.rst +0 -0
  126. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/inplace.rst +0 -0
  127. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/op.rst +0 -0
  128. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/other_ops.rst +0 -0
  129. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  130. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  131. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/pipeline.rst +0 -0
  132. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/scan.rst +0 -0
  133. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/tips.rst +0 -0
  134. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/type.rst +0 -0
  135. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/unittest.rst +0 -0
  136. {pytensor-2.36.2 → pytensor-2.37.0}/doc/extending/using_params.rst +0 -0
  137. {pytensor-2.36.2 → pytensor-2.37.0}/doc/faq.rst +0 -0
  138. {pytensor-2.36.2 → pytensor-2.37.0}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  139. {pytensor-2.36.2 → pytensor-2.37.0}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
  140. {pytensor-2.36.2 → pytensor-2.37.0}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
  141. {pytensor-2.36.2 → pytensor-2.37.0}/doc/gallery/optimize/root.ipynb +0 -0
  142. {pytensor-2.36.2 → pytensor-2.37.0}/doc/gallery/page_footer.md +0 -0
  143. {pytensor-2.36.2 → pytensor-2.37.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  144. {pytensor-2.36.2 → pytensor-2.37.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  145. {pytensor-2.36.2 → pytensor-2.37.0}/doc/generate_dtype_tensor_table.py +0 -0
  146. {pytensor-2.36.2 → pytensor-2.37.0}/doc/glossary.rst +0 -0
  147. {pytensor-2.36.2 → pytensor-2.37.0}/doc/images/Elman_srnn.png +0 -0
  148. {pytensor-2.36.2 → pytensor-2.37.0}/doc/images/PyTensor.png +0 -0
  149. {pytensor-2.36.2 → pytensor-2.37.0}/doc/images/PyTensor_RGB.svg +0 -0
  150. {pytensor-2.36.2 → pytensor-2.37.0}/doc/images/PyTensor_logo.png +0 -0
  151. {pytensor-2.36.2 → pytensor-2.37.0}/doc/images/binder.svg +0 -0
  152. {pytensor-2.36.2 → pytensor-2.37.0}/doc/images/blocksparse.png +0 -0
  153. {pytensor-2.36.2 → pytensor-2.37.0}/doc/images/colab.svg +0 -0
  154. {pytensor-2.36.2 → pytensor-2.37.0}/doc/images/github.svg +0 -0
  155. {pytensor-2.36.2 → pytensor-2.37.0}/doc/images/lstm.png +0 -0
  156. {pytensor-2.36.2 → pytensor-2.37.0}/doc/images/lstm_memorycell.png +0 -0
  157. {pytensor-2.36.2 → pytensor-2.37.0}/doc/images/talk2010.gif +0 -0
  158. {pytensor-2.36.2 → pytensor-2.37.0}/doc/images/talk2010.png +0 -0
  159. {pytensor-2.36.2 → pytensor-2.37.0}/doc/index.rst +0 -0
  160. {pytensor-2.36.2 → pytensor-2.37.0}/doc/install.rst +0 -0
  161. {pytensor-2.36.2 → pytensor-2.37.0}/doc/internal/how_to_release.rst +0 -0
  162. {pytensor-2.36.2 → pytensor-2.37.0}/doc/internal/index.rst +0 -0
  163. {pytensor-2.36.2 → pytensor-2.37.0}/doc/internal/metadocumentation.rst +0 -0
  164. {pytensor-2.36.2 → pytensor-2.37.0}/doc/introduction.rst +0 -0
  165. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/compile/debugmode.rst +0 -0
  166. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/compile/function.rst +0 -0
  167. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/compile/index.rst +0 -0
  168. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/compile/io.rst +0 -0
  169. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/compile/mode.rst +0 -0
  170. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/compile/nanguardmode.rst +0 -0
  171. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/compile/opfromgraph.rst +0 -0
  172. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/compile/ops.rst +0 -0
  173. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/compile/profilemode.rst +0 -0
  174. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/compile/shared.rst +0 -0
  175. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/config.rst +0 -0
  176. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  177. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  178. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  179. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  180. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  181. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  182. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  183. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/mlp.html +0 -0
  184. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/mlp.png +0 -0
  185. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/mlp2.html +0 -0
  186. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  187. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/mlp2.png +0 -0
  188. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/ofg.html +0 -0
  189. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/examples/ofg2.html +0 -0
  190. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/index.ipynb +0 -0
  191. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/index.rst +0 -0
  192. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  193. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  194. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  195. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  196. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/graph/features.rst +0 -0
  197. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/graph/fgraph.rst +0 -0
  198. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/graph/graph.rst +0 -0
  199. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/graph/index.rst +0 -0
  200. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/graph/op.rst +0 -0
  201. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/graph/replace.rst +0 -0
  202. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/graph/type.rst +0 -0
  203. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/graph/utils.rst +0 -0
  204. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/index.rst +0 -0
  205. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/misc/pkl_utils.rst +0 -0
  206. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/printing.rst +0 -0
  207. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/scalar/index.rst +0 -0
  208. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/scan.rst +0 -0
  209. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/sparse/index.rst +0 -0
  210. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/sparse/sandbox.rst +0 -0
  211. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/basic.rst +0 -0
  212. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/basic_opt.rst +0 -0
  213. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/bcast.png +0 -0
  214. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/bcast.svg +0 -0
  215. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/elemwise.rst +0 -0
  216. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/extra_ops.rst +0 -0
  217. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/fft.rst +0 -0
  218. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/functional.rst +0 -0
  219. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/index.rst +0 -0
  220. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/io.rst +0 -0
  221. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/math_opt.rst +0 -0
  222. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/nlinalg.rst +0 -0
  223. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/optimize.rst +0 -0
  224. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/plot_fft.png +0 -0
  225. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/random/distributions.rst +0 -0
  226. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/random/index.rst +0 -0
  227. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/slinalg.rst +0 -0
  228. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/tensor/utils.rst +0 -0
  229. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/typed_list.rst +0 -0
  230. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/xtensor/index.md +0 -0
  231. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/xtensor/linalg.md +0 -0
  232. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/xtensor/math.md +0 -0
  233. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/xtensor/module_functions.md +0 -0
  234. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/xtensor/random.md +0 -0
  235. {pytensor-2.36.2 → pytensor-2.37.0}/doc/library/xtensor/type.md +0 -0
  236. {pytensor-2.36.2 → pytensor-2.37.0}/doc/links.rst +0 -0
  237. {pytensor-2.36.2 → pytensor-2.37.0}/doc/optimizations.rst +0 -0
  238. {pytensor-2.36.2 → pytensor-2.37.0}/doc/pylintrc +0 -0
  239. {pytensor-2.36.2 → pytensor-2.37.0}/doc/robots.txt +0 -0
  240. {pytensor-2.36.2 → pytensor-2.37.0}/doc/troubleshooting.rst +0 -0
  241. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/adding.rst +0 -0
  242. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/adding_solution_1.py +0 -0
  243. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/aliasing.rst +0 -0
  244. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/apply.png +0 -0
  245. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/apply.svg +0 -0
  246. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/bcast.png +0 -0
  247. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/broadcasting.rst +0 -0
  248. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/conditions.rst +0 -0
  249. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/debug_faq.rst +0 -0
  250. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/dlogistic.png +0 -0
  251. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/examples.rst +0 -0
  252. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/faq_tutorial.rst +0 -0
  253. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/gradients.rst +0 -0
  254. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/index.rst +0 -0
  255. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/loading_and_saving.rst +0 -0
  256. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/logistic.gp +0 -0
  257. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/logistic.png +0 -0
  258. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/loop.rst +0 -0
  259. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/loop_solution_1.py +0 -0
  260. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/modes.rst +0 -0
  261. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/modes_solution_1.py +0 -0
  262. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/multi_cores.rst +0 -0
  263. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/nan_tutorial.rst +0 -0
  264. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/pics/d3viz.png +0 -0
  265. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  266. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  267. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  268. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/printing_drawing.rst +0 -0
  269. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/prng.rst +0 -0
  270. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/profiling.rst +0 -0
  271. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/profiling_example.py +0 -0
  272. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/profiling_example_out.prof +0 -0
  273. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/shape_info.rst +0 -0
  274. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/sparse.rst +0 -0
  275. {pytensor-2.36.2 → pytensor-2.37.0}/doc/tutorial/symbolic_graphs.rst +0 -0
  276. {pytensor-2.36.2 → pytensor-2.37.0}/doc/user_guide.rst +0 -0
  277. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/__init__.py +0 -0
  278. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/bin/__init__.py +0 -0
  279. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/bin/pytensor_cache.py +0 -0
  280. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/__init__.py +0 -0
  281. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/builders.py +0 -0
  282. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/compiledir.py +0 -0
  283. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/compilelock.py +0 -0
  284. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/debugmode.py +0 -0
  285. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/function/__init__.py +0 -0
  286. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/function/pfunc.py +0 -0
  287. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/function/types.py +0 -0
  288. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/io.py +0 -0
  289. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/mode.py +0 -0
  290. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/monitormode.py +0 -0
  291. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/nanguardmode.py +0 -0
  292. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/ops.py +0 -0
  293. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/profiling.py +0 -0
  294. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/compile/sharedvalue.py +0 -0
  295. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/d3viz/__init__.py +0 -0
  296. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  297. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/d3viz/css/d3viz.css +0 -0
  298. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/d3viz/d3viz.py +0 -0
  299. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/d3viz/formatting.py +0 -0
  300. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/d3viz/html/template.html +0 -0
  301. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  302. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  303. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/d3viz/js/d3viz.js +0 -0
  304. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  305. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  306. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/__init__.py +0 -0
  307. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/basic.py +0 -0
  308. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/destroyhandler.py +0 -0
  309. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/features.py +0 -0
  310. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/fg.py +0 -0
  311. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/null_type.py +0 -0
  312. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/op.py +0 -0
  313. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/replace.py +0 -0
  314. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/rewriting/__init__.py +0 -0
  315. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/rewriting/basic.py +0 -0
  316. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/rewriting/db.py +0 -0
  317. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/rewriting/kanren.py +0 -0
  318. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/rewriting/unify.py +0 -0
  319. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/rewriting/utils.py +0 -0
  320. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/traversal.py +0 -0
  321. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/type.py +0 -0
  322. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/graph/utils.py +0 -0
  323. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/ifelse.py +0 -0
  324. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/ipython.py +0 -0
  325. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/__init__.py +0 -0
  326. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/c/__init__.py +0 -0
  327. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/c/basic.py +0 -0
  328. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  329. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  330. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/c/cmodule.py +0 -0
  331. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/c/cutils.py +0 -0
  332. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/c/cvm.py +0 -0
  333. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/c/exceptions.py +0 -0
  334. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/c/interface.py +0 -0
  335. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/c/lazylinker_c.py +0 -0
  336. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/c/op.py +0 -0
  337. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/c/params_type.py +0 -0
  338. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/c/type.py +0 -0
  339. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/__init__.py +0 -0
  340. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/__init__.py +0 -0
  341. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/basic.py +0 -0
  342. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/blas.py +0 -0
  343. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  344. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
  345. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  346. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  347. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/math.py +0 -0
  348. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  349. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/pad.py +0 -0
  350. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/random.py +0 -0
  351. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/scalar.py +0 -0
  352. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/shape.py +0 -0
  353. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  354. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  355. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/sort.py +0 -0
  356. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
  357. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  358. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/jax/ops.py +0 -0
  359. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/__init__.py +0 -0
  360. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/__init__.py +0 -0
  361. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/basic.py +0 -0
  362. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
  363. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
  364. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
  365. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/math.py +0 -0
  366. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/nlinalg.py +0 -0
  367. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/shape.py +0 -0
  368. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  369. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  370. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/slinalg.py +0 -0
  371. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/sort.py +0 -0
  372. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
  373. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/mlx/linker.py +0 -0
  374. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/__init__.py +0 -0
  375. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/__init__.py +0 -0
  376. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  377. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  378. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  379. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  380. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
  381. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
  382. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
  383. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/shape.py +0 -0
  384. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  385. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  386. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/numba/dispatch/sort.py +0 -0
  387. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  388. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  389. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  390. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  391. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  392. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  393. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
  394. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
  395. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  396. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  397. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/dispatch/slinalg.py +0 -0
  398. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  399. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  400. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/pytorch/linker.py +0 -0
  401. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/link/utils.py +0 -0
  402. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/misc/__init__.py +0 -0
  403. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/misc/check_blas.py +0 -0
  404. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/misc/check_blas_many.sh +0 -0
  405. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/misc/check_duplicate_key.py +0 -0
  406. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  407. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/misc/elemwise_time_test.py +0 -0
  408. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/misc/frozendict.py +0 -0
  409. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/misc/may_share_memory.py +0 -0
  410. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/misc/ordered_set.py +0 -0
  411. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/misc/pkl_utils.py +0 -0
  412. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/npy_2_compat.py +0 -0
  413. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/printing.py +0 -0
  414. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/py.typed +0 -0
  415. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scalar/__init__.py +0 -0
  416. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  417. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  418. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scalar/c_code/gamma.c +0 -0
  419. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scalar/c_code/incbet.c +0 -0
  420. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scalar/loop.py +0 -0
  421. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scalar/math.py +0 -0
  422. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scalar/sharedvar.py +0 -0
  423. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scan/__init__.py +0 -0
  424. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scan/checkpoints.py +0 -0
  425. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scan/scan_perform.pyx +0 -0
  426. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scan/scan_perform_ext.py +0 -0
  427. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/scan/views.py +0 -0
  428. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/sparse/__init__.py +0 -0
  429. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/sparse/linalg.py +0 -0
  430. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/sparse/rewriting.py +0 -0
  431. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/sparse/sharedvar.py +0 -0
  432. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/sparse/type.py +0 -0
  433. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/sparse/utils.py +0 -0
  434. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/__init__.py +0 -0
  435. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/_linalg/__init__.py +0 -0
  436. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
  437. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/_linalg/solve/tridiagonal.py +0 -0
  438. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/blas.py +0 -0
  439. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/blas_c.py +0 -0
  440. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/blas_headers.py +0 -0
  441. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  442. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  443. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  444. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/einsum.py +0 -0
  445. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/elemwise.py +0 -0
  446. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/elemwise_cgen.py +0 -0
  447. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/exceptions.py +0 -0
  448. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/fourier.py +0 -0
  449. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/functional.py +0 -0
  450. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/interpolate.py +0 -0
  451. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/math.py +0 -0
  452. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/pad.py +0 -0
  453. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/random/__init__.py +0 -0
  454. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/random/basic.py +0 -0
  455. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/random/op.py +0 -0
  456. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  457. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
  458. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
  459. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
  460. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/random/type.py +0 -0
  461. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/random/utils.py +0 -0
  462. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/random/var.py +0 -0
  463. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/__init__.py +0 -0
  464. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/basic.py +0 -0
  465. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/blas.py +0 -0
  466. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/blockwise.py +0 -0
  467. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/einsum.py +0 -0
  468. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/elemwise.py +0 -0
  469. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  470. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/jax.py +0 -0
  471. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/numba.py +0 -0
  472. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/ofg.py +0 -0
  473. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/shape.py +0 -0
  474. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/special.py +0 -0
  475. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/subtensor.py +0 -0
  476. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  477. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/sharedvar.py +0 -0
  478. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/signal/__init__.py +0 -0
  479. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/sort.py +0 -0
  480. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/special.py +0 -0
  481. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/utils.py +0 -0
  482. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/var.py +0 -0
  483. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/variable.py +0 -0
  484. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/tensor/xlogx.py +0 -0
  485. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/typed_list/__init__.py +0 -0
  486. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/typed_list/basic.py +0 -0
  487. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/typed_list/rewriting.py +0 -0
  488. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/typed_list/type.py +0 -0
  489. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/updates.py +0 -0
  490. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/utils.py +0 -0
  491. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/__init__.py +0 -0
  492. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/basic.py +0 -0
  493. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/indexing.py +0 -0
  494. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/math.py +0 -0
  495. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/random.py +0 -0
  496. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/reduction.py +0 -0
  497. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/rewriting/__init__.py +0 -0
  498. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/rewriting/basic.py +0 -0
  499. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/rewriting/indexing.py +0 -0
  500. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/rewriting/math.py +0 -0
  501. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/rewriting/reduction.py +0 -0
  502. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/rewriting/shape.py +0 -0
  503. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/rewriting/utils.py +0 -0
  504. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  505. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/shape.py +0 -0
  506. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/type.py +0 -0
  507. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor/xtensor/vectorization.py +0 -0
  508. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor.egg-info/dependency_links.txt +0 -0
  509. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor.egg-info/entry_points.txt +0 -0
  510. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor.egg-info/requires.txt +0 -0
  511. {pytensor-2.36.2 → pytensor-2.37.0}/pytensor.egg-info/top_level.txt +0 -0
  512. {pytensor-2.36.2 → pytensor-2.37.0}/scripts/mypy-failing.txt +0 -0
  513. {pytensor-2.36.2 → pytensor-2.37.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  514. {pytensor-2.36.2 → pytensor-2.37.0}/setup.cfg +0 -0
  515. {pytensor-2.36.2 → pytensor-2.37.0}/setup.py +0 -0
  516. {pytensor-2.36.2 → pytensor-2.37.0}/tests/link/c/c_code/test_cenum.h +0 -0
  517. {pytensor-2.36.2 → pytensor-2.37.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  518. {pytensor-2.36.2 → pytensor-2.37.0}/tests/test_breakpoint.py +0 -0
  519. {pytensor-2.36.2 → pytensor-2.37.0}/tests/test_config.py +0 -0
  520. {pytensor-2.36.2 → pytensor-2.37.0}/tests/test_ifelse.py +0 -0
  521. {pytensor-2.36.2 → pytensor-2.37.0}/tests/test_printing.py +0 -0
  522. {pytensor-2.36.2 → pytensor-2.37.0}/tests/test_rop.py +0 -0
  523. {pytensor-2.36.2 → pytensor-2.37.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.2
3
+ Version: 2.37.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)
@@ -149,27 +149,21 @@ 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
+
173
167
 
174
168
 
175
169
  [tool.mypy]
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2026-01-02T17:20:52+0100",
11
+ "date": "2026-01-23T09:04:26+0100",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "0f864a33958e68e5110d043c4b5ef549cd1d6074",
15
- "version": "2.36.2"
14
+ "full-revisionid": "9834e96cee86d9f18436be5fa9e31c692bf6326f",
15
+ "version": "2.37.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)
@@ -270,15 +270,6 @@ def add_basic_configvars():
270
270
  in_c_key=False,
271
271
  )
272
272
 
273
- config.add(
274
- "conv__assert_shape",
275
- "If True, AbstractConv* ops will verify that user-provided"
276
- " shapes match the runtime shapes (debugging option,"
277
- " may slow down compilation)",
278
- BoolParam(False),
279
- in_c_key=False,
280
- )
281
-
282
273
  config.add(
283
274
  "print_global_stats",
284
275
  "Print some global statistics (time spent) at the end",
@@ -71,7 +71,6 @@ class PyTensorConfigParser:
71
71
  pickle_test_value: bool
72
72
  cast_policy: str
73
73
  device: str
74
- conv__assert_shape: bool
75
74
  print_global_stats: bool
76
75
  unpickle_function: bool
77
76
  # add_compile_configvars
@@ -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
 
@@ -2104,16 +2105,13 @@ def jacobian(
2104
2105
  idx, expr, *wrt = args
2105
2106
  return grad(expr[idx], wrt, **grad_kwargs)
2106
2107
 
2107
- jacobian_matrices, updates = pytensor.scan(
2108
+ jacobian_matrices = pytensor.scan(
2108
2109
  inner_function,
2109
2110
  sequences=pytensor.tensor.arange(expression.size),
2110
2111
  non_sequences=[expression.ravel(), *wrt],
2112
+ return_updates=False,
2111
2113
  return_list=True,
2112
2114
  )
2113
- if updates:
2114
- raise ValueError(
2115
- "The scan used to build the jacobian matrices returned a list of updates"
2116
- )
2117
2115
 
2118
2116
  if jacobian_matrices[0].ndim < (expression.ndim + wrt[0].ndim):
2119
2117
  # There was some raveling or squeezing done prior to getting the jacobians
@@ -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
@@ -10,7 +10,7 @@ from pytensor.scan.op import Scan
10
10
 
11
11
 
12
12
  @jax_funcify.register(Scan)
13
- def jax_funcify_Scan(op: Scan, **kwargs):
13
+ def jax_funcify_Scan(op: Scan, node, **kwargs):
14
14
  # Note: This implementation is different from the internal PyTensor Scan op.
15
15
  # In particular, we don't make use of the provided buffers for recurring outputs (MIT-SOT, SIT-SOT)
16
16
  # These buffers include the initial state and enough space to store as many intermediate results as needed.
@@ -29,7 +29,10 @@ def jax_funcify_Scan(op: Scan, **kwargs):
29
29
 
30
30
  # Optimize inner graph (exclude any defalut rewrites that are incompatible with JAX mode)
31
31
  rewriter = (
32
- get_mode(op.mode).including("jax").excluding(*JAX._optimizer.exclude).optimizer
32
+ get_mode(op.mode)
33
+ .including("jax")
34
+ .excluding("numba", *JAX._optimizer.exclude)
35
+ .optimizer
33
36
  )
34
37
  rewriter(op.fgraph)
35
38
  scan_inner_func = jax_funcify(op.fgraph, **kwargs)
@@ -216,6 +219,8 @@ def jax_funcify_Scan(op: Scan, **kwargs):
216
219
  if trace.shape[0] > buffer_size:
217
220
  # Trace is longer than buffer, keep just the last `buffer.shape[0]` entries
218
221
  partial_trace = trace[-buffer_size:]
222
+ elif trace.shape[0] == buffer_size:
223
+ partial_trace = trace
219
224
  else:
220
225
  # Trace is shorter than buffer, this happens when we keep the initial_state
221
226
  if init_state.ndim < buffer.ndim:
@@ -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
@@ -17,16 +17,15 @@ from pytensor.tensor.basic import (
17
17
  ScalarFromTensor,
18
18
  Split,
19
19
  TensorFromScalar,
20
- Tri,
21
20
  get_scalar_constant_value,
22
21
  )
23
22
  from pytensor.tensor.exceptions import NotScalarConstantError
24
23
  from pytensor.tensor.shape import Shape_i
25
24
 
26
25
 
27
- ARANGE_CONCRETE_VALUE_ERROR = """JAX requires the arguments of `jax.numpy.arange`
28
- to be constants. The graph that you defined thus cannot be JIT-compiled
29
- by JAX. An example of a graph that can be compiled to JAX:
26
+ ARANGE_CONCRETE_VALUE_ERROR = """JAX requires the arguments of `jax.numpy.arange` to be constants.
27
+ The graph that you defined thus cannot be JIT-compiled by JAX.
28
+ An example of a graph that can be compiled to JAX:
30
29
  >>> import pytensor.tensor as pt
31
30
  >>> pt.arange(1, 10, 2)
32
31
  """
@@ -185,19 +184,3 @@ def jax_funcify_ScalarFromTensor(op, **kwargs):
185
184
  return jnp.array(x).flatten()[0]
186
185
 
187
186
  return scalar_from_tensor
188
-
189
-
190
- @jax_funcify.register(Tri)
191
- def jax_funcify_Tri(op, node, **kwargs):
192
- # node.inputs is N, M, k
193
- const_args = [getattr(x, "data", None) for x in node.inputs]
194
-
195
- def tri(*args):
196
- # args is N, M, k
197
- args = [
198
- x if const_x is None else const_x
199
- for x, const_x in zip(args, const_args, strict=True)
200
- ]
201
- return jnp.tri(*args, dtype=op.dtype)
202
-
203
- return tri
@@ -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",
@@ -13,7 +13,6 @@ from pytensor.tensor.basic import (
13
13
  ScalarFromTensor,
14
14
  Split,
15
15
  TensorFromScalar,
16
- Tri,
17
16
  get_scalar_constant_value,
18
17
  )
19
18
  from pytensor.tensor.exceptions import NotScalarConstantError
@@ -219,23 +218,6 @@ def mlx_funcify_ScalarFromTensor(op, **kwargs):
219
218
  return scalar_from_tensor
220
219
 
221
220
 
222
- @mlx_funcify.register(Tri)
223
- def mlx_funcify_Tri(op, node, **kwargs):
224
- # node.inputs -> N, M, k
225
- const_args = [getattr(inp, "data", None) for inp in node.inputs]
226
- dtype = convert_dtype_to_mlx(op.dtype)
227
-
228
- def tri(*args):
229
- # Replace args with compile-time constants when available
230
- args = [
231
- arg if const_a is None else const_a
232
- for arg, const_a in zip(args, const_args, strict=True)
233
- ]
234
- return mx.tri(*args, dtype=dtype)
235
-
236
- return tri
237
-
238
-
239
221
  @mlx_funcify.register(AllocEmpty)
240
222
  def mlx_funcify_AllocEmpty(op, node, **kwargs):
241
223
  dtype = convert_dtype_to_mlx(op.dtype)
@@ -5,6 +5,9 @@ from tempfile import NamedTemporaryFile
5
5
  from typing import Any
6
6
  from weakref import WeakKeyDictionary
7
7
 
8
+ import numba
9
+ from llvmlite import ir
10
+ from numba.core import cgutils
8
11
  from numba.core.caching import CacheImpl, _CacheLocator
9
12
 
10
13
  from pytensor.configdefaults import config
@@ -127,3 +130,49 @@ def compile_numba_function_src(
127
130
  CACHED_SRC_FUNCTIONS[res] = cache_key
128
131
 
129
132
  return res # type: ignore
133
+
134
+
135
+ @numba.extending.intrinsic(prefer_literal=True)
136
+ def _call_cached_ptr(typingctx, get_ptr_func, func_type_ref, unique_func_name_lit):
137
+ """
138
+ Enable caching of function pointers returned by `get_ptr_func`.
139
+
140
+ When one of our Numba-dispatched functions depends on a pointer to a compiled function function (e.g. when we call
141
+ cython_lapack routines), numba will refuse to cache the function, because the pointer may change between runs.
142
+
143
+ This intrinsic allows us to cache the pointer ourselves, by storing it in a global variable keyed by a literal
144
+ `unique_func_name_lit`. The first time the intrinsic is called, it will call `get_ptr_func` to get the pointer, store it
145
+ in the global variable, and return it. Subsequent calls will load the pointer from the global variable.
146
+ """
147
+ func_type = func_type_ref.instance_type
148
+ cache_key = unique_func_name_lit.literal_value
149
+
150
+ def codegen(context, builder, signature, args):
151
+ ptr_ty = ir.PointerType(ir.IntType(8))
152
+ null = ptr_ty(None)
153
+ align = 64
154
+
155
+ mod = builder.module
156
+ var = cgutils.add_global_variable(mod, ptr_ty, f"_ptr_cache_{cache_key}")
157
+ var.align = align
158
+ var.linkage = "private"
159
+ var.initializer = null
160
+
161
+ var_val = builder.load_atomic(var, "acquire", align)
162
+ result_ptr = cgutils.alloca_once_value(builder, var_val)
163
+
164
+ with builder.if_then(builder.icmp_signed("==", var_val, null), likely=False):
165
+ sig = typingctx.resolve_function_type(get_ptr_func, [], {})
166
+ f = context.get_function(get_ptr_func, sig)
167
+ new_ptr = f(builder, [])
168
+ new_ptr = builder.inttoptr(new_ptr, ptr_ty)
169
+ builder.store_atomic(new_ptr, var, "release", align)
170
+ builder.store(new_ptr, result_ptr)
171
+
172
+ sfunc = cgutils.create_struct_proxy(func_type)(context, builder)
173
+ sfunc.c_addr = builder.load(result_ptr)
174
+
175
+ return sfunc._getvalue()
176
+
177
+ sig = func_type(get_ptr_func, func_type_ref, unique_func_name_lit)
178
+ return sig, codegen
@@ -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(
@@ -171,40 +178,6 @@ def create_numba_signature(
171
178
  return numba.types.void(*input_types)
172
179
 
173
180
 
174
- def create_tuple_creator(f, n):
175
- """Construct a compile-time ``tuple``-comprehension-like loop.
176
-
177
- See https://github.com/numba/numba/issues/2771#issuecomment-414358902
178
- """
179
- warnings.warn(
180
- "create_tuple_creator is deprecated and will be removed in a future release",
181
- FutureWarning,
182
- )
183
-
184
- assert n > 0
185
-
186
- f = numba_njit(f)
187
-
188
- @numba_njit
189
- def creator(args):
190
- return (f(0, *args),)
191
-
192
- for i in range(1, n):
193
-
194
- @numba_njit
195
- def creator(args, creator=creator, i=i):
196
- return (*creator(args), f(i, *args))
197
-
198
- return numba_njit(lambda *args: creator(args))
199
-
200
-
201
- def create_tuple_string(x):
202
- if len(x) == 1:
203
- return f"({x[0]},)"
204
- else:
205
- return f"({', '.join(x)})"
206
-
207
-
208
181
  @numba.extending.intrinsic
209
182
  def direct_cast(typingctx, val, typ):
210
183
  if isinstance(typ, numba.types.TypeRef):
@@ -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:
@@ -14,11 +14,11 @@ from pytensor.link.numba.cache import (
14
14
  )
15
15
  from pytensor.link.numba.dispatch import basic as numba_basic
16
16
  from pytensor.link.numba.dispatch.basic import (
17
- create_tuple_string,
18
17
  numba_funcify_and_cache_key,
19
18
  register_funcify_and_cache_key,
20
19
  register_funcify_default_op_cache_key,
21
20
  )
21
+ from pytensor.link.numba.dispatch.string_codegen import create_tuple_string
22
22
  from pytensor.link.numba.dispatch.vectorize_codegen import (
23
23
  _vectorized,
24
24
  encode_literals,
@@ -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
@@ -466,6 +467,16 @@ def numba_funcify_DimShuffle(op: DimShuffle, node, **kwargs):
466
467
 
467
468
  return squeeze_to_0d
468
469
 
470
+ elif op.input_ndim == 0:
471
+ # DimShuffle can only be an expand_dims or a no_op
472
+ # This branch uses asarray in case we get a scalar due to https://github.com/numba/numba/issues/10358
473
+ new_shape = shape_template
474
+ new_strides = strides_template
475
+
476
+ @numba_basic.numba_njit
477
+ def dimshuffle(x):
478
+ return as_strided(np.asarray(x), shape=new_shape, strides=new_strides)
479
+
469
480
  else:
470
481
 
471
482
  @numba_basic.numba_njit
@@ -490,7 +501,7 @@ def numba_funcify_DimShuffle(op: DimShuffle, node, **kwargs):
490
501
 
491
502
  return as_strided(x, shape=new_shape, strides=new_strides)
492
503
 
493
- cache_version = 1
504
+ cache_version = 2
494
505
  return dimshuffle, cache_version
495
506
 
496
507