pytensor 2.35.1__tar.gz → 2.36.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.35.1/pytensor.egg-info → pytensor-2.36.0}/PKG-INFO +4 -2
  2. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/creating_a_numba_jax_op.rst +1 -1
  3. {pytensor-2.35.1 → pytensor-2.36.0}/doc/gallery/autodiff/vector_jacobian_product.ipynb +2 -2
  4. {pytensor-2.35.1 → pytensor-2.36.0}/pyproject.toml +10 -5
  5. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/_version.py +3 -3
  6. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/bin/pytensor_cache.py +7 -1
  7. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/__init__.py +2 -1
  8. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/builders.py +7 -2
  9. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/debugmode.py +4 -0
  10. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/function/pfunc.py +21 -22
  11. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/io.py +1 -1
  12. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/mode.py +51 -80
  13. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/profiling.py +0 -1
  14. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/configdefaults.py +21 -5
  15. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/configparser.py +3 -1
  16. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/gradient.py +5 -7
  17. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/rewriting/basic.py +1 -1
  18. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/basic.py +43 -14
  19. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/c/basic.py +0 -2
  20. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/c/cmodule.py +3 -3
  21. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/scalar.py +1 -1
  22. pytensor-2.36.0/pytensor/link/jax/dispatch/scan.py +251 -0
  23. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/sparse.py +1 -1
  24. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/linker.py +16 -0
  25. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/ops.py +4 -3
  26. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/mlx/dispatch/__init__.py +4 -0
  27. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/mlx/dispatch/blockwise.py +11 -4
  28. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/mlx/dispatch/core.py +7 -4
  29. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/mlx/dispatch/elemwise.py +20 -9
  30. pytensor-2.36.0/pytensor/link/mlx/dispatch/extra_ops.py +35 -0
  31. pytensor-2.36.0/pytensor/link/mlx/dispatch/nlinalg.py +69 -0
  32. pytensor-2.36.0/pytensor/link/mlx/dispatch/slinalg.py +84 -0
  33. pytensor-2.36.0/pytensor/link/mlx/dispatch/sort.py +38 -0
  34. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/mlx/linker.py +8 -0
  35. pytensor-2.36.0/pytensor/link/numba/cache.py +129 -0
  36. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/__init__.py +2 -0
  37. pytensor-2.36.0/pytensor/link/numba/dispatch/basic.py +571 -0
  38. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/blockwise.py +53 -30
  39. pytensor-2.36.0/pytensor/link/numba/dispatch/compile_ops.py +148 -0
  40. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/elemwise.py +294 -215
  41. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/extra_ops.py +128 -119
  42. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +14 -2
  43. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +22 -12
  44. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +14 -13
  45. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +5 -8
  46. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +147 -64
  47. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +8 -7
  48. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/solve/general.py +11 -10
  49. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +13 -9
  50. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/solve/norm.py +4 -7
  51. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +16 -15
  52. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +20 -19
  53. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +8 -7
  54. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +100 -39
  55. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/utils.py +25 -15
  56. pytensor-2.36.0/pytensor/link/numba/dispatch/nlinalg.py +179 -0
  57. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/random.py +68 -34
  58. pytensor-2.36.0/pytensor/link/numba/dispatch/scalar.py +414 -0
  59. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/scan.py +107 -85
  60. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/shape.py +12 -12
  61. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/signal/conv.py +8 -6
  62. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/slinalg.py +143 -56
  63. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/sort.py +8 -6
  64. pytensor-2.36.0/pytensor/link/numba/dispatch/subtensor.py +655 -0
  65. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/tensor_basic.py +59 -58
  66. pytensor-2.36.0/pytensor/link/numba/dispatch/typed_list.py +236 -0
  67. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +26 -23
  68. pytensor-2.36.0/pytensor/link/numba/linker.py +32 -0
  69. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/dispatch/basic.py +0 -1
  70. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/linker.py +10 -0
  71. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/utils.py +26 -13
  72. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/vm.py +7 -0
  73. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scalar/basic.py +23 -107
  74. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scalar/loop.py +1 -4
  75. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scalar/math.py +10 -8
  76. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scan/basic.py +144 -102
  77. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scan/checkpoints.py +12 -8
  78. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scan/op.py +242 -179
  79. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scan/rewriting.py +25 -17
  80. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scan/utils.py +22 -16
  81. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scan/views.py +93 -5
  82. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/sparse/__init__.py +1 -0
  83. pytensor-2.36.0/pytensor/sparse/basic.py +1946 -0
  84. pytensor-2.36.0/pytensor/sparse/linalg.py +93 -0
  85. pytensor-2.36.0/pytensor/sparse/math.py +2087 -0
  86. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/sparse/rewriting.py +32 -38
  87. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/sparse/sharedvar.py +2 -2
  88. pytensor-2.36.0/pytensor/sparse/variable.py +479 -0
  89. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/__init__.py +0 -1
  90. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/_linalg/solve/tridiagonal.py +1 -2
  91. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/basic.py +10 -7
  92. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/blas.py +2 -2
  93. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/blas_c.py +24 -15
  94. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/blockwise.py +5 -0
  95. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/elemwise.py +11 -13
  96. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/elemwise_cgen.py +2 -2
  97. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/extra_ops.py +7 -9
  98. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/fourier.py +2 -2
  99. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/math.py +8 -5
  100. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/nlinalg.py +32 -14
  101. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/optimize.py +158 -107
  102. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/pad.py +2 -1
  103. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/random/op.py +12 -3
  104. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/random/rewriting/basic.py +17 -14
  105. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/random/rewriting/numba.py +4 -2
  106. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/random/utils.py +26 -11
  107. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/basic.py +48 -0
  108. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/elemwise.py +10 -16
  109. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/math.py +10 -3
  110. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/shape.py +4 -4
  111. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/subtensor.py +19 -179
  112. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/uncanonicalize.py +1 -1
  113. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/shape.py +26 -9
  114. pytensor-2.36.0/pytensor/tensor/signal/__init__.py +4 -0
  115. pytensor-2.36.0/pytensor/tensor/signal/conv.py +348 -0
  116. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/slinalg.py +21 -9
  117. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/sort.py +10 -2
  118. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/subtensor.py +7 -3
  119. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/variable.py +0 -16
  120. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/xlogx.py +2 -2
  121. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/typed_list/basic.py +15 -11
  122. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/utils.py +2 -3
  123. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/math.py +2 -2
  124. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/reduction.py +2 -2
  125. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/rewriting/reduction.py +2 -2
  126. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/type.py +0 -6
  127. {pytensor-2.35.1 → pytensor-2.36.0/pytensor.egg-info}/PKG-INFO +4 -2
  128. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor.egg-info/SOURCES.txt +10 -2
  129. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor.egg-info/requires.txt +1 -0
  130. {pytensor-2.35.1 → pytensor-2.36.0}/scripts/mypy-failing.txt +1 -1
  131. {pytensor-2.35.1 → pytensor-2.36.0}/tests/test_config.py +5 -2
  132. {pytensor-2.35.1 → pytensor-2.36.0}/tests/test_printing.py +3 -4
  133. {pytensor-2.35.1 → pytensor-2.36.0}/tests/test_raise_op.py +6 -1
  134. pytensor-2.35.1/pytensor/link/jax/dispatch/scan.py +0 -202
  135. pytensor-2.35.1/pytensor/link/numba/dispatch/basic.py +0 -383
  136. pytensor-2.35.1/pytensor/link/numba/dispatch/nlinalg.py +0 -144
  137. pytensor-2.35.1/pytensor/link/numba/dispatch/scalar.py +0 -317
  138. pytensor-2.35.1/pytensor/link/numba/dispatch/subtensor.py +0 -448
  139. pytensor-2.35.1/pytensor/link/numba/linker.py +0 -19
  140. pytensor-2.35.1/pytensor/sparse/basic.py +0 -4343
  141. pytensor-2.35.1/pytensor/tensor/inplace.py +0 -427
  142. pytensor-2.35.1/pytensor/tensor/io.py +0 -94
  143. pytensor-2.35.1/pytensor/tensor/signal/__init__.py +0 -4
  144. pytensor-2.35.1/pytensor/tensor/signal/conv.py +0 -213
  145. {pytensor-2.35.1 → pytensor-2.36.0}/LICENSE.txt +0 -0
  146. {pytensor-2.35.1 → pytensor-2.36.0}/MANIFEST.in +0 -0
  147. {pytensor-2.35.1 → pytensor-2.36.0}/README.rst +0 -0
  148. {pytensor-2.35.1 → pytensor-2.36.0}/doc/.templates/PLACEHOLDER +0 -0
  149. {pytensor-2.35.1 → pytensor-2.36.0}/doc/.templates/layout.html +0 -0
  150. {pytensor-2.35.1 → pytensor-2.36.0}/doc/.templates/nb-badges.html +0 -0
  151. {pytensor-2.35.1 → pytensor-2.36.0}/doc/.templates/rendered_citation.html +0 -0
  152. {pytensor-2.35.1 → pytensor-2.36.0}/doc/LICENSE.txt +0 -0
  153. {pytensor-2.35.1 → pytensor-2.36.0}/doc/README.md +0 -0
  154. {pytensor-2.35.1 → pytensor-2.36.0}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  155. {pytensor-2.35.1 → pytensor-2.36.0}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  156. {pytensor-2.35.1 → pytensor-2.36.0}/doc/acknowledgement.rst +0 -0
  157. {pytensor-2.35.1 → pytensor-2.36.0}/doc/bcast.png +0 -0
  158. {pytensor-2.35.1 → pytensor-2.36.0}/doc/bcast.svg +0 -0
  159. {pytensor-2.35.1 → pytensor-2.36.0}/doc/blog.md +0 -0
  160. {pytensor-2.35.1 → pytensor-2.36.0}/doc/conf.py +0 -0
  161. {pytensor-2.35.1 → pytensor-2.36.0}/doc/core_development_guide.rst +0 -0
  162. {pytensor-2.35.1 → pytensor-2.36.0}/doc/css.inc +0 -0
  163. {pytensor-2.35.1 → pytensor-2.36.0}/doc/dev_start_guide.rst +0 -0
  164. {pytensor-2.35.1 → pytensor-2.36.0}/doc/environment.yml +0 -0
  165. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/apply.png +0 -0
  166. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/apply.svg +0 -0
  167. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/apply2.svg +0 -0
  168. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/creating_a_c_op.rst +0 -0
  169. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/creating_an_op.rst +0 -0
  170. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/ctype.rst +0 -0
  171. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/extending_faq.rst +0 -0
  172. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
  173. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/graph_rewriting.rst +0 -0
  174. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/graphstructures.rst +0 -0
  175. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/index.rst +0 -0
  176. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/inplace.rst +0 -0
  177. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/op.rst +0 -0
  178. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/other_ops.rst +0 -0
  179. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  180. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  181. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/pipeline.rst +0 -0
  182. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/scan.rst +0 -0
  183. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/tips.rst +0 -0
  184. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/type.rst +0 -0
  185. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/unittest.rst +0 -0
  186. {pytensor-2.35.1 → pytensor-2.36.0}/doc/extending/using_params.rst +0 -0
  187. {pytensor-2.35.1 → pytensor-2.36.0}/doc/faq.rst +0 -0
  188. {pytensor-2.35.1 → pytensor-2.36.0}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  189. {pytensor-2.35.1 → pytensor-2.36.0}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
  190. {pytensor-2.35.1 → pytensor-2.36.0}/doc/gallery/optimize/root.ipynb +0 -0
  191. {pytensor-2.35.1 → pytensor-2.36.0}/doc/gallery/page_footer.md +0 -0
  192. {pytensor-2.35.1 → pytensor-2.36.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  193. {pytensor-2.35.1 → pytensor-2.36.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  194. {pytensor-2.35.1 → pytensor-2.36.0}/doc/generate_dtype_tensor_table.py +0 -0
  195. {pytensor-2.35.1 → pytensor-2.36.0}/doc/glossary.rst +0 -0
  196. {pytensor-2.35.1 → pytensor-2.36.0}/doc/images/Elman_srnn.png +0 -0
  197. {pytensor-2.35.1 → pytensor-2.36.0}/doc/images/PyTensor.png +0 -0
  198. {pytensor-2.35.1 → pytensor-2.36.0}/doc/images/PyTensor_RGB.svg +0 -0
  199. {pytensor-2.35.1 → pytensor-2.36.0}/doc/images/PyTensor_logo.png +0 -0
  200. {pytensor-2.35.1 → pytensor-2.36.0}/doc/images/binder.svg +0 -0
  201. {pytensor-2.35.1 → pytensor-2.36.0}/doc/images/blocksparse.png +0 -0
  202. {pytensor-2.35.1 → pytensor-2.36.0}/doc/images/colab.svg +0 -0
  203. {pytensor-2.35.1 → pytensor-2.36.0}/doc/images/github.svg +0 -0
  204. {pytensor-2.35.1 → pytensor-2.36.0}/doc/images/lstm.png +0 -0
  205. {pytensor-2.35.1 → pytensor-2.36.0}/doc/images/lstm_memorycell.png +0 -0
  206. {pytensor-2.35.1 → pytensor-2.36.0}/doc/images/talk2010.gif +0 -0
  207. {pytensor-2.35.1 → pytensor-2.36.0}/doc/images/talk2010.png +0 -0
  208. {pytensor-2.35.1 → pytensor-2.36.0}/doc/index.rst +0 -0
  209. {pytensor-2.35.1 → pytensor-2.36.0}/doc/install.rst +0 -0
  210. {pytensor-2.35.1 → pytensor-2.36.0}/doc/internal/how_to_release.rst +0 -0
  211. {pytensor-2.35.1 → pytensor-2.36.0}/doc/internal/index.rst +0 -0
  212. {pytensor-2.35.1 → pytensor-2.36.0}/doc/internal/metadocumentation.rst +0 -0
  213. {pytensor-2.35.1 → pytensor-2.36.0}/doc/introduction.rst +0 -0
  214. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/compile/debugmode.rst +0 -0
  215. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/compile/function.rst +0 -0
  216. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/compile/index.rst +0 -0
  217. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/compile/io.rst +0 -0
  218. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/compile/mode.rst +0 -0
  219. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/compile/nanguardmode.rst +0 -0
  220. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/compile/opfromgraph.rst +0 -0
  221. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/compile/ops.rst +0 -0
  222. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/compile/profilemode.rst +0 -0
  223. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/compile/shared.rst +0 -0
  224. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/config.rst +0 -0
  225. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  226. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  227. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  228. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  229. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  230. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  231. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  232. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/mlp.html +0 -0
  233. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/mlp.png +0 -0
  234. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/mlp2.html +0 -0
  235. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  236. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/mlp2.png +0 -0
  237. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/ofg.html +0 -0
  238. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/examples/ofg2.html +0 -0
  239. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/index.ipynb +0 -0
  240. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/index.rst +0 -0
  241. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  242. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  243. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  244. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  245. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/graph/features.rst +0 -0
  246. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/graph/fgraph.rst +0 -0
  247. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/graph/graph.rst +0 -0
  248. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/graph/index.rst +0 -0
  249. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/graph/op.rst +0 -0
  250. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/graph/replace.rst +0 -0
  251. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/graph/type.rst +0 -0
  252. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/graph/utils.rst +0 -0
  253. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/index.rst +0 -0
  254. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/misc/pkl_utils.rst +0 -0
  255. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/printing.rst +0 -0
  256. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/scalar/index.rst +0 -0
  257. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/scan.rst +0 -0
  258. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/sparse/index.rst +0 -0
  259. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/sparse/sandbox.rst +0 -0
  260. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/basic.rst +0 -0
  261. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/basic_opt.rst +0 -0
  262. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/bcast.png +0 -0
  263. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/bcast.svg +0 -0
  264. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/conv.rst +0 -0
  265. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/elemwise.rst +0 -0
  266. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/extra_ops.rst +0 -0
  267. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/fft.rst +0 -0
  268. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/functional.rst +0 -0
  269. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/index.rst +0 -0
  270. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/io.rst +0 -0
  271. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/math_opt.rst +0 -0
  272. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/nlinalg.rst +0 -0
  273. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/optimize.rst +0 -0
  274. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/plot_fft.png +0 -0
  275. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/random/distributions.rst +0 -0
  276. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/random/index.rst +0 -0
  277. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/slinalg.rst +0 -0
  278. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/tensor/utils.rst +0 -0
  279. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/typed_list.rst +0 -0
  280. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/xtensor/index.md +0 -0
  281. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/xtensor/linalg.md +0 -0
  282. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/xtensor/math.md +0 -0
  283. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/xtensor/module_functions.md +0 -0
  284. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/xtensor/random.md +0 -0
  285. {pytensor-2.35.1 → pytensor-2.36.0}/doc/library/xtensor/type.md +0 -0
  286. {pytensor-2.35.1 → pytensor-2.36.0}/doc/links.rst +0 -0
  287. {pytensor-2.35.1 → pytensor-2.36.0}/doc/optimizations.rst +0 -0
  288. {pytensor-2.35.1 → pytensor-2.36.0}/doc/pylintrc +0 -0
  289. {pytensor-2.35.1 → pytensor-2.36.0}/doc/robots.txt +0 -0
  290. {pytensor-2.35.1 → pytensor-2.36.0}/doc/troubleshooting.rst +0 -0
  291. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/adding.rst +0 -0
  292. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/adding_solution_1.py +0 -0
  293. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/aliasing.rst +0 -0
  294. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/apply.png +0 -0
  295. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/apply.svg +0 -0
  296. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/bcast.png +0 -0
  297. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/broadcasting.rst +0 -0
  298. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/conditions.rst +0 -0
  299. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/debug_faq.rst +0 -0
  300. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/dlogistic.png +0 -0
  301. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/examples.rst +0 -0
  302. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/faq_tutorial.rst +0 -0
  303. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/gradients.rst +0 -0
  304. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/index.rst +0 -0
  305. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/loading_and_saving.rst +0 -0
  306. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/logistic.gp +0 -0
  307. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/logistic.png +0 -0
  308. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/loop.rst +0 -0
  309. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/loop_solution_1.py +0 -0
  310. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/modes.rst +0 -0
  311. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/modes_solution_1.py +0 -0
  312. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/multi_cores.rst +0 -0
  313. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/nan_tutorial.rst +0 -0
  314. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/pics/d3viz.png +0 -0
  315. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  316. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  317. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  318. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/printing_drawing.rst +0 -0
  319. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/prng.rst +0 -0
  320. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/profiling.rst +0 -0
  321. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/profiling_example.py +0 -0
  322. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/profiling_example_out.prof +0 -0
  323. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/shape_info.rst +0 -0
  324. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/sparse.rst +0 -0
  325. {pytensor-2.35.1 → pytensor-2.36.0}/doc/tutorial/symbolic_graphs.rst +0 -0
  326. {pytensor-2.35.1 → pytensor-2.36.0}/doc/user_guide.rst +0 -0
  327. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/__init__.py +0 -0
  328. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/bin/__init__.py +0 -0
  329. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/breakpoint.py +0 -0
  330. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/compiledir.py +0 -0
  331. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/compilelock.py +0 -0
  332. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/function/__init__.py +0 -0
  333. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/function/types.py +0 -0
  334. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/monitormode.py +0 -0
  335. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/nanguardmode.py +0 -0
  336. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/ops.py +0 -0
  337. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/compile/sharedvalue.py +0 -0
  338. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/d3viz/__init__.py +0 -0
  339. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  340. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/d3viz/css/d3viz.css +0 -0
  341. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/d3viz/d3viz.py +0 -0
  342. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/d3viz/formatting.py +0 -0
  343. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/d3viz/html/template.html +0 -0
  344. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  345. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  346. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/d3viz/js/d3viz.js +0 -0
  347. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  348. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  349. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/__init__.py +0 -0
  350. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/basic.py +0 -0
  351. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/destroyhandler.py +0 -0
  352. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/features.py +0 -0
  353. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/fg.py +0 -0
  354. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/null_type.py +0 -0
  355. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/op.py +0 -0
  356. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/replace.py +0 -0
  357. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/rewriting/__init__.py +0 -0
  358. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/rewriting/db.py +0 -0
  359. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/rewriting/kanren.py +0 -0
  360. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/rewriting/unify.py +0 -0
  361. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/rewriting/utils.py +0 -0
  362. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/traversal.py +0 -0
  363. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/type.py +0 -0
  364. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/graph/utils.py +0 -0
  365. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/ifelse.py +0 -0
  366. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/ipython.py +0 -0
  367. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/__init__.py +0 -0
  368. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/c/__init__.py +0 -0
  369. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  370. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  371. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/c/cutils.py +0 -0
  372. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/c/cvm.py +0 -0
  373. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/c/exceptions.py +0 -0
  374. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/c/interface.py +0 -0
  375. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/c/lazylinker_c.py +0 -0
  376. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/c/op.py +0 -0
  377. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/c/params_type.py +0 -0
  378. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/c/type.py +0 -0
  379. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/__init__.py +0 -0
  380. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/__init__.py +0 -0
  381. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/basic.py +0 -0
  382. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/blas.py +0 -0
  383. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  384. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
  385. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  386. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  387. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/math.py +0 -0
  388. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  389. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/pad.py +0 -0
  390. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/random.py +0 -0
  391. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/shape.py +0 -0
  392. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  393. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  394. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/slinalg.py +0 -0
  395. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/sort.py +0 -0
  396. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  397. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  398. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/mlx/__init__.py +0 -0
  399. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/mlx/dispatch/basic.py +0 -0
  400. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/mlx/dispatch/math.py +0 -0
  401. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/mlx/dispatch/shape.py +0 -0
  402. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  403. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  404. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
  405. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/__init__.py +0 -0
  406. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  407. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  408. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  409. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
  410. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
  411. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  412. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/numba/dispatch/sparse.py +0 -0
  413. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  414. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  415. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  416. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  417. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  418. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
  419. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
  420. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  421. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  422. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/dispatch/slinalg.py +0 -0
  423. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  424. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  425. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/misc/__init__.py +0 -0
  426. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/misc/check_blas.py +0 -0
  427. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/misc/check_blas_many.sh +0 -0
  428. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/misc/check_duplicate_key.py +0 -0
  429. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  430. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/misc/elemwise_time_test.py +0 -0
  431. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/misc/frozendict.py +0 -0
  432. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/misc/may_share_memory.py +0 -0
  433. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/misc/ordered_set.py +0 -0
  434. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/misc/pkl_utils.py +0 -0
  435. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/npy_2_compat.py +0 -0
  436. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/printing.py +0 -0
  437. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/py.typed +0 -0
  438. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/raise_op.py +0 -0
  439. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scalar/__init__.py +0 -0
  440. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  441. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  442. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scalar/c_code/gamma.c +0 -0
  443. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scalar/c_code/incbet.c +0 -0
  444. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scalar/sharedvar.py +0 -0
  445. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scan/__init__.py +0 -0
  446. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scan/scan_perform.pyx +0 -0
  447. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/scan/scan_perform_ext.py +0 -0
  448. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/sparse/type.py +0 -0
  449. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/sparse/utils.py +0 -0
  450. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/_linalg/__init__.py +0 -0
  451. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
  452. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/_linalg/solve/rewriting.py +0 -0
  453. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/blas_headers.py +0 -0
  454. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  455. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  456. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  457. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/conv/__init__.py +0 -0
  458. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/conv/abstract_conv.py +0 -0
  459. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/einsum.py +0 -0
  460. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/exceptions.py +0 -0
  461. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/fft.py +0 -0
  462. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/functional.py +0 -0
  463. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/interpolate.py +0 -0
  464. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/linalg.py +0 -0
  465. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/random/__init__.py +0 -0
  466. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/random/basic.py +0 -0
  467. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  468. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
  469. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/random/type.py +0 -0
  470. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/random/var.py +0 -0
  471. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/__init__.py +0 -0
  472. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/blas.py +0 -0
  473. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/blas_c.py +0 -0
  474. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/blockwise.py +0 -0
  475. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/einsum.py +0 -0
  476. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  477. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/jax.py +0 -0
  478. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/linalg.py +0 -0
  479. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/numba.py +0 -0
  480. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/ofg.py +0 -0
  481. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/special.py +0 -0
  482. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
  483. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/sharedvar.py +0 -0
  484. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/special.py +0 -0
  485. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/type.py +0 -0
  486. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/type_other.py +0 -0
  487. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/utils.py +0 -0
  488. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/tensor/var.py +0 -0
  489. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/typed_list/__init__.py +0 -0
  490. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/typed_list/rewriting.py +0 -0
  491. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/typed_list/type.py +0 -0
  492. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/updates.py +0 -0
  493. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/__init__.py +0 -0
  494. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/basic.py +0 -0
  495. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/indexing.py +0 -0
  496. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/linalg.py +0 -0
  497. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/random.py +0 -0
  498. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/rewriting/__init__.py +0 -0
  499. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/rewriting/basic.py +0 -0
  500. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/rewriting/indexing.py +0 -0
  501. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/rewriting/math.py +0 -0
  502. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/rewriting/shape.py +0 -0
  503. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/rewriting/utils.py +0 -0
  504. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  505. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/shape.py +0 -0
  506. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor/xtensor/vectorization.py +0 -0
  507. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor.egg-info/dependency_links.txt +0 -0
  508. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor.egg-info/entry_points.txt +0 -0
  509. {pytensor-2.35.1 → pytensor-2.36.0}/pytensor.egg-info/top_level.txt +0 -0
  510. {pytensor-2.35.1 → pytensor-2.36.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  511. {pytensor-2.35.1 → pytensor-2.36.0}/setup.cfg +0 -0
  512. {pytensor-2.35.1 → pytensor-2.36.0}/setup.py +0 -0
  513. {pytensor-2.35.1 → pytensor-2.36.0}/tests/link/c/c_code/test_cenum.h +0 -0
  514. {pytensor-2.35.1 → pytensor-2.36.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  515. {pytensor-2.35.1 → pytensor-2.36.0}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
  516. {pytensor-2.35.1 → pytensor-2.36.0}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
  517. {pytensor-2.35.1 → pytensor-2.36.0}/tests/test_breakpoint.py +0 -0
  518. {pytensor-2.35.1 → pytensor-2.36.0}/tests/test_gradient.py +0 -0
  519. {pytensor-2.35.1 → pytensor-2.36.0}/tests/test_ifelse.py +0 -0
  520. {pytensor-2.35.1 → pytensor-2.36.0}/tests/test_rop.py +0 -0
  521. {pytensor-2.35.1 → pytensor-2.36.0}/tests/test_updates.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 2.35.1
3
+ Version: 2.36.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
@@ -24,12 +24,14 @@ Classifier: Programming Language :: Python :: 3
24
24
  Classifier: Programming Language :: Python :: 3.11
25
25
  Classifier: Programming Language :: Python :: 3.12
26
26
  Classifier: Programming Language :: Python :: 3.13
27
- Requires-Python: <3.14,>=3.11
27
+ Classifier: Programming Language :: Python :: 3.14
28
+ Requires-Python: <3.15,>=3.11
28
29
  Description-Content-Type: text/x-rst
29
30
  License-File: LICENSE.txt
30
31
  Requires-Dist: setuptools>=59.0.0
31
32
  Requires-Dist: scipy<2,>=1
32
33
  Requires-Dist: numpy>=2.0
34
+ Requires-Dist: numba<1,>0.57
33
35
  Requires-Dist: filelock>=3.15
34
36
  Requires-Dist: etuples
35
37
  Requires-Dist: logical-unification
@@ -228,7 +228,7 @@ Here's an example for :class:`DimShuffle`:
228
228
  # E No match.
229
229
  # ...(on this line)...
230
230
  # E shuffle_shape = res.shape[: len(shuffle)]
231
- @numba_basic.numba_njit(inline="always")
231
+ @numba_basic.numba_njit
232
232
  def dimshuffle(x):
233
233
  return dimshuffle_inner(np.asarray(x), shuffle)
234
234
 
@@ -389,7 +389,7 @@
389
389
  "1 & 1 & 0 \\\\\n",
390
390
  "1 & 1 & 1 \\\\\n",
391
391
  "\\end{pmatrix} = \\begin{pmatrix}\n",
392
- "v_1 + v2 + v 3 \\\\ v_2 + v_3 \\\\ v_3\n",
392
+ "v_1 + v_2 + v_3 \\\\ v_2 + v_3 \\\\ v_3\n",
393
393
  "\\end{pmatrix}\n",
394
394
  "$$"
395
395
  ]
@@ -661,7 +661,7 @@
661
661
  "source": [
662
662
  "$$\n",
663
663
  "v^T \\cdot J = \\begin{pmatrix}\n",
664
- "v_1 \\\\ v_2 \\\\ v_3 \\\\ v4\n",
664
+ "v_1 \\\\ v_2 \\\\ v_3 \\\\ v_4\n",
665
665
  "\\end{pmatrix}^T \\cdot \\begin{pmatrix}\n",
666
666
  "x_1 & 0 \\\\\n",
667
667
  "x_2 & x_1 \\\\\n",
@@ -10,7 +10,7 @@ build-backend = "setuptools.build_meta"
10
10
  [project]
11
11
  name = "pytensor"
12
12
  dynamic = ['version']
13
- requires-python = ">=3.11,<3.14"
13
+ requires-python = ">=3.11,<3.15"
14
14
  authors = [{ name = "pymc-devs", email = "pymc.devs@gmail.com" }]
15
15
  description = "Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs."
16
16
  readme = "README.rst"
@@ -33,6 +33,7 @@ classifiers = [
33
33
  "Programming Language :: Python :: 3.11",
34
34
  "Programming Language :: Python :: 3.12",
35
35
  "Programming Language :: Python :: 3.13",
36
+ "Programming Language :: Python :: 3.14",
36
37
  ]
37
38
 
38
39
  keywords = [
@@ -49,6 +50,7 @@ dependencies = [
49
50
  "setuptools>=59.0.0",
50
51
  "scipy>=1,<2",
51
52
  "numpy>=2.0",
53
+ "numba>0.57,<1",
52
54
  "filelock>=3.15",
53
55
  "etuples",
54
56
  "logical-unification",
@@ -120,6 +122,9 @@ tag_prefix = "rel-"
120
122
  addopts = "--durations=50 --doctest-modules --ignore=pytensor/link --ignore=pytensor/misc/check_duplicate_key.py --ignore=pytensor/ipython.py"
121
123
  testpaths = ["pytensor/", "tests/"]
122
124
  xfail_strict = true
125
+ filterwarnings =[
126
+ 'ignore:^Numba will use object mode to run.*perform method\.:UserWarning',
127
+ ]
123
128
 
124
129
  [tool.ruff]
125
130
  line-length = 88
@@ -150,7 +155,7 @@ lines-after-imports = 2
150
155
  "pytensor/misc/check_duplicate_key.py" = ["T201"]
151
156
  "pytensor/misc/check_blas.py" = ["T201"]
152
157
  "pytensor/bin/pytensor_cache.py" = ["T201"]
153
- # For the tests we skip because `pytest.importorskip` is used:
158
+ # For the tests we skip `E402` because `pytest.importorskip` is used:
154
159
  "tests/link/jax/test_scalar.py" = ["E402"]
155
160
  "tests/link/jax/test_tensor_basic.py" = ["E402"]
156
161
  "tests/link/numba/test_basic.py" = ["E402"]
@@ -182,12 +187,12 @@ files = ["pytensor", "tests"]
182
187
  build = "*"
183
188
  # Uncomment to skip builds that compile but fail when trying to test (maybe due to incompatibility with runner)
184
189
  # archs = ["auto64"]
185
- # Disable any-platform (pp*), and 32-bit builds.
190
+ # Disable any-platform (pp*), 32-bit builds, and free-threaded builds (cp*t-*)
186
191
  # Additional options to consider: "*musllinux*"
187
- skip = ["pp*", "*-win32", "*-manylinux_i686"]
192
+ skip = ["pp*", "*-win32", "*-manylinux_i686", "cp*t-*"]
188
193
  build-frontend = "build"
189
194
  test-command = 'python -c "import pytensor; print(pytensor.__version__); from pytensor.scan import scan_perform; print(scan_perform.get_version())"'
190
- test-skip = ["cp37*", "*musllinux*", "*win32*", "*i686*"]
195
+ test-skip = ["*musllinux*", "*i686*"]
191
196
 
192
197
  # Testing seems to be running into issues locating libs where expected
193
198
  # test-requires = ["pytest", "numba", "jax", "jaxlib"]
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-10-20T17:04:33+0200",
11
+ "date": "2025-12-15T22:58:11+0100",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "5547eb086c6f281621fb81f2ef93e041ee05aece",
15
- "version": "2.35.1"
14
+ "full-revisionid": "6319fac84ebc71ad079c5986c6c302a52e254198",
15
+ "version": "2.36.0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  import os
3
+ import shutil
3
4
  import sys
4
5
  from pathlib import Path
5
6
 
@@ -74,7 +75,10 @@ def main():
74
75
  'You can also call "pytensor-cache purge" to '
75
76
  "remove everything from that directory."
76
77
  )
77
- _logger.debug(f"Remaining elements ({len(items)}): {', '.join(items)}")
78
+ _logger.debug(f"Remaining elements ({len(items)}): {items}")
79
+ numba_cache_dir: Path = config.base_compiledir / "numba"
80
+ shutil.rmtree(numba_cache_dir, ignore_errors=True)
81
+
78
82
  elif sys.argv[1] == "list":
79
83
  pytensor.compile.compiledir.print_compiledir_content()
80
84
  elif sys.argv[1] == "cleanup":
@@ -86,6 +90,8 @@ def main():
86
90
  print("Lock successfully removed!")
87
91
  elif sys.argv[1] == "purge":
88
92
  pytensor.compile.compiledir.compiledir_purge()
93
+ numba_cache_dir: Path = config.base_compiledir / "numba"
94
+ shutil.rmtree(numba_cache_dir, ignore_errors=True)
89
95
  elif sys.argv[1] == "basecompiledir":
90
96
  # Simply print the base_compiledir
91
97
  print(pytensor.config.base_compiledir)
@@ -17,8 +17,8 @@ from pytensor.compile.function.types import (
17
17
  )
18
18
  from pytensor.compile.io import In, Out, SymbolicInput, SymbolicOutput
19
19
  from pytensor.compile.mode import (
20
+ CVM,
20
21
  FAST_COMPILE,
21
- FAST_RUN,
22
22
  JAX,
23
23
  NUMBA,
24
24
  OPT_FAST_COMPILE,
@@ -33,6 +33,7 @@ from pytensor.compile.mode import (
33
33
  PYTORCH,
34
34
  AddDestroyHandler,
35
35
  AddFeatureOptimizer,
36
+ C,
36
37
  Mode,
37
38
  PrintCurrentFunctionGraph,
38
39
  get_default_mode,
@@ -4,6 +4,7 @@ import warnings
4
4
  from collections.abc import Callable, Sequence
5
5
  from copy import copy
6
6
  from functools import partial
7
+ from itertools import chain
7
8
  from typing import Union, cast
8
9
 
9
10
  from pytensor.compile.function import function
@@ -47,11 +48,15 @@ def infer_shape(outs, inputs, input_shapes):
47
48
  assert len(inp_shp) == inp.type.ndim
48
49
 
49
50
  shape_feature = ShapeFeature()
50
- shape_feature.on_attach(FunctionGraph([], []))
51
+ fgraph = FunctionGraph([], [], features=[shape_feature])
52
+ for v in chain.from_iterable(s for s in input_shapes if s is not None):
53
+ # Import input_shape nodes, as for some graphs ShapeFeature assumes these were seen before
54
+ if (node := v.owner) is not None:
55
+ fgraph.import_node(node, import_missing=True)
51
56
 
52
57
  # Initialize shape_of with the input shapes
53
58
  for inp, inp_shp in zip(inputs, input_shapes, strict=True):
54
- shape_feature.set_shape(inp, inp_shp)
59
+ shape_feature.set_shape(inp, inp_shp, override=True)
55
60
 
56
61
  def local_traverse(out):
57
62
  """
@@ -1331,7 +1331,11 @@ default_make_thunk = [get_unbound_function(COp.make_thunk)]
1331
1331
  # the external requirements of the .linker attribute of a mode
1332
1332
  # 1) it's a class instance
1333
1333
  # 2) it a has a .clone() method
1334
+ # 3) it has required_rewrites and incompatible_rewrites class attributes
1334
1335
  class _DummyLinker:
1336
+ required_rewrites = ()
1337
+ incompatible_rewrites = ()
1338
+
1335
1339
  # This is not a real linker anyway
1336
1340
  def clone(self, allow_gc=None):
1337
1341
  return self
@@ -453,7 +453,6 @@ def pfunc(
453
453
  inputs, cloned_outputs = construct_pfunc_ins_and_outs(
454
454
  params,
455
455
  outputs,
456
- mode,
457
456
  updates,
458
457
  givens,
459
458
  no_default_updates,
@@ -479,7 +478,6 @@ def pfunc(
479
478
  def construct_pfunc_ins_and_outs(
480
479
  params,
481
480
  outputs=None,
482
- mode=None,
483
481
  updates=None,
484
482
  givens=None,
485
483
  no_default_updates=False,
@@ -546,26 +544,27 @@ def construct_pfunc_ins_and_outs(
546
544
  "variables in the inputs list."
547
545
  )
548
546
 
549
- # Check that we are not using `givens` to replace input variables, because
550
- # this typically does nothing, contrary to what one may expect.
551
- in_var_set = set(in_variables)
552
- try:
553
- givens_pairs = list(givens.items())
554
- except AttributeError:
555
- givens_pairs = givens
556
- for x, y in givens_pairs:
557
- if x in in_var_set:
558
- raise RuntimeError(
559
- f"You are trying to replace variable '{x}' through the "
560
- "`givens` parameter, but this variable is an input to your "
561
- "function. Replacing inputs is currently forbidden because it "
562
- "has no effect. One way to modify an input `x` to a function "
563
- "evaluating f(x) is to define a new input `y` and use "
564
- "`pytensor.function([y], f(x), givens={x: g(y)})`. Another "
565
- "solution consists in using `pytensor.clone_replace`, e.g. like this: "
566
- "`pytensor.function([x], "
567
- "pytensor.clone_replace(f(x), replace={x: g(x)}))`."
568
- )
547
+ if givens:
548
+ # Check that we are not using `givens` to replace input variables, because
549
+ # this typically does nothing, contrary to what one may expect.
550
+ in_var_set = set(in_variables)
551
+ try:
552
+ givens_pairs = list(givens.items())
553
+ except AttributeError:
554
+ givens_pairs = givens
555
+ for x, y in givens_pairs:
556
+ if x in in_var_set:
557
+ raise RuntimeError(
558
+ f"You are trying to replace variable '{x}' through the "
559
+ "`givens` parameter, but this variable is an input to your "
560
+ "function. Replacing inputs is currently forbidden because it "
561
+ "has no effect. One way to modify an input `x` to a function "
562
+ "evaluating f(x) is to define a new input `y` and use "
563
+ "`pytensor.function([y], f(x), givens={x: g(y)})`. Another "
564
+ "solution consists in using `pytensor.clone_replace`, e.g. like this: "
565
+ "`pytensor.function([x], "
566
+ "pytensor.clone_replace(f(x), replace={x: g(x)}))`."
567
+ )
569
568
 
570
569
  if not fgraph:
571
570
  # Extend the outputs with the updates on input variables so they are
@@ -95,7 +95,7 @@ class SymbolicInput:
95
95
  self.implicit = implicit
96
96
 
97
97
  def __str__(self):
98
- if self.update:
98
+ if self.update is not None:
99
99
  return f"In({self.variable} -> {self.update})"
100
100
  else:
101
101
  return f"In({self.variable})"
@@ -5,7 +5,7 @@ WRITEME
5
5
 
6
6
  import logging
7
7
  import warnings
8
- from typing import Literal
8
+ from typing import Any, Literal
9
9
 
10
10
  from pytensor.compile.function.types import Supervisor
11
11
  from pytensor.configdefaults import config
@@ -62,23 +62,17 @@ def register_linker(name, linker):
62
62
  predefined_linkers[name] = linker
63
63
 
64
64
 
65
- # If a string is passed as the optimizer argument in the constructor
66
- # for Mode, it will be used as the key to retrieve the real optimizer
67
- # in this dictionary
68
- exclude = []
69
- if not config.cxx:
70
- exclude = ["cxx_only"]
71
- OPT_NONE = RewriteDatabaseQuery(include=[], exclude=exclude)
65
+ OPT_NONE = RewriteDatabaseQuery(include=[])
72
66
  # Minimum set of rewrites needed to evaluate a function. This is needed for graphs with "dummy" Operations
73
- OPT_MINIMUM = RewriteDatabaseQuery(include=["minimum_compile"], exclude=exclude)
67
+ OPT_MINIMUM = RewriteDatabaseQuery(include=["minimum_compile"])
74
68
  # Even if multiple merge optimizer call will be there, this shouldn't
75
69
  # impact performance.
76
- OPT_MERGE = RewriteDatabaseQuery(include=["merge"], exclude=exclude)
77
- OPT_FAST_RUN = RewriteDatabaseQuery(include=["fast_run"], exclude=exclude)
70
+ OPT_MERGE = RewriteDatabaseQuery(include=["merge"])
71
+ OPT_FAST_RUN = RewriteDatabaseQuery(include=["fast_run"])
78
72
  OPT_FAST_RUN_STABLE = OPT_FAST_RUN.requiring("stable")
79
73
 
80
- OPT_FAST_COMPILE = RewriteDatabaseQuery(include=["fast_compile"], exclude=exclude)
81
- OPT_STABILIZE = RewriteDatabaseQuery(include=["fast_run"], exclude=exclude)
74
+ OPT_FAST_COMPILE = RewriteDatabaseQuery(include=["fast_compile"])
75
+ OPT_STABILIZE = RewriteDatabaseQuery(include=["fast_run"])
82
76
  OPT_STABILIZE.position_cutoff = 1.5000001
83
77
  OPT_NONE.name = "OPT_NONE"
84
78
  OPT_MINIMUM.name = "OPT_MINIMUM"
@@ -316,6 +310,8 @@ class Mode:
316
310
  ):
317
311
  if linker is None:
318
312
  linker = config.linker
313
+ if isinstance(linker, str) and linker == "auto":
314
+ linker = "cvm" if config.cxx else "vm"
319
315
  if isinstance(optimizer, str) and optimizer == "default":
320
316
  optimizer = config.optimizer
321
317
 
@@ -352,7 +348,14 @@ class Mode:
352
348
  if isinstance(optimizer, str) or optimizer is None:
353
349
  optimizer = predefined_optimizers[optimizer]
354
350
  if isinstance(optimizer, RewriteDatabaseQuery):
351
+ # TODO: From the __init__ signature this should always be the case
352
+ # But some tests and internal logic allow passing a GraphRewriter directly as optimizer
353
+ # Cleanup!
355
354
  self.provided_optimizer = optimizer
355
+ if r := linker.required_rewrites:
356
+ optimizer = optimizer.including(*r)
357
+ if r := linker.incompatible_rewrites:
358
+ optimizer = optimizer.excluding(*r)
356
359
  self._optimizer = optimizer
357
360
  self.call_time = 0
358
361
  self.fn_time = 0
@@ -365,14 +368,13 @@ class Mode:
365
368
  f"optdb={self.optdb})"
366
369
  )
367
370
 
368
- def __get_optimizer(self):
371
+ @property
372
+ def optimizer(self):
369
373
  if isinstance(self._optimizer, RewriteDatabaseQuery):
370
374
  return self.optdb.query(self._optimizer)
371
375
  else:
372
376
  return self._optimizer
373
377
 
374
- optimizer = property(__get_optimizer)
375
-
376
378
  def get_linker_optimizer(self, linker, optimizer):
377
379
  if isinstance(linker, str) or linker is None:
378
380
  linker = predefined_linkers[linker]
@@ -445,92 +447,51 @@ class Mode:
445
447
  return new_mode
446
448
 
447
449
 
448
- # If a string is passed as the mode argument in function or
449
- # FunctionMaker, the Mode will be taken from this dictionary using the
450
- # string as the key
451
- # Use VM_linker to allow lazy evaluation by default.
452
- FAST_COMPILE = Mode(
453
- VMLinker(use_cloop=False, c_thunks=False),
454
- RewriteDatabaseQuery(include=["fast_compile", "py_only"]),
455
- )
456
- if config.cxx:
457
- FAST_RUN = Mode("cvm", "fast_run")
458
- else:
459
- FAST_RUN = Mode(
460
- "vm",
461
- RewriteDatabaseQuery(include=["fast_run", "py_only"]),
462
- )
450
+ C = Mode("c", "fast_run")
451
+ CVM = Mode("cvm", "fast_run")
452
+ VM = (Mode("vm", "fast_run"),)
463
453
 
464
454
  NUMBA = Mode(
465
455
  NumbaLinker(),
466
- RewriteDatabaseQuery(
467
- include=["fast_run", "numba"],
468
- exclude=[
469
- "cxx_only",
470
- "BlasOpt",
471
- "local_careduce_fusion",
472
- "scan_save_mem_prealloc",
473
- ],
474
- ),
456
+ RewriteDatabaseQuery(include=["fast_run", "numba"]),
475
457
  )
476
458
 
477
459
  JAX = Mode(
478
460
  JAXLinker(),
479
- RewriteDatabaseQuery(
480
- include=["fast_run", "jax"],
481
- exclude=[
482
- "cxx_only",
483
- "BlasOpt",
484
- "fusion",
485
- "inplace",
486
- "scan_save_mem_prealloc",
487
- # There are specific variants for the LU decompositions supported by JAX
488
- "reuse_lu_decomposition_multiple_solves",
489
- "scan_split_non_sequence_lu_decomposition_solve",
490
- ],
491
- ),
461
+ RewriteDatabaseQuery(include=["fast_run", "jax"]),
492
462
  )
493
463
  PYTORCH = Mode(
494
464
  PytorchLinker(),
495
- RewriteDatabaseQuery(
496
- include=["fast_run"],
497
- exclude=[
498
- "cxx_only",
499
- "BlasOpt",
500
- "fusion",
501
- "inplace",
502
- "scan_save_mem_prealloc",
503
- "reuse_lu_decomposition_multiple_solves",
504
- "scan_split_non_sequence_lu_decomposition_solve",
505
- ],
506
- ),
465
+ RewriteDatabaseQuery(include=["fast_run"]),
507
466
  )
508
467
 
509
468
  MLX = Mode(
510
469
  MLXLinker(),
511
- RewriteDatabaseQuery(
512
- include=["fast_run"],
513
- exclude=[
514
- "cxx_only",
515
- "BlasOpt",
516
- "fusion",
517
- "inplace",
518
- "scan_save_mem_prealloc",
519
- ],
520
- ),
470
+ RewriteDatabaseQuery(include=["fast_run"]),
471
+ )
472
+
473
+ FAST_COMPILE = Mode(
474
+ VMLinker(use_cloop=False, c_thunks=False),
475
+ RewriteDatabaseQuery(include=["fast_compile", "py_only"]),
521
476
  )
522
477
 
478
+ fast_run_linkers_to_mode = {
479
+ "cvm": CVM,
480
+ "vm": VM,
481
+ "numba": NUMBA,
482
+ }
523
483
 
524
484
  predefined_modes = {
525
485
  "FAST_COMPILE": FAST_COMPILE,
526
- "FAST_RUN": FAST_RUN,
486
+ "C": C,
487
+ "CVM": CVM,
527
488
  "JAX": JAX,
528
489
  "NUMBA": NUMBA,
529
490
  "PYTORCH": PYTORCH,
530
491
  "MLX": MLX,
531
492
  }
532
493
 
533
- _CACHED_RUNTIME_MODES: dict[str, Mode] = {}
494
+ _CACHED_RUNTIME_MODES: dict[Any, Mode] = {}
534
495
 
535
496
 
536
497
  def get_mode(orig_string):
@@ -548,10 +509,20 @@ def get_mode(orig_string):
548
509
  if upper_string in predefined_modes:
549
510
  return predefined_modes[upper_string]
550
511
 
512
+ if upper_string == "FAST_RUN":
513
+ linker = config.linker
514
+ if linker == "auto":
515
+ return CVM if config.cxx else VM
516
+ return fast_run_linkers_to_mode[linker]
517
+
551
518
  global _CACHED_RUNTIME_MODES
552
519
 
553
- if upper_string in _CACHED_RUNTIME_MODES:
554
- return _CACHED_RUNTIME_MODES[upper_string]
520
+ cache_key = ("MODE", config.linker) if upper_string == "MODE" else upper_string
521
+
522
+ try:
523
+ return _CACHED_RUNTIME_MODES[cache_key]
524
+ except KeyError:
525
+ pass
555
526
 
556
527
  # Need to define the mode for the first time
557
528
  if upper_string == "MODE":
@@ -577,7 +548,7 @@ def get_mode(orig_string):
577
548
  if config.optimizer_requiring:
578
549
  ret = ret.requiring(*config.optimizer_requiring.split(":"))
579
550
  # Cache the mode for next time
580
- _CACHED_RUNTIME_MODES[upper_string] = ret
551
+ _CACHED_RUNTIME_MODES[cache_key] = ret
581
552
 
582
553
  return ret
583
554
 
@@ -1464,7 +1464,6 @@ class ProfileStats:
1464
1464
  ps.GE,
1465
1465
  ps.EQ,
1466
1466
  ps.NEQ,
1467
- ps.InRange,
1468
1467
  ps.Switch,
1469
1468
  ps.OR,
1470
1469
  ps.XOR,
@@ -45,8 +45,12 @@ def _filter_mode(val):
45
45
  "NanGuardMode",
46
46
  "FAST_COMPILE",
47
47
  "DEBUG_MODE",
48
+ "CVM",
49
+ "C",
48
50
  "JAX",
49
51
  "NUMBA",
52
+ "PYTORCH",
53
+ "MLX",
50
54
  ]
51
55
  if val in str_options:
52
56
  return val
@@ -367,13 +371,26 @@ def add_compile_configvars():
367
371
  )
368
372
  del param
369
373
 
374
+ default_linker = "auto"
375
+
370
376
  if rc == 0 and config.cxx != "":
371
377
  # Keep the default linker the same as the one for the mode FAST_RUN
372
- linker_options = ["c|py", "py", "c", "c|py_nogc", "vm", "vm_nogc", "cvm_nogc"]
378
+ linker_options = [
379
+ "cvm",
380
+ "c|py",
381
+ "py",
382
+ "c",
383
+ "c|py_nogc",
384
+ "vm",
385
+ "vm_nogc",
386
+ "cvm_nogc",
387
+ "numba",
388
+ "jax",
389
+ ]
373
390
  else:
374
391
  # g++ is not present or the user disabled it,
375
392
  # linker should default to python only.
376
- linker_options = ["py", "vm_nogc"]
393
+ linker_options = ["py", "vm", "vm_nogc", "numba", "jax"]
377
394
  if type(config).cxx.is_default:
378
395
  # If the user provided an empty value for cxx, do not warn.
379
396
  _logger.warning(
@@ -385,9 +402,8 @@ def add_compile_configvars():
385
402
 
386
403
  config.add(
387
404
  "linker",
388
- "Default linker used if the pytensor flags mode is Mode",
389
- # Not mutable because the default mode is cached after the first use.
390
- EnumStr("cvm", linker_options, mutable=False),
405
+ "Default linker used if the pytensor flags mode is Mode or FAST_RUN",
406
+ EnumStr(default_linker, linker_options, mutable=True),
391
407
  in_c_key=False,
392
408
  )
393
409
 
@@ -410,7 +410,9 @@ class ConfigParam:
410
410
  f"The config parameter '{self.name}' was registered on a different instance of the PyTensorConfigParser."
411
411
  f" It is not accessible through the instance with id '{id(cls)}' because of safeguarding."
412
412
  )
413
- if not hasattr(self, "val"):
413
+ try:
414
+ return self.val
415
+ except AttributeError:
414
416
  try:
415
417
  val_str = cls.fetch_val_for_key(self.name, delete_key=delete_key)
416
418
  self.is_default = False
@@ -1784,14 +1784,14 @@ class numeric_grad:
1784
1784
 
1785
1785
  def mode_not_slow(mode):
1786
1786
  from pytensor.compile.debugmode import DebugMode
1787
- from pytensor.compile.mode import FAST_RUN, get_mode
1787
+ from pytensor.compile.mode import get_mode
1788
1788
 
1789
1789
  if mode == "FAST_COMPILE":
1790
- return FAST_RUN
1790
+ return get_mode("FAST_RUN")
1791
1791
  mode = get_mode(mode)
1792
1792
  if isinstance(mode, DebugMode):
1793
1793
  opt = mode.optimizer
1794
- return FAST_RUN.clone(optimizer=opt)
1794
+ return get_mode("FAST_RUN").clone(optimizer=opt)
1795
1795
  else:
1796
1796
  return mode
1797
1797
 
@@ -2188,7 +2188,7 @@ def hessian(cost, wrt, consider_constant=None, disconnected_inputs="raise"):
2188
2188
  # It is possible that the inputs are disconnected from expr,
2189
2189
  # even if they are connected to cost.
2190
2190
  # This should not be an error.
2191
- hess, updates = pytensor.scan(
2191
+ hess = pytensor.scan(
2192
2192
  lambda i, y, x: grad(
2193
2193
  y[i],
2194
2194
  x,
@@ -2197,9 +2197,7 @@ def hessian(cost, wrt, consider_constant=None, disconnected_inputs="raise"):
2197
2197
  ),
2198
2198
  sequences=pytensor.tensor.arange(expr.shape[0]),
2199
2199
  non_sequences=[expr, input],
2200
- )
2201
- assert not updates, (
2202
- "Scan has returned a list of updates; this should not happen."
2200
+ return_updates=False,
2203
2201
  )
2204
2202
  hessians.append(hess)
2205
2203
  return as_list_or_tuple(using_list, using_tuple, hessians)
@@ -1010,7 +1010,7 @@ class FromFunctionNodeRewriter(NodeRewriter):
1010
1010
 
1011
1011
 
1012
1012
  def node_rewriter(
1013
- tracks: Sequence[Op | type, OpPattern] | None,
1013
+ tracks: Sequence[Op | type | OpPattern] | None,
1014
1014
  inplace: bool = False,
1015
1015
  requirements: tuple[type, ...] | None = (),
1016
1016
  ):