pytensor 3.3.2__tar.gz → 3.3.3__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 (625) hide show
  1. {pytensor-3.3.2/pytensor.egg-info → pytensor-3.3.3}/PKG-INFO +1 -1
  2. {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/introduction/pytensor_intro.ipynb +2 -2
  3. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/prng.rst +1 -1
  4. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/_version.py +3 -3
  5. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/tensor_basic.py +8 -0
  6. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/linker.py +2 -2
  7. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/ops.py +37 -7
  8. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/blockwise.py +24 -0
  9. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/decomposition.py +10 -4
  10. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/inverse.py +2 -0
  11. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/solvers.py +25 -6
  12. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/summary.py +6 -4
  13. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/pad.py +20 -2
  14. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/shape.py +15 -3
  15. pytensor-3.3.3/pytensor/link/mlx/dispatch/sort.py +52 -0
  16. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/subtensor.py +21 -3
  17. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/tensor_basic.py +22 -21
  18. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/basic.py +7 -1
  19. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/linker.py +2 -2
  20. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/numba.py +2 -2
  21. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/variable.py +2 -1
  22. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/summary.py +1 -1
  23. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/random/variable.py +1 -1
  24. {pytensor-3.3.2 → pytensor-3.3.3/pytensor.egg-info}/PKG-INFO +1 -1
  25. pytensor-3.3.2/pytensor/link/mlx/dispatch/sort.py +0 -38
  26. {pytensor-3.3.2 → pytensor-3.3.3}/LICENSE.txt +0 -0
  27. {pytensor-3.3.2 → pytensor-3.3.3}/MANIFEST.in +0 -0
  28. {pytensor-3.3.2 → pytensor-3.3.3}/README.rst +0 -0
  29. {pytensor-3.3.2 → pytensor-3.3.3}/doc/.templates/PLACEHOLDER +0 -0
  30. {pytensor-3.3.2 → pytensor-3.3.3}/doc/.templates/layout.html +0 -0
  31. {pytensor-3.3.2 → pytensor-3.3.3}/doc/.templates/nb-badges.html +0 -0
  32. {pytensor-3.3.2 → pytensor-3.3.3}/doc/.templates/rendered_citation.html +0 -0
  33. {pytensor-3.3.2 → pytensor-3.3.3}/doc/LICENSE.txt +0 -0
  34. {pytensor-3.3.2 → pytensor-3.3.3}/doc/README.md +0 -0
  35. {pytensor-3.3.2 → pytensor-3.3.3}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  36. {pytensor-3.3.2 → pytensor-3.3.3}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  37. {pytensor-3.3.2 → pytensor-3.3.3}/doc/acknowledgement.rst +0 -0
  38. {pytensor-3.3.2 → pytensor-3.3.3}/doc/bcast.png +0 -0
  39. {pytensor-3.3.2 → pytensor-3.3.3}/doc/bcast.svg +0 -0
  40. {pytensor-3.3.2 → pytensor-3.3.3}/doc/blog.md +0 -0
  41. {pytensor-3.3.2 → pytensor-3.3.3}/doc/conf.py +0 -0
  42. {pytensor-3.3.2 → pytensor-3.3.3}/doc/core_development_guide.rst +0 -0
  43. {pytensor-3.3.2 → pytensor-3.3.3}/doc/css.inc +0 -0
  44. {pytensor-3.3.2 → pytensor-3.3.3}/doc/dev_start_guide.rst +0 -0
  45. {pytensor-3.3.2 → pytensor-3.3.3}/doc/environment.yml +0 -0
  46. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/apply.png +0 -0
  47. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/apply.svg +0 -0
  48. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/apply2.svg +0 -0
  49. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/creating_a_c_op.rst +0 -0
  50. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  51. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/creating_an_op.rst +0 -0
  52. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/ctype.rst +0 -0
  53. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/extending_faq.rst +0 -0
  54. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/extending_pytensor_solution_1.py +0 -0
  55. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/graph_rewriting.rst +0 -0
  56. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/graphstructures.rst +0 -0
  57. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/index.rst +0 -0
  58. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/inplace.rst +0 -0
  59. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/op.rst +0 -0
  60. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/other_ops.rst +0 -0
  61. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  62. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  63. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/pipeline.rst +0 -0
  64. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/scan.rst +0 -0
  65. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/tips.rst +0 -0
  66. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/type.rst +0 -0
  67. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/unification_kanren.rst +0 -0
  68. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/unittest.rst +0 -0
  69. {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/using_params.rst +0 -0
  70. {pytensor-3.3.2 → pytensor-3.3.3}/doc/faq.rst +0 -0
  71. {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  72. {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/applications/tiny_transformer_llm.ipynb +0 -0
  73. {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
  74. {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/optimize/root.ipynb +0 -0
  75. {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/page_footer.md +0 -0
  76. {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  77. {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  78. {pytensor-3.3.2 → pytensor-3.3.3}/doc/generate_dtype_tensor_table.py +0 -0
  79. {pytensor-3.3.2 → pytensor-3.3.3}/doc/glossary.rst +0 -0
  80. {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/Elman_srnn.png +0 -0
  81. {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/PyTensor.png +0 -0
  82. {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/PyTensor_RGB.svg +0 -0
  83. {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/PyTensor_logo.png +0 -0
  84. {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/binder.svg +0 -0
  85. {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/blocksparse.png +0 -0
  86. {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/colab.svg +0 -0
  87. {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/github.svg +0 -0
  88. {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/lstm.png +0 -0
  89. {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/lstm_memorycell.png +0 -0
  90. {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/talk2010.gif +0 -0
  91. {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/talk2010.png +0 -0
  92. {pytensor-3.3.2 → pytensor-3.3.3}/doc/index.rst +0 -0
  93. {pytensor-3.3.2 → pytensor-3.3.3}/doc/install.rst +0 -0
  94. {pytensor-3.3.2 → pytensor-3.3.3}/doc/internal/how_to_release.rst +0 -0
  95. {pytensor-3.3.2 → pytensor-3.3.3}/doc/internal/index.rst +0 -0
  96. {pytensor-3.3.2 → pytensor-3.3.3}/doc/internal/metadocumentation.rst +0 -0
  97. {pytensor-3.3.2 → pytensor-3.3.3}/doc/introduction.rst +0 -0
  98. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/debugmode.rst +0 -0
  99. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/function.rst +0 -0
  100. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/index.rst +0 -0
  101. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/io.rst +0 -0
  102. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/mode.rst +0 -0
  103. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/nanguardmode.rst +0 -0
  104. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/opfromgraph.rst +0 -0
  105. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/ops.rst +0 -0
  106. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/profilemode.rst +0 -0
  107. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/shared.rst +0 -0
  108. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/config.rst +0 -0
  109. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  110. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  111. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  112. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  113. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  114. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  115. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  116. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp.html +0 -0
  117. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp.png +0 -0
  118. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp2.html +0 -0
  119. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  120. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp2.png +0 -0
  121. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/ofg.html +0 -0
  122. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/ofg2.html +0 -0
  123. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/index.ipynb +0 -0
  124. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/index.rst +0 -0
  125. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  126. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  127. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  128. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  129. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/features.rst +0 -0
  130. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/fgraph.rst +0 -0
  131. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/graph.rst +0 -0
  132. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/index.rst +0 -0
  133. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/op.rst +0 -0
  134. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/replace.rst +0 -0
  135. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/traversal.rst +0 -0
  136. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/type.rst +0 -0
  137. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/utils.rst +0 -0
  138. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/index.rst +0 -0
  139. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/misc/pkl_utils.rst +0 -0
  140. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/printing.rst +0 -0
  141. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/scalar/index.rst +0 -0
  142. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/scan.rst +0 -0
  143. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/sparse/index.rst +0 -0
  144. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/sparse/sandbox.rst +0 -0
  145. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/basic.rst +0 -0
  146. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/basic_opt.rst +0 -0
  147. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/bcast.png +0 -0
  148. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/bcast.svg +0 -0
  149. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/elemwise.rst +0 -0
  150. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/extra_ops.rst +0 -0
  151. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/fft.rst +0 -0
  152. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/functional.rst +0 -0
  153. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/index.rst +0 -0
  154. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/io.rst +0 -0
  155. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/linalg.rst +0 -0
  156. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/math_opt.rst +0 -0
  157. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/nlinalg.rst +0 -0
  158. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/optimize.rst +0 -0
  159. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/plot_fft.png +0 -0
  160. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/random.rst +0 -0
  161. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/slinalg.rst +0 -0
  162. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/utils.rst +0 -0
  163. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/typed_list.rst +0 -0
  164. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/index.md +0 -0
  165. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/linalg.md +0 -0
  166. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/math.md +0 -0
  167. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/module_functions.md +0 -0
  168. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/random.md +0 -0
  169. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/signal.md +0 -0
  170. {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/type.md +0 -0
  171. {pytensor-3.3.2 → pytensor-3.3.3}/doc/links.rst +0 -0
  172. {pytensor-3.3.2 → pytensor-3.3.3}/doc/optimizations.rst +0 -0
  173. {pytensor-3.3.2 → pytensor-3.3.3}/doc/pylintrc +0 -0
  174. {pytensor-3.3.2 → pytensor-3.3.3}/doc/robots.txt +0 -0
  175. {pytensor-3.3.2 → pytensor-3.3.3}/doc/troubleshooting.rst +0 -0
  176. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/adding.rst +0 -0
  177. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/adding_solution_1.py +0 -0
  178. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/aliasing.rst +0 -0
  179. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/apply.png +0 -0
  180. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/apply.svg +0 -0
  181. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/bcast.png +0 -0
  182. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/broadcasting.rst +0 -0
  183. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/conditions.rst +0 -0
  184. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/debug_faq.rst +0 -0
  185. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/dlogistic.png +0 -0
  186. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/examples.rst +0 -0
  187. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/faq_tutorial.rst +0 -0
  188. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/gradients.rst +0 -0
  189. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/index.rst +0 -0
  190. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/loading_and_saving.rst +0 -0
  191. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/logistic.gp +0 -0
  192. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/logistic.png +0 -0
  193. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/loop.rst +0 -0
  194. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/loop_solution_1.py +0 -0
  195. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/modes.rst +0 -0
  196. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/modes_solution_1.py +0 -0
  197. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/multi_cores.rst +0 -0
  198. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/nan_tutorial.rst +0 -0
  199. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/pics/d3viz.png +0 -0
  200. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  201. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  202. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  203. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/printing_drawing.rst +0 -0
  204. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/profiling.rst +0 -0
  205. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/profiling_example.py +0 -0
  206. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/profiling_example_out.prof +0 -0
  207. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/shape_info.rst +0 -0
  208. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/sparse.rst +0 -0
  209. {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/symbolic_graphs.rst +0 -0
  210. {pytensor-3.3.2 → pytensor-3.3.3}/doc/user_guide.rst +0 -0
  211. {pytensor-3.3.2 → pytensor-3.3.3}/pyproject.toml +0 -0
  212. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/__init__.py +0 -0
  213. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/_sparse_lazy.py +0 -0
  214. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/__init__.py +0 -0
  215. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/alloc.py +0 -0
  216. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/blockwise.py +0 -0
  217. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/core.py +0 -0
  218. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/diagonal.py +0 -0
  219. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/dimshuffle.py +0 -0
  220. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/dot.py +0 -0
  221. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/elemwise.py +0 -0
  222. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/orthogonal.py +0 -0
  223. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/permutation.py +0 -0
  224. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/positive_definite.py +0 -0
  225. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/reshape.py +0 -0
  226. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/selection.py +0 -0
  227. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/shape.py +0 -0
  228. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/specify.py +0 -0
  229. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/subtensor.py +0 -0
  230. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/symmetric.py +0 -0
  231. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/triangular.py +0 -0
  232. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/basic.py +0 -0
  233. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/bin/__init__.py +0 -0
  234. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/bin/pytensor_cache.py +0 -0
  235. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/breakpoint.py +0 -0
  236. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/__init__.py +0 -0
  237. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/aliasing.py +0 -0
  238. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/builders.py +0 -0
  239. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/compiledir.py +0 -0
  240. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/compilelock.py +0 -0
  241. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/debug/__init__.py +0 -0
  242. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/debug/debugmode.py +0 -0
  243. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/debug/dump.py +0 -0
  244. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/debug/monitormode.py +0 -0
  245. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/debug/nanguardmode.py +0 -0
  246. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/debug/profiling.py +0 -0
  247. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/executor.py +0 -0
  248. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/inner_function.py +0 -0
  249. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/io.py +0 -0
  250. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/maker.py +0 -0
  251. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/mode.py +0 -0
  252. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/ops.py +0 -0
  253. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/rebuild.py +0 -0
  254. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/rewriting.py +0 -0
  255. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/sharedvalue.py +0 -0
  256. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/configdefaults.py +0 -0
  257. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/configparser.py +0 -0
  258. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/__init__.py +0 -0
  259. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  260. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/css/d3viz.css +0 -0
  261. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/d3viz.py +0 -0
  262. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/formatting.py +0 -0
  263. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/html/template.html +0 -0
  264. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  265. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  266. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/js/d3viz.js +0 -0
  267. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  268. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  269. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/gradient.py +0 -0
  270. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/__init__.py +0 -0
  271. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/basic.py +0 -0
  272. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/destroyhandler.py +0 -0
  273. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/features.py +0 -0
  274. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/fg.py +0 -0
  275. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/null_type.py +0 -0
  276. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/op.py +0 -0
  277. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/replace.py +0 -0
  278. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/__init__.py +0 -0
  279. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/basic.py +0 -0
  280. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/db.py +0 -0
  281. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/kanren.py +0 -0
  282. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/reachability.py +0 -0
  283. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/unify.py +0 -0
  284. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/utils.py +0 -0
  285. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/traversal.py +0 -0
  286. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/type.py +0 -0
  287. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/utils.py +0 -0
  288. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/ifelse.py +0 -0
  289. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/ipython.py +0 -0
  290. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/__init__.py +0 -0
  291. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/basic.py +0 -0
  292. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/__init__.py +0 -0
  293. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/basic.py +0 -0
  294. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  295. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  296. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/cmodule.py +0 -0
  297. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/cutils.py +0 -0
  298. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/cvm.py +0 -0
  299. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/exceptions.py +0 -0
  300. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/interface.py +0 -0
  301. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/lazylinker_c.py +0 -0
  302. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/op.py +0 -0
  303. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/params_type.py +0 -0
  304. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/type.py +0 -0
  305. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/__init__.py +0 -0
  306. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/__init__.py +0 -0
  307. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/basic.py +0 -0
  308. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/blas.py +0 -0
  309. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  310. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/einsum.py +0 -0
  311. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  312. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  313. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
  314. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
  315. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
  316. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
  317. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
  318. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
  319. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
  320. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/math.py +0 -0
  321. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/pad.py +0 -0
  322. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/random.py +0 -0
  323. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/scalar.py +0 -0
  324. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/scan.py +0 -0
  325. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/shape.py +0 -0
  326. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  327. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  328. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/sort.py +0 -0
  329. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/sparse.py +0 -0
  330. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  331. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/__init__.py +0 -0
  332. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/__init__.py +0 -0
  333. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/basic.py +0 -0
  334. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/blas.py +0 -0
  335. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/einsum.py +0 -0
  336. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
  337. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
  338. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
  339. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
  340. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/math.py +0 -0
  341. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/random.py +0 -0
  342. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/__init__.py +0 -0
  343. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/basic.py +0 -0
  344. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/bessel.py +0 -0
  345. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/beta.py +0 -0
  346. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/erf.py +0 -0
  347. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/erfcinv.py +0 -0
  348. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/gamma.py +0 -0
  349. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/gammainc.py +0 -0
  350. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/helpers.py +0 -0
  351. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/math.py +0 -0
  352. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  353. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  354. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/linker.py +0 -0
  355. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/__init__.py +0 -0
  356. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/cache.py +0 -0
  357. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/__init__.py +0 -0
  358. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/_llvmlite_self_ref.py +0 -0
  359. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/_patch_list_to_tuple.py +0 -0
  360. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/_patch_pointer_add.py +0 -0
  361. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/basic.py +0 -0
  362. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  363. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
  364. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  365. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/elemwise.py +0 -0
  366. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  367. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/_BLAS.py +0 -0
  368. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
  369. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  370. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
  371. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  372. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  373. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
  374. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
  375. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
  376. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  377. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -0
  378. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
  379. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
  380. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
  381. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
  382. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
  383. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
  384. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
  385. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
  386. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
  387. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
  388. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
  389. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
  390. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
  391. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
  392. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
  393. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
  394. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
  395. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
  396. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  397. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/random.py +0 -0
  398. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/scalar.py +0 -0
  399. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/scan.py +0 -0
  400. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/shape.py +0 -0
  401. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  402. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  403. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sort.py +0 -0
  404. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
  405. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
  406. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
  407. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
  408. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
  409. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  410. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  411. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/typed_list.py +0 -0
  412. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  413. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/linker.py +0 -0
  414. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  415. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  416. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  417. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  418. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  419. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
  420. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
  421. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
  422. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
  423. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
  424. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/math.py +0 -0
  425. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  426. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  427. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  428. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  429. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/utils.py +0 -0
  430. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/vm.py +0 -0
  431. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/__init__.py +0 -0
  432. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/check_blas.py +0 -0
  433. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/check_blas_many.sh +0 -0
  434. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/check_duplicate_key.py +0 -0
  435. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  436. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/elemwise_time_test.py +0 -0
  437. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/frozendict.py +0 -0
  438. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/may_share_memory.py +0 -0
  439. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/ordered_set.py +0 -0
  440. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/pkl_utils.py +0 -0
  441. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/npy_2_compat.py +0 -0
  442. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/printing.py +0 -0
  443. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/py.typed +0 -0
  444. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/raise_op.py +0 -0
  445. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/__init__.py +0 -0
  446. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/basic.py +0 -0
  447. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  448. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  449. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/c_code/gamma.c +0 -0
  450. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/c_code/incbet.c +0 -0
  451. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/loop.py +0 -0
  452. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/math.py +0 -0
  453. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/sharedvar.py +0 -0
  454. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/__init__.py +0 -0
  455. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/basic.py +0 -0
  456. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/checkpoints.py +0 -0
  457. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/op.py +0 -0
  458. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/__init__.py +0 -0
  459. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/db.py +0 -0
  460. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/inner_graph.py +0 -0
  461. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/inplace.py +0 -0
  462. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/io.py +0 -0
  463. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/merge.py +0 -0
  464. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/push_out.py +0 -0
  465. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/trace.py +0 -0
  466. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/utils.py +0 -0
  467. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/scan_perform.pyx +0 -0
  468. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/scan_perform_ext.py +0 -0
  469. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/utils.py +0 -0
  470. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/views.py +0 -0
  471. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/__init__.py +0 -0
  472. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/basic.py +0 -0
  473. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/linalg.py +0 -0
  474. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/math.py +0 -0
  475. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/rewriting.py +0 -0
  476. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/sharedvar.py +0 -0
  477. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/type.py +0 -0
  478. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/utils.py +0 -0
  479. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/variable.py +0 -0
  480. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/__init__.py +0 -0
  481. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/basic.py +0 -0
  482. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/__init__.py +0 -0
  483. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/_core.py +0 -0
  484. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/batched.py +0 -0
  485. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/blas_c.py +0 -0
  486. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/__init__.py +0 -0
  487. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/alt_blas_common.h +0 -0
  488. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/alt_blas_template.c +0 -0
  489. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/blas_headers.py +0 -0
  490. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/codegen.py +0 -0
  491. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/gemm.py +0 -0
  492. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/gemv.py +0 -0
  493. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/ger.py +0 -0
  494. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blockwise.py +0 -0
  495. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/einsum.py +0 -0
  496. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/elemwise.py +0 -0
  497. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/elemwise_cgen.py +0 -0
  498. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/exceptions.py +0 -0
  499. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/extra_ops.py +0 -0
  500. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/fft.py +0 -0
  501. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/fourier.py +0 -0
  502. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/functional.py +0 -0
  503. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/interpolate.py +0 -0
  504. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/__init__.py +0 -0
  505. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/_lazy.py +0 -0
  506. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/constructors.py +0 -0
  507. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
  508. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
  509. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
  510. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
  511. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
  512. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
  513. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
  514. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/dtype_utils.py +0 -0
  515. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/inverse.py +0 -0
  516. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/products.py +0 -0
  517. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
  518. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/core.py +0 -0
  519. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/general.py +0 -0
  520. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
  521. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
  522. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/psd.py +0 -0
  523. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
  524. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
  525. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/summary.py +0 -0
  526. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/math.py +0 -0
  527. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/nlinalg.py +0 -0
  528. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/optimize.py +0 -0
  529. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/pad.py +0 -0
  530. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/__init__.py +0 -0
  531. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/basic.py +0 -0
  532. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/op.py +0 -0
  533. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  534. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/basic.py +0 -0
  535. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/jax.py +0 -0
  536. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/type.py +0 -0
  537. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/utils.py +0 -0
  538. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/reshape.py +0 -0
  539. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/__init__.py +0 -0
  540. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/assumptions.py +0 -0
  541. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/basic.py +0 -0
  542. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/blas.py +0 -0
  543. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/blas_c.py +0 -0
  544. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/blockwise.py +0 -0
  545. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/einsum.py +0 -0
  546. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/elemwise.py +0 -0
  547. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  548. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/fused_elemwise.py +0 -0
  549. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/jax.py +0 -0
  550. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
  551. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
  552. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
  553. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/products.py +0 -0
  554. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
  555. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
  556. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/math.py +0 -0
  557. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/numba.py +0 -0
  558. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/ofg.py +0 -0
  559. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/optimize.py +0 -0
  560. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/reshape.py +0 -0
  561. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/shape.py +0 -0
  562. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/special.py +0 -0
  563. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/subtensor.py +0 -0
  564. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
  565. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  566. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/shape.py +0 -0
  567. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/sharedvar.py +0 -0
  568. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/signal/__init__.py +0 -0
  569. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/signal/conv.py +0 -0
  570. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/slinalg.py +0 -0
  571. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/sort.py +0 -0
  572. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/special.py +0 -0
  573. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/subtensor.py +0 -0
  574. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/symbolic.py +0 -0
  575. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/type.py +0 -0
  576. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/type_other.py +0 -0
  577. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/utils.py +0 -0
  578. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/var.py +0 -0
  579. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/variable.py +0 -0
  580. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/xlogx.py +0 -0
  581. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/typed_list/__init__.py +0 -0
  582. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/typed_list/basic.py +0 -0
  583. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/typed_list/rewriting.py +0 -0
  584. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/typed_list/type.py +0 -0
  585. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/utils.py +0 -0
  586. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/__init__.py +0 -0
  587. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/basic.py +0 -0
  588. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/indexing.py +0 -0
  589. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/linalg.py +0 -0
  590. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/math.py +0 -0
  591. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/random/__init__.py +0 -0
  592. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/random/basic.py +0 -0
  593. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/random/type.py +0 -0
  594. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/reduction.py +0 -0
  595. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/__init__.py +0 -0
  596. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/basic.py +0 -0
  597. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/indexing.py +0 -0
  598. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/math.py +0 -0
  599. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/reduction.py +0 -0
  600. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/shape.py +0 -0
  601. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/utils.py +0 -0
  602. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  603. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/shape.py +0 -0
  604. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/signal.py +0 -0
  605. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/type.py +0 -0
  606. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/vectorization.py +0 -0
  607. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor.egg-info/SOURCES.txt +0 -0
  608. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor.egg-info/dependency_links.txt +0 -0
  609. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor.egg-info/entry_points.txt +0 -0
  610. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor.egg-info/requires.txt +0 -0
  611. {pytensor-3.3.2 → pytensor-3.3.3}/pytensor.egg-info/top_level.txt +0 -0
  612. {pytensor-3.3.2 → pytensor-3.3.3}/scripts/mypy-failing.txt +0 -0
  613. {pytensor-3.3.2 → pytensor-3.3.3}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  614. {pytensor-3.3.2 → pytensor-3.3.3}/setup.cfg +0 -0
  615. {pytensor-3.3.2 → pytensor-3.3.3}/setup.py +0 -0
  616. {pytensor-3.3.2 → pytensor-3.3.3}/tests/link/c/c_code/test_cenum.h +0 -0
  617. {pytensor-3.3.2 → pytensor-3.3.3}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  618. {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_basic.py +0 -0
  619. {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_breakpoint.py +0 -0
  620. {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_config.py +0 -0
  621. {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_gradient.py +0 -0
  622. {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_ifelse.py +0 -0
  623. {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_printing.py +0 -0
  624. {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_raise_op.py +0 -0
  625. {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_rop.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 3.3.2
3
+ Version: 3.3.3
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
@@ -877,7 +877,7 @@
877
877
  "text": [
878
878
  "Exp [id A]\n",
879
879
  " └─ normal_rv{\"(),()->()\"}.1 [id B]\n",
880
- " ├─ RNG(<Generator(PCG64) at 0x12C30BAE0>) [id C]\n",
880
+ " ├─ RNG(Generator(PCG64)) [id C]\n",
881
881
  " ├─ [10] [id D]\n",
882
882
  " ├─ ExpandDims{axis=0} [id E]\n",
883
883
  " │ └─ 0 [id F]\n",
@@ -1495,7 +1495,7 @@
1495
1495
  "output_type": "stream",
1496
1496
  "text": [
1497
1497
  "normal_rv{\"(),()->()\"}.1 [id A] 'z'\n",
1498
- " ├─ RNG(<Generator(PCG64) at 0x136F5DC40>) [id B]\n",
1498
+ " ├─ RNG(Generator(PCG64)) [id B]\n",
1499
1499
  " ├─ NoneConst{None} [id C]\n",
1500
1500
  " ├─ [0 0] [id D]\n",
1501
1501
  " └─ [1 2] [id E]\n"
@@ -568,7 +568,7 @@ In general, update rules are still respected, but they won't update/rely on the
568
568
  >>> jax_fn = pytensor.function([], [x], updates={rng: next_rng}, mode="JAX")
569
569
  >>> _ = pytensor.dprint(jax_fn, print_type=True) # doctest: +ELLIPSIS
570
570
  uniform_rv{"(),()->()"}.1 [id A] <Scalar(float64, shape=())> 0
571
- ├─ RNG(<Generator(PCG64) at 0x...>) [id B] <RandomGeneratorType>
571
+ ├─ RNG(Generator(PCG64)) [id B] <RandomGeneratorType>
572
572
  ├─ NoneConst{None} [id C] <NoneTypeT>
573
573
  ├─ 0.0 [id D] <Scalar(float32, shape=())>
574
574
  └─ 1.0 [id E] <Scalar(float32, shape=())>
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2026-09-14T16:15:54+0200",
11
+ "date": "2026-10-01T22:39:01+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "895f7795e2ae8ea16e3a4097ce4b92c61c8faf76",
15
- "version": "3.3.2"
14
+ "full-revisionid": "259987437e5efea3678a7d632af90d366c8fd9a2",
15
+ "version": "3.3.3"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -14,6 +14,7 @@ from pytensor.tensor.basic import (
14
14
  Eye,
15
15
  Join,
16
16
  MakeVector,
17
+ Nonzero,
17
18
  ScalarFromTensor,
18
19
  Split,
19
20
  TensorFromScalar,
@@ -32,6 +33,13 @@ An example of a graph that can be compiled to JAX:
32
33
  """
33
34
 
34
35
 
36
+ @jax_funcify.register(Nonzero)
37
+ def jax_funcify_Nonzero(op, **kwargs):
38
+ raise NotImplementedError(
39
+ "JAX does not support nonzero, its output shape is data-dependent"
40
+ )
41
+
42
+
35
43
  @jax_funcify.register(AllocEmpty)
36
44
  def jax_funcify_AllocEmpty(op, **kwargs):
37
45
  def allocempty(*shape):
@@ -21,8 +21,8 @@ class JAXLinker(JITLinker):
21
21
  # JAX does it his own inplace optimization
22
22
  "inplace",
23
23
  # There are specific variants for the LU decompositions supported by JAX
24
- "reuse_lu_decomposition_multiple_solves",
25
- "scan_split_non_sequence_lu_decomposition_solve",
24
+ "reuse_decomposition_multiple_solves",
25
+ "scan_split_non_sequence_decomposition_and_solve",
26
26
  )
27
27
 
28
28
  scalar_shape_inputs: tuple[int, ...]
@@ -10,7 +10,7 @@ from pytensor.compile.mode import Mode
10
10
  from pytensor.gradient import DisconnectedType
11
11
  from pytensor.graph import Apply, Op, Variable
12
12
  from pytensor.tensor.basic import as_tensor, infer_static_shape
13
- from pytensor.tensor.type import TensorType
13
+ from pytensor.tensor.type import TensorType, discrete_dtypes
14
14
 
15
15
 
16
16
  class JAXOp(Op):
@@ -135,6 +135,13 @@ class JAXOp(Op):
135
135
  return outputs[0]
136
136
  return outputs
137
137
 
138
+ def connection_pattern(self, node):
139
+ """Mark discrete inputs as disconnected from every output."""
140
+ return [
141
+ [input_type.dtype not in discrete_dtypes] * len(self.output_types)
142
+ for input_type in self.input_types
143
+ ]
144
+
138
145
  def pullback(self, inputs, outputs, output_gradients):
139
146
  """Compute gradients using JAX's vector-Jacobian product (VJP)."""
140
147
  import jax
@@ -146,6 +153,15 @@ class JAXOp(Op):
146
153
  if not isinstance(output_grad.type, DisconnectedType)
147
154
  ]
148
155
 
156
+ # Integer and boolean inputs are not differentiable. JAX gives them
157
+ # float0 cotangents, which have no PyTensor equivalent, so they are
158
+ # held constant in the VJP and reported as disconnected.
159
+ differentiable_input_indices = [
160
+ i
161
+ for i, input_type in enumerate(self.input_types)
162
+ if input_type.dtype not in discrete_dtypes
163
+ ]
164
+
149
165
  num_inputs = len(inputs)
150
166
 
151
167
  def vjp_operation(*args):
@@ -154,15 +170,23 @@ class JAXOp(Op):
154
170
  cotangent_vectors = args[num_inputs:]
155
171
  assert len(cotangent_vectors) == len(connected_output_indices)
156
172
 
157
- def restricted_function(*input_values):
158
- """Restricted function that only returns connected outputs."""
159
- outputs = self.jax_func(*input_values)
173
+ def restricted_function(*differentiable_values):
174
+ """Restricted function of the differentiable inputs, returning connected outputs."""
175
+ all_input_values = list(input_values)
176
+ for i, value in zip(
177
+ differentiable_input_indices, differentiable_values, strict=True
178
+ ):
179
+ all_input_values[i] = value
180
+ outputs = self.jax_func(*all_input_values)
160
181
  return [
161
182
  outputs[i].astype(self.output_types[i].dtype)
162
183
  for i in connected_output_indices
163
184
  ]
164
185
 
165
- _primals, vjp_function = jax.vjp(restricted_function, *input_values)
186
+ _primals, vjp_function = jax.vjp(
187
+ restricted_function,
188
+ *(input_values[i] for i in differentiable_input_indices),
189
+ )
166
190
  output_dtypes = [
167
191
  self.output_types[i].dtype for i in connected_output_indices
168
192
  ]
@@ -184,15 +208,21 @@ class JAXOp(Op):
184
208
  vjp_op = JAXOp(
185
209
  self.input_types
186
210
  + tuple(self.output_types[i] for i in connected_output_indices),
187
- [self.input_types[i] for i in range(num_inputs)],
211
+ [self.input_types[i] for i in differentiable_input_indices],
188
212
  vjp_operation,
189
213
  name=name,
190
214
  )
191
215
 
192
- return vjp_op(
216
+ differentiable_input_gradients = vjp_op(
193
217
  *[*inputs, *[output_gradients[i] for i in connected_output_indices]],
194
218
  return_list=True,
195
219
  )
220
+ input_gradients = [DisconnectedType()() for _ in inputs]
221
+ for i, input_gradient in zip(
222
+ differentiable_input_indices, differentiable_input_gradients, strict=True
223
+ ):
224
+ input_gradients[i] = input_gradient
225
+ return input_gradients
196
226
 
197
227
 
198
228
  def wrap_jax(jax_function=None, *, allow_eval=True):
@@ -1,4 +1,5 @@
1
1
  import mlx.core as mx
2
+ import numpy as np
2
3
 
3
4
  from pytensor.link.mlx.dispatch import mlx_funcify
4
5
  from pytensor.tensor.blockwise import Blockwise, _check_runtime_broadcast_core
@@ -19,6 +20,29 @@ def funcify_Blockwise(op: Blockwise, node, **kwargs):
19
20
  # Hoisted out of the per-call path, unlike Blockwise._check_runtime_broadcast.
20
21
  batch_bcast = [inp.type.broadcastable[:batch_ndim] for inp in node.inputs]
21
22
 
23
+ # A core function that sets `natively_batched` runs directly on inputs
24
+ # broadcast to the common batch shape. MLX's linalg functions take leading
25
+ # batch dims themselves, and mx.vmap has no rule for LUF or QRF and drops the
26
+ # triangular flags of solve_triangular.
27
+ if getattr(core_f, "natively_batched", False):
28
+
29
+ def blockwise_native(*args):
30
+ _check_runtime_broadcast_core(args, batch_bcast, batch_ndim)
31
+
32
+ batch_shapes = [
33
+ arg.shape[: arg.ndim - n_core] for arg, n_core in zip(args, core_ndims)
34
+ ]
35
+ batch_shape = np.broadcast_shapes(*batch_shapes)
36
+ args = [
37
+ mx.broadcast_to(arg, (*batch_shape, *arg.shape[arg.ndim - n_core :]))
38
+ for arg, n_core in zip(args, core_ndims)
39
+ ]
40
+
41
+ out = core_f(*args)
42
+ return tuple(out) if multi_output else out
43
+
44
+ return blockwise_native
45
+
22
46
  # Decide batching purely from static shapes so a graph batches identically
23
47
  # here and in every other backend: a batch axis broadcasts (is never mapped)
24
48
  # only when its static size is exactly 1, or the input lacks it entirely.
@@ -29,10 +29,9 @@ def mlx_funcify_SVD(op, node, **kwargs):
29
29
  )
30
30
  return outputs
31
31
 
32
- if compute_uv:
33
- return svd_full
34
- else:
35
- return svd_S_only
32
+ svd = svd_full if compute_uv else svd_S_only
33
+ svd.natively_batched = True
34
+ return svd
36
35
 
37
36
 
38
37
  @mlx_funcify.register(Cholesky)
@@ -45,6 +44,7 @@ def mlx_funcify_Cholesky(op, node, **kwargs):
45
44
  a.astype(dtype=a_dtype, stream=mx.cpu), upper=not lower, stream=mx.cpu
46
45
  )
47
46
 
47
+ cholesky.natively_batched = True
48
48
  return cholesky
49
49
 
50
50
 
@@ -70,6 +70,7 @@ def mlx_funcify_LU(op, node, **kwargs):
70
70
  U,
71
71
  )
72
72
 
73
+ lu.natively_batched = True
73
74
  return lu
74
75
 
75
76
 
@@ -80,6 +81,7 @@ def mlx_funcify_Eig(op, node, **kwargs):
80
81
  def eig(x):
81
82
  return mx.linalg.eig(x.astype(dtype=X_dtype, stream=mx.cpu), stream=mx.cpu)
82
83
 
84
+ eig.natively_batched = True
83
85
  return eig
84
86
 
85
87
 
@@ -99,6 +101,7 @@ def mlx_funcify_Eigh(op, node, **kwargs):
99
101
  a.astype(dtype=X_dtype, stream=mx.cpu), UPLO=UPLO, stream=mx.cpu
100
102
  )
101
103
 
104
+ eigh.natively_batched = True
102
105
  return eigh
103
106
 
104
107
 
@@ -118,6 +121,7 @@ def mlx_funcify_Eigvalsh(op, node, **kwargs):
118
121
  a.astype(dtype=X_dtype, stream=mx.cpu), UPLO=UPLO, stream=mx.cpu
119
122
  )
120
123
 
124
+ eigvalsh.natively_batched = True
121
125
  return eigvalsh
122
126
 
123
127
 
@@ -131,6 +135,7 @@ def mlx_funcify_LUFactor(op, node, **kwargs):
131
135
  )
132
136
  return lu, pivots.astype(mx.int32, stream=mx.cpu)
133
137
 
138
+ lu_factor.natively_batched = True
134
139
  return lu_factor
135
140
 
136
141
 
@@ -174,4 +179,5 @@ def mlx_funcify_QR(op, node, **kwargs):
174
179
  return R
175
180
  return Q, R
176
181
 
182
+ qr.natively_batched = True
177
183
  return qr
@@ -11,6 +11,7 @@ def mlx_funcify_MatrixInverse(op, node, **kwargs):
11
11
  def inv(x):
12
12
  return mx.linalg.inv(x.astype(dtype=X_dtype, stream=mx.cpu), stream=mx.cpu)
13
13
 
14
+ inv.natively_batched = True
14
15
  return inv
15
16
 
16
17
 
@@ -21,4 +22,5 @@ def mlx_funcify_MatrixPinv(op, node, **kwargs):
21
22
  def pinv(x):
22
23
  return mx.linalg.pinv(x.astype(dtype=x_dtype, stream=mx.cpu), stream=mx.cpu)
23
24
 
25
+ pinv.natively_batched = True
24
26
  return pinv
@@ -8,6 +8,15 @@ from pytensor.tensor.linalg.solvers.psd import CholeskySolve
8
8
  from pytensor.tensor.linalg.solvers.triangular import SolveTriangular
9
9
 
10
10
 
11
+ def _as_column(b, b_ndim):
12
+ # MLX treats a 2-d rhs as a matrix, so a batched vector rhs needs an explicit column.
13
+ return mx.expand_dims(b, -1, stream=mx.cpu) if b_ndim == 1 else b
14
+
15
+
16
+ def _from_column(out, b_ndim):
17
+ return mx.squeeze(out, -1, stream=mx.cpu) if b_ndim == 1 else out
18
+
19
+
11
20
  @mlx_funcify.register(Solve)
12
21
  def mlx_funcify_Solve(op, node, **kwargs):
13
22
  assume_a = op.assume_a
@@ -20,13 +29,17 @@ def mlx_funcify_Solve(op, node, **kwargs):
20
29
  UserWarning,
21
30
  )
22
31
 
32
+ b_ndim = op.b_ndim
33
+
23
34
  def solve(a, b):
24
- return mx.linalg.solve(
35
+ out = mx.linalg.solve(
25
36
  a.astype(stream=mx.cpu, dtype=a_dtype),
26
- b.astype(stream=mx.cpu, dtype=b_dtype),
37
+ _as_column(b.astype(stream=mx.cpu, dtype=b_dtype), b_ndim),
27
38
  stream=mx.cpu,
28
39
  )
40
+ return _from_column(out, b_ndim)
29
41
 
42
+ solve.natively_batched = True
30
43
  return solve
31
44
 
32
45
 
@@ -36,6 +49,7 @@ def mlx_funcify_SolveTriangular(op, node, **kwargs):
36
49
  unit_diagonal = op.unit_diagonal
37
50
  A_dtype = getattr(mx, node.inputs[0].dtype)
38
51
  b_dtype = getattr(mx, node.inputs[1].dtype)
52
+ b_ndim = op.b_ndim
39
53
 
40
54
  def solve_triangular(A, b):
41
55
  A = A.astype(stream=mx.cpu, dtype=A_dtype)
@@ -47,13 +61,15 @@ def mlx_funcify_SolveTriangular(op, node, **kwargs):
47
61
  diagonal_mask = mx.eye(A.shape[-1], dtype=mx.bool_, stream=mx.cpu)
48
62
  A = mx.where(diagonal_mask, mx.array(1, dtype=A_dtype), A, stream=mx.cpu)
49
63
 
50
- return mx.linalg.solve_triangular(
64
+ out = mx.linalg.solve_triangular(
51
65
  A,
52
- b.astype(stream=mx.cpu, dtype=b_dtype),
66
+ _as_column(b.astype(stream=mx.cpu, dtype=b_dtype), b_ndim),
53
67
  upper=not lower,
54
68
  stream=mx.cpu,
55
69
  )
70
+ return _from_column(out, b_ndim)
56
71
 
72
+ solve_triangular.natively_batched = True
57
73
  return solve_triangular
58
74
 
59
75
 
@@ -62,15 +78,18 @@ def mlx_funcify_CholeskySolve(op, node, **kwargs):
62
78
  lower = op.lower
63
79
  c_dtype = getattr(mx, node.inputs[0].dtype)
64
80
  b_dtype = getattr(mx, node.inputs[1].dtype)
81
+ b_ndim = op.b_ndim
65
82
 
66
83
  # MLX has no cho_solve, so with A = L L.T we solve L y = b then L.T x = y.
67
84
  def cho_solve(c, b):
68
85
  c = c.astype(stream=mx.cpu, dtype=c_dtype)
69
- b = b.astype(stream=mx.cpu, dtype=b_dtype)
86
+ b = _as_column(b.astype(stream=mx.cpu, dtype=b_dtype), b_ndim)
70
87
  c_T = mx.swapaxes(c, -1, -2, stream=mx.cpu)
71
88
  L, L_T = (c, c_T) if lower else (c_T, c)
72
89
 
73
90
  y = mx.linalg.solve_triangular(L, b, upper=False, stream=mx.cpu)
74
- return mx.linalg.solve_triangular(L_T, y, upper=True, stream=mx.cpu)
91
+ out = mx.linalg.solve_triangular(L_T, y, upper=True, stream=mx.cpu)
92
+ return _from_column(out, b_ndim)
75
93
 
94
+ cho_solve.natively_batched = True
76
95
  return cho_solve
@@ -7,11 +7,11 @@ from pytensor.tensor.linalg.summary import Det, SLogDet
7
7
  def _lu_det_parts(x):
8
8
  """Compute sign and logdet via LU factorization. Call within a CPU stream context."""
9
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))
10
+ diag_u = mx.diagonal(lu, axis1=-2, axis2=-1)
11
+ n_swaps = mx.sum(pivots != mx.arange(pivots.shape[-1], dtype=pivots.dtype), axis=-1)
12
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)))
13
+ sign = pivot_sign * mx.prod(mx.sign(diag_u), axis=-1)
14
+ logabsdet = mx.sum(mx.log(mx.abs(diag_u)), axis=-1)
15
15
  return sign, logabsdet
16
16
 
17
17
 
@@ -24,6 +24,7 @@ def mlx_funcify_Det(op, node, **kwargs):
24
24
  sign, logabsdet = _lu_det_parts(x.astype(dtype=X_dtype))
25
25
  return sign * mx.exp(logabsdet)
26
26
 
27
+ det.natively_batched = True
27
28
  return det
28
29
 
29
30
 
@@ -35,4 +36,5 @@ def mlx_funcify_SLogDet(op, node, **kwargs):
35
36
  with mx.stream(mx.cpu):
36
37
  return _lu_det_parts(x.astype(dtype=X_dtype))
37
38
 
39
+ slogdet.natively_batched = True
38
40
  return slogdet
@@ -1,12 +1,27 @@
1
1
  import mlx.core as mx
2
+ import numpy as np
2
3
 
3
4
  from pytensor.link.mlx.dispatch.basic import mlx_funcify
5
+ from pytensor.link.mlx.dispatch.tensor_basic import mlx_to_list_shape
4
6
  from pytensor.tensor.pad import Pad
5
7
 
6
8
 
9
+ def _runtime_pad_width_pairs(pad_width, ndim):
10
+ widths = np.array(mlx_to_list_shape(pad_width.flatten())).reshape(pad_width.shape)
11
+ widths = np.broadcast_to(widths, (ndim, 2))
12
+ return [tuple(pair) for pair in widths.tolist()]
13
+
14
+
7
15
  @mlx_funcify.register(Pad)
8
16
  def mlx_funcify_pad(op, node, **kwargs):
9
17
  pad_mode = op.pad_mode
18
+ ndim = node.inputs[0].type.ndim
19
+ static_pairs = None if op.static_pad_width is None else list(op.static_pad_width)
20
+
21
+ def pad_width_pairs(pad_width):
22
+ if static_pairs is not None:
23
+ return static_pairs
24
+ return _runtime_pad_width_pairs(pad_width, ndim)
10
25
 
11
26
  if pad_mode == "constant":
12
27
  _, _, constant_values = node.inputs
@@ -18,7 +33,10 @@ def mlx_funcify_pad(op, node, **kwargs):
18
33
 
19
34
  def constant_pad_fn(x, pad_width, constant_values):
20
35
  return mx.pad(
21
- x, pad_width, mode="constant", constant_values=constant_values
36
+ x,
37
+ pad_width_pairs(pad_width),
38
+ mode="constant",
39
+ constant_values=constant_values,
22
40
  )
23
41
 
24
42
  return constant_pad_fn
@@ -26,7 +44,7 @@ def mlx_funcify_pad(op, node, **kwargs):
26
44
  elif pad_mode == "edge":
27
45
 
28
46
  def edge_pad_fn(x, pad_width):
29
- return mx.pad(x, pad_width, mode="edge")
47
+ return mx.pad(x, pad_width_pairs(pad_width), mode="edge")
30
48
 
31
49
  return edge_pad_fn
32
50
 
@@ -1,6 +1,8 @@
1
1
  import mlx.core as mx
2
2
 
3
+ from pytensor.graph import Constant
3
4
  from pytensor.link.mlx.dispatch.basic import mlx_funcify
5
+ from pytensor.link.mlx.dispatch.tensor_basic import mlx_to_list_shape
4
6
  from pytensor.tensor.shape import Reshape, Shape, Shape_i, SpecifyShape
5
7
 
6
8
 
@@ -37,8 +39,18 @@ def mlx_funcify_Shape_i(op, node, **kwargs):
37
39
 
38
40
 
39
41
  @mlx_funcify.register(Reshape)
40
- def mlx_funcify_Reshape(op, **kwargs):
41
- def reshape(x, shp):
42
- return mx.reshape(x, shp)
42
+ def mlx_funcify_Reshape(op, node, **kwargs):
43
+ shape = node.inputs[1]
44
+
45
+ if isinstance(shape, Constant):
46
+ constant_shape = tuple(int(dim) for dim in shape.data)
47
+
48
+ def reshape(x, shp):
49
+ return mx.reshape(x, constant_shape)
50
+
51
+ else:
52
+
53
+ def reshape(x, shp):
54
+ return mx.reshape(x, mlx_to_list_shape(shp))
43
55
 
44
56
  return reshape
@@ -0,0 +1,52 @@
1
+ import warnings
2
+
3
+ import mlx.core as mx
4
+
5
+ from pytensor.link.mlx.dispatch.basic import convert_dtype_to_mlx, mlx_funcify
6
+ from pytensor.link.mlx.dispatch.tensor_basic import coerce_to_int
7
+ from pytensor.tensor.basic import get_scalar_constant_value
8
+ from pytensor.tensor.exceptions import NotScalarConstantError
9
+ from pytensor.tensor.sort import ArgSortOp, SortOp
10
+
11
+
12
+ def _warn_unsupported_kind(op, name):
13
+ if op.kind != "quicksort":
14
+ warnings.warn(
15
+ message=f"MLX {name} does not support the kind argument (got kind={op.kind}). "
16
+ "The argument will be ignored.",
17
+ category=UserWarning,
18
+ )
19
+
20
+
21
+ def _static_axis(node):
22
+ try:
23
+ return int(get_scalar_constant_value(node.inputs[1]))
24
+ except NotScalarConstantError:
25
+ return None
26
+
27
+
28
+ def _resolve_axis(static_axis, axis):
29
+ return coerce_to_int(axis) if static_axis is None else static_axis
30
+
31
+
32
+ @mlx_funcify.register(SortOp)
33
+ def mlx_funcify_Sort(op, node, **kwargs):
34
+ _warn_unsupported_kind(op, "sort")
35
+ static_axis = _static_axis(node)
36
+
37
+ def sort(x, axis):
38
+ return mx.sort(x, axis=_resolve_axis(static_axis, axis))
39
+
40
+ return sort
41
+
42
+
43
+ @mlx_funcify.register(ArgSortOp)
44
+ def mlx_funcify_ArgSort(op, node, **kwargs):
45
+ _warn_unsupported_kind(op, "argsort")
46
+ static_axis = _static_axis(node)
47
+ out_dtype = convert_dtype_to_mlx(node.outputs[0].dtype)
48
+
49
+ def argsort(x, axis):
50
+ return mx.argsort(x, axis=_resolve_axis(static_axis, axis)).astype(out_dtype)
51
+
52
+ return argsort
@@ -10,6 +10,21 @@ from pytensor.tensor.subtensor import (
10
10
  )
11
11
 
12
12
 
13
+ def _with_int_slice_bounds(indices):
14
+ # Slice bounds arrive as 0-d arrays, which MLX slices reject.
15
+ return tuple(
16
+ slice(
17
+ *(
18
+ None if bound is None else int(bound)
19
+ for bound in (index.start, index.stop, index.step)
20
+ )
21
+ )
22
+ if isinstance(index, slice)
23
+ else index
24
+ for index in indices
25
+ )
26
+
27
+
13
28
  @mlx_funcify.register(Subtensor)
14
29
  def mlx_funcify_Subtensor(op, node, **kwargs):
15
30
  def subtensor(x, *ilists):
@@ -27,7 +42,7 @@ def mlx_funcify_Subtensor(op, node, **kwargs):
27
42
  @mlx_funcify.register(AdvancedSubtensor)
28
43
  def mlx_funcify_AdvancedSubtensor(op, node, **kwargs):
29
44
  def advanced_subtensor(x, *ilists):
30
- indices = indices_from_subtensor(ilists, op.idx_list)
45
+ indices = _with_int_slice_bounds(indices_from_subtensor(ilists, op.idx_list))
31
46
  if len(indices) == 1:
32
47
  indices = indices[0]
33
48
 
@@ -96,9 +111,12 @@ def mlx_funcify_AdvancedIncSubtensor(op, node, **kwargs):
96
111
  def mlx_fn(x, indices, y):
97
112
  return x.at[indices].add(y)
98
113
 
99
- def advancedincsubtensor(x, y, *ilist, mlx_fn=mlx_fn):
114
+ def advancedincsubtensor(x, y, *ilist, mlx_fn=mlx_fn, idx_list=op.idx_list):
100
115
  op._check_runtime_broadcast_of_vector_index(node, x, y, ilist[0])
101
116
 
102
- return mlx_fn(x, ilist, y)
117
+ # mirrors AdvancedIncSubtensor.perform
118
+ indices = _with_int_slice_bounds(indices_from_subtensor(ilist, idx_list))
119
+
120
+ return mlx_fn(x, indices, y)
103
121
 
104
122
  return advancedincsubtensor
@@ -19,14 +19,14 @@ from pytensor.tensor.basic import (
19
19
  from pytensor.tensor.exceptions import NotScalarConstantError
20
20
 
21
21
 
22
- MLX_DYNAMIC_SHAPE_ERROR = (
23
- "MLX compilation limitation: Alloc operations with dynamic shapes "
24
- "cannot be used inside compiled functions. This is because MLX "
25
- "compilation forbids evaluating arrays to extract shape values. "
22
+ MLX_DYNAMIC_VALUE_ERROR = (
23
+ "MLX compilation limitation: integer arguments (shapes, axes, pad widths) "
24
+ "computed from symbolic inputs cannot be used inside compiled functions. "
25
+ "This is because MLX compilation forbids evaluating arrays to extract "
26
+ "their values. "
26
27
  "\n\nWorkarounds:"
27
- "\n1. Avoid using Alloc with dynamic shapes in compiled contexts"
28
- "\n2. Use static shapes when possible"
29
- "\n3. Move Alloc operations outside compiled functions"
28
+ "\n1. Use constant values for these arguments when possible"
29
+ "\n2. Compile with `MLXLinker(use_compile=False)`"
30
30
  )
31
31
 
32
32
 
@@ -147,7 +147,7 @@ def mlx_funcify_AllocEmpty(op, node, **kwargs):
147
147
  resolved_shape = (
148
148
  _resolve_shape(static_dims, shape)
149
149
  if static_dims is not None
150
- else tuple(_coerce_to_int(dim) for dim in shape)
150
+ else tuple(mlx_to_list_shape(shape))
151
151
  )
152
152
  return mx.zeros(resolved_shape, dtype=dtype)
153
153
 
@@ -167,7 +167,7 @@ def mlx_funcify_Alloc(op, node, **kwargs):
167
167
  resolved_shape = (
168
168
  _resolve_shape(static_dims, shape)
169
169
  if static_dims is not None
170
- else tuple(_coerce_to_int(dim) for dim in shape)
170
+ else tuple(mlx_to_list_shape(shape))
171
171
  )
172
172
  result = mx.broadcast_to(x, resolved_shape)
173
173
  if node_inputs is not None:
@@ -222,12 +222,12 @@ def _resolve_shape(static_dims, runtime_shape):
222
222
 
223
223
  resolved = []
224
224
  for const_dim, dim in zip(static_dims, runtime_shape, strict=True):
225
- resolved.append(const_dim if const_dim is not None else _coerce_to_int(dim))
225
+ resolved.append(const_dim if const_dim is not None else coerce_to_int(dim))
226
226
 
227
227
  return tuple(resolved)
228
228
 
229
229
 
230
- def _coerce_to_int(value):
230
+ def coerce_to_int(value):
231
231
  if isinstance(value, np.integer | int):
232
232
  return int(value)
233
233
  try:
@@ -235,21 +235,22 @@ def _coerce_to_int(value):
235
235
  return int(value.item())
236
236
  return int(value)
237
237
  except (ValueError, TypeError) as exc:
238
- _rethrow_dynamic_shape_error(exc)
238
+ _rethrow_dynamic_value_error(exc)
239
239
  raise
240
240
 
241
241
 
242
242
  def mlx_to_list_shape(size) -> list[int]:
243
- """Convert a size value (mx.array, np.ndarray, or sequence) to a plain Python list of ints.
244
-
245
- Used by random variable dispatch to normalise the ``size`` argument, which
246
- PyTensor may pass as an ``mx.array`` or ``np.ndarray`` rather than a plain
247
- Python list.
248
- """
249
- return [_coerce_to_int(x) for x in size]
243
+ """Convert a shape given as an ``mx.array``, ``np.ndarray`` or sequence to a list of Python ints."""
244
+ if isinstance(size, mx.array):
245
+ try:
246
+ return [int(dim) for dim in size.tolist()]
247
+ except (ValueError, TypeError) as exc:
248
+ _rethrow_dynamic_value_error(exc)
249
+ raise
250
+ return [coerce_to_int(x) for x in size]
250
251
 
251
252
 
252
- def _rethrow_dynamic_shape_error(exc):
253
+ def _rethrow_dynamic_value_error(exc):
253
254
  msg = str(exc)
254
255
  if "[eval] Attempting to eval an array during function transformations" in msg:
255
- raise ValueError(f"{MLX_DYNAMIC_SHAPE_ERROR}\n\nOriginal error: {msg}") from exc
256
+ raise ValueError(f"{MLX_DYNAMIC_VALUE_ERROR}\n\nOriginal error: {msg}") from exc