pytensor 3.3.1__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 (626) hide show
  1. {pytensor-3.3.1/pytensor.egg-info → pytensor-3.3.3}/PKG-INFO +1 -1
  2. {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/introduction/pytensor_intro.ipynb +2 -2
  3. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/prng.rst +1 -1
  4. {pytensor-3.3.1 → pytensor-3.3.3}/pyproject.toml +1 -0
  5. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/_version.py +3 -3
  6. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/d3viz.py +1 -1
  7. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/fg.py +1 -1
  8. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/traversal.py +2 -2
  9. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/tensor_basic.py +8 -0
  10. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/linker.py +2 -2
  11. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/ops.py +37 -7
  12. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/__init__.py +1 -0
  13. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/basic.py +3 -1
  14. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/blockwise.py +24 -0
  15. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/decomposition.py +10 -4
  16. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/inverse.py +2 -0
  17. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/solvers.py +36 -7
  18. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/summary.py +6 -4
  19. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/pad.py +20 -2
  20. pytensor-3.3.3/pytensor/link/mlx/dispatch/random.py +276 -0
  21. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/shape.py +15 -3
  22. pytensor-3.3.3/pytensor/link/mlx/dispatch/sort.py +52 -0
  23. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/subtensor.py +21 -3
  24. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/tensor_basic.py +25 -14
  25. pytensor-3.3.3/pytensor/link/mlx/linker.py +143 -0
  26. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/cython_support.py +17 -20
  27. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -6
  28. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/scalar.py +2 -8
  29. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/basic.py +7 -1
  30. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/linker.py +2 -2
  31. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/numba.py +2 -2
  32. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/variable.py +2 -1
  33. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/summary.py +1 -1
  34. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/random/variable.py +1 -1
  35. {pytensor-3.3.1 → pytensor-3.3.3/pytensor.egg-info}/PKG-INFO +1 -1
  36. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor.egg-info/SOURCES.txt +1 -0
  37. pytensor-3.3.1/pytensor/link/mlx/dispatch/sort.py +0 -38
  38. pytensor-3.3.1/pytensor/link/mlx/linker.py +0 -79
  39. {pytensor-3.3.1 → pytensor-3.3.3}/LICENSE.txt +0 -0
  40. {pytensor-3.3.1 → pytensor-3.3.3}/MANIFEST.in +0 -0
  41. {pytensor-3.3.1 → pytensor-3.3.3}/README.rst +0 -0
  42. {pytensor-3.3.1 → pytensor-3.3.3}/doc/.templates/PLACEHOLDER +0 -0
  43. {pytensor-3.3.1 → pytensor-3.3.3}/doc/.templates/layout.html +0 -0
  44. {pytensor-3.3.1 → pytensor-3.3.3}/doc/.templates/nb-badges.html +0 -0
  45. {pytensor-3.3.1 → pytensor-3.3.3}/doc/.templates/rendered_citation.html +0 -0
  46. {pytensor-3.3.1 → pytensor-3.3.3}/doc/LICENSE.txt +0 -0
  47. {pytensor-3.3.1 → pytensor-3.3.3}/doc/README.md +0 -0
  48. {pytensor-3.3.1 → pytensor-3.3.3}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  49. {pytensor-3.3.1 → pytensor-3.3.3}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  50. {pytensor-3.3.1 → pytensor-3.3.3}/doc/acknowledgement.rst +0 -0
  51. {pytensor-3.3.1 → pytensor-3.3.3}/doc/bcast.png +0 -0
  52. {pytensor-3.3.1 → pytensor-3.3.3}/doc/bcast.svg +0 -0
  53. {pytensor-3.3.1 → pytensor-3.3.3}/doc/blog.md +0 -0
  54. {pytensor-3.3.1 → pytensor-3.3.3}/doc/conf.py +0 -0
  55. {pytensor-3.3.1 → pytensor-3.3.3}/doc/core_development_guide.rst +0 -0
  56. {pytensor-3.3.1 → pytensor-3.3.3}/doc/css.inc +0 -0
  57. {pytensor-3.3.1 → pytensor-3.3.3}/doc/dev_start_guide.rst +0 -0
  58. {pytensor-3.3.1 → pytensor-3.3.3}/doc/environment.yml +0 -0
  59. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/apply.png +0 -0
  60. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/apply.svg +0 -0
  61. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/apply2.svg +0 -0
  62. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/creating_a_c_op.rst +0 -0
  63. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  64. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/creating_an_op.rst +0 -0
  65. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/ctype.rst +0 -0
  66. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/extending_faq.rst +0 -0
  67. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/extending_pytensor_solution_1.py +0 -0
  68. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/graph_rewriting.rst +0 -0
  69. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/graphstructures.rst +0 -0
  70. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/index.rst +0 -0
  71. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/inplace.rst +0 -0
  72. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/op.rst +0 -0
  73. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/other_ops.rst +0 -0
  74. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  75. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  76. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/pipeline.rst +0 -0
  77. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/scan.rst +0 -0
  78. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/tips.rst +0 -0
  79. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/type.rst +0 -0
  80. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/unification_kanren.rst +0 -0
  81. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/unittest.rst +0 -0
  82. {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/using_params.rst +0 -0
  83. {pytensor-3.3.1 → pytensor-3.3.3}/doc/faq.rst +0 -0
  84. {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  85. {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/applications/tiny_transformer_llm.ipynb +0 -0
  86. {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
  87. {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/optimize/root.ipynb +0 -0
  88. {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/page_footer.md +0 -0
  89. {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  90. {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  91. {pytensor-3.3.1 → pytensor-3.3.3}/doc/generate_dtype_tensor_table.py +0 -0
  92. {pytensor-3.3.1 → pytensor-3.3.3}/doc/glossary.rst +0 -0
  93. {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/Elman_srnn.png +0 -0
  94. {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/PyTensor.png +0 -0
  95. {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/PyTensor_RGB.svg +0 -0
  96. {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/PyTensor_logo.png +0 -0
  97. {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/binder.svg +0 -0
  98. {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/blocksparse.png +0 -0
  99. {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/colab.svg +0 -0
  100. {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/github.svg +0 -0
  101. {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/lstm.png +0 -0
  102. {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/lstm_memorycell.png +0 -0
  103. {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/talk2010.gif +0 -0
  104. {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/talk2010.png +0 -0
  105. {pytensor-3.3.1 → pytensor-3.3.3}/doc/index.rst +0 -0
  106. {pytensor-3.3.1 → pytensor-3.3.3}/doc/install.rst +0 -0
  107. {pytensor-3.3.1 → pytensor-3.3.3}/doc/internal/how_to_release.rst +0 -0
  108. {pytensor-3.3.1 → pytensor-3.3.3}/doc/internal/index.rst +0 -0
  109. {pytensor-3.3.1 → pytensor-3.3.3}/doc/internal/metadocumentation.rst +0 -0
  110. {pytensor-3.3.1 → pytensor-3.3.3}/doc/introduction.rst +0 -0
  111. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/debugmode.rst +0 -0
  112. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/function.rst +0 -0
  113. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/index.rst +0 -0
  114. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/io.rst +0 -0
  115. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/mode.rst +0 -0
  116. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/nanguardmode.rst +0 -0
  117. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/opfromgraph.rst +0 -0
  118. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/ops.rst +0 -0
  119. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/profilemode.rst +0 -0
  120. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/shared.rst +0 -0
  121. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/config.rst +0 -0
  122. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  123. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  124. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  125. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  126. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  127. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  128. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  129. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp.html +0 -0
  130. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp.png +0 -0
  131. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp2.html +0 -0
  132. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  133. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp2.png +0 -0
  134. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/ofg.html +0 -0
  135. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/ofg2.html +0 -0
  136. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/index.ipynb +0 -0
  137. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/index.rst +0 -0
  138. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  139. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  140. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  141. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  142. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/features.rst +0 -0
  143. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/fgraph.rst +0 -0
  144. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/graph.rst +0 -0
  145. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/index.rst +0 -0
  146. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/op.rst +0 -0
  147. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/replace.rst +0 -0
  148. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/traversal.rst +0 -0
  149. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/type.rst +0 -0
  150. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/utils.rst +0 -0
  151. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/index.rst +0 -0
  152. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/misc/pkl_utils.rst +0 -0
  153. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/printing.rst +0 -0
  154. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/scalar/index.rst +0 -0
  155. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/scan.rst +0 -0
  156. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/sparse/index.rst +0 -0
  157. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/sparse/sandbox.rst +0 -0
  158. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/basic.rst +0 -0
  159. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/basic_opt.rst +0 -0
  160. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/bcast.png +0 -0
  161. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/bcast.svg +0 -0
  162. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/elemwise.rst +0 -0
  163. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/extra_ops.rst +0 -0
  164. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/fft.rst +0 -0
  165. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/functional.rst +0 -0
  166. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/index.rst +0 -0
  167. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/io.rst +0 -0
  168. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/linalg.rst +0 -0
  169. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/math_opt.rst +0 -0
  170. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/nlinalg.rst +0 -0
  171. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/optimize.rst +0 -0
  172. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/plot_fft.png +0 -0
  173. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/random.rst +0 -0
  174. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/slinalg.rst +0 -0
  175. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/utils.rst +0 -0
  176. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/typed_list.rst +0 -0
  177. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/index.md +0 -0
  178. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/linalg.md +0 -0
  179. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/math.md +0 -0
  180. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/module_functions.md +0 -0
  181. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/random.md +0 -0
  182. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/signal.md +0 -0
  183. {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/type.md +0 -0
  184. {pytensor-3.3.1 → pytensor-3.3.3}/doc/links.rst +0 -0
  185. {pytensor-3.3.1 → pytensor-3.3.3}/doc/optimizations.rst +0 -0
  186. {pytensor-3.3.1 → pytensor-3.3.3}/doc/pylintrc +0 -0
  187. {pytensor-3.3.1 → pytensor-3.3.3}/doc/robots.txt +0 -0
  188. {pytensor-3.3.1 → pytensor-3.3.3}/doc/troubleshooting.rst +0 -0
  189. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/adding.rst +0 -0
  190. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/adding_solution_1.py +0 -0
  191. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/aliasing.rst +0 -0
  192. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/apply.png +0 -0
  193. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/apply.svg +0 -0
  194. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/bcast.png +0 -0
  195. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/broadcasting.rst +0 -0
  196. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/conditions.rst +0 -0
  197. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/debug_faq.rst +0 -0
  198. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/dlogistic.png +0 -0
  199. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/examples.rst +0 -0
  200. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/faq_tutorial.rst +0 -0
  201. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/gradients.rst +0 -0
  202. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/index.rst +0 -0
  203. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/loading_and_saving.rst +0 -0
  204. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/logistic.gp +0 -0
  205. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/logistic.png +0 -0
  206. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/loop.rst +0 -0
  207. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/loop_solution_1.py +0 -0
  208. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/modes.rst +0 -0
  209. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/modes_solution_1.py +0 -0
  210. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/multi_cores.rst +0 -0
  211. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/nan_tutorial.rst +0 -0
  212. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/pics/d3viz.png +0 -0
  213. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  214. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  215. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  216. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/printing_drawing.rst +0 -0
  217. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/profiling.rst +0 -0
  218. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/profiling_example.py +0 -0
  219. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/profiling_example_out.prof +0 -0
  220. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/shape_info.rst +0 -0
  221. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/sparse.rst +0 -0
  222. {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/symbolic_graphs.rst +0 -0
  223. {pytensor-3.3.1 → pytensor-3.3.3}/doc/user_guide.rst +0 -0
  224. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/__init__.py +0 -0
  225. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/_sparse_lazy.py +0 -0
  226. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/__init__.py +0 -0
  227. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/alloc.py +0 -0
  228. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/blockwise.py +0 -0
  229. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/core.py +0 -0
  230. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/diagonal.py +0 -0
  231. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/dimshuffle.py +0 -0
  232. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/dot.py +0 -0
  233. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/elemwise.py +0 -0
  234. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/orthogonal.py +0 -0
  235. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/permutation.py +0 -0
  236. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/positive_definite.py +0 -0
  237. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/reshape.py +0 -0
  238. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/selection.py +0 -0
  239. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/shape.py +0 -0
  240. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/specify.py +0 -0
  241. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/subtensor.py +0 -0
  242. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/symmetric.py +0 -0
  243. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/triangular.py +0 -0
  244. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/basic.py +0 -0
  245. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/bin/__init__.py +0 -0
  246. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/bin/pytensor_cache.py +0 -0
  247. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/breakpoint.py +0 -0
  248. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/__init__.py +0 -0
  249. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/aliasing.py +0 -0
  250. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/builders.py +0 -0
  251. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/compiledir.py +0 -0
  252. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/compilelock.py +0 -0
  253. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/debug/__init__.py +0 -0
  254. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/debug/debugmode.py +0 -0
  255. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/debug/dump.py +0 -0
  256. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/debug/monitormode.py +0 -0
  257. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/debug/nanguardmode.py +0 -0
  258. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/debug/profiling.py +0 -0
  259. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/executor.py +0 -0
  260. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/inner_function.py +0 -0
  261. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/io.py +0 -0
  262. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/maker.py +0 -0
  263. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/mode.py +0 -0
  264. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/ops.py +0 -0
  265. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/rebuild.py +0 -0
  266. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/rewriting.py +0 -0
  267. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/sharedvalue.py +0 -0
  268. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/configdefaults.py +0 -0
  269. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/configparser.py +0 -0
  270. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/__init__.py +0 -0
  271. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  272. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/css/d3viz.css +0 -0
  273. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/formatting.py +0 -0
  274. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/html/template.html +0 -0
  275. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  276. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  277. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/js/d3viz.js +0 -0
  278. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  279. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  280. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/gradient.py +0 -0
  281. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/__init__.py +0 -0
  282. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/basic.py +0 -0
  283. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/destroyhandler.py +0 -0
  284. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/features.py +0 -0
  285. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/null_type.py +0 -0
  286. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/op.py +0 -0
  287. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/replace.py +0 -0
  288. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/__init__.py +0 -0
  289. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/basic.py +0 -0
  290. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/db.py +0 -0
  291. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/kanren.py +0 -0
  292. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/reachability.py +0 -0
  293. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/unify.py +0 -0
  294. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/utils.py +0 -0
  295. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/type.py +0 -0
  296. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/utils.py +0 -0
  297. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/ifelse.py +0 -0
  298. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/ipython.py +0 -0
  299. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/__init__.py +0 -0
  300. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/basic.py +0 -0
  301. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/__init__.py +0 -0
  302. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/basic.py +0 -0
  303. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  304. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  305. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/cmodule.py +0 -0
  306. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/cutils.py +0 -0
  307. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/cvm.py +0 -0
  308. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/exceptions.py +0 -0
  309. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/interface.py +0 -0
  310. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/lazylinker_c.py +0 -0
  311. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/op.py +0 -0
  312. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/params_type.py +0 -0
  313. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/type.py +0 -0
  314. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/__init__.py +0 -0
  315. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/__init__.py +0 -0
  316. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/basic.py +0 -0
  317. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/blas.py +0 -0
  318. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  319. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/einsum.py +0 -0
  320. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  321. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  322. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
  323. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
  324. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
  325. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
  326. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
  327. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
  328. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
  329. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/math.py +0 -0
  330. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/pad.py +0 -0
  331. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/random.py +0 -0
  332. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/scalar.py +0 -0
  333. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/scan.py +0 -0
  334. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/shape.py +0 -0
  335. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  336. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  337. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/sort.py +0 -0
  338. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/sparse.py +0 -0
  339. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  340. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/__init__.py +0 -0
  341. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/blas.py +0 -0
  342. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/einsum.py +0 -0
  343. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
  344. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
  345. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
  346. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
  347. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/math.py +0 -0
  348. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/__init__.py +0 -0
  349. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/basic.py +0 -0
  350. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/bessel.py +0 -0
  351. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/beta.py +0 -0
  352. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/erf.py +0 -0
  353. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/erfcinv.py +0 -0
  354. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/gamma.py +0 -0
  355. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/gammainc.py +0 -0
  356. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/helpers.py +0 -0
  357. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/math.py +0 -0
  358. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  359. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  360. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/__init__.py +0 -0
  361. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/cache.py +0 -0
  362. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/__init__.py +0 -0
  363. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/_llvmlite_self_ref.py +0 -0
  364. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/_patch_list_to_tuple.py +0 -0
  365. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/_patch_pointer_add.py +0 -0
  366. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/basic.py +0 -0
  367. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  368. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
  369. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/elemwise.py +0 -0
  370. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  371. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/_BLAS.py +0 -0
  372. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
  373. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  374. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
  375. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  376. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  377. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
  378. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
  379. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
  380. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  381. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
  382. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
  383. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
  384. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
  385. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
  386. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
  387. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
  388. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
  389. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
  390. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
  391. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
  392. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
  393. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
  394. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
  395. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
  396. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
  397. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
  398. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
  399. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  400. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/random.py +0 -0
  401. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/scan.py +0 -0
  402. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/shape.py +0 -0
  403. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  404. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  405. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sort.py +0 -0
  406. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
  407. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
  408. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
  409. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
  410. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
  411. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  412. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  413. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/typed_list.py +0 -0
  414. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  415. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/linker.py +0 -0
  416. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  417. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  418. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  419. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  420. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  421. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
  422. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
  423. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
  424. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
  425. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
  426. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/math.py +0 -0
  427. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  428. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  429. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  430. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  431. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/utils.py +0 -0
  432. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/vm.py +0 -0
  433. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/__init__.py +0 -0
  434. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/check_blas.py +0 -0
  435. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/check_blas_many.sh +0 -0
  436. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/check_duplicate_key.py +0 -0
  437. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  438. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/elemwise_time_test.py +0 -0
  439. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/frozendict.py +0 -0
  440. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/may_share_memory.py +0 -0
  441. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/ordered_set.py +0 -0
  442. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/pkl_utils.py +0 -0
  443. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/npy_2_compat.py +0 -0
  444. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/printing.py +0 -0
  445. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/py.typed +0 -0
  446. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/raise_op.py +0 -0
  447. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/__init__.py +0 -0
  448. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/basic.py +0 -0
  449. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  450. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  451. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/c_code/gamma.c +0 -0
  452. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/c_code/incbet.c +0 -0
  453. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/loop.py +0 -0
  454. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/math.py +0 -0
  455. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/sharedvar.py +0 -0
  456. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/__init__.py +0 -0
  457. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/basic.py +0 -0
  458. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/checkpoints.py +0 -0
  459. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/op.py +0 -0
  460. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/__init__.py +0 -0
  461. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/db.py +0 -0
  462. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/inner_graph.py +0 -0
  463. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/inplace.py +0 -0
  464. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/io.py +0 -0
  465. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/merge.py +0 -0
  466. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/push_out.py +0 -0
  467. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/trace.py +0 -0
  468. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/utils.py +0 -0
  469. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/scan_perform.pyx +0 -0
  470. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/scan_perform_ext.py +0 -0
  471. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/utils.py +0 -0
  472. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/views.py +0 -0
  473. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/__init__.py +0 -0
  474. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/basic.py +0 -0
  475. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/linalg.py +0 -0
  476. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/math.py +0 -0
  477. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/rewriting.py +0 -0
  478. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/sharedvar.py +0 -0
  479. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/type.py +0 -0
  480. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/utils.py +0 -0
  481. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/variable.py +0 -0
  482. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/__init__.py +0 -0
  483. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/basic.py +0 -0
  484. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/__init__.py +0 -0
  485. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/_core.py +0 -0
  486. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/batched.py +0 -0
  487. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/blas_c.py +0 -0
  488. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/__init__.py +0 -0
  489. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/alt_blas_common.h +0 -0
  490. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/alt_blas_template.c +0 -0
  491. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/blas_headers.py +0 -0
  492. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/codegen.py +0 -0
  493. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/gemm.py +0 -0
  494. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/gemv.py +0 -0
  495. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/ger.py +0 -0
  496. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blockwise.py +0 -0
  497. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/einsum.py +0 -0
  498. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/elemwise.py +0 -0
  499. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/elemwise_cgen.py +0 -0
  500. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/exceptions.py +0 -0
  501. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/extra_ops.py +0 -0
  502. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/fft.py +0 -0
  503. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/fourier.py +0 -0
  504. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/functional.py +0 -0
  505. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/interpolate.py +0 -0
  506. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/__init__.py +0 -0
  507. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/_lazy.py +0 -0
  508. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/constructors.py +0 -0
  509. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
  510. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
  511. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
  512. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
  513. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
  514. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
  515. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
  516. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/dtype_utils.py +0 -0
  517. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/inverse.py +0 -0
  518. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/products.py +0 -0
  519. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
  520. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/core.py +0 -0
  521. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/general.py +0 -0
  522. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
  523. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
  524. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/psd.py +0 -0
  525. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
  526. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
  527. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/summary.py +0 -0
  528. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/math.py +0 -0
  529. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/nlinalg.py +0 -0
  530. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/optimize.py +0 -0
  531. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/pad.py +0 -0
  532. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/__init__.py +0 -0
  533. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/basic.py +0 -0
  534. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/op.py +0 -0
  535. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  536. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/basic.py +0 -0
  537. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/jax.py +0 -0
  538. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/type.py +0 -0
  539. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/utils.py +0 -0
  540. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/reshape.py +0 -0
  541. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/__init__.py +0 -0
  542. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/assumptions.py +0 -0
  543. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/basic.py +0 -0
  544. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/blas.py +0 -0
  545. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/blas_c.py +0 -0
  546. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/blockwise.py +0 -0
  547. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/einsum.py +0 -0
  548. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/elemwise.py +0 -0
  549. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  550. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/fused_elemwise.py +0 -0
  551. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/jax.py +0 -0
  552. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
  553. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
  554. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
  555. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/products.py +0 -0
  556. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
  557. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
  558. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/math.py +0 -0
  559. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/numba.py +0 -0
  560. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/ofg.py +0 -0
  561. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/optimize.py +0 -0
  562. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/reshape.py +0 -0
  563. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/shape.py +0 -0
  564. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/special.py +0 -0
  565. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/subtensor.py +0 -0
  566. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
  567. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  568. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/shape.py +0 -0
  569. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/sharedvar.py +0 -0
  570. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/signal/__init__.py +0 -0
  571. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/signal/conv.py +0 -0
  572. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/slinalg.py +0 -0
  573. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/sort.py +0 -0
  574. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/special.py +0 -0
  575. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/subtensor.py +0 -0
  576. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/symbolic.py +0 -0
  577. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/type.py +0 -0
  578. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/type_other.py +0 -0
  579. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/utils.py +0 -0
  580. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/var.py +0 -0
  581. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/variable.py +0 -0
  582. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/xlogx.py +0 -0
  583. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/typed_list/__init__.py +0 -0
  584. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/typed_list/basic.py +0 -0
  585. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/typed_list/rewriting.py +0 -0
  586. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/typed_list/type.py +0 -0
  587. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/utils.py +0 -0
  588. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/__init__.py +0 -0
  589. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/basic.py +0 -0
  590. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/indexing.py +0 -0
  591. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/linalg.py +0 -0
  592. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/math.py +0 -0
  593. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/random/__init__.py +0 -0
  594. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/random/basic.py +0 -0
  595. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/random/type.py +0 -0
  596. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/reduction.py +0 -0
  597. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/__init__.py +0 -0
  598. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/basic.py +0 -0
  599. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/indexing.py +0 -0
  600. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/math.py +0 -0
  601. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/reduction.py +0 -0
  602. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/shape.py +0 -0
  603. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/utils.py +0 -0
  604. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  605. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/shape.py +0 -0
  606. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/signal.py +0 -0
  607. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/type.py +0 -0
  608. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/vectorization.py +0 -0
  609. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor.egg-info/dependency_links.txt +0 -0
  610. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor.egg-info/entry_points.txt +0 -0
  611. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor.egg-info/requires.txt +0 -0
  612. {pytensor-3.3.1 → pytensor-3.3.3}/pytensor.egg-info/top_level.txt +0 -0
  613. {pytensor-3.3.1 → pytensor-3.3.3}/scripts/mypy-failing.txt +0 -0
  614. {pytensor-3.3.1 → pytensor-3.3.3}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  615. {pytensor-3.3.1 → pytensor-3.3.3}/setup.cfg +0 -0
  616. {pytensor-3.3.1 → pytensor-3.3.3}/setup.py +0 -0
  617. {pytensor-3.3.1 → pytensor-3.3.3}/tests/link/c/c_code/test_cenum.h +0 -0
  618. {pytensor-3.3.1 → pytensor-3.3.3}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  619. {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_basic.py +0 -0
  620. {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_breakpoint.py +0 -0
  621. {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_config.py +0 -0
  622. {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_gradient.py +0 -0
  623. {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_ifelse.py +0 -0
  624. {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_printing.py +0 -0
  625. {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_raise_op.py +0 -0
  626. {pytensor-3.3.1 → 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.1
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=())>
@@ -151,6 +151,7 @@ unfixable = [
151
151
 
152
152
  [tool.ruff.lint.isort]
153
153
  lines-after-imports = 2
154
+ known-first-party = ["pytensor", "tests"]
154
155
 
155
156
  [tool.ruff.lint.per-file-ignores]
156
157
  # TODO: Get rid of these:
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2026-09-07T16:04:36+0200",
11
+ "date": "2026-10-01T22:39:01+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "bb5967ab72cfc29ee9f47c4a2fd0aaeeb1695268",
15
- "version": "3.3.1"
14
+ "full-revisionid": "259987437e5efea3678a7d632af90d366c8fd9a2",
15
+ "version": "3.3.3"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -18,7 +18,7 @@ def replace_patterns(x, replace):
18
18
 
19
19
  Parameters
20
20
  ----------
21
- s : str
21
+ x : str
22
22
  String on which function is applied
23
23
  replace : dict
24
24
  `key`, `value` pairs where key is a regular expression and `value` a
@@ -321,7 +321,7 @@ class FunctionGraph(AbstractFunctionGraph):
321
321
 
322
322
  Parameters
323
323
  ----------
324
- variable : pytensor.graph.basic.Variable
324
+ var : pytensor.graph.basic.Variable
325
325
  The variable to be imported.
326
326
  reason : str
327
327
  The name of the optimization or operation in progress.
@@ -666,9 +666,9 @@ def toposort_with_orderings(
666
666
  Parameters
667
667
  ----------
668
668
  graphs : list or tuple of Variable instances
669
- Graph inputs.
670
- outputs : list or tuple of Apply instances
671
669
  Graph outputs.
670
+ blockers : list or tuple of Variable instances
671
+ Graph inputs.
672
672
  orderings : dict
673
673
  Keys are `Apply` or `Variable` instances, values are lists of `Apply` or `Variable` instances.
674
674
 
@@ -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):
@@ -17,4 +17,5 @@ import pytensor.link.mlx.dispatch.extra_ops
17
17
  import pytensor.link.mlx.dispatch.pad
18
18
  import pytensor.link.mlx.dispatch.sort
19
19
  import pytensor.link.mlx.dispatch.linalg
20
+ import pytensor.link.mlx.dispatch.random
20
21
  # isort: on
@@ -132,7 +132,9 @@ def mlx_typify_tensor(data, dtype=None, **kwargs):
132
132
  # and it does so on the CPU too, where float64 is perfectly usable
133
133
  if dtype is None and data.dtype == np.float64 and float64_supported():
134
134
  dtype = mx.float64
135
- return _nan_safe_constant(data, dtype=dtype)
135
+ # MLX's elementwise kernels misread a non-contiguous buffer, and rewriting
136
+ # produces such arrays -- `triu` of a transpose, for one
137
+ return _nan_safe_constant(np.asarray(data, order="C"), dtype=dtype)
136
138
 
137
139
 
138
140
  @mlx_typify.register(slice)
@@ -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,30 +29,47 @@ 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
 
33
46
  @mlx_funcify.register(SolveTriangular)
34
47
  def mlx_funcify_SolveTriangular(op, node, **kwargs):
35
48
  lower = op.lower
49
+ unit_diagonal = op.unit_diagonal
36
50
  A_dtype = getattr(mx, node.inputs[0].dtype)
37
51
  b_dtype = getattr(mx, node.inputs[1].dtype)
52
+ b_ndim = op.b_ndim
38
53
 
39
54
  def solve_triangular(A, b):
40
- return mx.linalg.solve_triangular(
41
- A.astype(stream=mx.cpu, dtype=A_dtype),
42
- b.astype(stream=mx.cpu, dtype=b_dtype),
55
+ A = A.astype(stream=mx.cpu, dtype=A_dtype)
56
+
57
+ if unit_diagonal:
58
+ # MLX's `solve_triangular` has no `unit_diagonal`. LAPACK's `trtrs`
59
+ # never reads the diagonal in that mode, so overwriting it with ones
60
+ # gives the same answer.
61
+ diagonal_mask = mx.eye(A.shape[-1], dtype=mx.bool_, stream=mx.cpu)
62
+ A = mx.where(diagonal_mask, mx.array(1, dtype=A_dtype), A, stream=mx.cpu)
63
+
64
+ out = mx.linalg.solve_triangular(
65
+ A,
66
+ _as_column(b.astype(stream=mx.cpu, dtype=b_dtype), b_ndim),
43
67
  upper=not lower,
44
68
  stream=mx.cpu,
45
69
  )
70
+ return _from_column(out, b_ndim)
46
71
 
72
+ solve_triangular.natively_batched = True
47
73
  return solve_triangular
48
74
 
49
75
 
@@ -52,15 +78,18 @@ def mlx_funcify_CholeskySolve(op, node, **kwargs):
52
78
  lower = op.lower
53
79
  c_dtype = getattr(mx, node.inputs[0].dtype)
54
80
  b_dtype = getattr(mx, node.inputs[1].dtype)
81
+ b_ndim = op.b_ndim
55
82
 
56
83
  # MLX has no cho_solve, so with A = L L.T we solve L y = b then L.T x = y.
57
84
  def cho_solve(c, b):
58
85
  c = c.astype(stream=mx.cpu, dtype=c_dtype)
59
- b = b.astype(stream=mx.cpu, dtype=b_dtype)
86
+ b = _as_column(b.astype(stream=mx.cpu, dtype=b_dtype), b_ndim)
60
87
  c_T = mx.swapaxes(c, -1, -2, stream=mx.cpu)
61
88
  L, L_T = (c, c_T) if lower else (c_T, c)
62
89
 
63
90
  y = mx.linalg.solve_triangular(L, b, upper=False, stream=mx.cpu)
64
- 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)
65
93
 
94
+ cho_solve.natively_batched = True
66
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