pytensor 3.2.2__tar.gz → 3.2.4__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 (614) hide show
  1. {pytensor-3.2.2/pytensor.egg-info → pytensor-3.2.4}/PKG-INFO +3 -3
  2. {pytensor-3.2.2 → pytensor-3.2.4}/pyproject.toml +2 -2
  3. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/_version.py +3 -3
  4. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/rewriting.py +9 -9
  5. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/features.py +4 -4
  6. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/unify.py +2 -1
  7. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/scalar.py +17 -2
  8. pytensor-3.2.4/pytensor/link/mlx/dispatch/blockwise.py +64 -0
  9. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/linalg/decomposition.py +9 -8
  10. pytensor-3.2.4/pytensor/link/mlx/dispatch/linalg/summary.py +38 -0
  11. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/elemwise.py +1 -1
  12. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/random.py +1 -1
  13. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/vectorize_codegen.py +14 -4
  14. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/math.py +3 -0
  15. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/__init__.py +4 -0
  16. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/math.py +0 -49
  17. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/math.py +0 -86
  18. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/ofg.py +2 -2
  19. pytensor-3.2.4/pytensor/tensor/rewriting/special.py +184 -0
  20. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/subtensor.py +52 -1
  21. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/subtensor_lift.py +106 -8
  22. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/special.py +103 -5
  23. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/utils.py +9 -3
  24. {pytensor-3.2.2 → pytensor-3.2.4/pytensor.egg-info}/PKG-INFO +3 -3
  25. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor.egg-info/requires.txt +2 -2
  26. pytensor-3.2.2/pytensor/link/mlx/dispatch/blockwise.py +0 -42
  27. pytensor-3.2.2/pytensor/link/mlx/dispatch/linalg/summary.py +0 -46
  28. pytensor-3.2.2/pytensor/tensor/rewriting/special.py +0 -97
  29. {pytensor-3.2.2 → pytensor-3.2.4}/LICENSE.txt +0 -0
  30. {pytensor-3.2.2 → pytensor-3.2.4}/MANIFEST.in +0 -0
  31. {pytensor-3.2.2 → pytensor-3.2.4}/README.rst +0 -0
  32. {pytensor-3.2.2 → pytensor-3.2.4}/doc/.templates/PLACEHOLDER +0 -0
  33. {pytensor-3.2.2 → pytensor-3.2.4}/doc/.templates/layout.html +0 -0
  34. {pytensor-3.2.2 → pytensor-3.2.4}/doc/.templates/nb-badges.html +0 -0
  35. {pytensor-3.2.2 → pytensor-3.2.4}/doc/.templates/rendered_citation.html +0 -0
  36. {pytensor-3.2.2 → pytensor-3.2.4}/doc/LICENSE.txt +0 -0
  37. {pytensor-3.2.2 → pytensor-3.2.4}/doc/README.md +0 -0
  38. {pytensor-3.2.2 → pytensor-3.2.4}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  39. {pytensor-3.2.2 → pytensor-3.2.4}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  40. {pytensor-3.2.2 → pytensor-3.2.4}/doc/acknowledgement.rst +0 -0
  41. {pytensor-3.2.2 → pytensor-3.2.4}/doc/bcast.png +0 -0
  42. {pytensor-3.2.2 → pytensor-3.2.4}/doc/bcast.svg +0 -0
  43. {pytensor-3.2.2 → pytensor-3.2.4}/doc/blog.md +0 -0
  44. {pytensor-3.2.2 → pytensor-3.2.4}/doc/conf.py +0 -0
  45. {pytensor-3.2.2 → pytensor-3.2.4}/doc/core_development_guide.rst +0 -0
  46. {pytensor-3.2.2 → pytensor-3.2.4}/doc/css.inc +0 -0
  47. {pytensor-3.2.2 → pytensor-3.2.4}/doc/dev_start_guide.rst +0 -0
  48. {pytensor-3.2.2 → pytensor-3.2.4}/doc/environment.yml +0 -0
  49. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/apply.png +0 -0
  50. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/apply.svg +0 -0
  51. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/apply2.svg +0 -0
  52. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/creating_a_c_op.rst +0 -0
  53. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  54. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/creating_an_op.rst +0 -0
  55. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/ctype.rst +0 -0
  56. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/extending_faq.rst +0 -0
  57. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/extending_pytensor_solution_1.py +0 -0
  58. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/graph_rewriting.rst +0 -0
  59. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/graphstructures.rst +0 -0
  60. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/index.rst +0 -0
  61. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/inplace.rst +0 -0
  62. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/op.rst +0 -0
  63. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/other_ops.rst +0 -0
  64. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  65. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  66. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/pipeline.rst +0 -0
  67. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/scan.rst +0 -0
  68. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/tips.rst +0 -0
  69. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/type.rst +0 -0
  70. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/unification_kanren.rst +0 -0
  71. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/unittest.rst +0 -0
  72. {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/using_params.rst +0 -0
  73. {pytensor-3.2.2 → pytensor-3.2.4}/doc/faq.rst +0 -0
  74. {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  75. {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/applications/tiny_transformer_llm.ipynb +0 -0
  76. {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
  77. {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
  78. {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/optimize/root.ipynb +0 -0
  79. {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/page_footer.md +0 -0
  80. {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  81. {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  82. {pytensor-3.2.2 → pytensor-3.2.4}/doc/generate_dtype_tensor_table.py +0 -0
  83. {pytensor-3.2.2 → pytensor-3.2.4}/doc/glossary.rst +0 -0
  84. {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/Elman_srnn.png +0 -0
  85. {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/PyTensor.png +0 -0
  86. {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/PyTensor_RGB.svg +0 -0
  87. {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/PyTensor_logo.png +0 -0
  88. {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/binder.svg +0 -0
  89. {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/blocksparse.png +0 -0
  90. {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/colab.svg +0 -0
  91. {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/github.svg +0 -0
  92. {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/lstm.png +0 -0
  93. {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/lstm_memorycell.png +0 -0
  94. {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/talk2010.gif +0 -0
  95. {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/talk2010.png +0 -0
  96. {pytensor-3.2.2 → pytensor-3.2.4}/doc/index.rst +0 -0
  97. {pytensor-3.2.2 → pytensor-3.2.4}/doc/install.rst +0 -0
  98. {pytensor-3.2.2 → pytensor-3.2.4}/doc/internal/how_to_release.rst +0 -0
  99. {pytensor-3.2.2 → pytensor-3.2.4}/doc/internal/index.rst +0 -0
  100. {pytensor-3.2.2 → pytensor-3.2.4}/doc/internal/metadocumentation.rst +0 -0
  101. {pytensor-3.2.2 → pytensor-3.2.4}/doc/introduction.rst +0 -0
  102. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/debugmode.rst +0 -0
  103. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/function.rst +0 -0
  104. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/index.rst +0 -0
  105. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/io.rst +0 -0
  106. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/mode.rst +0 -0
  107. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/nanguardmode.rst +0 -0
  108. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/opfromgraph.rst +0 -0
  109. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/ops.rst +0 -0
  110. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/profilemode.rst +0 -0
  111. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/shared.rst +0 -0
  112. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/config.rst +0 -0
  113. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  114. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  115. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  116. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  117. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  118. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  119. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  120. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/mlp.html +0 -0
  121. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/mlp.png +0 -0
  122. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/mlp2.html +0 -0
  123. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  124. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/mlp2.png +0 -0
  125. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/ofg.html +0 -0
  126. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/ofg2.html +0 -0
  127. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/index.ipynb +0 -0
  128. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/index.rst +0 -0
  129. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  130. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  131. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  132. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  133. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/features.rst +0 -0
  134. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/fgraph.rst +0 -0
  135. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/graph.rst +0 -0
  136. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/index.rst +0 -0
  137. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/op.rst +0 -0
  138. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/replace.rst +0 -0
  139. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/type.rst +0 -0
  140. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/utils.rst +0 -0
  141. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/index.rst +0 -0
  142. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/misc/pkl_utils.rst +0 -0
  143. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/printing.rst +0 -0
  144. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/scalar/index.rst +0 -0
  145. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/scan.rst +0 -0
  146. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/sparse/index.rst +0 -0
  147. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/sparse/sandbox.rst +0 -0
  148. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/basic.rst +0 -0
  149. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/basic_opt.rst +0 -0
  150. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/bcast.png +0 -0
  151. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/bcast.svg +0 -0
  152. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/elemwise.rst +0 -0
  153. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/extra_ops.rst +0 -0
  154. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/fft.rst +0 -0
  155. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/functional.rst +0 -0
  156. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/index.rst +0 -0
  157. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/io.rst +0 -0
  158. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/linalg.rst +0 -0
  159. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/math_opt.rst +0 -0
  160. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/nlinalg.rst +0 -0
  161. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/optimize.rst +0 -0
  162. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/plot_fft.png +0 -0
  163. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/random.rst +0 -0
  164. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/slinalg.rst +0 -0
  165. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/utils.rst +0 -0
  166. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/typed_list.rst +0 -0
  167. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/index.md +0 -0
  168. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/linalg.md +0 -0
  169. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/math.md +0 -0
  170. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/module_functions.md +0 -0
  171. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/random.md +0 -0
  172. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/signal.md +0 -0
  173. {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/type.md +0 -0
  174. {pytensor-3.2.2 → pytensor-3.2.4}/doc/links.rst +0 -0
  175. {pytensor-3.2.2 → pytensor-3.2.4}/doc/optimizations.rst +0 -0
  176. {pytensor-3.2.2 → pytensor-3.2.4}/doc/pylintrc +0 -0
  177. {pytensor-3.2.2 → pytensor-3.2.4}/doc/robots.txt +0 -0
  178. {pytensor-3.2.2 → pytensor-3.2.4}/doc/troubleshooting.rst +0 -0
  179. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/adding.rst +0 -0
  180. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/adding_solution_1.py +0 -0
  181. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/aliasing.rst +0 -0
  182. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/apply.png +0 -0
  183. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/apply.svg +0 -0
  184. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/bcast.png +0 -0
  185. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/broadcasting.rst +0 -0
  186. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/conditions.rst +0 -0
  187. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/debug_faq.rst +0 -0
  188. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/dlogistic.png +0 -0
  189. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/examples.rst +0 -0
  190. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/faq_tutorial.rst +0 -0
  191. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/gradients.rst +0 -0
  192. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/index.rst +0 -0
  193. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/loading_and_saving.rst +0 -0
  194. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/logistic.gp +0 -0
  195. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/logistic.png +0 -0
  196. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/loop.rst +0 -0
  197. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/loop_solution_1.py +0 -0
  198. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/modes.rst +0 -0
  199. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/modes_solution_1.py +0 -0
  200. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/multi_cores.rst +0 -0
  201. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/nan_tutorial.rst +0 -0
  202. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/pics/d3viz.png +0 -0
  203. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  204. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  205. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  206. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/printing_drawing.rst +0 -0
  207. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/prng.rst +0 -0
  208. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/profiling.rst +0 -0
  209. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/profiling_example.py +0 -0
  210. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/profiling_example_out.prof +0 -0
  211. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/shape_info.rst +0 -0
  212. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/sparse.rst +0 -0
  213. {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/symbolic_graphs.rst +0 -0
  214. {pytensor-3.2.2 → pytensor-3.2.4}/doc/user_guide.rst +0 -0
  215. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/__init__.py +0 -0
  216. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/_sparse_lazy.py +0 -0
  217. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/__init__.py +0 -0
  218. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/alloc.py +0 -0
  219. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/blockwise.py +0 -0
  220. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/core.py +0 -0
  221. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/diagonal.py +0 -0
  222. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/dimshuffle.py +0 -0
  223. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/dot.py +0 -0
  224. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/elemwise.py +0 -0
  225. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/orthogonal.py +0 -0
  226. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/permutation.py +0 -0
  227. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/positive_definite.py +0 -0
  228. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/reshape.py +0 -0
  229. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/selection.py +0 -0
  230. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/shape.py +0 -0
  231. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/specify.py +0 -0
  232. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/subtensor.py +0 -0
  233. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/symmetric.py +0 -0
  234. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/triangular.py +0 -0
  235. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/basic.py +0 -0
  236. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/bin/__init__.py +0 -0
  237. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/bin/pytensor_cache.py +0 -0
  238. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/breakpoint.py +0 -0
  239. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/__init__.py +0 -0
  240. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/aliasing.py +0 -0
  241. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/builders.py +0 -0
  242. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/compiledir.py +0 -0
  243. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/compilelock.py +0 -0
  244. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/debug/__init__.py +0 -0
  245. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/debug/debugmode.py +0 -0
  246. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/debug/dump.py +0 -0
  247. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/debug/monitormode.py +0 -0
  248. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/debug/nanguardmode.py +0 -0
  249. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/debug/profiling.py +0 -0
  250. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/executor.py +0 -0
  251. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/inner_function.py +0 -0
  252. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/io.py +0 -0
  253. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/maker.py +0 -0
  254. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/mode.py +0 -0
  255. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/ops.py +0 -0
  256. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/rebuild.py +0 -0
  257. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/sharedvalue.py +0 -0
  258. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/configdefaults.py +0 -0
  259. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/configparser.py +0 -0
  260. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/__init__.py +0 -0
  261. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  262. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/css/d3viz.css +0 -0
  263. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/d3viz.py +0 -0
  264. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/formatting.py +0 -0
  265. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/html/template.html +0 -0
  266. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  267. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  268. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/js/d3viz.js +0 -0
  269. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  270. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  271. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/gradient.py +0 -0
  272. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/__init__.py +0 -0
  273. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/basic.py +0 -0
  274. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/destroyhandler.py +0 -0
  275. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/fg.py +0 -0
  276. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/null_type.py +0 -0
  277. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/op.py +0 -0
  278. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/replace.py +0 -0
  279. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/__init__.py +0 -0
  280. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/basic.py +0 -0
  281. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/db.py +0 -0
  282. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/kanren.py +0 -0
  283. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/reachability.py +0 -0
  284. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/utils.py +0 -0
  285. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/traversal.py +0 -0
  286. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/type.py +0 -0
  287. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/utils.py +0 -0
  288. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/ifelse.py +0 -0
  289. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/ipython.py +0 -0
  290. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/__init__.py +0 -0
  291. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/basic.py +0 -0
  292. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/__init__.py +0 -0
  293. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/basic.py +0 -0
  294. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  295. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  296. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/cmodule.py +0 -0
  297. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/cutils.py +0 -0
  298. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/cvm.py +0 -0
  299. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/exceptions.py +0 -0
  300. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/interface.py +0 -0
  301. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/lazylinker_c.py +0 -0
  302. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/op.py +0 -0
  303. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/params_type.py +0 -0
  304. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/type.py +0 -0
  305. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/__init__.py +0 -0
  306. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/__init__.py +0 -0
  307. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/basic.py +0 -0
  308. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/blas.py +0 -0
  309. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  310. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/einsum.py +0 -0
  311. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  312. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  313. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
  314. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
  315. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
  316. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
  317. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
  318. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
  319. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
  320. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/math.py +0 -0
  321. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/pad.py +0 -0
  322. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/random.py +0 -0
  323. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/scan.py +0 -0
  324. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/shape.py +0 -0
  325. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  326. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  327. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/sort.py +0 -0
  328. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/sparse.py +0 -0
  329. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  330. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  331. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/linker.py +0 -0
  332. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/ops.py +0 -0
  333. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/__init__.py +0 -0
  334. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/__init__.py +0 -0
  335. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/basic.py +0 -0
  336. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/blas.py +0 -0
  337. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/einsum.py +0 -0
  338. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
  339. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
  340. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
  341. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/linalg/inverse.py +0 -0
  342. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
  343. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/linalg/solvers.py +0 -0
  344. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/math.py +0 -0
  345. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/pad.py +0 -0
  346. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/scalar.py +0 -0
  347. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/shape.py +0 -0
  348. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  349. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  350. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/sort.py +0 -0
  351. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
  352. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/tensor_basic.py +0 -0
  353. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/linker.py +0 -0
  354. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/__init__.py +0 -0
  355. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/cache.py +0 -0
  356. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/__init__.py +0 -0
  357. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/_llvmlite_self_ref.py +0 -0
  358. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/_patch_pointer_add.py +0 -0
  359. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/basic.py +0 -0
  360. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  361. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
  362. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  363. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  364. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
  365. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  366. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
  367. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  368. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  369. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
  370. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
  371. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
  372. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  373. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -0
  374. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
  375. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
  376. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
  377. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
  378. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
  379. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
  380. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
  381. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
  382. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
  383. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
  384. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
  385. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
  386. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
  387. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
  388. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
  389. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
  390. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
  391. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
  392. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  393. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/scalar.py +0 -0
  394. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/scan.py +0 -0
  395. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/shape.py +0 -0
  396. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  397. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  398. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/sort.py +0 -0
  399. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
  400. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
  401. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
  402. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
  403. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
  404. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  405. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  406. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/typed_list.py +0 -0
  407. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/linker.py +0 -0
  408. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  409. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  410. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  411. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  412. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  413. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  414. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
  415. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
  416. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
  417. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
  418. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
  419. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/math.py +0 -0
  420. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  421. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  422. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  423. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  424. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/linker.py +0 -0
  425. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/utils.py +0 -0
  426. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/vm.py +0 -0
  427. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/__init__.py +0 -0
  428. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/check_blas.py +0 -0
  429. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/check_blas_many.sh +0 -0
  430. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/check_duplicate_key.py +0 -0
  431. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  432. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/elemwise_time_test.py +0 -0
  433. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/frozendict.py +0 -0
  434. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/may_share_memory.py +0 -0
  435. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/ordered_set.py +0 -0
  436. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/pkl_utils.py +0 -0
  437. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/npy_2_compat.py +0 -0
  438. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/printing.py +0 -0
  439. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/py.typed +0 -0
  440. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/raise_op.py +0 -0
  441. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/__init__.py +0 -0
  442. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/basic.py +0 -0
  443. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  444. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  445. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/c_code/gamma.c +0 -0
  446. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/c_code/incbet.c +0 -0
  447. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/loop.py +0 -0
  448. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/sharedvar.py +0 -0
  449. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/__init__.py +0 -0
  450. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/basic.py +0 -0
  451. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/checkpoints.py +0 -0
  452. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/op.py +0 -0
  453. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/__init__.py +0 -0
  454. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/db.py +0 -0
  455. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/inner_graph.py +0 -0
  456. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/inplace.py +0 -0
  457. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/io.py +0 -0
  458. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/merge.py +0 -0
  459. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/push_out.py +0 -0
  460. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/trace.py +0 -0
  461. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/utils.py +0 -0
  462. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/scan_perform.pyx +0 -0
  463. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/scan_perform_ext.py +0 -0
  464. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/utils.py +0 -0
  465. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/views.py +0 -0
  466. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/__init__.py +0 -0
  467. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/basic.py +0 -0
  468. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/linalg.py +0 -0
  469. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/math.py +0 -0
  470. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/rewriting.py +0 -0
  471. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/sharedvar.py +0 -0
  472. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/type.py +0 -0
  473. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/utils.py +0 -0
  474. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/variable.py +0 -0
  475. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/basic.py +0 -0
  476. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/__init__.py +0 -0
  477. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/_core.py +0 -0
  478. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/batched.py +0 -0
  479. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/blas_c.py +0 -0
  480. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/c_code/__init__.py +0 -0
  481. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/c_code/alt_blas_common.h +0 -0
  482. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/c_code/alt_blas_template.c +0 -0
  483. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/c_code/blas_headers.py +0 -0
  484. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/c_code/codegen.py +0 -0
  485. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/gemm.py +0 -0
  486. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/gemv.py +0 -0
  487. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/ger.py +0 -0
  488. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blockwise.py +0 -0
  489. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/einsum.py +0 -0
  490. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/elemwise.py +0 -0
  491. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/elemwise_cgen.py +0 -0
  492. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/exceptions.py +0 -0
  493. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/extra_ops.py +0 -0
  494. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/fft.py +0 -0
  495. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/fourier.py +0 -0
  496. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/functional.py +0 -0
  497. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/interpolate.py +0 -0
  498. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/__init__.py +0 -0
  499. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/_lazy.py +0 -0
  500. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/constructors.py +0 -0
  501. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
  502. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
  503. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
  504. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
  505. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
  506. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
  507. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
  508. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/dtype_utils.py +0 -0
  509. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/inverse.py +0 -0
  510. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/products.py +0 -0
  511. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
  512. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/core.py +0 -0
  513. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/general.py +0 -0
  514. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
  515. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
  516. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/psd.py +0 -0
  517. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
  518. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
  519. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/summary.py +0 -0
  520. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/nlinalg.py +0 -0
  521. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/optimize.py +0 -0
  522. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/pad.py +0 -0
  523. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/__init__.py +0 -0
  524. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/basic.py +0 -0
  525. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/op.py +0 -0
  526. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  527. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/rewriting/basic.py +0 -0
  528. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/rewriting/jax.py +0 -0
  529. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/rewriting/numba.py +0 -0
  530. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/type.py +0 -0
  531. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/utils.py +0 -0
  532. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/variable.py +0 -0
  533. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/reshape.py +0 -0
  534. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/__init__.py +0 -0
  535. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/assumptions.py +0 -0
  536. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/basic.py +0 -0
  537. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/blas.py +0 -0
  538. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/blas_c.py +0 -0
  539. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/blockwise.py +0 -0
  540. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/einsum.py +0 -0
  541. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/elemwise.py +0 -0
  542. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  543. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/fused_elemwise.py +0 -0
  544. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/jax.py +0 -0
  545. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
  546. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
  547. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
  548. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/products.py +0 -0
  549. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
  550. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/summary.py +0 -0
  551. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
  552. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/numba.py +0 -0
  553. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/optimize.py +0 -0
  554. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/reshape.py +0 -0
  555. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/shape.py +0 -0
  556. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  557. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/shape.py +0 -0
  558. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/sharedvar.py +0 -0
  559. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/signal/__init__.py +0 -0
  560. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/signal/conv.py +0 -0
  561. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/slinalg.py +0 -0
  562. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/sort.py +0 -0
  563. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/subtensor.py +0 -0
  564. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/symbolic.py +0 -0
  565. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/type.py +0 -0
  566. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/type_other.py +0 -0
  567. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/var.py +0 -0
  568. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/variable.py +0 -0
  569. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/xlogx.py +0 -0
  570. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/typed_list/__init__.py +0 -0
  571. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/typed_list/basic.py +0 -0
  572. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/typed_list/rewriting.py +0 -0
  573. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/typed_list/type.py +0 -0
  574. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/utils.py +0 -0
  575. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/__init__.py +0 -0
  576. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/basic.py +0 -0
  577. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/indexing.py +0 -0
  578. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/linalg.py +0 -0
  579. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/math.py +0 -0
  580. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/random/__init__.py +0 -0
  581. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/random/basic.py +0 -0
  582. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/random/type.py +0 -0
  583. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/random/variable.py +0 -0
  584. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/reduction.py +0 -0
  585. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/__init__.py +0 -0
  586. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/basic.py +0 -0
  587. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/indexing.py +0 -0
  588. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/math.py +0 -0
  589. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/reduction.py +0 -0
  590. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/shape.py +0 -0
  591. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/utils.py +0 -0
  592. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  593. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/shape.py +0 -0
  594. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/signal.py +0 -0
  595. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/type.py +0 -0
  596. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/vectorization.py +0 -0
  597. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor.egg-info/SOURCES.txt +0 -0
  598. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor.egg-info/dependency_links.txt +0 -0
  599. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor.egg-info/entry_points.txt +0 -0
  600. {pytensor-3.2.2 → pytensor-3.2.4}/pytensor.egg-info/top_level.txt +0 -0
  601. {pytensor-3.2.2 → pytensor-3.2.4}/scripts/mypy-failing.txt +0 -0
  602. {pytensor-3.2.2 → pytensor-3.2.4}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  603. {pytensor-3.2.2 → pytensor-3.2.4}/setup.cfg +0 -0
  604. {pytensor-3.2.2 → pytensor-3.2.4}/setup.py +0 -0
  605. {pytensor-3.2.2 → pytensor-3.2.4}/tests/link/c/c_code/test_cenum.h +0 -0
  606. {pytensor-3.2.2 → pytensor-3.2.4}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  607. {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_basic.py +0 -0
  608. {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_breakpoint.py +0 -0
  609. {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_config.py +0 -0
  610. {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_gradient.py +0 -0
  611. {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_ifelse.py +0 -0
  612. {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_printing.py +0 -0
  613. {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_raise_op.py +0 -0
  614. {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_rop.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 3.2.2
3
+ Version: 3.2.4
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
@@ -30,7 +30,7 @@ License-File: LICENSE.txt
30
30
  Requires-Dist: setuptools>=59.0.0
31
31
  Requires-Dist: scipy<2,>=1
32
32
  Requires-Dist: numpy>=2.0
33
- Requires-Dist: numba<=0.65.1,>=0.58
33
+ Requires-Dist: numba<=0.66.0,>=0.58
34
34
  Requires-Dist: filelock>=3.15
35
35
  Provides-Extra: complete
36
36
  Requires-Dist: pytensor[jax]; extra == "complete"
@@ -56,7 +56,7 @@ Provides-Extra: jax
56
56
  Requires-Dist: jax; extra == "jax"
57
57
  Requires-Dist: jaxlib; extra == "jax"
58
58
  Provides-Extra: numba
59
- Requires-Dist: numba<=0.65.1,>=0.58; extra == "numba"
59
+ Requires-Dist: numba<=0.66.0,>=0.58; extra == "numba"
60
60
  Requires-Dist: llvmlite; extra == "numba"
61
61
  Provides-Extra: kanren
62
62
  Requires-Dist: etuples; extra == "kanren"
@@ -49,7 +49,7 @@ dependencies = [
49
49
  "setuptools>=59.0.0",
50
50
  "scipy>=1,<2",
51
51
  "numpy>=2.0",
52
- "numba>=0.58,<=0.65.1",
52
+ "numba>=0.58,<=0.66.0",
53
53
  "filelock>=3.15",
54
54
  ]
55
55
 
@@ -77,7 +77,7 @@ tests = [
77
77
  ]
78
78
  rtd = ["sphinx>=5.1.0,<6", "pygments", "pydot"]
79
79
  jax = ["jax", "jaxlib"]
80
- numba = ["numba>=0.58,<=0.65.1", "llvmlite"]
80
+ numba = ["numba>=0.58,<=0.66.0", "llvmlite"]
81
81
  kanren = [
82
82
  "etuples",
83
83
  "logical-unification",
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2026-07-19T19:39:04+0200",
11
+ "date": "2026-08-02T00:12:33+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "301ed014903acb2d1ed1a34466819cf22f8a3a2b",
15
- "version": "3.2.2"
14
+ "full-revisionid": "7175f7cadf3934a03f63e6e7b187fa1519e6d85f",
15
+ "version": "3.2.4"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -7,7 +7,7 @@ from pytensor.compile.aliasing import (
7
7
  add_supervisor_to_fgraph,
8
8
  insert_deepcopy,
9
9
  )
10
- from pytensor.compile.builders import OpFromGraph
10
+ from pytensor.compile.builders import OpFromGraph, SymbolicOp
11
11
  from pytensor.compile.io import In, Out
12
12
  from pytensor.compile.mode import optdb
13
13
  from pytensor.graph.basic import Apply, Variable
@@ -134,12 +134,12 @@ def rewrite_ofg_inner_graph(linker, op, node, inner, *, mode):
134
134
  )
135
135
 
136
136
 
137
- def _ofg_inner_optimizer(mode):
138
- # Recognition rewrites fold a pattern into an inner-graph op (e.g.
139
- # ``exp(x) / sum(exp(x))`` -> ``Softmax``, itself an ``OpFromGraph``). Running
140
- # them on an ``OpFromGraph`` inner graph -- which may *be* that pattern --
141
- # would re-create the op inside itself and recurse without end.
142
- return mode.excluding("symbolic_op_recognition").optimizer
137
+ def _ofg_inner_optimizer(mode, op):
138
+ # Recognition would re-create a `SymbolicOp` inside its own inner graph and never
139
+ # terminate. Any other `OpFromGraph` must keep it, or wrapping destabilizes the body.
140
+ if isinstance(op, SymbolicOp):
141
+ return mode.excluding("symbolic_op_recognition").optimizer
142
+ return mode.optimizer
143
143
 
144
144
 
145
145
  @rewrite_ofg_inner_graph.register(VMLinker)
@@ -152,7 +152,7 @@ def destructive_rewrite_ofg_inner_graph(linker, op, node, inner, *, mode):
152
152
  # still be baked between purely internal buffers.
153
153
  input_specs = [In(x, borrow=True, mutable=False) for x in inner.inputs]
154
154
  add_supervisor_to_fgraph(fgraph=inner, input_specs=input_specs, accept_inplace=True)
155
- _ofg_inner_optimizer(mode).rewrite(inner)
155
+ _ofg_inner_optimizer(mode, op).rewrite(inner)
156
156
  # The op's outputs must not alias its inputs or each other (it declares no
157
157
  # view_map, so the outer graph cannot see such aliases); deepcopies break any
158
158
  # boundary alias the optimized graph ends up with.
@@ -165,7 +165,7 @@ def destructive_rewrite_ofg_inner_graph(linker, op, node, inner, *, mode):
165
165
  @rewrite_ofg_inner_graph.register(MLXLinker)
166
166
  def functional_rewrite_ofg_inner_graph(linker, op, node, inner, *, mode):
167
167
  """Structurally optimize the inner graph for the functional JIT backends."""
168
- _ofg_inner_optimizer(mode).rewrite(inner)
168
+ _ofg_inner_optimizer(mode, op).rewrite(inner)
169
169
 
170
170
 
171
171
  @graph_rewriter
@@ -546,10 +546,10 @@ class FullHistory(Feature):
546
546
  └─ ···
547
547
  >> local_softmax_stabilize
548
548
  Log [id A] 1
549
- └─ Softmax{axis=None} [id B] 0
549
+ └─ Softmax{axis=(0,)} [id B] 0
550
550
  └─ x [id C]
551
551
  >> local_logsoftmax
552
- LogSoftmax{axis=None} [id A] 0
552
+ LogSoftmax{axis=(0,)} [id A] 0
553
553
  └─ x [id B]
554
554
 
555
555
 
@@ -563,7 +563,7 @@ class FullHistory(Feature):
563
563
  .. testoutput::
564
564
  >> local_logsoftmax
565
565
  Log [id A] 1
566
- └─ Softmax{axis=None} [id B] 0
566
+ └─ Softmax{axis=(0,)} [id B] 0
567
567
  └─ x [id C]
568
568
  >> local_softmax_stabilize
569
569
  Log [id A] 4
@@ -591,7 +591,7 @@ class FullHistory(Feature):
591
591
 
592
592
  .. testoutput::
593
593
  Log [id A] 1
594
- └─ Softmax{axis=None} [id B] 0
594
+ └─ Softmax{axis=(0,)} [id B] 0
595
595
  └─ x [id C]
596
596
 
597
597
 
@@ -572,7 +572,8 @@ def reify_pattern(pattern, subs: Mapping[PatternVar | Asterisk, Any]):
572
572
  inputs.extend(captured)
573
573
  else:
574
574
  inputs.append(reify_pattern(p, subs))
575
- return op.make_node(*inputs).default_output()
575
+ # Call the Op, so those that build state lazily (SymbolicOp) are constructed
576
+ return op(*inputs)
576
577
 
577
578
  if isinstance(pattern, OpPattern):
578
579
  op_type = pattern.op_type
@@ -263,14 +263,29 @@ def jax_funcify_Erfinv(op, **kwargs):
263
263
 
264
264
 
265
265
  @jax_funcify.register(BetaIncInv)
266
- @jax_funcify.register(Erfcx)
267
- @jax_funcify.register(Erfcinv)
268
266
  def jax_funcify_from_tfp(op, **kwargs):
269
267
  tfp_jax_op = try_import_tfp_jax_op(op)
270
268
 
271
269
  return tfp_jax_op
272
270
 
273
271
 
272
+ @jax_funcify.register(Erfcx)
273
+ def jax_funcify_Erfcx(op, **kwargs):
274
+ if hasattr(jax.scipy.special, "erfcx"):
275
+ return jax.scipy.special.erfcx
276
+ # jax < 0.11 has no native erfcx
277
+ return try_import_tfp_jax_op(op)
278
+
279
+
280
+ @jax_funcify.register(Erfcinv)
281
+ def jax_funcify_Erfcinv(op, **kwargs):
282
+ def erfcinv(x):
283
+ # erfc(z) = 2 ndtr(-z * sqrt(2)), so z = -ndtri(x / 2) / sqrt(2)
284
+ return -jax.scipy.special.ndtri(x / 2) / jnp.sqrt(2)
285
+
286
+ return erfcinv
287
+
288
+
274
289
  @jax_funcify.register(NdtriExp)
275
290
  def jax_funcify_NdtriExp(op, **kwargs):
276
291
  def ndtri_exp(x):
@@ -0,0 +1,64 @@
1
+ import mlx.core as mx
2
+
3
+ from pytensor.link.mlx.dispatch import mlx_funcify
4
+ from pytensor.tensor.blockwise import Blockwise, _check_runtime_broadcast_core
5
+
6
+
7
+ @mlx_funcify.register(Blockwise)
8
+ def funcify_Blockwise(op: Blockwise, node, **kwargs):
9
+ core_node = op._create_dummy_core_node(node.inputs)
10
+ core_f = mlx_funcify(op.core_op, node=core_node)
11
+
12
+ batch_ndim = op.batch_ndim(node)
13
+ if batch_ndim == 0:
14
+ return core_f
15
+
16
+ multi_output = len(node.outputs) > 1
17
+ core_ndims = [len(sig) for sig in op.inputs_sig]
18
+
19
+ # Hoisted out of the per-call path, unlike Blockwise._check_runtime_broadcast.
20
+ batch_bcast = [inp.type.broadcastable[:batch_ndim] for inp in node.inputs]
21
+
22
+ # Decide batching purely from static shapes so a graph batches identically
23
+ # here and in every other backend: a batch axis broadcasts (is never mapped)
24
+ # only when its static size is exactly 1, or the input lacks it entirely.
25
+ squeeze_axes, padded_batch = [], []
26
+ for inp, n_core_dims in zip(node.inputs, core_ndims):
27
+ batch_shape = inp.type.shape[: inp.type.ndim - n_core_dims]
28
+ squeeze_axes.append(tuple(i for i, s in enumerate(batch_shape) if s == 1))
29
+ padded_batch.append((1,) * (batch_ndim - len(batch_shape)) + tuple(batch_shape))
30
+
31
+ # Nest one mx.vmap per mapped batch axis (innermost first, so array axis 0
32
+ # tracks the outermost batch dim). All-broadcast axes are squeezed out of
33
+ # every input above and re-inserted as size-1 dims after the mapped call.
34
+ fn, expand_axes = core_f, []
35
+ for axis in reversed(range(batch_ndim)):
36
+ in_axes = tuple(None if shape[axis] == 1 else 0 for shape in padded_batch)
37
+ if all(ax is None for ax in in_axes):
38
+ expand_axes.append(axis)
39
+ else:
40
+ fn = mx.vmap(fn, in_axes=in_axes)
41
+
42
+ expand_axes.sort()
43
+
44
+ def blockwise(*args):
45
+ # Other backends reject a runtime size-1 batch dim that is not statically
46
+ # broadcastable; match them rather than silently broadcasting here.
47
+ _check_runtime_broadcast_core(args, batch_bcast, batch_ndim)
48
+
49
+ squeezed = [
50
+ mx.squeeze(arg, axes) if axes else arg
51
+ for arg, axes in zip(args, squeeze_axes)
52
+ ]
53
+ out = fn(*squeezed)
54
+ if not expand_axes:
55
+ return tuple(out) if multi_output else out
56
+
57
+ # Re-insert the never-mapped all-broadcast axes as size-1 dims, in
58
+ # ascending order so each insertion's index stays valid for the next.
59
+ outs = out if multi_output else (out,)
60
+ for ax in expand_axes:
61
+ outs = [mx.expand_dims(o, ax) for o in outs]
62
+ return tuple(outs) if multi_output else outs[0]
63
+
64
+ return blockwise
@@ -139,14 +139,15 @@ def mlx_funcify_PivotToPermutations(op, **kwargs):
139
139
  inverse = op.inverse
140
140
 
141
141
  def pivot_to_permutations(pivots):
142
- pivots = mx.array(pivots)
143
- n = pivots.shape[0]
144
- p_inv = mx.arange(n, dtype=mx.int32)
145
- for i in range(n):
146
- p_inv[i], p_inv[pivots[i]] = p_inv[pivots[i]], p_inv[i]
147
- if inverse:
148
- return p_inv
149
- return mx.argsort(p_inv)
142
+ with mx.stream(mx.cpu):
143
+ pivots = mx.array(pivots)
144
+ n = pivots.shape[0]
145
+ p_inv = mx.arange(n, dtype=mx.int32)
146
+ for i in range(n):
147
+ p_inv[i], p_inv[pivots[i]] = p_inv[pivots[i]], p_inv[i]
148
+ if inverse:
149
+ return p_inv
150
+ return mx.argsort(p_inv)
150
151
 
151
152
  return pivot_to_permutations
152
153
 
@@ -0,0 +1,38 @@
1
+ import mlx.core as mx
2
+
3
+ from pytensor.link.mlx.dispatch.basic import mlx_funcify
4
+ from pytensor.tensor.linalg.summary import Det, SLogDet
5
+
6
+
7
+ def _lu_det_parts(x):
8
+ """Compute sign and logdet via LU factorization. Call within a CPU stream context."""
9
+ lu, pivots = mx.linalg.lu_factor(x)
10
+ diag_u = mx.diagonal(lu)
11
+ n_swaps = mx.sum(pivots != mx.arange(pivots.shape[0], dtype=pivots.dtype))
12
+ pivot_sign = 1 - 2 * (n_swaps % 2)
13
+ sign = pivot_sign * mx.prod(mx.sign(diag_u))
14
+ logabsdet = mx.sum(mx.log(mx.abs(diag_u)))
15
+ return sign, logabsdet
16
+
17
+
18
+ @mlx_funcify.register(Det)
19
+ def mlx_funcify_Det(op, node, **kwargs):
20
+ X_dtype = getattr(mx, node.inputs[0].dtype)
21
+
22
+ def det(x):
23
+ with mx.stream(mx.cpu):
24
+ sign, logabsdet = _lu_det_parts(x.astype(dtype=X_dtype))
25
+ return sign * mx.exp(logabsdet)
26
+
27
+ return det
28
+
29
+
30
+ @mlx_funcify.register(SLogDet)
31
+ def mlx_funcify_SLogDet(op, node, **kwargs):
32
+ X_dtype = getattr(mx, node.inputs[0].dtype)
33
+
34
+ def slogdet(x):
35
+ with mx.stream(mx.cpu):
36
+ return _lu_det_parts(x.astype(dtype=X_dtype))
37
+
38
+ return slogdet
@@ -993,7 +993,7 @@ def numba_funcify_FusedElemwise(op, node, **kwargs):
993
993
  def ov_fused_elemwise_fn(*outer_inputs):
994
994
  return impl_fn
995
995
 
996
- cache_version = 3
996
+ cache_version = 4
997
997
  if scalar_cache_key is None:
998
998
  key = None
999
999
  else:
@@ -137,7 +137,7 @@ def numba_core_HalfNormalRV(op, node):
137
137
  def numba_core_CauchyRV(op, node):
138
138
  @numba_basic.numba_njit
139
139
  def random(rng, loc, scale):
140
- return (loc + rng.standard_cauchy()) / scale
140
+ return loc + scale * rng.standard_cauchy()
141
141
 
142
142
  return random
143
143
 
@@ -167,10 +167,20 @@ def _compute_idx_load_axes(indexed_inputs, indexed_outputs, idx_ndims):
167
167
  _, out_axis, _ = entry
168
168
  group_min_axis[root] = min(group_min_axis.get(root, out_axis), out_axis)
169
169
 
170
- return tuple(
171
- tuple(range(group_min_axis[find(k)], group_min_axis[find(k)] + idx_ndims[k]))
172
- for k in range(n_indices)
173
- )
170
+ # Indices in a group broadcast together right-aligned (NumPy semantics), so
171
+ # a lower-ndim index occupies the trailing loop dims of the group's span,
172
+ # whose width is the max ndim across the group.
173
+ group_max_ndim: dict[int, int] = {}
174
+ for k in range(n_indices):
175
+ root = find(k)
176
+ group_max_ndim[root] = max(group_max_ndim.get(root, 0), idx_ndims[k])
177
+
178
+ load_axes = []
179
+ for k in range(n_indices):
180
+ root = find(k)
181
+ end = group_min_axis[root] + group_max_ndim[root]
182
+ load_axes.append(tuple(range(end - idx_ndims[k], end)))
183
+ return tuple(load_axes)
174
184
 
175
185
 
176
186
  def _core_slice_layout(full_layout, batch_bc_pattern):
@@ -298,6 +298,9 @@ class NdtriExp(UnaryScalarOp):
298
298
  cst = np.asarray(np.sqrt(2 * np.pi), dtype=gz.type.dtype)
299
299
  return (gz * cst * exp(x + z**2 / 2),)
300
300
 
301
+ def c_code(self, *args, **kwargs):
302
+ raise NotImplementedError()
303
+
301
304
 
302
305
  ndtri_exp = NdtriExp(upgrade_to_float_no_complex, name="ndtri_exp")
303
306
 
@@ -126,6 +126,10 @@ from pytensor.tensor.interpolate import interp, interpolate1d
126
126
  from pytensor.tensor.math import *
127
127
  from pytensor.tensor.pad import pad
128
128
 
129
+ # Kept in the top-level namespace for backwards compatibility; the rest of
130
+ # `pytensor.tensor.special` is only reachable as `pt.special.*`
131
+ from pytensor.tensor.special import logaddexp, logsumexp
132
+
129
133
 
130
134
  # isort: off
131
135
  # reshape needs to be imported before shape.reshape, otherwise the tensor.reshape imports fail
@@ -3891,53 +3891,6 @@ def power(x, y):
3891
3891
  return x**y
3892
3892
 
3893
3893
 
3894
- def logaddexp(*xs):
3895
- """Logarithm of the sum of exponentiations of the inputs.
3896
-
3897
- See ``numpy.logaddexp``.
3898
-
3899
- Parameters
3900
- ----------
3901
- xs : symbolic tensors
3902
- Input
3903
-
3904
- Returns
3905
- -------
3906
- TensorVariable
3907
-
3908
- """
3909
-
3910
- return log(add(*[exp(x) for x in xs]))
3911
-
3912
-
3913
- def logsumexp(x, axis=None, keepdims=False):
3914
- """Compute the log of the sum of exponentials of input elements.
3915
-
3916
- See ``scipy.special.logsumexp``.
3917
-
3918
- Parameters
3919
- ----------
3920
- x : symbolic tensor
3921
- Input
3922
-
3923
- axis : None or int or tuple of ints, optional
3924
- Axis or axes over which the sum is taken. By default axis is None,
3925
- and all elements are summed.
3926
-
3927
- keepdims : bool, optional
3928
- If this is set to True, the axes which are reduced are left in the
3929
- result as dimensions with size one. With this option, the result will
3930
- broadcast correctly against the original array.
3931
-
3932
- Returns
3933
- -------
3934
- TensorVariable
3935
-
3936
- """
3937
-
3938
- return log(sum(exp(x), axis=axis, keepdims=keepdims))
3939
-
3940
-
3941
3894
  _matmul = Blockwise(_dot, name="Matmul")
3942
3895
 
3943
3896
 
@@ -4321,8 +4274,6 @@ __all__ = [
4321
4274
  "log1pexp",
4322
4275
  "log2",
4323
4276
  "log10",
4324
- "logaddexp",
4325
- "logsumexp",
4326
4277
  "lt",
4327
4278
  "matmul",
4328
4279
  "matvec",
@@ -71,7 +71,6 @@ from pytensor.tensor.math import (
71
71
  expm1,
72
72
  ge,
73
73
  int_div,
74
- isinf,
75
74
  ive,
76
75
  kve,
77
76
  le,
@@ -79,8 +78,6 @@ from pytensor.tensor.math import (
79
78
  log1mexp,
80
79
  log1p,
81
80
  log1pexp,
82
- makeKeepDims,
83
- maximum,
84
81
  mul,
85
82
  neg,
86
83
  polygamma,
@@ -100,9 +97,7 @@ from pytensor.tensor.math import (
100
97
  variadic_mul,
101
98
  )
102
99
  from pytensor.tensor.math import abs as pt_abs
103
- from pytensor.tensor.math import max as pt_max
104
100
  from pytensor.tensor.math import pow as pt_pow
105
- from pytensor.tensor.math import sum as pt_sum
106
101
  from pytensor.tensor.rewriting.basic import (
107
102
  broadcast_like_elemwise,
108
103
  local_second_sink,
@@ -2813,87 +2808,6 @@ def local_log1p(fgraph, node):
2813
2808
  return [broadcast_like_elemwise(new_out, node, fgraph=fgraph, stack_trace=True)]
2814
2809
 
2815
2810
 
2816
- @register_stabilize("fast_compile")
2817
- @register_specialize
2818
- @node_rewriter([log])
2819
- def local_log_add_exp(fgraph, node):
2820
- """
2821
- ``log(exp(x)+exp(y)+exp(z)) = max + log(x-max, y-max, z-max)``
2822
-
2823
- TODO: in canonicalize, change log10 and log2 -> log
2824
- """
2825
-
2826
- z = node.inputs[0]
2827
- if z.owner and z.owner.op == add:
2828
- zi = z.owner.inputs
2829
- pre_exp = [x.owner.inputs[0] for x in zi if x.owner and x.owner.op == exp]
2830
- # all arguments to add are exp(<something>)
2831
- if len(pre_exp) == len(zi):
2832
- # Do not offset when max_pre = -np.inf, to avoid nan in the output
2833
- # Switch statement is placed directly inside add to break the self-symmetry
2834
- # of the returned output (otherwise the rewrite would not stabilize)
2835
- max_pre = reduce(maximum, pre_exp)
2836
- ret = max_pre + log(
2837
- add(
2838
- *[
2839
- switch(isinf(max_pre), exp(max_pre), exp(p - max_pre))
2840
- for p in pre_exp
2841
- ]
2842
- )
2843
- )
2844
- return [ret]
2845
-
2846
-
2847
- @register_stabilize("fast_compile")
2848
- @register_specialize
2849
- @node_rewriter([log])
2850
- def local_log_sum_exp(fgraph, node):
2851
- # log(sum_i(exp(x_i))) = x_max + log(sum_i(exp(x_i - x_max)))
2852
-
2853
- sum_node = node.inputs[0].owner
2854
- # If the sum has keepdims=True, there might be a dimshuffle
2855
- if sum_node and isinstance(sum_node.op, DimShuffle):
2856
- dimshuffle_op = sum_node.op
2857
- sum_node = sum_node.inputs[0].owner
2858
- else:
2859
- dimshuffle_op = None
2860
-
2861
- if not (sum_node and isinstance(sum_node.op, Sum)):
2862
- return
2863
-
2864
- exp_node, axis = sum_node.inputs[0].owner, sum_node.op.axis
2865
- if not (
2866
- exp_node
2867
- and isinstance(exp_node.op, Elemwise)
2868
- and isinstance(exp_node.op.scalar_op, ps.Exp)
2869
- ):
2870
- return
2871
-
2872
- pre_exp = exp_node.inputs[0]
2873
- max_pre_exp = pt_max(pre_exp, axis=axis)
2874
- max_pre_exp_keepdims = makeKeepDims(pre_exp, max_pre_exp, axis)
2875
-
2876
- # Do not offset when max_pre = -np.inf, to avoid nan in the output
2877
- # Switch statement is placed directly inside sum to break the self-symmetry
2878
- # of the returned output (otherwise the rewrite would not stabilize)
2879
- ret = max_pre_exp + log(
2880
- pt_sum(
2881
- switch(
2882
- isinf(max_pre_exp_keepdims),
2883
- exp(max_pre_exp_keepdims),
2884
- exp(pre_exp - max_pre_exp_keepdims),
2885
- ),
2886
- axis=axis,
2887
- ),
2888
- )
2889
-
2890
- # Restore the dimshuffle op, if any.
2891
- if dimshuffle_op:
2892
- ret = dimshuffle_op(ret)
2893
-
2894
- return [ret]
2895
-
2896
-
2897
2811
  def add_calculate(num, denum, aslist=False, out_type=None):
2898
2812
  # TODO: make sure that this function and mul_calculate are similar
2899
2813
  if out_type is None:
@@ -2,11 +2,11 @@ from pytensor.compile.rewriting import inline_ofg_node
2
2
  from pytensor.graph import node_rewriter
3
3
  from pytensor.tensor.basic import AllocDiag
4
4
  from pytensor.tensor.rewriting.basic import register_specialize
5
- from pytensor.tensor.special import XLog1PY, XLogY
5
+ from pytensor.tensor.special import LogAddExp, LogSumExp, XLog1PY, XLogY
6
6
 
7
7
 
8
8
  @register_specialize("inline_ofg")
9
- @node_rewriter([AllocDiag, XLogY, XLog1PY])
9
+ @node_rewriter([AllocDiag, XLogY, XLog1PY, LogSumExp, LogAddExp])
10
10
  def late_inline_OpFromGraph(fgraph, node):
11
11
  """
12
12
  Inline `OpFromGraph` nodes.