pytensor 2.27.1__tar.gz → 2.28.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 (430) hide show
  1. {pytensor-2.27.1/pytensor.egg-info → pytensor-2.28.0}/PKG-INFO +4 -3
  2. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/op.rst +0 -1
  3. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/basic.rst +0 -2
  4. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/gradients.rst +16 -5
  5. {pytensor-2.27.1 → pytensor-2.28.0}/pyproject.toml +12 -4
  6. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/_version.py +3 -3
  7. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/breakpoint.py +8 -8
  8. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/builders.py +12 -1
  9. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/compiledir.py +23 -23
  10. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/debugmode.py +4 -4
  11. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/function/pfunc.py +2 -2
  12. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/function/types.py +7 -3
  13. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/mode.py +1 -1
  14. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/monitormode.py +3 -3
  15. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/nanguardmode.py +2 -2
  16. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/profiling.py +2 -2
  17. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/gradient.py +160 -43
  18. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/features.py +11 -11
  19. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/fg.py +1 -1
  20. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/rewriting/basic.py +10 -20
  21. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/utils.py +2 -2
  22. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/c/basic.py +7 -12
  23. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/c/c_code/lazylinker_c.c +19 -34
  24. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +1 -7
  25. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/c/interface.py +3 -3
  26. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/c/lazylinker_c.py +1 -1
  27. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/c/op.py +1 -1
  28. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/random.py +15 -2
  29. pytensor-2.28.0/pytensor/link/numba/dispatch/_LAPACK.py +392 -0
  30. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/basic.py +1 -1
  31. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/elemwise.py +1 -1
  32. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/random.py +50 -6
  33. pytensor-2.28.0/pytensor/link/numba/dispatch/slinalg.py +1187 -0
  34. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/pytorch/dispatch/basic.py +37 -7
  35. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/pytorch/dispatch/scalar.py +6 -0
  36. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/pytorch/dispatch/shape.py +16 -3
  37. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/pytorch/dispatch/subtensor.py +15 -0
  38. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/pytorch/linker.py +3 -0
  39. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/vm.py +1 -1
  40. pytensor-2.28.0/pytensor/npy_2_compat.py +308 -0
  41. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/printing.py +3 -4
  42. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scalar/basic.py +222 -98
  43. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scalar/loop.py +2 -2
  44. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scalar/math.py +34 -172
  45. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scan/basic.py +1 -1
  46. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scan/op.py +51 -36
  47. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/sparse/basic.py +10 -10
  48. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/sparse/rewriting.py +47 -47
  49. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/__init__.py +1 -1
  50. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/basic.py +140 -94
  51. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/blas.py +7 -7
  52. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/blas_headers.py +2 -2
  53. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/blockwise.py +7 -0
  54. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/conv/abstract_conv.py +4 -3
  55. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/einsum.py +6 -5
  56. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/elemwise.py +17 -16
  57. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/extra_ops.py +160 -84
  58. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/inplace.py +0 -5
  59. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/math.py +81 -50
  60. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/nlinalg.py +5 -7
  61. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/random/basic.py +42 -52
  62. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/random/op.py +2 -2
  63. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/random/type.py +2 -2
  64. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/blas.py +7 -5
  65. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/elemwise.py +4 -4
  66. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/math.py +13 -13
  67. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/shape.py +246 -171
  68. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/special.py +1 -1
  69. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/subtensor.py +1 -1
  70. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/shape.py +17 -5
  71. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/slinalg.py +25 -23
  72. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/special.py +43 -23
  73. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/subtensor.py +10 -7
  74. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/type.py +16 -13
  75. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/utils.py +3 -3
  76. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/variable.py +35 -34
  77. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/xlogx.py +2 -10
  78. {pytensor-2.27.1 → pytensor-2.28.0/pytensor.egg-info}/PKG-INFO +4 -3
  79. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor.egg-info/SOURCES.txt +2 -1
  80. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor.egg-info/requires.txt +1 -1
  81. {pytensor-2.27.1 → pytensor-2.28.0}/tests/test_config.py +1 -1
  82. {pytensor-2.27.1 → pytensor-2.28.0}/tests/test_gradient.py +15 -13
  83. {pytensor-2.27.1 → pytensor-2.28.0}/tests/test_printing.py +3 -3
  84. {pytensor-2.27.1 → pytensor-2.28.0}/tests/test_rop.py +134 -50
  85. pytensor-2.27.1/doc/library/gradient.rst +0 -76
  86. pytensor-2.27.1/pytensor/link/numba/dispatch/slinalg.py +0 -431
  87. {pytensor-2.27.1 → pytensor-2.28.0}/LICENSE.txt +0 -0
  88. {pytensor-2.27.1 → pytensor-2.28.0}/MANIFEST.in +0 -0
  89. {pytensor-2.27.1 → pytensor-2.28.0}/README.rst +0 -0
  90. {pytensor-2.27.1 → pytensor-2.28.0}/doc/.templates/PLACEHOLDER +0 -0
  91. {pytensor-2.27.1 → pytensor-2.28.0}/doc/.templates/layout.html +0 -0
  92. {pytensor-2.27.1 → pytensor-2.28.0}/doc/.templates/nb-badges.html +0 -0
  93. {pytensor-2.27.1 → pytensor-2.28.0}/doc/.templates/rendered_citation.html +0 -0
  94. {pytensor-2.27.1 → pytensor-2.28.0}/doc/LICENSE.txt +0 -0
  95. {pytensor-2.27.1 → pytensor-2.28.0}/doc/README.md +0 -0
  96. {pytensor-2.27.1 → pytensor-2.28.0}/doc/acknowledgement.rst +0 -0
  97. {pytensor-2.27.1 → pytensor-2.28.0}/doc/bcast.png +0 -0
  98. {pytensor-2.27.1 → pytensor-2.28.0}/doc/bcast.svg +0 -0
  99. {pytensor-2.27.1 → pytensor-2.28.0}/doc/blog.md +0 -0
  100. {pytensor-2.27.1 → pytensor-2.28.0}/doc/conf.py +0 -0
  101. {pytensor-2.27.1 → pytensor-2.28.0}/doc/core_development_guide.rst +0 -0
  102. {pytensor-2.27.1 → pytensor-2.28.0}/doc/css.inc +0 -0
  103. {pytensor-2.27.1 → pytensor-2.28.0}/doc/dev_start_guide.rst +0 -0
  104. {pytensor-2.27.1 → pytensor-2.28.0}/doc/environment.yml +0 -0
  105. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/apply.png +0 -0
  106. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/apply.svg +0 -0
  107. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/apply2.svg +0 -0
  108. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/creating_a_c_op.rst +0 -0
  109. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  110. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/creating_an_op.rst +0 -0
  111. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/ctype.rst +0 -0
  112. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/extending_faq.rst +0 -0
  113. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
  114. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/graph_rewriting.rst +0 -0
  115. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/graphstructures.rst +0 -0
  116. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/index.rst +0 -0
  117. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/inplace.rst +0 -0
  118. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/other_ops.rst +0 -0
  119. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  120. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  121. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/pipeline.rst +0 -0
  122. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/scan.rst +0 -0
  123. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/tips.rst +0 -0
  124. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/type.rst +0 -0
  125. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/unittest.rst +0 -0
  126. {pytensor-2.27.1 → pytensor-2.28.0}/doc/extending/using_params.rst +0 -0
  127. {pytensor-2.27.1 → pytensor-2.28.0}/doc/faq.rst +0 -0
  128. {pytensor-2.27.1 → pytensor-2.28.0}/doc/gallery/page_footer.md +0 -0
  129. {pytensor-2.27.1 → pytensor-2.28.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  130. {pytensor-2.27.1 → pytensor-2.28.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  131. {pytensor-2.27.1 → pytensor-2.28.0}/doc/generate_dtype_tensor_table.py +0 -0
  132. {pytensor-2.27.1 → pytensor-2.28.0}/doc/glossary.rst +0 -0
  133. {pytensor-2.27.1 → pytensor-2.28.0}/doc/images/Elman_srnn.png +0 -0
  134. {pytensor-2.27.1 → pytensor-2.28.0}/doc/images/PyTensor.png +0 -0
  135. {pytensor-2.27.1 → pytensor-2.28.0}/doc/images/PyTensor_RGB.svg +0 -0
  136. {pytensor-2.27.1 → pytensor-2.28.0}/doc/images/PyTensor_logo.png +0 -0
  137. {pytensor-2.27.1 → pytensor-2.28.0}/doc/images/binder.svg +0 -0
  138. {pytensor-2.27.1 → pytensor-2.28.0}/doc/images/blocksparse.png +0 -0
  139. {pytensor-2.27.1 → pytensor-2.28.0}/doc/images/colab.svg +0 -0
  140. {pytensor-2.27.1 → pytensor-2.28.0}/doc/images/github.svg +0 -0
  141. {pytensor-2.27.1 → pytensor-2.28.0}/doc/images/lstm.png +0 -0
  142. {pytensor-2.27.1 → pytensor-2.28.0}/doc/images/lstm_memorycell.png +0 -0
  143. {pytensor-2.27.1 → pytensor-2.28.0}/doc/images/talk2010.gif +0 -0
  144. {pytensor-2.27.1 → pytensor-2.28.0}/doc/images/talk2010.png +0 -0
  145. {pytensor-2.27.1 → pytensor-2.28.0}/doc/index.rst +0 -0
  146. {pytensor-2.27.1 → pytensor-2.28.0}/doc/install.rst +0 -0
  147. {pytensor-2.27.1 → pytensor-2.28.0}/doc/internal/how_to_release.rst +0 -0
  148. {pytensor-2.27.1 → pytensor-2.28.0}/doc/internal/index.rst +0 -0
  149. {pytensor-2.27.1 → pytensor-2.28.0}/doc/internal/metadocumentation.rst +0 -0
  150. {pytensor-2.27.1 → pytensor-2.28.0}/doc/introduction.rst +0 -0
  151. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/compile/debugmode.rst +0 -0
  152. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/compile/function.rst +0 -0
  153. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/compile/index.rst +0 -0
  154. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/compile/io.rst +0 -0
  155. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/compile/mode.rst +0 -0
  156. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/compile/nanguardmode.rst +0 -0
  157. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/compile/opfromgraph.rst +0 -0
  158. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/compile/ops.rst +0 -0
  159. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/compile/profilemode.rst +0 -0
  160. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/compile/shared.rst +0 -0
  161. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/config.rst +0 -0
  162. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  163. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  164. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  165. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  166. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  167. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  168. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  169. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/mlp.html +0 -0
  170. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/mlp.png +0 -0
  171. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/mlp2.html +0 -0
  172. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  173. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/mlp2.png +0 -0
  174. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/ofg.html +0 -0
  175. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/examples/ofg2.html +0 -0
  176. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/index.ipynb +0 -0
  177. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/index.rst +0 -0
  178. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  179. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  180. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  181. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  182. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/graph/features.rst +0 -0
  183. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/graph/fgraph.rst +0 -0
  184. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/graph/graph.rst +0 -0
  185. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/graph/index.rst +0 -0
  186. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/graph/op.rst +0 -0
  187. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/graph/replace.rst +0 -0
  188. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/graph/type.rst +0 -0
  189. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/graph/utils.rst +0 -0
  190. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/index.rst +0 -0
  191. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/misc/pkl_utils.rst +0 -0
  192. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/printing.rst +0 -0
  193. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/scalar/index.rst +0 -0
  194. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/scan.rst +0 -0
  195. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/sparse/index.rst +0 -0
  196. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/sparse/sandbox.rst +0 -0
  197. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/basic_opt.rst +0 -0
  198. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/bcast.png +0 -0
  199. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/bcast.svg +0 -0
  200. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/conv.rst +0 -0
  201. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/elemwise.rst +0 -0
  202. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/extra_ops.rst +0 -0
  203. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/fft.rst +0 -0
  204. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/functional.rst +0 -0
  205. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/index.rst +0 -0
  206. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/io.rst +0 -0
  207. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/math_opt.rst +0 -0
  208. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/nlinalg.rst +0 -0
  209. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/plot_fft.png +0 -0
  210. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/random/distributions.rst +0 -0
  211. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/random/index.rst +0 -0
  212. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/slinalg.rst +0 -0
  213. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/tensor/utils.rst +0 -0
  214. {pytensor-2.27.1 → pytensor-2.28.0}/doc/library/typed_list.rst +0 -0
  215. {pytensor-2.27.1 → pytensor-2.28.0}/doc/links.rst +0 -0
  216. {pytensor-2.27.1 → pytensor-2.28.0}/doc/optimizations.rst +0 -0
  217. {pytensor-2.27.1 → pytensor-2.28.0}/doc/pylintrc +0 -0
  218. {pytensor-2.27.1 → pytensor-2.28.0}/doc/robots.txt +0 -0
  219. {pytensor-2.27.1 → pytensor-2.28.0}/doc/troubleshooting.rst +0 -0
  220. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/adding.rst +0 -0
  221. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/adding_solution_1.py +0 -0
  222. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/aliasing.rst +0 -0
  223. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/apply.png +0 -0
  224. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/apply.svg +0 -0
  225. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/bcast.png +0 -0
  226. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/broadcasting.rst +0 -0
  227. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/conditions.rst +0 -0
  228. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/debug_faq.rst +0 -0
  229. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/dlogistic.png +0 -0
  230. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/examples.rst +0 -0
  231. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/faq_tutorial.rst +0 -0
  232. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/index.rst +0 -0
  233. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/loading_and_saving.rst +0 -0
  234. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/logistic.gp +0 -0
  235. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/logistic.png +0 -0
  236. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/loop.rst +0 -0
  237. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/loop_solution_1.py +0 -0
  238. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/modes.rst +0 -0
  239. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/modes_solution_1.py +0 -0
  240. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/multi_cores.rst +0 -0
  241. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/nan_tutorial.rst +0 -0
  242. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/pics/d3viz.png +0 -0
  243. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  244. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  245. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  246. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/printing_drawing.rst +0 -0
  247. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/prng.rst +0 -0
  248. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/profiling.rst +0 -0
  249. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/profiling_example.py +0 -0
  250. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/profiling_example_out.prof +0 -0
  251. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/shape_info.rst +0 -0
  252. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/sparse.rst +0 -0
  253. {pytensor-2.27.1 → pytensor-2.28.0}/doc/tutorial/symbolic_graphs.rst +0 -0
  254. {pytensor-2.27.1 → pytensor-2.28.0}/doc/user_guide.rst +0 -0
  255. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/__init__.py +0 -0
  256. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/bin/__init__.py +0 -0
  257. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/bin/pytensor_cache.py +0 -0
  258. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/__init__.py +0 -0
  259. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/compilelock.py +0 -0
  260. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/function/__init__.py +0 -0
  261. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/io.py +0 -0
  262. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/ops.py +0 -0
  263. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/compile/sharedvalue.py +0 -0
  264. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/configdefaults.py +0 -0
  265. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/configparser.py +0 -0
  266. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/d3viz/__init__.py +0 -0
  267. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  268. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/d3viz/css/d3viz.css +0 -0
  269. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/d3viz/d3viz.py +0 -0
  270. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/d3viz/formatting.py +0 -0
  271. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  272. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  273. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/d3viz/js/d3viz.js +0 -0
  274. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  275. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  276. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/__init__.py +0 -0
  277. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/basic.py +0 -0
  278. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/destroyhandler.py +0 -0
  279. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/null_type.py +0 -0
  280. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/op.py +0 -0
  281. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/replace.py +0 -0
  282. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/rewriting/__init__.py +0 -0
  283. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/rewriting/db.py +0 -0
  284. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/rewriting/kanren.py +0 -0
  285. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/rewriting/unify.py +0 -0
  286. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/rewriting/utils.py +0 -0
  287. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/graph/type.py +0 -0
  288. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/ifelse.py +0 -0
  289. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/__init__.py +0 -0
  290. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/basic.py +0 -0
  291. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/c/__init__.py +0 -0
  292. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/c/cmodule.py +0 -0
  293. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/c/cutils.py +0 -0
  294. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/c/cvm.py +0 -0
  295. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/c/exceptions.py +0 -0
  296. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/c/params_type.py +0 -0
  297. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/c/type.py +0 -0
  298. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/__init__.py +0 -0
  299. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/__init__.py +0 -0
  300. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/basic.py +0 -0
  301. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/blas.py +0 -0
  302. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  303. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
  304. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  305. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  306. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/math.py +0 -0
  307. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  308. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/pad.py +0 -0
  309. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/scalar.py +0 -0
  310. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/scan.py +0 -0
  311. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/shape.py +0 -0
  312. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/slinalg.py +0 -0
  313. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/sort.py +0 -0
  314. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
  315. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  316. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  317. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/jax/linker.py +0 -0
  318. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/__init__.py +0 -0
  319. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/__init__.py +0 -0
  320. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  321. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  322. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  323. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
  324. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/scalar.py +0 -0
  325. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/scan.py +0 -0
  326. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/sparse.py +0 -0
  327. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  328. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  329. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  330. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/numba/linker.py +0 -0
  331. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  332. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  333. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  334. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  335. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  336. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
  337. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
  338. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  339. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/link/utils.py +0 -0
  340. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/misc/__init__.py +0 -0
  341. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/misc/check_blas.py +0 -0
  342. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/misc/check_blas_many.sh +0 -0
  343. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/misc/check_duplicate_key.py +0 -0
  344. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  345. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/misc/elemwise_time_test.py +0 -0
  346. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/misc/frozendict.py +0 -0
  347. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/misc/may_share_memory.py +0 -0
  348. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/misc/ordered_set.py +0 -0
  349. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/misc/pkl_utils.py +0 -0
  350. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/py.typed +0 -0
  351. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/raise_op.py +0 -0
  352. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scalar/__init__.py +0 -0
  353. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  354. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  355. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scalar/c_code/gamma.c +0 -0
  356. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scalar/c_code/incbet.c +0 -0
  357. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scalar/sharedvar.py +0 -0
  358. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scan/__init__.py +0 -0
  359. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scan/checkpoints.py +0 -0
  360. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scan/rewriting.py +0 -0
  361. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scan/scan_perform.pyx +0 -0
  362. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scan/scan_perform_ext.py +0 -0
  363. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scan/utils.py +0 -0
  364. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/scan/views.py +0 -0
  365. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/sparse/__init__.py +0 -0
  366. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/sparse/sandbox/__init__.py +0 -0
  367. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/sparse/sandbox/sp.py +0 -0
  368. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/sparse/sandbox/sp2.py +0 -0
  369. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/sparse/sharedvar.py +0 -0
  370. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/sparse/type.py +0 -0
  371. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/sparse/utils.py +0 -0
  372. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/blas_c.py +0 -0
  373. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/blas_scipy.py +0 -0
  374. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  375. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  376. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  377. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/conv/__init__.py +0 -0
  378. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/elemwise_cgen.py +0 -0
  379. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/exceptions.py +0 -0
  380. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/fft.py +0 -0
  381. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/fourier.py +0 -0
  382. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/functional.py +0 -0
  383. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/interpolate.py +0 -0
  384. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/io.py +0 -0
  385. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/linalg.py +0 -0
  386. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/pad.py +0 -0
  387. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/random/__init__.py +0 -0
  388. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  389. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
  390. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
  391. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
  392. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/random/utils.py +0 -0
  393. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/random/var.py +0 -0
  394. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/__init__.py +0 -0
  395. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/basic.py +0 -0
  396. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/blas_c.py +0 -0
  397. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
  398. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/blockwise.py +0 -0
  399. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/einsum.py +0 -0
  400. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  401. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/jax.py +0 -0
  402. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/linalg.py +0 -0
  403. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/numba.py +0 -0
  404. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/ofg.py +0 -0
  405. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  406. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/sharedvar.py +0 -0
  407. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/sort.py +0 -0
  408. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/type_other.py +0 -0
  409. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/tensor/var.py +0 -0
  410. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/typed_list/__init__.py +0 -0
  411. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/typed_list/basic.py +0 -0
  412. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/typed_list/rewriting.py +0 -0
  413. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/typed_list/type.py +0 -0
  414. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/updates.py +0 -0
  415. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor/utils.py +0 -0
  416. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor.egg-info/dependency_links.txt +0 -0
  417. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor.egg-info/entry_points.txt +0 -0
  418. {pytensor-2.27.1 → pytensor-2.28.0}/pytensor.egg-info/top_level.txt +0 -0
  419. {pytensor-2.27.1 → pytensor-2.28.0}/scripts/mypy-failing.txt +0 -0
  420. {pytensor-2.27.1 → pytensor-2.28.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  421. {pytensor-2.27.1 → pytensor-2.28.0}/setup.cfg +0 -0
  422. {pytensor-2.27.1 → pytensor-2.28.0}/setup.py +0 -0
  423. {pytensor-2.27.1 → pytensor-2.28.0}/tests/link/c/c_code/test_cenum.h +0 -0
  424. {pytensor-2.27.1 → pytensor-2.28.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  425. {pytensor-2.27.1 → pytensor-2.28.0}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
  426. {pytensor-2.27.1 → pytensor-2.28.0}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
  427. {pytensor-2.27.1 → pytensor-2.28.0}/tests/test_breakpoint.py +0 -0
  428. {pytensor-2.27.1 → pytensor-2.28.0}/tests/test_ifelse.py +0 -0
  429. {pytensor-2.27.1 → pytensor-2.28.0}/tests/test_raise_op.py +0 -0
  430. {pytensor-2.27.1 → pytensor-2.28.0}/tests/test_updates.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pytensor
3
- Version: 2.27.1
3
+ Version: 2.28.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: .. _license:
@@ -69,12 +69,13 @@ Classifier: Programming Language :: Python :: 3
69
69
  Classifier: Programming Language :: Python :: 3.10
70
70
  Classifier: Programming Language :: Python :: 3.11
71
71
  Classifier: Programming Language :: Python :: 3.12
72
- Requires-Python: <3.13,>=3.10
72
+ Classifier: Programming Language :: Python :: 3.13
73
+ Requires-Python: <3.14,>=3.10
73
74
  Description-Content-Type: text/x-rst
74
75
  License-File: LICENSE.txt
75
76
  Requires-Dist: setuptools>=59.0.0
76
77
  Requires-Dist: scipy<2,>=1
77
- Requires-Dist: numpy<2,>=1.17.0
78
+ Requires-Dist: numpy>=1.17.0
78
79
  Requires-Dist: filelock>=3.15
79
80
  Requires-Dist: etuples
80
81
  Requires-Dist: logical-unification
@@ -506,4 +506,3 @@ These are the function required to work with :func:`pytensor.gradient.grad`.
506
506
  the outputs) back to their corresponding shapes and return them as the
507
507
  output of the :meth:`Op.R_op` method.
508
508
 
509
- :ref:`List of op with r op support <R_op_list>`.
@@ -1791,5 +1791,3 @@ Gradient / Differentiation
1791
1791
  :members: grad
1792
1792
  :noindex:
1793
1793
 
1794
- See the :ref:`gradient <libdoc_gradient>` page for complete documentation
1795
- of the gradient module.
@@ -86,9 +86,7 @@ of symbolic differentiation).
86
86
  ``i`` of the output list is the gradient of the first argument of
87
87
  `pt.grad` with respect to the ``i``-th element of the list given as second argument.
88
88
  The first argument of `pt.grad` has to be a scalar (a tensor
89
- of size 1). For more information on the semantics of the arguments of
90
- `pt.grad` and details about the implementation, see
91
- :ref:`this<libdoc_gradient>` section of the library.
89
+ of size 1).
92
90
 
93
91
  Additional information on the inner workings of differentiation may also be
94
92
  found in the more advanced tutorial :ref:`Extending PyTensor<extending>`.
@@ -204,7 +202,21 @@ you need to do something similar to this:
204
202
  >>> f([[1, 1], [1, 1]], [[2, 2], [2, 2]], [0,1])
205
203
  array([ 2., 2.])
206
204
 
207
- :ref:`List <R_op_list>` of Op that implement Rop.
205
+ By default, the R-operator is implemented as a double application of the L_operator
206
+ (see `reference <https://j-towns.github.io/2017/06/12/A-new-trick.html>`_).
207
+ In most cases this should be as performant as a specialized implementation of the R-operator.
208
+ However, PyTensor may sometimes fail to prune dead branches or fuse common expressions within composite operators,
209
+ such as Scan and OpFromGraph, that would be more easily avoidable in a direct implentation of the R-operator.
210
+
211
+ When this is a concern, it is possible to force `Rop` to use the specialized `Op.R_op` methods by passing
212
+ `use_op_rop_implementation=True`. Note that this will fail if the graph contains `Op`s that don't implement this method.
213
+
214
+
215
+ >>> JV = pytensor.gradient.Rop(y, W, V, use_op_rop_implementation=True)
216
+ >>> f = pytensor.function([W, V, x], JV)
217
+ >>> f([[1, 1], [1, 1]], [[2, 2], [2, 2]], [0,1])
218
+ array([ 2., 2.])
219
+
208
220
 
209
221
  L-operator
210
222
  ----------
@@ -234,7 +246,6 @@ array([[ 0., 0.],
234
246
  as the input parameter, while the result of the R-operator has a shape similar
235
247
  to that of the output.
236
248
 
237
- :ref:`List of op with r op support <R_op_list>`.
238
249
 
239
250
  Hessian times a Vector
240
251
  ======================
@@ -10,7 +10,7 @@ build-backend = "setuptools.build_meta"
10
10
  [project]
11
11
  name = "pytensor"
12
12
  dynamic = ['version']
13
- requires-python = ">=3.10,<3.13"
13
+ requires-python = ">=3.10,<3.14"
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.10",
34
34
  "Programming Language :: Python :: 3.11",
35
35
  "Programming Language :: Python :: 3.12",
36
+ "Programming Language :: Python :: 3.13",
36
37
  ]
37
38
 
38
39
  keywords = [
@@ -48,7 +49,7 @@ keywords = [
48
49
  dependencies = [
49
50
  "setuptools>=59.0.0",
50
51
  "scipy>=1,<2",
51
- "numpy>=1.17.0,<2",
52
+ "numpy>=1.17.0",
52
53
  "filelock>=3.15",
53
54
  "etuples",
54
55
  "logical-unification",
@@ -129,7 +130,7 @@ exclude = ["doc/", "pytensor/_version.py"]
129
130
  docstring-code-format = true
130
131
 
131
132
  [tool.ruff.lint]
132
- select = ["B905", "C", "E", "F", "I", "UP", "W", "RUF", "PERF", "PTH", "ISC"]
133
+ select = ["B905", "C", "E", "F", "I", "UP", "W", "RUF", "PERF", "PTH", "ISC", "T20", "NPY201"]
133
134
  ignore = ["C408", "C901", "E501", "E741", "RUF012", "PERF203", "ISC001"]
134
135
  unfixable = [
135
136
  # zip-strict: the auto-fix adds `strict=False` but we might want `strict=True` instead
@@ -144,7 +145,12 @@ lines-after-imports = 2
144
145
  # TODO: Get rid of these:
145
146
  "**/__init__.py" = ["F401", "E402", "F403"]
146
147
  "pytensor/tensor/linalg.py" = ["F403"]
147
- "pytensor/link/c/cmodule.py" = ["PTH"]
148
+ "pytensor/link/c/cmodule.py" = ["PTH", "T201"]
149
+ "pytensor/misc/elemwise_time_test.py" = ["T201"]
150
+ "pytensor/misc/elemwise_openmp_speedup.py" = ["T201"]
151
+ "pytensor/misc/check_duplicate_key.py" = ["T201"]
152
+ "pytensor/misc/check_blas.py" = ["T201"]
153
+ "pytensor/bin/pytensor_cache.py" = ["T201"]
148
154
  # For the tests we skip because `pytest.importorskip` is used:
149
155
  "tests/link/jax/test_scalar.py" = ["E402"]
150
156
  "tests/link/jax/test_tensor_basic.py" = ["E402"]
@@ -158,6 +164,8 @@ lines-after-imports = 2
158
164
  "tests/sparse/test_sp2.py" = ["E402"]
159
165
  "tests/sparse/test_utils.py" = ["E402"]
160
166
  "tests/sparse/sandbox/test_sp.py" = ["E402", "F401"]
167
+ "tests/compile/test_monitormode.py" = ["T201"]
168
+ "scripts/run_mypy.py" = ["T201"]
161
169
 
162
170
 
163
171
  [tool.mypy]
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-02-03T19:06:21+0100",
11
+ "date": "2025-02-20T16:27:45+0100",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "c22e79e1bbf54deb7043a3a778b6e91295d25e07",
15
- "version": "2.27.1"
14
+ "full-revisionid": "5d4e9e0749aa0d33a9db26080a35fdd579aef23d",
15
+ "version": "2.28.0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -108,14 +108,14 @@ class PdbBreakpoint(Op):
108
108
  f"'{self.name}' could not be casted to NumPy arrays"
109
109
  )
110
110
 
111
- print("\n")
112
- print("-------------------------------------------------")
113
- print(f"Conditional breakpoint '{self.name}' activated\n")
114
- print("The monitored variables are stored, in order,")
115
- print("in the list variable 'monitored' as NumPy arrays.\n")
116
- print("Their contents can be altered and, when execution")
117
- print("resumes, the updated values will be used.")
118
- print("-------------------------------------------------")
111
+ print("\n") # noqa: T201
112
+ print("-------------------------------------------------") # noqa: T201
113
+ print(f"Conditional breakpoint '{self.name}' activated\n") # noqa: T201
114
+ print("The monitored variables are stored, in order,") # noqa: T201
115
+ print("in the list variable 'monitored' as NumPy arrays.\n") # noqa: T201
116
+ print("Their contents can be altered and, when execution") # noqa: T201
117
+ print("resumes, the updated values will be used.") # noqa: T201
118
+ print("-------------------------------------------------") # noqa: T201
119
119
 
120
120
  try:
121
121
  import pudb
@@ -340,6 +340,12 @@ class OpFromGraph(Op, HasInnerGraph):
340
340
  ``None``, this will be used as the connection_pattern for this
341
341
  :class:`Op`.
342
342
 
343
+ .. warning::
344
+
345
+ rop overrides is ignored when `pytensor.gradient.Rop` is called with
346
+ `use_op_rop_implementation=False` (default). In this case the Lop
347
+ is used twice to obtain a mathematically equivalent Rop.
348
+
343
349
  strict: bool, default False
344
350
  If true, it raises when any variables needed to compute the inner graph
345
351
  are not provided as explici inputs. This can only happen for graphs with
@@ -641,7 +647,12 @@ class OpFromGraph(Op, HasInnerGraph):
641
647
  return rop_overrides
642
648
 
643
649
  eval_points = [inp_t() for inp_t in self.input_types]
644
- fn_rop = partial(Rop, wrt=inner_inputs, eval_points=eval_points)
650
+ fn_rop = partial(
651
+ Rop,
652
+ wrt=inner_inputs,
653
+ eval_points=eval_points,
654
+ use_op_rop_implementation=True,
655
+ )
645
656
 
646
657
  callable_args = (inner_inputs, eval_points)
647
658
  if rop_overrides is None:
@@ -95,10 +95,10 @@ def cleanup():
95
95
  def print_title(title, overline="", underline=""):
96
96
  len_title = len(title)
97
97
  if overline:
98
- print(str(overline) * len_title)
99
- print(title)
98
+ print(str(overline) * len_title) # noqa: T201
99
+ print(title) # noqa: T201
100
100
  if underline:
101
- print(str(underline) * len_title)
101
+ print(str(underline) * len_title) # noqa: T201
102
102
 
103
103
 
104
104
  def print_compiledir_content():
@@ -159,7 +159,7 @@ def print_compiledir_content():
159
159
  _logger.error(f"Could not read key file '{filename}'.")
160
160
 
161
161
  print_title(f"PyTensor cache: {compiledir}", overline="=", underline="=")
162
- print()
162
+ print() # noqa: T201
163
163
 
164
164
  print_title(f"List of {len(table)} compiled individual ops", underline="+")
165
165
  print_title(
@@ -168,9 +168,9 @@ def print_compiledir_content():
168
168
  )
169
169
  table = sorted(table, key=lambda t: str(t[1]))
170
170
  for dir, op, types, compile_time in table:
171
- print(dir, f"{compile_time:.3f}s", op, types)
171
+ print(dir, f"{compile_time:.3f}s", op, types) # noqa: T201
172
172
 
173
- print()
173
+ print() # noqa: T201
174
174
  print_title(
175
175
  f"List of {len(table_multiple_ops)} compiled sets of ops", underline="+"
176
176
  )
@@ -180,9 +180,9 @@ def print_compiledir_content():
180
180
  )
181
181
  table_multiple_ops = sorted(table_multiple_ops, key=lambda t: (t[1], t[2]))
182
182
  for dir, ops_to_str, types_to_str, compile_time in table_multiple_ops:
183
- print(dir, f"{compile_time:.3f}s", ops_to_str, types_to_str)
183
+ print(dir, f"{compile_time:.3f}s", ops_to_str, types_to_str) # noqa: T201
184
184
 
185
- print()
185
+ print() # noqa: T201
186
186
  print_title(
187
187
  (
188
188
  f"List of {len(table_op_class)} compiled Op classes and "
@@ -191,33 +191,33 @@ def print_compiledir_content():
191
191
  underline="+",
192
192
  )
193
193
  for op_class, nb in reversed(table_op_class.most_common()):
194
- print(op_class, nb)
194
+ print(op_class, nb) # noqa: T201
195
195
 
196
196
  if big_key_files:
197
197
  big_key_files = sorted(big_key_files, key=lambda t: str(t[1]))
198
198
  big_total_size = sum(sz for _, sz, _ in big_key_files)
199
- print(
199
+ print( # noqa: T201
200
200
  f"There are directories with key files bigger than {int(max_key_file_size)} bytes "
201
201
  "(they probably contain big tensor constants)"
202
202
  )
203
- print(
203
+ print( # noqa: T201
204
204
  f"They use {int(big_total_size)} bytes out of {int(total_key_sizes)} (total size "
205
205
  "used by all key files)"
206
206
  )
207
207
 
208
208
  for dir, size, ops in big_key_files:
209
- print(dir, size, ops)
209
+ print(dir, size, ops) # noqa: T201
210
210
 
211
211
  nb_keys = sorted(nb_keys.items())
212
- print()
212
+ print() # noqa: T201
213
213
  print_title("Number of keys for a compiled module", underline="+")
214
214
  print_title(
215
215
  "number of keys/number of modules with that number of keys", underline="-"
216
216
  )
217
217
  for n_k, n_m in nb_keys:
218
- print(n_k, n_m)
219
- print()
220
- print(
218
+ print(n_k, n_m) # noqa: T201
219
+ print() # noqa: T201
220
+ print( # noqa: T201
221
221
  f"Skipped {int(zeros_op)} files that contained 0 op "
222
222
  "(are they always pytensor.scalar ops?)"
223
223
  )
@@ -242,18 +242,18 @@ def basecompiledir_ls():
242
242
  subdirs = sorted(subdirs)
243
243
  others = sorted(others)
244
244
 
245
- print(f"Base compile dir is {config.base_compiledir}")
246
- print("Sub-directories (possible compile caches):")
245
+ print(f"Base compile dir is {config.base_compiledir}") # noqa: T201
246
+ print("Sub-directories (possible compile caches):") # noqa: T201
247
247
  for d in subdirs:
248
- print(f" {d}")
248
+ print(f" {d}") # noqa: T201
249
249
  if not subdirs:
250
- print(" (None)")
250
+ print(" (None)") # noqa: T201
251
251
 
252
252
  if others:
253
- print()
254
- print("Other files in base_compiledir:")
253
+ print() # noqa: T201
254
+ print("Other files in base_compiledir:") # noqa: T201
255
255
  for f in others:
256
- print(f" {f}")
256
+ print(f" {f}") # noqa: T201
257
257
 
258
258
 
259
259
  def basecompiledir_purge():
@@ -1315,9 +1315,9 @@ class _VariableEquivalenceTracker:
1315
1315
 
1316
1316
  def printstuff(self):
1317
1317
  for key in self.equiv:
1318
- print(key)
1318
+ print(key) # noqa: T201
1319
1319
  for e in self.equiv[key]:
1320
- print(" ", e)
1320
+ print(" ", e) # noqa: T201
1321
1321
 
1322
1322
 
1323
1323
  # List of default version of make thunk.
@@ -1569,7 +1569,7 @@ class _Linker(LocalLinker):
1569
1569
  #####
1570
1570
  for r, s in storage_map.items():
1571
1571
  if s[0] is not None:
1572
- print(r, s)
1572
+ print(r, s) # noqa: T201
1573
1573
  assert s[0] is None
1574
1574
 
1575
1575
  # try:
@@ -2079,7 +2079,7 @@ class _Maker(FunctionMaker): # inheritance buys a few helper functions
2079
2079
  raise StochasticOrder(infolog.getvalue())
2080
2080
  else:
2081
2081
  if self.verbose:
2082
- print(
2082
+ print( # noqa: T201
2083
2083
  "OPTCHECK: optimization",
2084
2084
  i,
2085
2085
  "of",
@@ -569,7 +569,7 @@ def construct_pfunc_ins_and_outs(
569
569
  if not fgraph:
570
570
  # Extend the outputs with the updates on input variables so they are
571
571
  # also cloned
572
- additional_outputs = [i.update for i in inputs if i.update]
572
+ additional_outputs = [i.update for i in inputs if i.update is not None]
573
573
  if outputs is None:
574
574
  out_list = []
575
575
  else:
@@ -608,7 +608,7 @@ def construct_pfunc_ins_and_outs(
608
608
  new_i.variable = iv
609
609
 
610
610
  # If needed, replace the input's update by its cloned equivalent
611
- if i.update:
611
+ if i.update is not None:
612
612
  new_i.update = clone_d[i.update]
613
613
 
614
614
  new_inputs.append(new_i)
@@ -198,7 +198,7 @@ def std_fgraph(
198
198
  update_mapping = {}
199
199
  out_idx = len(output_specs)
200
200
  for idx, input_spec in enumerate(input_specs):
201
- if input_spec.update:
201
+ if input_spec.update is not None:
202
202
  updates.append(input_spec.update)
203
203
  update_mapping[out_idx] = idx
204
204
  out_idx += 1
@@ -1195,7 +1195,7 @@ def insert_deepcopy(fgraph, wrapped_inputs, wrapped_outputs):
1195
1195
  updated_fgraph_inputs = {
1196
1196
  fgraph_i
1197
1197
  for i, fgraph_i in zip(wrapped_inputs, fgraph.inputs, strict=True)
1198
- if getattr(i, "update", False)
1198
+ if getattr(i, "update", None) is not None
1199
1199
  }
1200
1200
 
1201
1201
  # We can't use fgraph.inputs as this don't include Constant Value.
@@ -1351,7 +1351,11 @@ class FunctionMaker:
1351
1351
  ancestors(
1352
1352
  (
1353
1353
  [o.variable for o in outputs]
1354
- + [i.update for i in inputs if getattr(i, "update", False)]
1354
+ + [
1355
+ i.update
1356
+ for i in inputs
1357
+ if getattr(i, "update", None) is not None
1358
+ ]
1355
1359
  ),
1356
1360
  blockers=[i.variable for i in inputs],
1357
1361
  )
@@ -178,7 +178,7 @@ class PrintCurrentFunctionGraph(GraphRewriter):
178
178
  def apply(self, fgraph):
179
179
  import pytensor.printing
180
180
 
181
- print("PrintCurrentFunctionGraph:", self.header)
181
+ print("PrintCurrentFunctionGraph:", self.header) # noqa: T201
182
182
  pytensor.printing.debugprint(fgraph.outputs)
183
183
 
184
184
 
@@ -108,8 +108,8 @@ def detect_nan(fgraph, i, node, fn):
108
108
  not isinstance(output[0], np.random.RandomState | np.random.Generator)
109
109
  and np.isnan(output[0]).any()
110
110
  ):
111
- print("*** NaN detected ***")
111
+ print("*** NaN detected ***") # noqa: T201
112
112
  debugprint(node)
113
- print(f"Inputs : {[input[0] for input in fn.inputs]}")
114
- print(f"Outputs: {[output[0] for output in fn.outputs]}")
113
+ print(f"Inputs : {[input[0] for input in fn.inputs]}") # noqa: T201
114
+ print(f"Outputs: {[output[0] for output in fn.outputs]}") # noqa: T201
115
115
  break
@@ -36,7 +36,7 @@ def _is_numeric_value(arr, var):
36
36
  return False
37
37
  elif isinstance(arr, np.random.mtrand.RandomState | np.random.Generator):
38
38
  return False
39
- elif var and isinstance(var.type, RandomType):
39
+ elif var is not None and isinstance(var.type, RandomType):
40
40
  return False
41
41
  elif isinstance(arr, slice):
42
42
  return False
@@ -236,7 +236,7 @@ class NanGuardMode(Mode):
236
236
  if config.NanGuardMode__action == "raise":
237
237
  raise AssertionError(msg)
238
238
  elif config.NanGuardMode__action == "pdb":
239
- print(msg)
239
+ print(msg) # noqa: T201
240
240
  import pdb
241
241
 
242
242
  pdb.set_trace()
@@ -82,7 +82,7 @@ def _atexit_print_fn():
82
82
  to_sum.append(ps)
83
83
  else:
84
84
  # TODO print the name if there is one!
85
- print("Skipping empty Profile")
85
+ print("Skipping empty Profile") # noqa: T201
86
86
  if len(to_sum) > 1:
87
87
  # Make a global profile
88
88
  cum = copy.copy(to_sum[0])
@@ -125,7 +125,7 @@ def _atexit_print_fn():
125
125
  assert len(merge) == len(cum.rewriter_profile[1])
126
126
  cum.rewriter_profile = (cum.rewriter_profile[0], merge)
127
127
  except Exception as e:
128
- print(e)
128
+ print(e) # noqa: T201
129
129
  cum.rewriter_profile = None
130
130
  else:
131
131
  cum.rewriter_profile = None