pytensor 2.28.2__tar.gz → 2.29.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 (428) hide show
  1. {pytensor-2.28.2/pytensor.egg-info → pytensor-2.29.0}/PKG-INFO +1 -1
  2. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/basic.rst +6 -9
  3. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/_version.py +3 -3
  4. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/function/pfunc.py +1 -7
  5. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/mode.py +15 -7
  6. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/configdefaults.py +3 -1
  7. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/ifelse.py +1 -2
  8. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/scan.py +1 -1
  9. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/shape.py +1 -9
  10. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/slinalg.py +24 -7
  11. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/basic.py +0 -87
  12. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/scan.py +32 -7
  13. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/slinalg.py +18 -14
  14. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/subtensor.py +60 -50
  15. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/tensor_basic.py +0 -10
  16. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/shape.py +1 -9
  17. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/basic.py +5 -5
  18. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/op.py +11 -2
  19. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/rewriting.py +135 -100
  20. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/utils.py +2 -2
  21. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/basic.py +16 -31
  22. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/blas.py +53 -42
  23. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/c_code/dimshuffle.c +7 -2
  24. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/einsum.py +13 -1
  25. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/math.py +152 -128
  26. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/basic.py +8 -1
  27. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/blas.py +2 -2
  28. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/shape.py +0 -77
  29. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/subtensor.py +0 -37
  30. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/shape.py +0 -116
  31. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/slinalg.py +121 -34
  32. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/subtensor.py +45 -17
  33. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/utils.py +0 -8
  34. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/variable.py +1 -1
  35. {pytensor-2.28.2 → pytensor-2.29.0/pytensor.egg-info}/PKG-INFO +1 -1
  36. {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_rop.py +0 -8
  37. {pytensor-2.28.2 → pytensor-2.29.0}/LICENSE.txt +0 -0
  38. {pytensor-2.28.2 → pytensor-2.29.0}/MANIFEST.in +0 -0
  39. {pytensor-2.28.2 → pytensor-2.29.0}/README.rst +0 -0
  40. {pytensor-2.28.2 → pytensor-2.29.0}/doc/.templates/PLACEHOLDER +0 -0
  41. {pytensor-2.28.2 → pytensor-2.29.0}/doc/.templates/layout.html +0 -0
  42. {pytensor-2.28.2 → pytensor-2.29.0}/doc/.templates/nb-badges.html +0 -0
  43. {pytensor-2.28.2 → pytensor-2.29.0}/doc/.templates/rendered_citation.html +0 -0
  44. {pytensor-2.28.2 → pytensor-2.29.0}/doc/LICENSE.txt +0 -0
  45. {pytensor-2.28.2 → pytensor-2.29.0}/doc/README.md +0 -0
  46. {pytensor-2.28.2 → pytensor-2.29.0}/doc/acknowledgement.rst +0 -0
  47. {pytensor-2.28.2 → pytensor-2.29.0}/doc/bcast.png +0 -0
  48. {pytensor-2.28.2 → pytensor-2.29.0}/doc/bcast.svg +0 -0
  49. {pytensor-2.28.2 → pytensor-2.29.0}/doc/blog.md +0 -0
  50. {pytensor-2.28.2 → pytensor-2.29.0}/doc/conf.py +0 -0
  51. {pytensor-2.28.2 → pytensor-2.29.0}/doc/core_development_guide.rst +0 -0
  52. {pytensor-2.28.2 → pytensor-2.29.0}/doc/css.inc +0 -0
  53. {pytensor-2.28.2 → pytensor-2.29.0}/doc/dev_start_guide.rst +0 -0
  54. {pytensor-2.28.2 → pytensor-2.29.0}/doc/environment.yml +0 -0
  55. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/apply.png +0 -0
  56. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/apply.svg +0 -0
  57. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/apply2.svg +0 -0
  58. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/creating_a_c_op.rst +0 -0
  59. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  60. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/creating_an_op.rst +0 -0
  61. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/ctype.rst +0 -0
  62. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/extending_faq.rst +0 -0
  63. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
  64. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/graph_rewriting.rst +0 -0
  65. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/graphstructures.rst +0 -0
  66. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/index.rst +0 -0
  67. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/inplace.rst +0 -0
  68. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/op.rst +0 -0
  69. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/other_ops.rst +0 -0
  70. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  71. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  72. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/pipeline.rst +0 -0
  73. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/scan.rst +0 -0
  74. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/tips.rst +0 -0
  75. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/type.rst +0 -0
  76. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/unittest.rst +0 -0
  77. {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/using_params.rst +0 -0
  78. {pytensor-2.28.2 → pytensor-2.29.0}/doc/faq.rst +0 -0
  79. {pytensor-2.28.2 → pytensor-2.29.0}/doc/gallery/page_footer.md +0 -0
  80. {pytensor-2.28.2 → pytensor-2.29.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  81. {pytensor-2.28.2 → pytensor-2.29.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  82. {pytensor-2.28.2 → pytensor-2.29.0}/doc/generate_dtype_tensor_table.py +0 -0
  83. {pytensor-2.28.2 → pytensor-2.29.0}/doc/glossary.rst +0 -0
  84. {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/Elman_srnn.png +0 -0
  85. {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/PyTensor.png +0 -0
  86. {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/PyTensor_RGB.svg +0 -0
  87. {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/PyTensor_logo.png +0 -0
  88. {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/binder.svg +0 -0
  89. {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/blocksparse.png +0 -0
  90. {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/colab.svg +0 -0
  91. {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/github.svg +0 -0
  92. {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/lstm.png +0 -0
  93. {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/lstm_memorycell.png +0 -0
  94. {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/talk2010.gif +0 -0
  95. {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/talk2010.png +0 -0
  96. {pytensor-2.28.2 → pytensor-2.29.0}/doc/index.rst +0 -0
  97. {pytensor-2.28.2 → pytensor-2.29.0}/doc/install.rst +0 -0
  98. {pytensor-2.28.2 → pytensor-2.29.0}/doc/internal/how_to_release.rst +0 -0
  99. {pytensor-2.28.2 → pytensor-2.29.0}/doc/internal/index.rst +0 -0
  100. {pytensor-2.28.2 → pytensor-2.29.0}/doc/internal/metadocumentation.rst +0 -0
  101. {pytensor-2.28.2 → pytensor-2.29.0}/doc/introduction.rst +0 -0
  102. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/debugmode.rst +0 -0
  103. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/function.rst +0 -0
  104. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/index.rst +0 -0
  105. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/io.rst +0 -0
  106. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/mode.rst +0 -0
  107. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/nanguardmode.rst +0 -0
  108. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/opfromgraph.rst +0 -0
  109. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/ops.rst +0 -0
  110. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/profilemode.rst +0 -0
  111. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/shared.rst +0 -0
  112. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/config.rst +0 -0
  113. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  114. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  115. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  116. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  117. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  118. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  119. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  120. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp.html +0 -0
  121. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp.png +0 -0
  122. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp2.html +0 -0
  123. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  124. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp2.png +0 -0
  125. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/ofg.html +0 -0
  126. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/ofg2.html +0 -0
  127. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/index.ipynb +0 -0
  128. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/index.rst +0 -0
  129. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  130. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  131. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  132. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  133. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/features.rst +0 -0
  134. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/fgraph.rst +0 -0
  135. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/graph.rst +0 -0
  136. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/index.rst +0 -0
  137. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/op.rst +0 -0
  138. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/replace.rst +0 -0
  139. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/type.rst +0 -0
  140. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/utils.rst +0 -0
  141. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/index.rst +0 -0
  142. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/misc/pkl_utils.rst +0 -0
  143. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/printing.rst +0 -0
  144. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/scalar/index.rst +0 -0
  145. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/scan.rst +0 -0
  146. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/sparse/index.rst +0 -0
  147. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/sparse/sandbox.rst +0 -0
  148. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/basic_opt.rst +0 -0
  149. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/bcast.png +0 -0
  150. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/bcast.svg +0 -0
  151. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/conv.rst +0 -0
  152. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/elemwise.rst +0 -0
  153. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/extra_ops.rst +0 -0
  154. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/fft.rst +0 -0
  155. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/functional.rst +0 -0
  156. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/index.rst +0 -0
  157. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/io.rst +0 -0
  158. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/math_opt.rst +0 -0
  159. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/nlinalg.rst +0 -0
  160. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/plot_fft.png +0 -0
  161. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/random/distributions.rst +0 -0
  162. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/random/index.rst +0 -0
  163. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/slinalg.rst +0 -0
  164. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/utils.rst +0 -0
  165. {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/typed_list.rst +0 -0
  166. {pytensor-2.28.2 → pytensor-2.29.0}/doc/links.rst +0 -0
  167. {pytensor-2.28.2 → pytensor-2.29.0}/doc/optimizations.rst +0 -0
  168. {pytensor-2.28.2 → pytensor-2.29.0}/doc/pylintrc +0 -0
  169. {pytensor-2.28.2 → pytensor-2.29.0}/doc/robots.txt +0 -0
  170. {pytensor-2.28.2 → pytensor-2.29.0}/doc/troubleshooting.rst +0 -0
  171. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/adding.rst +0 -0
  172. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/adding_solution_1.py +0 -0
  173. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/aliasing.rst +0 -0
  174. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/apply.png +0 -0
  175. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/apply.svg +0 -0
  176. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/bcast.png +0 -0
  177. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/broadcasting.rst +0 -0
  178. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/conditions.rst +0 -0
  179. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/debug_faq.rst +0 -0
  180. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/dlogistic.png +0 -0
  181. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/examples.rst +0 -0
  182. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/faq_tutorial.rst +0 -0
  183. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/gradients.rst +0 -0
  184. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/index.rst +0 -0
  185. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/loading_and_saving.rst +0 -0
  186. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/logistic.gp +0 -0
  187. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/logistic.png +0 -0
  188. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/loop.rst +0 -0
  189. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/loop_solution_1.py +0 -0
  190. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/modes.rst +0 -0
  191. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/modes_solution_1.py +0 -0
  192. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/multi_cores.rst +0 -0
  193. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/nan_tutorial.rst +0 -0
  194. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/pics/d3viz.png +0 -0
  195. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  196. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  197. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  198. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/printing_drawing.rst +0 -0
  199. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/prng.rst +0 -0
  200. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/profiling.rst +0 -0
  201. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/profiling_example.py +0 -0
  202. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/profiling_example_out.prof +0 -0
  203. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/shape_info.rst +0 -0
  204. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/sparse.rst +0 -0
  205. {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/symbolic_graphs.rst +0 -0
  206. {pytensor-2.28.2 → pytensor-2.29.0}/doc/user_guide.rst +0 -0
  207. {pytensor-2.28.2 → pytensor-2.29.0}/pyproject.toml +0 -0
  208. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/__init__.py +0 -0
  209. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/bin/__init__.py +0 -0
  210. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/bin/pytensor_cache.py +0 -0
  211. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/breakpoint.py +0 -0
  212. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/__init__.py +0 -0
  213. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/builders.py +0 -0
  214. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/compiledir.py +0 -0
  215. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/compilelock.py +0 -0
  216. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/debugmode.py +0 -0
  217. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/function/__init__.py +0 -0
  218. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/function/types.py +0 -0
  219. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/io.py +0 -0
  220. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/monitormode.py +0 -0
  221. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/nanguardmode.py +0 -0
  222. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/ops.py +0 -0
  223. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/profiling.py +0 -0
  224. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/sharedvalue.py +0 -0
  225. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/configparser.py +0 -0
  226. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/__init__.py +0 -0
  227. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  228. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/css/d3viz.css +0 -0
  229. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/d3viz.py +0 -0
  230. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/formatting.py +0 -0
  231. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  232. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  233. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/js/d3viz.js +0 -0
  234. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  235. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  236. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/gradient.py +0 -0
  237. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/__init__.py +0 -0
  238. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/basic.py +0 -0
  239. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/destroyhandler.py +0 -0
  240. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/features.py +0 -0
  241. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/fg.py +0 -0
  242. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/null_type.py +0 -0
  243. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/op.py +0 -0
  244. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/replace.py +0 -0
  245. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/rewriting/__init__.py +0 -0
  246. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/rewriting/basic.py +0 -0
  247. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/rewriting/db.py +0 -0
  248. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/rewriting/kanren.py +0 -0
  249. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/rewriting/unify.py +0 -0
  250. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/rewriting/utils.py +0 -0
  251. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/type.py +0 -0
  252. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/utils.py +0 -0
  253. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/__init__.py +0 -0
  254. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/basic.py +0 -0
  255. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/__init__.py +0 -0
  256. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/basic.py +0 -0
  257. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  258. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  259. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/cmodule.py +0 -0
  260. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/cutils.py +0 -0
  261. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/cvm.py +0 -0
  262. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/exceptions.py +0 -0
  263. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/interface.py +0 -0
  264. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/lazylinker_c.py +0 -0
  265. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/op.py +0 -0
  266. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/params_type.py +0 -0
  267. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/type.py +0 -0
  268. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/__init__.py +0 -0
  269. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/__init__.py +0 -0
  270. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/basic.py +0 -0
  271. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/blas.py +0 -0
  272. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  273. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
  274. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  275. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  276. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/math.py +0 -0
  277. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  278. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/pad.py +0 -0
  279. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/random.py +0 -0
  280. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/scalar.py +0 -0
  281. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/sort.py +0 -0
  282. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
  283. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  284. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  285. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/linker.py +0 -0
  286. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/__init__.py +0 -0
  287. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/_LAPACK.py +0 -0
  288. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/__init__.py +0 -0
  289. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  290. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  291. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/elemwise.py +0 -0
  292. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  293. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
  294. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/random.py +0 -0
  295. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/scalar.py +0 -0
  296. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/sparse.py +0 -0
  297. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  298. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/linker.py +0 -0
  299. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  300. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  301. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  302. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  303. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  304. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  305. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
  306. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
  307. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  308. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  309. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  310. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/linker.py +0 -0
  311. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/utils.py +0 -0
  312. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/vm.py +0 -0
  313. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/__init__.py +0 -0
  314. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/check_blas.py +0 -0
  315. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/check_blas_many.sh +0 -0
  316. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/check_duplicate_key.py +0 -0
  317. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  318. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/elemwise_time_test.py +0 -0
  319. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/frozendict.py +0 -0
  320. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/may_share_memory.py +0 -0
  321. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/ordered_set.py +0 -0
  322. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/pkl_utils.py +0 -0
  323. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/npy_2_compat.py +0 -0
  324. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/printing.py +0 -0
  325. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/py.typed +0 -0
  326. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/raise_op.py +0 -0
  327. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/__init__.py +0 -0
  328. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/basic.py +0 -0
  329. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  330. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  331. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/c_code/gamma.c +0 -0
  332. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/c_code/incbet.c +0 -0
  333. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/loop.py +0 -0
  334. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/math.py +0 -0
  335. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/sharedvar.py +0 -0
  336. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/__init__.py +0 -0
  337. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/checkpoints.py +0 -0
  338. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/scan_perform.pyx +0 -0
  339. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/scan_perform_ext.py +0 -0
  340. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/views.py +0 -0
  341. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/__init__.py +0 -0
  342. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/basic.py +0 -0
  343. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/rewriting.py +0 -0
  344. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/sandbox/__init__.py +0 -0
  345. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/sandbox/sp.py +0 -0
  346. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/sandbox/sp2.py +0 -0
  347. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/sharedvar.py +0 -0
  348. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/type.py +0 -0
  349. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/utils.py +0 -0
  350. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/__init__.py +0 -0
  351. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/blas_c.py +0 -0
  352. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/blas_headers.py +0 -0
  353. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/blas_scipy.py +0 -0
  354. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/blockwise.py +0 -0
  355. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  356. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  357. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/conv/__init__.py +0 -0
  358. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/conv/abstract_conv.py +0 -0
  359. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/elemwise.py +0 -0
  360. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/elemwise_cgen.py +0 -0
  361. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/exceptions.py +0 -0
  362. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/extra_ops.py +0 -0
  363. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/fft.py +0 -0
  364. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/fourier.py +0 -0
  365. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/functional.py +0 -0
  366. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/inplace.py +0 -0
  367. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/interpolate.py +0 -0
  368. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/io.py +0 -0
  369. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/linalg.py +0 -0
  370. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/nlinalg.py +0 -0
  371. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/pad.py +0 -0
  372. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/__init__.py +0 -0
  373. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/op.py +0 -0
  374. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  375. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
  376. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
  377. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
  378. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/type.py +0 -0
  379. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/utils.py +0 -0
  380. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/var.py +0 -0
  381. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/__init__.py +0 -0
  382. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/basic.py +0 -0
  383. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/blas_c.py +0 -0
  384. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
  385. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/blockwise.py +0 -0
  386. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/einsum.py +0 -0
  387. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/elemwise.py +0 -0
  388. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  389. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/jax.py +0 -0
  390. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/linalg.py +0 -0
  391. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/math.py +0 -0
  392. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/numba.py +0 -0
  393. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/ofg.py +0 -0
  394. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/special.py +0 -0
  395. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  396. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/sharedvar.py +0 -0
  397. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/sort.py +0 -0
  398. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/special.py +0 -0
  399. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/type.py +0 -0
  400. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/type_other.py +0 -0
  401. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/var.py +0 -0
  402. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/xlogx.py +0 -0
  403. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/typed_list/__init__.py +0 -0
  404. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/typed_list/basic.py +0 -0
  405. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/typed_list/rewriting.py +0 -0
  406. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/typed_list/type.py +0 -0
  407. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/updates.py +0 -0
  408. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/utils.py +0 -0
  409. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor.egg-info/SOURCES.txt +0 -0
  410. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor.egg-info/dependency_links.txt +0 -0
  411. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor.egg-info/entry_points.txt +0 -0
  412. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor.egg-info/requires.txt +0 -0
  413. {pytensor-2.28.2 → pytensor-2.29.0}/pytensor.egg-info/top_level.txt +0 -0
  414. {pytensor-2.28.2 → pytensor-2.29.0}/scripts/mypy-failing.txt +0 -0
  415. {pytensor-2.28.2 → pytensor-2.29.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  416. {pytensor-2.28.2 → pytensor-2.29.0}/setup.cfg +0 -0
  417. {pytensor-2.28.2 → pytensor-2.29.0}/setup.py +0 -0
  418. {pytensor-2.28.2 → pytensor-2.29.0}/tests/link/c/c_code/test_cenum.h +0 -0
  419. {pytensor-2.28.2 → pytensor-2.29.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  420. {pytensor-2.28.2 → pytensor-2.29.0}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
  421. {pytensor-2.28.2 → pytensor-2.29.0}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
  422. {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_breakpoint.py +0 -0
  423. {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_config.py +0 -0
  424. {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_gradient.py +0 -0
  425. {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_ifelse.py +0 -0
  426. {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_printing.py +0 -0
  427. {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_raise_op.py +0 -0
  428. {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_updates.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pytensor
3
- Version: 2.28.2
3
+ Version: 2.29.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:
@@ -619,9 +619,8 @@ dimensions, see :meth:`_tensor_py_operators.dimshuffle`.
619
619
 
620
620
  .. function:: shape_padleft(x, n_ones=1)
621
621
 
622
- Reshape `x` by left padding the shape with `n_ones` 1s. Note that all
623
- this new dimension will be broadcastable. To make them non-broadcastable
624
- see the :func:`unbroadcast`.
622
+ Reshape `x` by left padding the shape with `n_ones` 1s.
623
+ All new dimensions will be broadcastable.
625
624
 
626
625
  :param x: variable to be reshaped
627
626
  :type x: any `TensorVariable` (or compatible)
@@ -633,9 +632,8 @@ dimensions, see :meth:`_tensor_py_operators.dimshuffle`.
633
632
 
634
633
  .. function:: shape_padright(x, n_ones=1)
635
634
 
636
- Reshape `x` by right padding the shape with `n_ones` ones. Note that all
637
- this new dimension will be broadcastable. To make them non-broadcastable
638
- see the :func:`unbroadcast`.
635
+ Reshape `x` by right padding the shape with `n_ones` ones.
636
+ All new dimensions will be broadcastable.
639
637
 
640
638
  :param x: variable to be reshaped
641
639
  :type x: any TensorVariable (or compatible)
@@ -646,9 +644,8 @@ dimensions, see :meth:`_tensor_py_operators.dimshuffle`.
646
644
 
647
645
  .. function:: shape_padaxis(t, axis)
648
646
 
649
- Reshape `t` by inserting ``1`` at the dimension `axis`. Note that this new
650
- dimension will be broadcastable. To make it non-broadcastable
651
- see the :func:`unbroadcast`.
647
+ Reshape `t` by inserting ``1`` at the dimension `axis`.
648
+ All new dimensions will be broadcastable.
652
649
 
653
650
  :type x: any `TensorVariable` (or compatible)
654
651
  :param x: variable to be reshaped
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-03-03T18:16:56+0100",
11
+ "date": "2025-03-18T14:02:26+0100",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "757a10cd496ac24800f03491891ff6bba2d4807a",
15
- "version": "2.28.2"
14
+ "full-revisionid": "a149f6c996bd0499406150853bef517e7d7a3c4f",
15
+ "version": "2.29.0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -292,14 +292,8 @@ def rebuild_collect_shared(
292
292
  f" shared_var.type={store_into.type},"
293
293
  f" update_val={update_val}, update_val.type={getattr(update_val, 'type', None)})."
294
294
  )
295
- err_sug = (
296
- "If the difference is related to the broadcast pattern,"
297
- " you can call the"
298
- " tensor.shape.unbroadcast(var, axis_to_unbroadcast[, ...])"
299
- " function to mask broadcastable dimensions."
300
- )
301
295
 
302
- raise TypeError(err_msg, err_sug)
296
+ raise TypeError(err_msg)
303
297
  assert store_into.type.is_super(update_val.type)
304
298
 
305
299
  update_d[store_into] = update_val
@@ -454,6 +454,19 @@ else:
454
454
  RewriteDatabaseQuery(include=["fast_run", "py_only"]),
455
455
  )
456
456
 
457
+ NUMBA = Mode(
458
+ NumbaLinker(),
459
+ RewriteDatabaseQuery(
460
+ include=["fast_run", "numba"],
461
+ exclude=[
462
+ "cxx_only",
463
+ "BlasOpt",
464
+ "local_careduce_fusion",
465
+ "scan_save_mem_prealloc",
466
+ ],
467
+ ),
468
+ )
469
+
457
470
  JAX = Mode(
458
471
  JAXLinker(),
459
472
  RewriteDatabaseQuery(
@@ -463,6 +476,7 @@ JAX = Mode(
463
476
  "BlasOpt",
464
477
  "fusion",
465
478
  "inplace",
479
+ "scan_save_mem_prealloc",
466
480
  ],
467
481
  ),
468
482
  )
@@ -476,16 +490,10 @@ PYTORCH = Mode(
476
490
  "fusion",
477
491
  "inplace",
478
492
  "local_uint_constant_indices",
493
+ "scan_save_mem_prealloc",
479
494
  ],
480
495
  ),
481
496
  )
482
- NUMBA = Mode(
483
- NumbaLinker(),
484
- RewriteDatabaseQuery(
485
- include=["fast_run", "numba"],
486
- exclude=["cxx_only", "BlasOpt", "local_careduce_fusion"],
487
- ),
488
- )
489
497
 
490
498
 
491
499
  predefined_modes = {
@@ -1085,7 +1085,9 @@ def add_scan_configvars():
1085
1085
  "scan__allow_output_prealloc",
1086
1086
  "Allow/disallow memory preallocation for outputs inside of scan "
1087
1087
  "(default: True)",
1088
- BoolParam(True),
1088
+ # Non-mutable because ScanSaveMem rewrite checks it,
1089
+ # and we can't have the rewrite and the implementation mismatch
1090
+ BoolParam(True, mutable=False),
1089
1091
  in_c_key=False,
1090
1092
  )
1091
1093
 
@@ -26,7 +26,7 @@ from pytensor.graph.op import _NoPythonOp
26
26
  from pytensor.graph.replace import clone_replace
27
27
  from pytensor.graph.rewriting.basic import GraphRewriter, in2out, node_rewriter
28
28
  from pytensor.graph.type import HasDataType, HasShape
29
- from pytensor.tensor.shape import Reshape, Shape, SpecifyShape, Unbroadcast
29
+ from pytensor.tensor.shape import Reshape, Shape, SpecifyShape
30
30
 
31
31
 
32
32
  if TYPE_CHECKING:
@@ -481,7 +481,6 @@ acceptable_ops = (
481
481
  Shape,
482
482
  SpecifyShape,
483
483
  Reshape,
484
- Unbroadcast,
485
484
  pt.math.Dot,
486
485
  pt.math.Max,
487
486
  pt.math.Argmax,
@@ -29,7 +29,7 @@ def jax_funcify_Scan(op: Scan, **kwargs):
29
29
  # Extract JAX scan inputs
30
30
  outer_inputs = list(outer_inputs)
31
31
  n_steps = outer_inputs[0] # JAX `length`
32
- seqs = op.outer_seqs(outer_inputs) # JAX `xs`
32
+ seqs = [seq[:n_steps] for seq in op.outer_seqs(outer_inputs)] # JAX `xs`
33
33
 
34
34
  mit_sot_init = []
35
35
  for tap, seq in zip(
@@ -4,7 +4,7 @@ from pytensor.graph import Constant
4
4
  from pytensor.graph.basic import Apply
5
5
  from pytensor.graph.op import Op
6
6
  from pytensor.link.jax.dispatch.basic import jax_funcify
7
- from pytensor.tensor.shape import Reshape, Shape, Shape_i, SpecifyShape, Unbroadcast
7
+ from pytensor.tensor.shape import Reshape, Shape, Shape_i, SpecifyShape
8
8
  from pytensor.tensor.type import TensorType
9
9
 
10
10
 
@@ -104,11 +104,3 @@ def jax_funcify_SpecifyShape(op, node, **kwargs):
104
104
  return x
105
105
 
106
106
  return specifyshape
107
-
108
-
109
- @jax_funcify.register(Unbroadcast)
110
- def jax_funcify_Unbroadcast(op, **kwargs):
111
- def unbroadcast(x):
112
- return x
113
-
114
- return unbroadcast
@@ -1,3 +1,5 @@
1
+ import warnings
2
+
1
3
  import jax
2
4
 
3
5
  from pytensor.link.jax.dispatch.basic import jax_funcify
@@ -39,13 +41,29 @@ def jax_funcify_Cholesky(op, **kwargs):
39
41
 
40
42
  @jax_funcify.register(Solve)
41
43
  def jax_funcify_Solve(op, **kwargs):
42
- if op.assume_a != "gen" and op.lower:
43
- lower = True
44
+ assume_a = op.assume_a
45
+ lower = op.lower
46
+
47
+ if assume_a == "tridiagonal":
48
+ # jax.scipy.solve does not yet support tridiagonal matrices
49
+ # But there's a jax.lax.linalg.tridiaonal_solve we can use instead.
50
+ def solve(a, b):
51
+ dl = jax.numpy.diagonal(a, offset=-1, axis1=-2, axis2=-1)
52
+ d = jax.numpy.diagonal(a, offset=0, axis1=-2, axis2=-1)
53
+ du = jax.numpy.diagonal(a, offset=1, axis1=-2, axis2=-1)
54
+ return jax.lax.linalg.tridiagonal_solve(dl, d, du, b, lower=lower)
55
+
44
56
  else:
45
- lower = False
57
+ if assume_a not in ("gen", "sym", "her", "pos"):
58
+ warnings.warn(
59
+ f"JAX solve does not support assume_a={op.assume_a}. Defaulting to assume_a='gen'.\n"
60
+ f"If appropriate, you may want to set assume_a to one of 'sym', 'pos', 'her' or 'tridiagonal' to improve performance.",
61
+ UserWarning,
62
+ )
63
+ assume_a = "gen"
46
64
 
47
- def solve(a, b, lower=lower):
48
- return jax.scipy.linalg.solve(a, b, lower=lower)
65
+ def solve(a, b):
66
+ return jax.scipy.linalg.solve(a, b, lower=lower, assume_a=assume_a)
49
67
 
50
68
  return solve
51
69
 
@@ -53,7 +71,6 @@ def jax_funcify_Solve(op, **kwargs):
53
71
  @jax_funcify.register(SolveTriangular)
54
72
  def jax_funcify_SolveTriangular(op, **kwargs):
55
73
  lower = op.lower
56
- trans = op.trans
57
74
  unit_diagonal = op.unit_diagonal
58
75
  check_finite = op.check_finite
59
76
 
@@ -62,7 +79,7 @@ def jax_funcify_SolveTriangular(op, **kwargs):
62
79
  A,
63
80
  b,
64
81
  lower=lower,
65
- trans=trans,
82
+ trans=0, # this is handled by explicitly transposing A, so it will always be 0 when we get to here.
66
83
  unit_diagonal=unit_diagonal,
67
84
  check_finite=check_finite,
68
85
  )
@@ -243,93 +243,6 @@ def impl_to_scalar(x):
243
243
  raise TypingError(f"{x} must be a scalar compatible type.")
244
244
 
245
245
 
246
- def enable_slice_literals():
247
- """Enable lowering for ``SliceLiteral``s.
248
-
249
- TODO: This can be removed once https://github.com/numba/numba/pull/6996 is merged
250
- and a release is made.
251
- """
252
- from numba.core import types
253
- from numba.core.datamodel.models import SliceModel
254
- from numba.core.datamodel.registry import register_default
255
- from numba.core.imputils import lower_cast, lower_constant
256
- from numba.core.types.misc import SliceLiteral
257
- from numba.cpython.slicing import get_defaults
258
-
259
- register_default(numba.types.misc.SliceLiteral)(SliceModel)
260
-
261
- @property
262
- def key(self):
263
- return self.name
264
-
265
- SliceLiteral.key = key
266
-
267
- def make_slice_from_constant(context, builder, ty, pyval):
268
- sli = context.make_helper(builder, ty)
269
- lty = context.get_value_type(types.intp)
270
-
271
- (
272
- default_start_pos,
273
- default_start_neg,
274
- default_stop_pos,
275
- default_stop_neg,
276
- default_step,
277
- ) = (context.get_constant(types.intp, x) for x in get_defaults(context))
278
-
279
- step = pyval.step
280
- if step is None:
281
- step_is_neg = False
282
- step = default_step
283
- else:
284
- step_is_neg = step < 0
285
- step = lty(step)
286
-
287
- start = pyval.start
288
- if start is None:
289
- if step_is_neg:
290
- start = default_start_neg
291
- else:
292
- start = default_start_pos
293
- else:
294
- start = lty(start)
295
-
296
- stop = pyval.stop
297
- if stop is None:
298
- if step_is_neg:
299
- stop = default_stop_neg
300
- else:
301
- stop = default_stop_pos
302
- else:
303
- stop = lty(stop)
304
-
305
- sli.start = start
306
- sli.stop = stop
307
- sli.step = step
308
-
309
- return sli._getvalue()
310
-
311
- @lower_constant(numba.types.SliceType)
312
- def constant_slice(context, builder, ty, pyval):
313
- if isinstance(ty, types.Literal):
314
- typ = ty.literal_type
315
- else:
316
- typ = ty
317
-
318
- return make_slice_from_constant(context, builder, typ, pyval)
319
-
320
- @lower_cast(numba.types.misc.SliceLiteral, numba.types.SliceType)
321
- def cast_from_literal(context, builder, fromty, toty, val):
322
- return make_slice_from_constant(
323
- context,
324
- builder,
325
- toty,
326
- fromty.literal_value,
327
- )
328
-
329
-
330
- enable_slice_literals()
331
-
332
-
333
246
  def create_tuple_creator(f, n):
334
247
  """Construct a compile-time ``tuple``-comprehension-like loop.
335
248
 
@@ -55,7 +55,7 @@ def array0d_range(x):
55
55
 
56
56
 
57
57
  @numba_funcify.register(Scan)
58
- def numba_funcify_Scan(op, node, **kwargs):
58
+ def numba_funcify_Scan(op: Scan, node, **kwargs):
59
59
  # Apply inner rewrites
60
60
  # TODO: Not sure this is the right place to do this, should we have a rewrite that
61
61
  # explicitly triggers the optimization of the inner graphs of Scan?
@@ -67,9 +67,32 @@ def numba_funcify_Scan(op, node, **kwargs):
67
67
  .optimizer
68
68
  )
69
69
  fgraph = op.fgraph
70
+ # When the buffer can only hold one SITSOT or as as many MITSOT as there are taps,
71
+ # We must always discard the oldest tap, so it's safe to destroy it in the inner function.
72
+ # TODO: Allow inplace for MITMOT
73
+ destroyable_sitsot = [
74
+ inner_sitsot
75
+ for outer_sitsot, inner_sitsot in zip(
76
+ op.outer_sitsot(node.inputs), op.inner_sitsot(fgraph.inputs), strict=True
77
+ )
78
+ if outer_sitsot.type.shape[0] == 1
79
+ ]
80
+ destroyable_mitsot = [
81
+ oldest_inner_mitmot
82
+ for outer_mitsot, oldest_inner_mitmot, taps in zip(
83
+ op.outer_mitsot(node.inputs),
84
+ op.oldest_inner_mitsot(fgraph.inputs),
85
+ op.info.mit_sot_in_slices,
86
+ strict=True,
87
+ )
88
+ if outer_mitsot.type.shape[0] == abs(min(taps))
89
+ ]
90
+ destroyable = {*destroyable_sitsot, *destroyable_mitsot}
70
91
  add_supervisor_to_fgraph(
71
92
  fgraph=fgraph,
72
- input_specs=[In(x, borrow=True, mutable=False) for x in fgraph.inputs],
93
+ input_specs=[
94
+ In(x, borrow=True, mutable=x in destroyable) for x in fgraph.inputs
95
+ ],
73
96
  accept_inplace=True,
74
97
  )
75
98
  rewriter(fgraph)
@@ -222,14 +245,16 @@ def numba_funcify_Scan(op, node, **kwargs):
222
245
  # the storage array.
223
246
  # This is needed when the output storage array does not have a length
224
247
  # equal to the number of taps plus `n_steps`.
248
+ # If the storage size only allows one entry, there's nothing to rotate
225
249
  output_storage_post_proc_stmts.append(
226
250
  dedent(
227
251
  f"""
228
- if (i + {tap_size}) > {storage_size}:
252
+ if 1 < {storage_size} < (i + {tap_size}):
229
253
  {outer_in_name}_shift = (i + {tap_size}) % ({storage_size})
230
- {outer_in_name}_left = {outer_in_name}[:{outer_in_name}_shift]
231
- {outer_in_name}_right = {outer_in_name}[{outer_in_name}_shift:]
232
- {outer_in_name} = np.concatenate(({outer_in_name}_right, {outer_in_name}_left))
254
+ if {outer_in_name}_shift > 0:
255
+ {outer_in_name}_left = {outer_in_name}[:{outer_in_name}_shift]
256
+ {outer_in_name}_right = {outer_in_name}[{outer_in_name}_shift:]
257
+ {outer_in_name} = np.concatenate(({outer_in_name}_right, {outer_in_name}_left))
233
258
  """
234
259
  ).strip()
235
260
  )
@@ -417,4 +442,4 @@ def scan({", ".join(outer_in_names)}):
417
442
 
418
443
  scan_op_fn = compile_function_src(scan_op_src, "scan", {**globals(), **global_env})
419
444
 
420
- return numba_basic.numba_njit(scan_op_fn)
445
+ return numba_basic.numba_njit(scan_op_fn, boundscheck=False)
@@ -1,3 +1,4 @@
1
+ import warnings
1
2
  from collections.abc import Callable
2
3
 
3
4
  import numba
@@ -180,7 +181,6 @@ def solve_triangular_impl(A, B, trans, lower, unit_diagonal, b_ndim, overwrite_b
180
181
 
181
182
  @numba_funcify.register(SolveTriangular)
182
183
  def numba_funcify_SolveTriangular(op, node, **kwargs):
183
- trans = bool(op.trans)
184
184
  lower = op.lower
185
185
  unit_diagonal = op.unit_diagonal
186
186
  check_finite = op.check_finite
@@ -208,7 +208,7 @@ def numba_funcify_SolveTriangular(op, node, **kwargs):
208
208
  res = _solve_triangular(
209
209
  a,
210
210
  b,
211
- trans=trans,
211
+ trans=0, # transposing is handled explicitly on the graph, so we never use this argument
212
212
  lower=lower,
213
213
  unit_diagonal=unit_diagonal,
214
214
  overwrite_b=overwrite_b,
@@ -654,7 +654,7 @@ def solve_gen_impl(
654
654
 
655
655
  def _sysv(
656
656
  A: np.ndarray, B: np.ndarray, lower: bool, overwrite_a: bool, overwrite_b: bool
657
- ) -> tuple[np.ndarray, np.ndarray, int]:
657
+ ) -> tuple[np.ndarray, np.ndarray, np.ndarray, int]:
658
658
  """
659
659
  Placeholder for solving a linear system with a symmetric matrix; used by linalg.solve.
660
660
  """
@@ -665,7 +665,8 @@ def _sysv(
665
665
  def sysv_impl(
666
666
  A: np.ndarray, B: np.ndarray, lower: bool, overwrite_a: bool, overwrite_b: bool
667
667
  ) -> Callable[
668
- [np.ndarray, np.ndarray, bool, bool, bool], tuple[np.ndarray, np.ndarray, int]
668
+ [np.ndarray, np.ndarray, bool, bool, bool],
669
+ tuple[np.ndarray, np.ndarray, np.ndarray, int],
669
670
  ]:
670
671
  ensure_lapack()
671
672
  _check_scipy_linalg_matrix(A, "sysv")
@@ -741,8 +742,8 @@ def sysv_impl(
741
742
  )
742
743
 
743
744
  if B_is_1d:
744
- return B_copy[..., 0], IPIV, int_ptr_to_val(INFO)
745
- return B_copy, IPIV, int_ptr_to_val(INFO)
745
+ B_copy = B_copy[..., 0]
746
+ return A_copy, B_copy, IPIV, int_ptr_to_val(INFO)
746
747
 
747
748
  return impl
748
749
 
@@ -771,7 +772,7 @@ def sycon_impl(
771
772
 
772
773
  N = val_to_int_ptr(_N)
773
774
  LDA = val_to_int_ptr(_N)
774
- UPLO = val_to_int_ptr(ord("L"))
775
+ UPLO = val_to_int_ptr(ord("U"))
775
776
  ANORM = np.array(anorm, dtype=dtype)
776
777
  RCOND = np.empty(1, dtype=dtype)
777
778
  WORK = np.empty(2 * _N, dtype=dtype)
@@ -844,10 +845,10 @@ def solve_symmetric_impl(
844
845
  ) -> np.ndarray:
845
846
  _solve_check_input_shapes(A, B)
846
847
 
847
- x, ipiv, info = _sysv(A, B, lower, overwrite_a, overwrite_b)
848
+ lu, x, ipiv, info = _sysv(A, B, lower, overwrite_a, overwrite_b)
848
849
  _solve_check(A.shape[-1], info)
849
850
 
850
- rcond, info = _sycon(A, ipiv, _xlange(A, order="I"))
851
+ rcond, info = _sycon(lu, ipiv, _xlange(A, order="I"))
851
852
  _solve_check(A.shape[-1], info, True, rcond)
852
853
 
853
854
  return x
@@ -1071,14 +1072,17 @@ def numba_funcify_Solve(op, node, **kwargs):
1071
1072
  elif assume_a == "sym":
1072
1073
  solve_fn = _solve_symmetric
1073
1074
  elif assume_a == "her":
1074
- raise NotImplementedError(
1075
- 'Use assume_a = "sym" for symmetric real matrices. If you need compelx support, '
1076
- "please open an issue on github."
1077
- )
1075
+ # We already ruled out complex inputs
1076
+ solve_fn = _solve_symmetric
1078
1077
  elif assume_a == "pos":
1079
1078
  solve_fn = _solve_psd
1080
1079
  else:
1081
- raise NotImplementedError(f"Assumption {assume_a} not supported in Numba mode")
1080
+ warnings.warn(
1081
+ f"Numba assume_a={assume_a} not implemented. Falling back to general solve.\n"
1082
+ f"If appropriate, you may want to set assume_a to one of 'sym', 'pos', or 'her' to improve performance.",
1083
+ UserWarning,
1084
+ )
1085
+ solve_fn = _solve_gen
1082
1086
 
1083
1087
  @numba_basic.numba_njit(inline="always")
1084
1088
  def solve(a, b):
@@ -130,15 +130,6 @@ def numba_funcify_AdvancedSubtensor(op, node, **kwargs):
130
130
  if isinstance(idx.type, TensorType)
131
131
  ]
132
132
 
133
- def broadcasted_to(x_bcast: tuple[bool, ...], to_bcast: tuple[bool, ...]):
134
- # Check that x is not broadcasted to y based on broadcastable info
135
- if len(x_bcast) < len(to_bcast):
136
- return True
137
- for x_bcast_dim, to_bcast_dim in zip(x_bcast, to_bcast, strict=True):
138
- if x_bcast_dim and not to_bcast_dim:
139
- return True
140
- return False
141
-
142
133
  # Special implementation for consecutive integer vector indices
143
134
  if (
144
135
  not basic_idxs
@@ -151,17 +142,6 @@ def numba_funcify_AdvancedSubtensor(op, node, **kwargs):
151
142
  )
152
143
  # Must be consecutive
153
144
  and not op.non_consecutive_adv_indexing(node)
154
- # y in set/inc_subtensor cannot be broadcasted
155
- and (
156
- y is None
157
- or not broadcasted_to(
158
- y.type.broadcastable,
159
- (
160
- x.type.broadcastable[: adv_idxs[0]["axis"]]
161
- + x.type.broadcastable[adv_idxs[-1]["axis"] :]
162
- ),
163
- )
164
- )
165
145
  ):
166
146
  return numba_funcify_multiple_integer_vector_indexing(op, node, **kwargs)
167
147
 
@@ -191,14 +171,24 @@ def numba_funcify_AdvancedSubtensor(op, node, **kwargs):
191
171
  return numba_funcify_default_subtensor(op, node, **kwargs)
192
172
 
193
173
 
174
+ def _broadcasted_to(x_bcast: tuple[bool, ...], to_bcast: tuple[bool, ...]):
175
+ # Check that x is not broadcasted to y based on broadcastable info
176
+ if len(x_bcast) < len(to_bcast):
177
+ return True
178
+ for x_bcast_dim, to_bcast_dim in zip(x_bcast, to_bcast, strict=True):
179
+ if x_bcast_dim and not to_bcast_dim:
180
+ return True
181
+ return False
182
+
183
+
194
184
  def numba_funcify_multiple_integer_vector_indexing(
195
185
  op: AdvancedSubtensor | AdvancedIncSubtensor, node, **kwargs
196
186
  ):
197
187
  # Special-case implementation for multiple consecutive vector integer indices (and set/incsubtensor)
198
188
  if isinstance(op, AdvancedSubtensor):
199
- y, idxs = None, node.inputs[1:]
189
+ idxs = node.inputs[1:]
200
190
  else:
201
- y, *idxs = node.inputs[1:]
191
+ idxs = node.inputs[2:]
202
192
 
203
193
  first_axis = next(
204
194
  i for i, idx in enumerate(idxs) if isinstance(idx.type, TensorType)
@@ -211,6 +201,10 @@ def numba_funcify_multiple_integer_vector_indexing(
211
201
  )
212
202
  except StopIteration:
213
203
  after_last_axis = len(idxs)
204
+ last_axis = after_last_axis - 1
205
+
206
+ vector_indices = idxs[first_axis:after_last_axis]
207
+ assert all(v.type.broadcastable == (False,) for v in vector_indices)
214
208
 
215
209
  if isinstance(op, AdvancedSubtensor):
216
210
 
@@ -231,43 +225,59 @@ def numba_funcify_multiple_integer_vector_indexing(
231
225
 
232
226
  return advanced_subtensor_multiple_vector
233
227
 
234
- elif op.set_instead_of_inc:
228
+ else:
235
229
  inplace = op.inplace
236
230
 
237
- @numba_njit
238
- def advanced_set_subtensor_multiple_vector(x, y, *idxs):
239
- vec_idxs = idxs[first_axis:after_last_axis]
240
- x_shape = x.shape
231
+ # Check if y must be broadcasted
232
+ # Includes the last integer vector index,
233
+ x, y = node.inputs[:2]
234
+ indexed_bcast_dims = (
235
+ *x.type.broadcastable[:first_axis],
236
+ *x.type.broadcastable[last_axis:],
237
+ )
238
+ y_is_broadcasted = _broadcasted_to(y.type.broadcastable, indexed_bcast_dims)
241
239
 
242
- if inplace:
243
- out = x
244
- else:
245
- out = x.copy()
240
+ if op.set_instead_of_inc:
246
241
 
247
- for outer in np.ndindex(x_shape[:first_axis]):
248
- for i, scalar_idxs in enumerate(zip(*vec_idxs)): # noqa: B905
249
- out[(*outer, *scalar_idxs)] = y[(*outer, i)]
250
- return out
242
+ @numba_njit
243
+ def advanced_set_subtensor_multiple_vector(x, y, *idxs):
244
+ vec_idxs = idxs[first_axis:after_last_axis]
245
+ x_shape = x.shape
251
246
 
252
- return advanced_set_subtensor_multiple_vector
247
+ if inplace:
248
+ out = x
249
+ else:
250
+ out = x.copy()
253
251
 
254
- else:
255
- inplace = op.inplace
252
+ if y_is_broadcasted:
253
+ y = np.broadcast_to(y, x_shape[:first_axis] + x_shape[last_axis:])
256
254
 
257
- @numba_njit
258
- def advanced_inc_subtensor_multiple_vector(x, y, *idxs):
259
- vec_idxs = idxs[first_axis:after_last_axis]
260
- x_shape = x.shape
255
+ for outer in np.ndindex(x_shape[:first_axis]):
256
+ for i, scalar_idxs in enumerate(zip(*vec_idxs)): # noqa: B905
257
+ out[(*outer, *scalar_idxs)] = y[(*outer, i)]
258
+ return out
259
+
260
+ return advanced_set_subtensor_multiple_vector
261
+
262
+ else:
263
+
264
+ @numba_njit
265
+ def advanced_inc_subtensor_multiple_vector(x, y, *idxs):
266
+ vec_idxs = idxs[first_axis:after_last_axis]
267
+ x_shape = x.shape
268
+
269
+ if inplace:
270
+ out = x
271
+ else:
272
+ out = x.copy()
261
273
 
262
- if inplace:
263
- out = x
264
- else:
265
- out = x.copy()
274
+ if y_is_broadcasted:
275
+ y = np.broadcast_to(y, x_shape[:first_axis] + x_shape[last_axis:])
266
276
 
267
- for outer in np.ndindex(x_shape[:first_axis]):
268
- for i, scalar_idxs in enumerate(zip(*vec_idxs)): # noqa: B905
269
- out[(*outer, *scalar_idxs)] += y[(*outer, i)]
270
- return out
277
+ for outer in np.ndindex(x_shape[:first_axis]):
278
+ for i, scalar_idxs in enumerate(zip(*vec_idxs)): # noqa: B905
279
+ out[(*outer, *scalar_idxs)] += y[(*outer, i)]
280
+ return out
271
281
 
272
282
  return advanced_inc_subtensor_multiple_vector
273
283