pytensor 3.0.4__tar.gz → 3.0.5__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 (597) hide show
  1. {pytensor-3.0.4/pytensor.egg-info → pytensor-3.0.5}/PKG-INFO +1 -1
  2. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/_version.py +3 -3
  3. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/diagonal.py +7 -2
  4. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/permutation.py +12 -7
  5. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/selection.py +12 -6
  6. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/debug/profiling.py +2 -1
  7. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/basic.py +19 -24
  8. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/fg.py +7 -2
  9. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/elemwise.py +1 -1
  10. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/sparse/math.py +5 -3
  11. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/vectorize_codegen.py +23 -25
  12. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/math.py +48 -0
  13. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/summary.py +11 -0
  14. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/math.py +61 -1
  15. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/subtensor.py +19 -15
  16. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/subtensor_lift.py +20 -17
  17. {pytensor-3.0.4 → pytensor-3.0.5/pytensor.egg-info}/PKG-INFO +1 -1
  18. {pytensor-3.0.4 → pytensor-3.0.5}/LICENSE.txt +0 -0
  19. {pytensor-3.0.4 → pytensor-3.0.5}/MANIFEST.in +0 -0
  20. {pytensor-3.0.4 → pytensor-3.0.5}/README.rst +0 -0
  21. {pytensor-3.0.4 → pytensor-3.0.5}/doc/.templates/PLACEHOLDER +0 -0
  22. {pytensor-3.0.4 → pytensor-3.0.5}/doc/.templates/layout.html +0 -0
  23. {pytensor-3.0.4 → pytensor-3.0.5}/doc/.templates/nb-badges.html +0 -0
  24. {pytensor-3.0.4 → pytensor-3.0.5}/doc/.templates/rendered_citation.html +0 -0
  25. {pytensor-3.0.4 → pytensor-3.0.5}/doc/LICENSE.txt +0 -0
  26. {pytensor-3.0.4 → pytensor-3.0.5}/doc/README.md +0 -0
  27. {pytensor-3.0.4 → pytensor-3.0.5}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  28. {pytensor-3.0.4 → pytensor-3.0.5}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  29. {pytensor-3.0.4 → pytensor-3.0.5}/doc/acknowledgement.rst +0 -0
  30. {pytensor-3.0.4 → pytensor-3.0.5}/doc/bcast.png +0 -0
  31. {pytensor-3.0.4 → pytensor-3.0.5}/doc/bcast.svg +0 -0
  32. {pytensor-3.0.4 → pytensor-3.0.5}/doc/blog.md +0 -0
  33. {pytensor-3.0.4 → pytensor-3.0.5}/doc/conf.py +0 -0
  34. {pytensor-3.0.4 → pytensor-3.0.5}/doc/core_development_guide.rst +0 -0
  35. {pytensor-3.0.4 → pytensor-3.0.5}/doc/css.inc +0 -0
  36. {pytensor-3.0.4 → pytensor-3.0.5}/doc/dev_start_guide.rst +0 -0
  37. {pytensor-3.0.4 → pytensor-3.0.5}/doc/environment.yml +0 -0
  38. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/apply.png +0 -0
  39. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/apply.svg +0 -0
  40. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/apply2.svg +0 -0
  41. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/creating_a_c_op.rst +0 -0
  42. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  43. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/creating_an_op.rst +0 -0
  44. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/ctype.rst +0 -0
  45. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/extending_faq.rst +0 -0
  46. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/extending_pytensor_solution_1.py +0 -0
  47. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/graph_rewriting.rst +0 -0
  48. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/graphstructures.rst +0 -0
  49. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/index.rst +0 -0
  50. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/inplace.rst +0 -0
  51. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/op.rst +0 -0
  52. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/other_ops.rst +0 -0
  53. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  54. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  55. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/pipeline.rst +0 -0
  56. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/scan.rst +0 -0
  57. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/tips.rst +0 -0
  58. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/type.rst +0 -0
  59. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/unittest.rst +0 -0
  60. {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/using_params.rst +0 -0
  61. {pytensor-3.0.4 → pytensor-3.0.5}/doc/faq.rst +0 -0
  62. {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  63. {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
  64. {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
  65. {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/optimize/root.ipynb +0 -0
  66. {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/page_footer.md +0 -0
  67. {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  68. {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  69. {pytensor-3.0.4 → pytensor-3.0.5}/doc/generate_dtype_tensor_table.py +0 -0
  70. {pytensor-3.0.4 → pytensor-3.0.5}/doc/glossary.rst +0 -0
  71. {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/Elman_srnn.png +0 -0
  72. {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/PyTensor.png +0 -0
  73. {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/PyTensor_RGB.svg +0 -0
  74. {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/PyTensor_logo.png +0 -0
  75. {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/binder.svg +0 -0
  76. {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/blocksparse.png +0 -0
  77. {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/colab.svg +0 -0
  78. {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/github.svg +0 -0
  79. {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/lstm.png +0 -0
  80. {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/lstm_memorycell.png +0 -0
  81. {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/talk2010.gif +0 -0
  82. {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/talk2010.png +0 -0
  83. {pytensor-3.0.4 → pytensor-3.0.5}/doc/index.rst +0 -0
  84. {pytensor-3.0.4 → pytensor-3.0.5}/doc/install.rst +0 -0
  85. {pytensor-3.0.4 → pytensor-3.0.5}/doc/internal/how_to_release.rst +0 -0
  86. {pytensor-3.0.4 → pytensor-3.0.5}/doc/internal/index.rst +0 -0
  87. {pytensor-3.0.4 → pytensor-3.0.5}/doc/internal/metadocumentation.rst +0 -0
  88. {pytensor-3.0.4 → pytensor-3.0.5}/doc/introduction.rst +0 -0
  89. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/debugmode.rst +0 -0
  90. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/function.rst +0 -0
  91. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/index.rst +0 -0
  92. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/io.rst +0 -0
  93. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/mode.rst +0 -0
  94. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/nanguardmode.rst +0 -0
  95. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/opfromgraph.rst +0 -0
  96. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/ops.rst +0 -0
  97. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/profilemode.rst +0 -0
  98. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/shared.rst +0 -0
  99. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/config.rst +0 -0
  100. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  101. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  102. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  103. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  104. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  105. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  106. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  107. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/mlp.html +0 -0
  108. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/mlp.png +0 -0
  109. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/mlp2.html +0 -0
  110. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  111. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/mlp2.png +0 -0
  112. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/ofg.html +0 -0
  113. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/ofg2.html +0 -0
  114. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/index.ipynb +0 -0
  115. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/index.rst +0 -0
  116. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  117. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  118. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  119. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  120. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/features.rst +0 -0
  121. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/fgraph.rst +0 -0
  122. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/graph.rst +0 -0
  123. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/index.rst +0 -0
  124. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/op.rst +0 -0
  125. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/replace.rst +0 -0
  126. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/type.rst +0 -0
  127. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/utils.rst +0 -0
  128. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/index.rst +0 -0
  129. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/misc/pkl_utils.rst +0 -0
  130. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/printing.rst +0 -0
  131. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/scalar/index.rst +0 -0
  132. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/scan.rst +0 -0
  133. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/sparse/index.rst +0 -0
  134. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/sparse/sandbox.rst +0 -0
  135. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/basic.rst +0 -0
  136. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/basic_opt.rst +0 -0
  137. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/bcast.png +0 -0
  138. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/bcast.svg +0 -0
  139. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/elemwise.rst +0 -0
  140. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/extra_ops.rst +0 -0
  141. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/fft.rst +0 -0
  142. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/functional.rst +0 -0
  143. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/index.rst +0 -0
  144. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/io.rst +0 -0
  145. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/linalg.rst +0 -0
  146. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/math_opt.rst +0 -0
  147. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/nlinalg.rst +0 -0
  148. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/optimize.rst +0 -0
  149. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/plot_fft.png +0 -0
  150. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/random.rst +0 -0
  151. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/slinalg.rst +0 -0
  152. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/utils.rst +0 -0
  153. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/typed_list.rst +0 -0
  154. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/index.md +0 -0
  155. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/linalg.md +0 -0
  156. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/math.md +0 -0
  157. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/module_functions.md +0 -0
  158. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/random.md +0 -0
  159. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/signal.md +0 -0
  160. {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/type.md +0 -0
  161. {pytensor-3.0.4 → pytensor-3.0.5}/doc/links.rst +0 -0
  162. {pytensor-3.0.4 → pytensor-3.0.5}/doc/optimizations.rst +0 -0
  163. {pytensor-3.0.4 → pytensor-3.0.5}/doc/pylintrc +0 -0
  164. {pytensor-3.0.4 → pytensor-3.0.5}/doc/robots.txt +0 -0
  165. {pytensor-3.0.4 → pytensor-3.0.5}/doc/troubleshooting.rst +0 -0
  166. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/adding.rst +0 -0
  167. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/adding_solution_1.py +0 -0
  168. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/aliasing.rst +0 -0
  169. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/apply.png +0 -0
  170. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/apply.svg +0 -0
  171. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/bcast.png +0 -0
  172. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/broadcasting.rst +0 -0
  173. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/conditions.rst +0 -0
  174. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/debug_faq.rst +0 -0
  175. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/dlogistic.png +0 -0
  176. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/examples.rst +0 -0
  177. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/faq_tutorial.rst +0 -0
  178. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/gradients.rst +0 -0
  179. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/index.rst +0 -0
  180. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/loading_and_saving.rst +0 -0
  181. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/logistic.gp +0 -0
  182. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/logistic.png +0 -0
  183. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/loop.rst +0 -0
  184. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/loop_solution_1.py +0 -0
  185. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/modes.rst +0 -0
  186. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/modes_solution_1.py +0 -0
  187. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/multi_cores.rst +0 -0
  188. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/nan_tutorial.rst +0 -0
  189. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/pics/d3viz.png +0 -0
  190. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  191. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  192. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  193. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/printing_drawing.rst +0 -0
  194. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/prng.rst +0 -0
  195. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/profiling.rst +0 -0
  196. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/profiling_example.py +0 -0
  197. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/profiling_example_out.prof +0 -0
  198. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/shape_info.rst +0 -0
  199. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/sparse.rst +0 -0
  200. {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/symbolic_graphs.rst +0 -0
  201. {pytensor-3.0.4 → pytensor-3.0.5}/doc/user_guide.rst +0 -0
  202. {pytensor-3.0.4 → pytensor-3.0.5}/pyproject.toml +0 -0
  203. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/__init__.py +0 -0
  204. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/_sparse_lazy.py +0 -0
  205. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/__init__.py +0 -0
  206. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/alloc.py +0 -0
  207. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/blockwise.py +0 -0
  208. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/core.py +0 -0
  209. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/dimshuffle.py +0 -0
  210. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/dot.py +0 -0
  211. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/elemwise.py +0 -0
  212. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/orthogonal.py +0 -0
  213. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/positive_definite.py +0 -0
  214. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/reshape.py +0 -0
  215. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/shape.py +0 -0
  216. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/specify.py +0 -0
  217. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/subtensor.py +0 -0
  218. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/symmetric.py +0 -0
  219. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/triangular.py +0 -0
  220. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/basic.py +0 -0
  221. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/bin/__init__.py +0 -0
  222. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/bin/pytensor_cache.py +0 -0
  223. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/breakpoint.py +0 -0
  224. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/__init__.py +0 -0
  225. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/aliasing.py +0 -0
  226. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/builders.py +0 -0
  227. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/compiledir.py +0 -0
  228. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/compilelock.py +0 -0
  229. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/debug/__init__.py +0 -0
  230. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/debug/debugmode.py +0 -0
  231. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/debug/dump.py +0 -0
  232. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/debug/monitormode.py +0 -0
  233. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/debug/nanguardmode.py +0 -0
  234. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/executor.py +0 -0
  235. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/io.py +0 -0
  236. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/maker.py +0 -0
  237. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/mode.py +0 -0
  238. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/ops.py +0 -0
  239. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/rebuild.py +0 -0
  240. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/sharedvalue.py +0 -0
  241. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/configdefaults.py +0 -0
  242. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/configparser.py +0 -0
  243. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/__init__.py +0 -0
  244. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  245. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/css/d3viz.css +0 -0
  246. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/d3viz.py +0 -0
  247. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/formatting.py +0 -0
  248. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/html/template.html +0 -0
  249. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  250. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  251. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/js/d3viz.js +0 -0
  252. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  253. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  254. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/gradient.py +0 -0
  255. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/__init__.py +0 -0
  256. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/destroyhandler.py +0 -0
  257. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/features.py +0 -0
  258. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/null_type.py +0 -0
  259. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/op.py +0 -0
  260. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/replace.py +0 -0
  261. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/rewriting/__init__.py +0 -0
  262. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/rewriting/basic.py +0 -0
  263. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/rewriting/db.py +0 -0
  264. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/rewriting/kanren.py +0 -0
  265. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/rewriting/unify.py +0 -0
  266. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/rewriting/utils.py +0 -0
  267. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/traversal.py +0 -0
  268. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/type.py +0 -0
  269. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/utils.py +0 -0
  270. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/ifelse.py +0 -0
  271. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/ipython.py +0 -0
  272. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/__init__.py +0 -0
  273. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/basic.py +0 -0
  274. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/__init__.py +0 -0
  275. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/basic.py +0 -0
  276. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  277. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  278. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/cmodule.py +0 -0
  279. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/cutils.py +0 -0
  280. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/cvm.py +0 -0
  281. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/exceptions.py +0 -0
  282. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/interface.py +0 -0
  283. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/lazylinker_c.py +0 -0
  284. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/op.py +0 -0
  285. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/params_type.py +0 -0
  286. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/type.py +0 -0
  287. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/__init__.py +0 -0
  288. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/__init__.py +0 -0
  289. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/basic.py +0 -0
  290. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/blas.py +0 -0
  291. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  292. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/einsum.py +0 -0
  293. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  294. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  295. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
  296. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
  297. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
  298. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
  299. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
  300. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
  301. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
  302. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/math.py +0 -0
  303. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/pad.py +0 -0
  304. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/random.py +0 -0
  305. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/scalar.py +0 -0
  306. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/scan.py +0 -0
  307. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/shape.py +0 -0
  308. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  309. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  310. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/sort.py +0 -0
  311. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/sparse.py +0 -0
  312. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  313. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  314. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/linker.py +0 -0
  315. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/ops.py +0 -0
  316. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/__init__.py +0 -0
  317. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/__init__.py +0 -0
  318. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/basic.py +0 -0
  319. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/blas.py +0 -0
  320. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
  321. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/einsum.py +0 -0
  322. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
  323. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
  324. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
  325. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/linalg/decomposition.py +0 -0
  326. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/linalg/inverse.py +0 -0
  327. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
  328. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/linalg/solvers.py +0 -0
  329. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/linalg/summary.py +0 -0
  330. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/math.py +0 -0
  331. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/pad.py +0 -0
  332. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/scalar.py +0 -0
  333. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/shape.py +0 -0
  334. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  335. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  336. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/sort.py +0 -0
  337. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
  338. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/tensor_basic.py +0 -0
  339. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/linker.py +0 -0
  340. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/__init__.py +0 -0
  341. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/cache.py +0 -0
  342. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/__init__.py +0 -0
  343. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/basic.py +0 -0
  344. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  345. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
  346. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  347. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  348. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
  349. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  350. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
  351. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  352. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  353. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
  354. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
  355. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
  356. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  357. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -0
  358. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
  359. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
  360. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
  361. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
  362. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
  363. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
  364. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
  365. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
  366. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
  367. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
  368. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
  369. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
  370. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
  371. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
  372. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
  373. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
  374. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
  375. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
  376. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  377. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/random.py +0 -0
  378. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/scalar.py +0 -0
  379. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/scan.py +0 -0
  380. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/shape.py +0 -0
  381. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  382. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  383. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/sort.py +0 -0
  384. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
  385. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
  386. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
  387. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
  388. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  389. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  390. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/typed_list.py +0 -0
  391. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/linker.py +0 -0
  392. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  393. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  394. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  395. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  396. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  397. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  398. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
  399. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
  400. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
  401. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
  402. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
  403. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/math.py +0 -0
  404. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  405. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  406. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  407. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  408. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/linker.py +0 -0
  409. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/utils.py +0 -0
  410. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/vm.py +0 -0
  411. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/__init__.py +0 -0
  412. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/check_blas.py +0 -0
  413. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/check_blas_many.sh +0 -0
  414. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/check_duplicate_key.py +0 -0
  415. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  416. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/elemwise_time_test.py +0 -0
  417. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/frozendict.py +0 -0
  418. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/may_share_memory.py +0 -0
  419. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/ordered_set.py +0 -0
  420. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/pkl_utils.py +0 -0
  421. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/npy_2_compat.py +0 -0
  422. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/printing.py +0 -0
  423. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/py.typed +0 -0
  424. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/raise_op.py +0 -0
  425. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/__init__.py +0 -0
  426. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/basic.py +0 -0
  427. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  428. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  429. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/c_code/gamma.c +0 -0
  430. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/c_code/incbet.c +0 -0
  431. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/loop.py +0 -0
  432. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/math.py +0 -0
  433. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/sharedvar.py +0 -0
  434. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/__init__.py +0 -0
  435. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/basic.py +0 -0
  436. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/checkpoints.py +0 -0
  437. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/op.py +0 -0
  438. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/__init__.py +0 -0
  439. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/db.py +0 -0
  440. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/inplace.py +0 -0
  441. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/io.py +0 -0
  442. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/merge.py +0 -0
  443. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/push_out.py +0 -0
  444. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/trace.py +0 -0
  445. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/utils.py +0 -0
  446. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/scan_perform.pyx +0 -0
  447. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/scan_perform_ext.py +0 -0
  448. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/utils.py +0 -0
  449. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/views.py +0 -0
  450. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/__init__.py +0 -0
  451. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/basic.py +0 -0
  452. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/linalg.py +0 -0
  453. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/rewriting.py +0 -0
  454. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/sharedvar.py +0 -0
  455. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/type.py +0 -0
  456. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/utils.py +0 -0
  457. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/variable.py +0 -0
  458. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/__init__.py +0 -0
  459. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/basic.py +0 -0
  460. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/blas.py +0 -0
  461. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/blas_c.py +0 -0
  462. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/blas_headers.py +0 -0
  463. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/blockwise.py +0 -0
  464. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  465. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  466. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  467. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/einsum.py +0 -0
  468. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/elemwise.py +0 -0
  469. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/elemwise_cgen.py +0 -0
  470. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/exceptions.py +0 -0
  471. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/extra_ops.py +0 -0
  472. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/fft.py +0 -0
  473. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/fourier.py +0 -0
  474. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/functional.py +0 -0
  475. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/interpolate.py +0 -0
  476. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/__init__.py +0 -0
  477. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/_lazy.py +0 -0
  478. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/constructors.py +0 -0
  479. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
  480. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
  481. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
  482. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
  483. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
  484. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
  485. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
  486. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/dtype_utils.py +0 -0
  487. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/inverse.py +0 -0
  488. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/products.py +0 -0
  489. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
  490. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/core.py +0 -0
  491. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/general.py +0 -0
  492. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
  493. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
  494. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/psd.py +0 -0
  495. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
  496. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
  497. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/summary.py +0 -0
  498. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/math.py +0 -0
  499. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/nlinalg.py +0 -0
  500. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/optimize.py +0 -0
  501. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/pad.py +0 -0
  502. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/__init__.py +0 -0
  503. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/basic.py +0 -0
  504. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/op.py +0 -0
  505. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  506. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/rewriting/basic.py +0 -0
  507. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/rewriting/jax.py +0 -0
  508. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/rewriting/numba.py +0 -0
  509. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/type.py +0 -0
  510. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/utils.py +0 -0
  511. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/variable.py +0 -0
  512. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/reshape.py +0 -0
  513. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/__init__.py +0 -0
  514. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/assumptions.py +0 -0
  515. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/basic.py +0 -0
  516. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/blas.py +0 -0
  517. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/blas_c.py +0 -0
  518. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/blockwise.py +0 -0
  519. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/einsum.py +0 -0
  520. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/elemwise.py +0 -0
  521. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  522. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/indexed_elemwise.py +0 -0
  523. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/jax.py +0 -0
  524. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
  525. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
  526. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
  527. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/products.py +0 -0
  528. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
  529. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
  530. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/numba.py +0 -0
  531. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/ofg.py +0 -0
  532. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/optimize.py +0 -0
  533. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/reshape.py +0 -0
  534. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/shape.py +0 -0
  535. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/special.py +0 -0
  536. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  537. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/shape.py +0 -0
  538. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/sharedvar.py +0 -0
  539. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/signal/__init__.py +0 -0
  540. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/signal/conv.py +0 -0
  541. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/slinalg.py +0 -0
  542. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/sort.py +0 -0
  543. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/special.py +0 -0
  544. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/subtensor.py +0 -0
  545. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/symbolic.py +0 -0
  546. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/type.py +0 -0
  547. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/type_other.py +0 -0
  548. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/utils.py +0 -0
  549. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/var.py +0 -0
  550. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/variable.py +0 -0
  551. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/xlogx.py +0 -0
  552. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/typed_list/__init__.py +0 -0
  553. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/typed_list/basic.py +0 -0
  554. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/typed_list/rewriting.py +0 -0
  555. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/typed_list/type.py +0 -0
  556. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/utils.py +0 -0
  557. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/__init__.py +0 -0
  558. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/basic.py +0 -0
  559. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/indexing.py +0 -0
  560. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/linalg.py +0 -0
  561. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/math.py +0 -0
  562. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/random/__init__.py +0 -0
  563. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/random/basic.py +0 -0
  564. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/random/type.py +0 -0
  565. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/random/variable.py +0 -0
  566. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/reduction.py +0 -0
  567. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/__init__.py +0 -0
  568. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/basic.py +0 -0
  569. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/indexing.py +0 -0
  570. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/math.py +0 -0
  571. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/reduction.py +0 -0
  572. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/shape.py +0 -0
  573. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/utils.py +0 -0
  574. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  575. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/shape.py +0 -0
  576. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/signal.py +0 -0
  577. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/type.py +0 -0
  578. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/vectorization.py +0 -0
  579. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor.egg-info/SOURCES.txt +0 -0
  580. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor.egg-info/dependency_links.txt +0 -0
  581. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor.egg-info/entry_points.txt +0 -0
  582. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor.egg-info/requires.txt +0 -0
  583. {pytensor-3.0.4 → pytensor-3.0.5}/pytensor.egg-info/top_level.txt +0 -0
  584. {pytensor-3.0.4 → pytensor-3.0.5}/scripts/mypy-failing.txt +0 -0
  585. {pytensor-3.0.4 → pytensor-3.0.5}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  586. {pytensor-3.0.4 → pytensor-3.0.5}/setup.cfg +0 -0
  587. {pytensor-3.0.4 → pytensor-3.0.5}/setup.py +0 -0
  588. {pytensor-3.0.4 → pytensor-3.0.5}/tests/link/c/c_code/test_cenum.h +0 -0
  589. {pytensor-3.0.4 → pytensor-3.0.5}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  590. {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_basic.py +0 -0
  591. {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_breakpoint.py +0 -0
  592. {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_config.py +0 -0
  593. {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_gradient.py +0 -0
  594. {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_ifelse.py +0 -0
  595. {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_printing.py +0 -0
  596. {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_raise_op.py +0 -0
  597. {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_rop.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 3.0.4
3
+ Version: 3.0.5
4
4
  Summary: Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs.
5
5
  Author-email: pymc-devs <pymc.devs@gmail.com>
6
6
  License-Expression: BSD-3-Clause
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2026-06-02T00:24:22+0200",
11
+ "date": "2026-06-11T03:57:58+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "1df3475ac881a6bb182828c3dc8e36ed0439827f",
15
- "version": "3.0.4"
14
+ "full-revisionid": "3411b300d7a120e7fb58b5ad5495391ddd74e189",
15
+ "version": "3.0.5"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -49,8 +49,13 @@ def _diagonal_from_constant(var: TensorConstant) -> FactState:
49
49
  if m != n:
50
50
  result = FactState.FALSE
51
51
  else:
52
- eye_mask = np.eye(n, dtype=bool)
53
- result = FactState.FALSE if np.any(data * ~eye_mask) else FactState.TRUE
52
+ # Off-diagonal has a nonzero iff there are more nonzeros in ``data``
53
+ # than on its diagonal.
54
+ diag = np.diagonal(data, axis1=-2, axis2=-1)
55
+ if np.count_nonzero(data) == np.count_nonzero(diag):
56
+ result = FactState.TRUE
57
+ else:
58
+ result = FactState.FALSE
54
59
 
55
60
  var.tag.is_diagonal = result
56
61
  return result
@@ -38,13 +38,18 @@ def _permutation_from_constant(var: TensorConstant) -> FactState:
38
38
  if data.ndim < 2 or data.shape[-1] != data.shape[-2]:
39
39
  result = FactState.FALSE
40
40
  else:
41
- # The row/column-sum reductions are cheaper and short-circuit the full-size binary
42
- # scan; a doubly-stochastic matrix shows the binary check is still required.
43
- is_permutation = (
44
- bool(np.all(data.sum(axis=-2) == 1))
45
- and bool(np.all(data.sum(axis=-1) == 1))
46
- and bool(np.all((data == 0) | (data == 1)))
47
- )
41
+ with np.errstate(invalid="ignore"):
42
+ if not (data.sum(axis=-2) == 1).all():
43
+ is_permutation = False
44
+ elif not (data.sum(axis=-1) == 1).all():
45
+ is_permutation = False
46
+ elif data.dtype.kind in "ub":
47
+ is_permutation = True
48
+ elif data.dtype.kind == "i":
49
+ is_permutation = data.min(initial=0) >= 0
50
+ else:
51
+ n = data.shape[-1]
52
+ is_permutation = np.count_nonzero(data) == (data.size // n if n else 0)
48
53
  result = FactState.TRUE if is_permutation else FactState.FALSE
49
54
 
50
55
  var.tag.is_permutation = result
@@ -28,12 +28,18 @@ def _selection_from_constant(var: TensorConstant) -> FactState:
28
28
  if data.ndim < 2:
29
29
  result = FactState.FALSE
30
30
  else:
31
- if not (data.sum(axis=-2) == 1).all():
32
- is_selection = False
33
- elif data.dtype.kind in "uib":
34
- is_selection = data.max(initial=1) <= 1 and data.min(initial=0) >= 0
35
- else:
36
- is_selection = bool(((data == 0) | (data == 1)).all())
31
+ with np.errstate(invalid="ignore"):
32
+ if not (data.sum(axis=-2) == 1).all():
33
+ is_selection = False
34
+ elif data.dtype.kind in "ub":
35
+ is_selection = True
36
+ elif data.dtype.kind == "i":
37
+ is_selection = data.min(initial=0) >= 0
38
+ else:
39
+ n_rows = data.shape[-2]
40
+ is_selection = np.count_nonzero(data) == (
41
+ data.size // n_rows if n_rows else 0
42
+ )
37
43
  result = FactState.TRUE if is_selection else FactState.FALSE
38
44
 
39
45
  var.tag.is_selection = result
@@ -15,6 +15,7 @@ import operator
15
15
  import sys
16
16
  import time
17
17
  from collections import Counter, defaultdict
18
+ from collections.abc import Callable
18
19
  from contextlib import contextmanager
19
20
  from pathlib import Path
20
21
  from typing import Any
@@ -172,7 +173,7 @@ def print_global_stats():
172
173
  print("=" * 50, file=f)
173
174
 
174
175
 
175
- _profiler_printers = []
176
+ _profiler_printers: list[Callable] = []
176
177
 
177
178
 
178
179
  def register_profiler_printer(fct):
@@ -820,40 +820,35 @@ def _make_frozen_output_reduce(out: Variable):
820
820
  class FrozenApply(Apply):
821
821
  """An immutable, globally-interned Apply node for frozen graphs.
822
822
 
823
- Uses tuples for ``inputs`` and ``outputs`` so mutation raises ``TypeError``
824
- at the language level. Interned by ``(op, cache_key(inputs))`` —
825
- constructing a ``FrozenApply`` with the same op and input variables returns
826
- the cached instance.
827
-
828
- Constants are keyed by their ``signature()`` so that two independently
829
- created Constants with the same value resolve to the same cached node.
823
+ ``inputs`` and ``outputs`` are tuples, so mutating them raises ``TypeError``.
824
+
825
+ Instances are interned on ``(op, inputs, output_types)``: constructing one
826
+ with a matching key returns the cached instance. Constant inputs are keyed
827
+ by ``signature()`` (so equal-valued Constants share a node). Other inputs
828
+ are already globally interned, so identity is enough; the key stores their
829
+ ``id()`` rather than the variables themselves, keeping strong references out
830
+ of the cache so chains of ``FrozenApply`` nodes collect in a single GC pass.
831
+
832
+ ``output_types`` is in the key because frozen graphs root on
833
+ ``NominalVariable`` inputs (index and type only). Nominalizing truncates the
834
+ root inputs, discarding the values and subgraphs an Op may have read to
835
+ derive its output type (e.g. via ``infer_shape``), so ``(op, inputs)`` alone
836
+ no longer pins it down.
830
837
  """
831
838
 
832
839
  _cache: weakref.WeakValueDictionary = weakref.WeakValueDictionary()
833
840
 
834
- @staticmethod
835
- def _input_to_key(inp: Variable):
836
- """Convert an input Variable to a hashable, value-based cache key element.
837
-
838
- Non-Constants (NominalVariables, FrozenApply outputs) are already
839
- globally interned, so ``id()`` is a correct identity key. Using
840
- ``id()`` instead of the object itself avoids strong references in
841
- cache keys that would prevent GC from collecting chains of
842
- FrozenApply nodes in a single pass.
843
-
844
- Constants use their ``signature()`` for value-based deduplication.
845
- """
846
- if isinstance(inp, Constant):
847
- return inp.signature()
848
- return id(inp)
849
-
850
841
  def __new__(
851
842
  cls,
852
843
  op: "Op",
853
844
  inputs: tuple[Variable, ...],
854
845
  output_types: tuple["Type", ...],
855
846
  ):
856
- cache_key = (op, tuple(cls._input_to_key(i) for i in inputs))
847
+ cache_key = (
848
+ op,
849
+ tuple(i.signature() if isinstance(i, Constant) else id(i) for i in inputs),
850
+ output_types,
851
+ )
857
852
  cached = cls._cache.get(cache_key)
858
853
  if cached is not None:
859
854
  return cached
@@ -1074,12 +1074,17 @@ class FrozenFunctionGraph(AbstractFunctionGraph):
1074
1074
  self._clients = clients
1075
1075
  return self._clients
1076
1076
 
1077
- def bind(self, replace: dict[Variable, Variable]) -> list[Variable]:
1077
+ def bind(
1078
+ self, replace: Sequence[Variable] | dict[Variable, Variable]
1079
+ ) -> list[Variable]:
1078
1080
  """Return fresh outputs with root inputs substituted per *replace*.
1079
1081
 
1080
1082
  Constants are reused; any non-Constant input not in *replace* raises KeyError.
1081
1083
  """
1082
- memo = replace.copy()
1084
+ if isinstance(replace, dict):
1085
+ memo = replace.copy()
1086
+ else:
1087
+ memo = dict(zip(self.inputs, replace))
1083
1088
  for node in self.toposort():
1084
1089
  for i in node.inputs:
1085
1090
  if i not in memo:
@@ -794,7 +794,7 @@ def numba_funcify_IndexedElemwise(op, node, **kwargs):
794
794
 
795
795
  return impl
796
796
 
797
- cache_version = 1
797
+ cache_version = 2
798
798
  if scalar_cache_key is None:
799
799
  key = None
800
800
  else:
@@ -136,7 +136,9 @@ def numba_funcify_SparseDot(op, node, **kwargs):
136
136
  x_format = x.type.format if x_is_sparse else None
137
137
  y_format = y.type.format if y_is_sparse else None
138
138
 
139
- cache_version = 2
139
+ out_type = np.dtype(out_dtype).type
140
+
141
+ cache_version = 3
140
142
  cache_key = sha256(
141
143
  str(
142
144
  (
@@ -371,7 +373,7 @@ def numba_funcify_SparseDot(op, node, **kwargs):
371
373
  for row_idx in range(n):
372
374
  for idx in range(x_ptr[row_idx], x_ptr[row_idx + 1]):
373
375
  col_idx = x_ind[idx]
374
- value = x_data[idx]
376
+ value = out_type(x_data[idx])
375
377
  z[row_idx] += value * y[col_idx]
376
378
  return z
377
379
 
@@ -390,7 +392,7 @@ def numba_funcify_SparseDot(op, node, **kwargs):
390
392
  for col_idx in range(p):
391
393
  for idx in range(x_ptr[col_idx], x_ptr[col_idx + 1]):
392
394
  row_idx = x_ind[idx]
393
- value = x_data[idx]
395
+ value = out_type(x_data[idx])
394
396
  z[row_idx] += value * y[col_idx]
395
397
  return z
396
398
 
@@ -964,32 +964,30 @@ def _vectorized(
964
964
  if spec is None:
965
965
  continue
966
966
  indexed_axes = {src_axis: idx_k for idx_k, src_axis in spec}
967
- n_indexed = len(indexed_axes)
968
967
  n_index_loop_dims = max(idx_types[idx_k].ndim for idx_k, _ in spec)
969
- if n_indexed == n_index_loop_dims:
970
- iter_shapes[p] = list(iter_shapes[p])
971
- for idx_k, axis in spec:
972
- iter_shapes[p][axis] = idx_shapes[idx_k][0]
973
- else:
974
- batch_ndim = len(input_bc_patterns[p])
975
- max_axis = max(a for _, a in spec)
976
- new_shape = []
977
- new_bc = []
978
- src_d = 0
979
- idx_d = 0
980
- for loop_d in range(batch_ndim):
981
- if src_d in indexed_axes and idx_d < n_index_loop_dims:
982
- new_shape.append(one)
983
- new_bc.append(True)
984
- idx_d += 1
985
- if idx_d >= n_index_loop_dims:
986
- src_d = max_axis + 1
987
- else:
988
- new_shape.append(in_shapes[p][src_d])
989
- new_bc.append(iter_bc[p][loop_d])
990
- src_d += 1
991
- iter_shapes[p] = new_shape
992
- iter_bc[p] = tuple(new_bc)
968
+ # An indexed input imposes no constraint on the loop dims produced by
969
+ # its indices: those are pinned by the index arrays' own iter_shape
970
+ # entries below. Mark each such loop dim broadcastable and copy the
971
+ # source shape for the non-indexed dims.
972
+ batch_ndim = len(input_bc_patterns[p])
973
+ max_axis = max(a for _, a in spec)
974
+ new_shape = []
975
+ new_bc = []
976
+ src_d = 0
977
+ idx_d = 0
978
+ for loop_d in range(batch_ndim):
979
+ if src_d in indexed_axes and idx_d < n_index_loop_dims:
980
+ new_shape.append(one)
981
+ new_bc.append(True)
982
+ idx_d += 1
983
+ if idx_d >= n_index_loop_dims:
984
+ src_d = max_axis + 1
985
+ else:
986
+ new_shape.append(in_shapes[p][src_d])
987
+ new_bc.append(iter_bc[p][loop_d])
988
+ src_d += 1
989
+ iter_shapes[p] = new_shape
990
+ iter_bc[p] = tuple(new_bc)
993
991
 
994
992
  # Each index array participates in iter_shape validation.
995
993
  # Write indices can broadcast against each other, but if ALL write
@@ -11,8 +11,10 @@ import pytensor.tensor.math as ptm
11
11
  from pytensor import config
12
12
  from pytensor.gradient import grad_not_implemented
13
13
  from pytensor.graph import Apply, Op
14
+ from pytensor.graph.replace import _vectorize_node
14
15
  from pytensor.link.c.op import COp
15
16
  from pytensor.sparse.type import SparseTensorType
17
+ from pytensor.tensor.reshape import join_dims, split_dims
16
18
  from pytensor.tensor.shape import specify_broadcastable
17
19
  from pytensor.tensor.type import TensorType, Variable, complex_dtypes, tensor
18
20
 
@@ -2067,3 +2069,49 @@ class Usmm(Op):
2067
2069
 
2068
2070
 
2069
2071
  usmm = Usmm()
2072
+
2073
+
2074
+ @_vectorize_node.register(StructuredDot)
2075
+ def _vectorize_structured_dot(op, node, batch_a, batch_b):
2076
+ """Batch StructuredDot(sparse_const, dense): (m,k)@(B...,k,n) -> (B...,m,n).
2077
+
2078
+ The sparse left input must stay unbatched (scipy has no batched-sparse
2079
+ type). The dense right input may gain any number of leading batch dims;
2080
+ we fold them through the existing 2D StructuredDot with a moveaxis +
2081
+ join_dims / split_dims round trip.
2082
+ """
2083
+ a, b = node.inputs
2084
+ if batch_a.type.ndim != a.type.ndim:
2085
+ raise NotImplementedError(
2086
+ "Cannot vectorize StructuredDot when the sparse (left) input is "
2087
+ "batched; scipy has no batched-sparse type."
2088
+ )
2089
+
2090
+ if batch_b.type.ndim == b.type.ndim:
2091
+ # No batch dims added to the dense input — rebuild the op as-is.
2092
+ return op.make_node(batch_a, batch_b).outputs
2093
+
2094
+ # batch_b is (B1,...,BN, k, n). Move k to the front and fold the batch
2095
+ # dims and n into a single column axis: (k, B1*...*BN*n).
2096
+ moved = ptb.moveaxis(batch_b, -2, 0) # (k, B1,...,BN, n)
2097
+ trailing = moved.shape[1:]
2098
+ flat_b = join_dims(moved, start_axis=1) # (k, B*n)
2099
+
2100
+ flat_out = op.make_node(batch_a, flat_b).outputs[0] # (m, B*n)
2101
+
2102
+ # Unfold the column axis and move m back into the (-2) slot.
2103
+ unflat = split_dims(flat_out, shape=trailing, axis=1) # (m, B1,...,BN, n)
2104
+ out = ptb.moveaxis(unflat, 0, -2) # (B1,...,BN, m, n)
2105
+ return [out]
2106
+
2107
+
2108
+ def _vectorize_sparse_unsupported(op, node, *batched_inputs):
2109
+ raise NotImplementedError(
2110
+ f"Cannot vectorize {type(op).__name__}: scipy has no batched-sparse "
2111
+ "representation, so the sparse operand cannot be broadcast against a "
2112
+ "batched dense input."
2113
+ )
2114
+
2115
+
2116
+ for _op_cls in (AddSD, SparseDenseMultiply):
2117
+ _vectorize_node.register(_op_cls)(_vectorize_sparse_unsupported)
@@ -18,6 +18,7 @@ from pytensor.tensor.linalg.decomposition.cholesky import Cholesky
18
18
  from pytensor.tensor.linalg.decomposition.lu import LU, LUFactor
19
19
  from pytensor.tensor.linalg.decomposition.qr import QR
20
20
  from pytensor.tensor.linalg.decomposition.svd import SVD
21
+ from pytensor.tensor.linalg.inverse import MatrixInverse
21
22
  from pytensor.tensor.linalg.summary import SLogDet, det
22
23
  from pytensor.tensor.math import Prod, log, prod
23
24
  from pytensor.tensor.rewriting.basic import (
@@ -192,6 +193,16 @@ def det_of_triangular(fgraph, node):
192
193
  return [det_val]
193
194
 
194
195
 
196
+ @register_canonicalize
197
+ @register_stabilize
198
+ @node_rewriter([det])
199
+ def det_of_inv(fgraph, node):
200
+ """Replace det(matrix_inverse(X)) with reciprocal(det(X))."""
201
+ match node.inputs[0].owner_op_and_inputs:
202
+ case (Blockwise(MatrixInverse()), X):
203
+ return [1 / det(X)]
204
+
205
+
195
206
  @register_specialize
196
207
  @node_rewriter([det])
197
208
  def slogdet_specialization(fgraph, node):
@@ -112,7 +112,7 @@ from pytensor.tensor.rewriting.basic import (
112
112
  from pytensor.tensor.rewriting.blockwise import blockwise_of
113
113
  from pytensor.tensor.rewriting.elemwise import apply_local_dimshuffle_lift
114
114
  from pytensor.tensor.shape import Shape, Shape_i, specify_shape
115
- from pytensor.tensor.subtensor import Subtensor
115
+ from pytensor.tensor.subtensor import Subtensor, _is_provably_positive
116
116
  from pytensor.tensor.type import (
117
117
  complex_dtypes,
118
118
  uint_dtypes,
@@ -689,6 +689,66 @@ def local_exp_log_nan_switch(fgraph, node):
689
689
  return [new_out]
690
690
 
691
691
 
692
+ @register_canonicalize
693
+ @register_stabilize
694
+ @register_specialize
695
+ @node_rewriter([log])
696
+ def local_log_div(fgraph, node):
697
+ """Rewrite log(reciprocal(x)) -> -log(x) and log(a / b) -> log(a) - log(b).
698
+
699
+ A reciprocal is just ``1 / x``; log(a / b) only splits when a positive
700
+ constant operand is involved, so its log folds and the op count stays flat.
701
+ """
702
+ (inp,) = node.inputs
703
+ if not (inp.owner and isinstance(inp.owner.op, Elemwise)):
704
+ return None
705
+ scalar_op = inp.owner.op.scalar_op
706
+
707
+ if isinstance(scalar_op, ps.Reciprocal):
708
+ return [neg(log(inp.owner.inputs[0]))]
709
+
710
+ if isinstance(scalar_op, ps.TrueDiv):
711
+ num, den = inp.owner.inputs
712
+ if (isinstance(num, Constant) and _is_provably_positive(num, strict=True)) or (
713
+ isinstance(den, Constant) and _is_provably_positive(den, strict=True)
714
+ ):
715
+ return [log(num) - log(den)]
716
+
717
+
718
+ @register_canonicalize
719
+ @register_stabilize
720
+ @register_specialize
721
+ @node_rewriter([sign])
722
+ def local_sign_div(fgraph, node):
723
+ """Rewrite sign of a reciprocal or division from a known-sign operand.
724
+
725
+ sign(reciprocal(x)) -> sign(x). For sign(a / b): a provably positive side ->
726
+ ``sign(other)``; a negative constant side -> ``-sign(other)``. Bails out
727
+ otherwise.
728
+ """
729
+ (inp,) = node.inputs
730
+ if not (inp.owner and isinstance(inp.owner.op, Elemwise)):
731
+ return None
732
+ scalar_op = inp.owner.op.scalar_op
733
+
734
+ if isinstance(scalar_op, ps.Reciprocal):
735
+ return [sign(inp.owner.inputs[0])]
736
+
737
+ if not isinstance(scalar_op, ps.TrueDiv):
738
+ return None
739
+
740
+ num, den = inp.owner.inputs
741
+
742
+ if _is_provably_positive(num, strict=True):
743
+ return [sign(den)]
744
+ if _is_provably_positive(den, strict=True):
745
+ return [sign(num)]
746
+
747
+ for side, other in ((num, den), (den, num)):
748
+ if isinstance(side, Constant) and np.all(np.asarray(side.data) < 0):
749
+ return [neg(sign(other))]
750
+
751
+
692
752
  @register_canonicalize
693
753
  @register_specialize
694
754
  @node_rewriter([Sum])
@@ -2738,22 +2738,26 @@ def local_blockwise_inc_subtensor(fgraph, node):
2738
2738
  idxs_core_ndim = [len(inp_sig) for inp_sig in node.op.inputs_sig[2:]]
2739
2739
  max_idx_core_ndim = max(idxs_core_ndim, default=0)
2740
2740
 
2741
- # Broadcast buffer to batch_shape
2742
- if x.type.broadcastable != out.type.broadcastable:
2743
- batch_shape = [1] * batch_ndim
2744
- for inp in node.inputs:
2745
- for i, (broadcastable, batch_dim) in enumerate(
2746
- zip(inp.type.broadcastable[:batch_ndim], tuple(inp.shape)[:batch_ndim])
2747
- ):
2748
- if broadcastable:
2749
- # This dimension is broadcastable, it doesn't provide shape information
2750
- continue
2751
- if batch_shape[i] != 1:
2752
- # We already found a source of shape for this batch dimension
2753
- continue
2754
- batch_shape[i] = batch_dim
2741
+ # Broadcast buffer to batch_shape. The output batch shape and broadcast
2742
+ # pattern are derived from the inputs, never from `out.type`, which can be
2743
+ # stale after an upstream rewrite swaps an input.
2744
+ batch_shape = [1] * batch_ndim
2745
+ out_batch_bcast = [True] * batch_ndim
2746
+ for inp in node.inputs:
2747
+ for i, (broadcastable, batch_dim) in enumerate(
2748
+ zip(inp.type.broadcastable[:batch_ndim], tuple(inp.shape)[:batch_ndim])
2749
+ ):
2750
+ if broadcastable:
2751
+ # This dimension is broadcastable, it doesn't provide shape information
2752
+ continue
2753
+ out_batch_bcast[i] = False
2754
+ if batch_shape[i] != 1:
2755
+ # We already found a source of shape for this batch dimension
2756
+ continue
2757
+ batch_shape[i] = batch_dim
2758
+
2759
+ if list(x.type.broadcastable[:batch_ndim]) != out_batch_bcast:
2755
2760
  x = broadcast_to(x, (*batch_shape, *x.shape[batch_ndim:]))
2756
- assert x.type.broadcastable == out.type.broadcastable
2757
2761
 
2758
2762
  # Massage indices so they respect blockwise semantics while using regular indexing
2759
2763
  core_idxs = []
@@ -567,8 +567,13 @@ def local_subtensor_of_expand_dims(fgraph, node):
567
567
 
568
568
  idx_tuple = indices_from_subtensor(idx, node.op.idx_list)
569
569
 
570
- # Keep indexes for the original dimensions, and drop indexes for the expanded dimensions when safe
570
+ # Keep indexes for the original dimensions, and drop indexes for the expanded
571
+ # dimensions when safe. We also track where each kept expanded dimension lands
572
+ # in the output (`out_pos`), so it can be re-introduced with expand_dims below.
573
+ # These axes are derived from the indices, not the (possibly stale) output type.
571
574
  new_idxs = []
575
+ expand_axes = []
576
+ out_pos = 0
572
577
  for i, idx_item in enumerate(idx_tuple):
573
578
  if i in expanded_axes:
574
579
  if isinstance(idx_item, slice):
@@ -576,6 +581,8 @@ def local_subtensor_of_expand_dims(fgraph, node):
576
581
  if idx_item == slice(None):
577
582
  # A None slice, always keeps the dimension.
578
583
  # We skip the index, and later introduce the needed expand_dim
584
+ expand_axes.append(out_pos)
585
+ out_pos += 1
579
586
  continue
580
587
  else:
581
588
  # Other slices could keep or drop the dimension.
@@ -589,27 +596,23 @@ def local_subtensor_of_expand_dims(fgraph, node):
589
596
  else:
590
597
  # Keep indexes for non-expanded dimensions
591
598
  new_idxs.append(idx_item)
599
+ # An integer index drops the dimension; any slice keeps one.
600
+ if isinstance(idx_item, slice):
601
+ out_pos += 1
602
+
603
+ # Trailing dimensions beyond the explicit indices are implicit full slices;
604
+ # the expanded ones among them must also be re-introduced.
605
+ for axis in range(len(idx_tuple), ds.type.ndim):
606
+ if axis in expanded_axes:
607
+ expand_axes.append(out_pos)
608
+ out_pos += 1
592
609
 
593
610
  [old_out] = node.outputs
594
611
  out = x[tuple(new_idxs)]
612
+ if expand_axes:
613
+ out = expand_dims(out, axis=expand_axes)
595
614
  copy_stack_trace(old_out, out)
596
615
 
597
- if out.type.broadcastable != old_out.type.broadcastable:
598
- # Re-introduce needed new dimensions (corresponding to full slices on the original expanded dimensions)
599
- # If out.type.broadcastable == (False) and old_out.type.broadcastable == (True, False, True)
600
- # then axis = (0, 2)
601
- old_bcast = list(old_out.type.broadcastable)
602
- expanded_bcast = list(out.type.broadcastable)
603
- axis = []
604
- i = 0
605
- while i < len(old_bcast):
606
- if i == len(expanded_bcast) or expanded_bcast[i] != old_bcast[i]:
607
- expanded_bcast.insert(i, True)
608
- axis.append(i)
609
- i += 1
610
- out = expand_dims(out, axis=axis)
611
- copy_stack_trace(old_out, out)
612
-
613
616
  return [out]
614
617
 
615
618
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 3.0.4
3
+ Version: 3.0.5
4
4
  Summary: Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs.
5
5
  Author-email: pymc-devs <pymc.devs@gmail.com>
6
6
  License-Expression: BSD-3-Clause
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes