pytensor 3.3.1__tar.gz → 3.3.2__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.1/pytensor.egg-info → pytensor-3.3.2}/PKG-INFO +1 -1
  2. {pytensor-3.3.1 → pytensor-3.3.2}/pyproject.toml +1 -0
  3. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/_version.py +3 -3
  4. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/d3viz.py +1 -1
  5. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/fg.py +1 -1
  6. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/traversal.py +2 -2
  7. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/__init__.py +1 -0
  8. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/basic.py +3 -1
  9. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/solvers.py +11 -1
  10. pytensor-3.3.2/pytensor/link/mlx/dispatch/random.py +276 -0
  11. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/tensor_basic.py +10 -0
  12. pytensor-3.3.2/pytensor/link/mlx/linker.py +143 -0
  13. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/cython_support.py +17 -20
  14. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -6
  15. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/scalar.py +2 -8
  16. {pytensor-3.3.1 → pytensor-3.3.2/pytensor.egg-info}/PKG-INFO +1 -1
  17. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor.egg-info/SOURCES.txt +1 -0
  18. pytensor-3.3.1/pytensor/link/mlx/linker.py +0 -79
  19. {pytensor-3.3.1 → pytensor-3.3.2}/LICENSE.txt +0 -0
  20. {pytensor-3.3.1 → pytensor-3.3.2}/MANIFEST.in +0 -0
  21. {pytensor-3.3.1 → pytensor-3.3.2}/README.rst +0 -0
  22. {pytensor-3.3.1 → pytensor-3.3.2}/doc/.templates/PLACEHOLDER +0 -0
  23. {pytensor-3.3.1 → pytensor-3.3.2}/doc/.templates/layout.html +0 -0
  24. {pytensor-3.3.1 → pytensor-3.3.2}/doc/.templates/nb-badges.html +0 -0
  25. {pytensor-3.3.1 → pytensor-3.3.2}/doc/.templates/rendered_citation.html +0 -0
  26. {pytensor-3.3.1 → pytensor-3.3.2}/doc/LICENSE.txt +0 -0
  27. {pytensor-3.3.1 → pytensor-3.3.2}/doc/README.md +0 -0
  28. {pytensor-3.3.1 → pytensor-3.3.2}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  29. {pytensor-3.3.1 → pytensor-3.3.2}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  30. {pytensor-3.3.1 → pytensor-3.3.2}/doc/acknowledgement.rst +0 -0
  31. {pytensor-3.3.1 → pytensor-3.3.2}/doc/bcast.png +0 -0
  32. {pytensor-3.3.1 → pytensor-3.3.2}/doc/bcast.svg +0 -0
  33. {pytensor-3.3.1 → pytensor-3.3.2}/doc/blog.md +0 -0
  34. {pytensor-3.3.1 → pytensor-3.3.2}/doc/conf.py +0 -0
  35. {pytensor-3.3.1 → pytensor-3.3.2}/doc/core_development_guide.rst +0 -0
  36. {pytensor-3.3.1 → pytensor-3.3.2}/doc/css.inc +0 -0
  37. {pytensor-3.3.1 → pytensor-3.3.2}/doc/dev_start_guide.rst +0 -0
  38. {pytensor-3.3.1 → pytensor-3.3.2}/doc/environment.yml +0 -0
  39. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/apply.png +0 -0
  40. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/apply.svg +0 -0
  41. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/apply2.svg +0 -0
  42. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/creating_a_c_op.rst +0 -0
  43. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  44. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/creating_an_op.rst +0 -0
  45. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/ctype.rst +0 -0
  46. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/extending_faq.rst +0 -0
  47. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/extending_pytensor_solution_1.py +0 -0
  48. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/graph_rewriting.rst +0 -0
  49. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/graphstructures.rst +0 -0
  50. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/index.rst +0 -0
  51. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/inplace.rst +0 -0
  52. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/op.rst +0 -0
  53. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/other_ops.rst +0 -0
  54. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  55. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  56. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/pipeline.rst +0 -0
  57. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/scan.rst +0 -0
  58. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/tips.rst +0 -0
  59. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/type.rst +0 -0
  60. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/unification_kanren.rst +0 -0
  61. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/unittest.rst +0 -0
  62. {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/using_params.rst +0 -0
  63. {pytensor-3.3.1 → pytensor-3.3.2}/doc/faq.rst +0 -0
  64. {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  65. {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/applications/tiny_transformer_llm.ipynb +0 -0
  66. {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
  67. {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
  68. {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/optimize/root.ipynb +0 -0
  69. {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/page_footer.md +0 -0
  70. {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  71. {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  72. {pytensor-3.3.1 → pytensor-3.3.2}/doc/generate_dtype_tensor_table.py +0 -0
  73. {pytensor-3.3.1 → pytensor-3.3.2}/doc/glossary.rst +0 -0
  74. {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/Elman_srnn.png +0 -0
  75. {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/PyTensor.png +0 -0
  76. {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/PyTensor_RGB.svg +0 -0
  77. {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/PyTensor_logo.png +0 -0
  78. {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/binder.svg +0 -0
  79. {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/blocksparse.png +0 -0
  80. {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/colab.svg +0 -0
  81. {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/github.svg +0 -0
  82. {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/lstm.png +0 -0
  83. {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/lstm_memorycell.png +0 -0
  84. {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/talk2010.gif +0 -0
  85. {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/talk2010.png +0 -0
  86. {pytensor-3.3.1 → pytensor-3.3.2}/doc/index.rst +0 -0
  87. {pytensor-3.3.1 → pytensor-3.3.2}/doc/install.rst +0 -0
  88. {pytensor-3.3.1 → pytensor-3.3.2}/doc/internal/how_to_release.rst +0 -0
  89. {pytensor-3.3.1 → pytensor-3.3.2}/doc/internal/index.rst +0 -0
  90. {pytensor-3.3.1 → pytensor-3.3.2}/doc/internal/metadocumentation.rst +0 -0
  91. {pytensor-3.3.1 → pytensor-3.3.2}/doc/introduction.rst +0 -0
  92. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/debugmode.rst +0 -0
  93. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/function.rst +0 -0
  94. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/index.rst +0 -0
  95. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/io.rst +0 -0
  96. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/mode.rst +0 -0
  97. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/nanguardmode.rst +0 -0
  98. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/opfromgraph.rst +0 -0
  99. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/ops.rst +0 -0
  100. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/profilemode.rst +0 -0
  101. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/shared.rst +0 -0
  102. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/config.rst +0 -0
  103. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  104. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  105. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  106. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  107. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  108. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  109. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  110. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp.html +0 -0
  111. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp.png +0 -0
  112. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp2.html +0 -0
  113. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  114. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp2.png +0 -0
  115. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/ofg.html +0 -0
  116. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/ofg2.html +0 -0
  117. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/index.ipynb +0 -0
  118. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/index.rst +0 -0
  119. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  120. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  121. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  122. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  123. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/features.rst +0 -0
  124. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/fgraph.rst +0 -0
  125. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/graph.rst +0 -0
  126. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/index.rst +0 -0
  127. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/op.rst +0 -0
  128. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/replace.rst +0 -0
  129. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/traversal.rst +0 -0
  130. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/type.rst +0 -0
  131. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/utils.rst +0 -0
  132. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/index.rst +0 -0
  133. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/misc/pkl_utils.rst +0 -0
  134. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/printing.rst +0 -0
  135. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/scalar/index.rst +0 -0
  136. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/scan.rst +0 -0
  137. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/sparse/index.rst +0 -0
  138. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/sparse/sandbox.rst +0 -0
  139. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/basic.rst +0 -0
  140. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/basic_opt.rst +0 -0
  141. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/bcast.png +0 -0
  142. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/bcast.svg +0 -0
  143. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/elemwise.rst +0 -0
  144. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/extra_ops.rst +0 -0
  145. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/fft.rst +0 -0
  146. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/functional.rst +0 -0
  147. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/index.rst +0 -0
  148. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/io.rst +0 -0
  149. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/linalg.rst +0 -0
  150. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/math_opt.rst +0 -0
  151. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/nlinalg.rst +0 -0
  152. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/optimize.rst +0 -0
  153. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/plot_fft.png +0 -0
  154. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/random.rst +0 -0
  155. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/slinalg.rst +0 -0
  156. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/utils.rst +0 -0
  157. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/typed_list.rst +0 -0
  158. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/index.md +0 -0
  159. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/linalg.md +0 -0
  160. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/math.md +0 -0
  161. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/module_functions.md +0 -0
  162. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/random.md +0 -0
  163. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/signal.md +0 -0
  164. {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/type.md +0 -0
  165. {pytensor-3.3.1 → pytensor-3.3.2}/doc/links.rst +0 -0
  166. {pytensor-3.3.1 → pytensor-3.3.2}/doc/optimizations.rst +0 -0
  167. {pytensor-3.3.1 → pytensor-3.3.2}/doc/pylintrc +0 -0
  168. {pytensor-3.3.1 → pytensor-3.3.2}/doc/robots.txt +0 -0
  169. {pytensor-3.3.1 → pytensor-3.3.2}/doc/troubleshooting.rst +0 -0
  170. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/adding.rst +0 -0
  171. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/adding_solution_1.py +0 -0
  172. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/aliasing.rst +0 -0
  173. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/apply.png +0 -0
  174. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/apply.svg +0 -0
  175. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/bcast.png +0 -0
  176. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/broadcasting.rst +0 -0
  177. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/conditions.rst +0 -0
  178. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/debug_faq.rst +0 -0
  179. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/dlogistic.png +0 -0
  180. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/examples.rst +0 -0
  181. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/faq_tutorial.rst +0 -0
  182. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/gradients.rst +0 -0
  183. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/index.rst +0 -0
  184. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/loading_and_saving.rst +0 -0
  185. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/logistic.gp +0 -0
  186. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/logistic.png +0 -0
  187. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/loop.rst +0 -0
  188. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/loop_solution_1.py +0 -0
  189. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/modes.rst +0 -0
  190. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/modes_solution_1.py +0 -0
  191. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/multi_cores.rst +0 -0
  192. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/nan_tutorial.rst +0 -0
  193. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/pics/d3viz.png +0 -0
  194. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  195. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  196. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  197. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/printing_drawing.rst +0 -0
  198. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/prng.rst +0 -0
  199. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/profiling.rst +0 -0
  200. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/profiling_example.py +0 -0
  201. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/profiling_example_out.prof +0 -0
  202. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/shape_info.rst +0 -0
  203. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/sparse.rst +0 -0
  204. {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/symbolic_graphs.rst +0 -0
  205. {pytensor-3.3.1 → pytensor-3.3.2}/doc/user_guide.rst +0 -0
  206. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/__init__.py +0 -0
  207. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/_sparse_lazy.py +0 -0
  208. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/__init__.py +0 -0
  209. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/alloc.py +0 -0
  210. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/blockwise.py +0 -0
  211. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/core.py +0 -0
  212. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/diagonal.py +0 -0
  213. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/dimshuffle.py +0 -0
  214. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/dot.py +0 -0
  215. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/elemwise.py +0 -0
  216. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/orthogonal.py +0 -0
  217. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/permutation.py +0 -0
  218. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/positive_definite.py +0 -0
  219. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/reshape.py +0 -0
  220. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/selection.py +0 -0
  221. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/shape.py +0 -0
  222. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/specify.py +0 -0
  223. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/subtensor.py +0 -0
  224. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/symmetric.py +0 -0
  225. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/triangular.py +0 -0
  226. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/basic.py +0 -0
  227. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/bin/__init__.py +0 -0
  228. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/bin/pytensor_cache.py +0 -0
  229. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/breakpoint.py +0 -0
  230. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/__init__.py +0 -0
  231. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/aliasing.py +0 -0
  232. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/builders.py +0 -0
  233. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/compiledir.py +0 -0
  234. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/compilelock.py +0 -0
  235. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/debug/__init__.py +0 -0
  236. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/debug/debugmode.py +0 -0
  237. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/debug/dump.py +0 -0
  238. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/debug/monitormode.py +0 -0
  239. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/debug/nanguardmode.py +0 -0
  240. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/debug/profiling.py +0 -0
  241. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/executor.py +0 -0
  242. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/inner_function.py +0 -0
  243. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/io.py +0 -0
  244. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/maker.py +0 -0
  245. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/mode.py +0 -0
  246. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/ops.py +0 -0
  247. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/rebuild.py +0 -0
  248. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/rewriting.py +0 -0
  249. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/sharedvalue.py +0 -0
  250. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/configdefaults.py +0 -0
  251. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/configparser.py +0 -0
  252. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/__init__.py +0 -0
  253. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  254. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/css/d3viz.css +0 -0
  255. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/formatting.py +0 -0
  256. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/html/template.html +0 -0
  257. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  258. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  259. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/js/d3viz.js +0 -0
  260. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  261. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  262. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/gradient.py +0 -0
  263. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/__init__.py +0 -0
  264. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/basic.py +0 -0
  265. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/destroyhandler.py +0 -0
  266. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/features.py +0 -0
  267. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/null_type.py +0 -0
  268. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/op.py +0 -0
  269. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/replace.py +0 -0
  270. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/__init__.py +0 -0
  271. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/basic.py +0 -0
  272. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/db.py +0 -0
  273. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/kanren.py +0 -0
  274. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/reachability.py +0 -0
  275. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/unify.py +0 -0
  276. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/utils.py +0 -0
  277. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/type.py +0 -0
  278. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/utils.py +0 -0
  279. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/ifelse.py +0 -0
  280. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/ipython.py +0 -0
  281. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/__init__.py +0 -0
  282. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/basic.py +0 -0
  283. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/__init__.py +0 -0
  284. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/basic.py +0 -0
  285. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  286. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  287. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/cmodule.py +0 -0
  288. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/cutils.py +0 -0
  289. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/cvm.py +0 -0
  290. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/exceptions.py +0 -0
  291. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/interface.py +0 -0
  292. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/lazylinker_c.py +0 -0
  293. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/op.py +0 -0
  294. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/params_type.py +0 -0
  295. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/type.py +0 -0
  296. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/__init__.py +0 -0
  297. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/__init__.py +0 -0
  298. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/basic.py +0 -0
  299. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/blas.py +0 -0
  300. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  301. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/einsum.py +0 -0
  302. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  303. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  304. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
  305. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
  306. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
  307. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
  308. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
  309. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
  310. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
  311. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/math.py +0 -0
  312. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/pad.py +0 -0
  313. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/random.py +0 -0
  314. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/scalar.py +0 -0
  315. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/scan.py +0 -0
  316. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/shape.py +0 -0
  317. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  318. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  319. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/sort.py +0 -0
  320. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/sparse.py +0 -0
  321. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  322. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  323. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/linker.py +0 -0
  324. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/ops.py +0 -0
  325. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/__init__.py +0 -0
  326. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/blas.py +0 -0
  327. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
  328. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/einsum.py +0 -0
  329. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
  330. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
  331. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
  332. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/decomposition.py +0 -0
  333. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/inverse.py +0 -0
  334. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
  335. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/summary.py +0 -0
  336. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/math.py +0 -0
  337. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/pad.py +0 -0
  338. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/__init__.py +0 -0
  339. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/basic.py +0 -0
  340. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/bessel.py +0 -0
  341. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/beta.py +0 -0
  342. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/erf.py +0 -0
  343. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/erfcinv.py +0 -0
  344. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/gamma.py +0 -0
  345. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/gammainc.py +0 -0
  346. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/helpers.py +0 -0
  347. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/math.py +0 -0
  348. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/shape.py +0 -0
  349. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  350. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  351. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/sort.py +0 -0
  352. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
  353. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/__init__.py +0 -0
  354. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/cache.py +0 -0
  355. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/__init__.py +0 -0
  356. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/_llvmlite_self_ref.py +0 -0
  357. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/_patch_list_to_tuple.py +0 -0
  358. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/_patch_pointer_add.py +0 -0
  359. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/basic.py +0 -0
  360. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  361. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
  362. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/elemwise.py +0 -0
  363. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  364. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/_BLAS.py +0 -0
  365. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
  366. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  367. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
  368. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  369. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  370. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
  371. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
  372. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
  373. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  374. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
  375. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
  376. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
  377. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
  378. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
  379. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
  380. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
  381. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
  382. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
  383. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
  384. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
  385. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
  386. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
  387. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
  388. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
  389. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
  390. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
  391. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
  392. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  393. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/random.py +0 -0
  394. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/scan.py +0 -0
  395. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/shape.py +0 -0
  396. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  397. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  398. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sort.py +0 -0
  399. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
  400. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
  401. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
  402. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
  403. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
  404. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  405. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  406. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/typed_list.py +0 -0
  407. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  408. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/linker.py +0 -0
  409. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  410. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  411. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  412. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  413. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  414. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  415. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
  416. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
  417. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
  418. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
  419. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
  420. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/math.py +0 -0
  421. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  422. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  423. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  424. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  425. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/linker.py +0 -0
  426. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/utils.py +0 -0
  427. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/vm.py +0 -0
  428. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/__init__.py +0 -0
  429. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/check_blas.py +0 -0
  430. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/check_blas_many.sh +0 -0
  431. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/check_duplicate_key.py +0 -0
  432. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  433. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/elemwise_time_test.py +0 -0
  434. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/frozendict.py +0 -0
  435. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/may_share_memory.py +0 -0
  436. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/ordered_set.py +0 -0
  437. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/pkl_utils.py +0 -0
  438. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/npy_2_compat.py +0 -0
  439. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/printing.py +0 -0
  440. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/py.typed +0 -0
  441. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/raise_op.py +0 -0
  442. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/__init__.py +0 -0
  443. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/basic.py +0 -0
  444. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  445. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  446. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/c_code/gamma.c +0 -0
  447. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/c_code/incbet.c +0 -0
  448. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/loop.py +0 -0
  449. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/math.py +0 -0
  450. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/sharedvar.py +0 -0
  451. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/__init__.py +0 -0
  452. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/basic.py +0 -0
  453. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/checkpoints.py +0 -0
  454. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/op.py +0 -0
  455. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/__init__.py +0 -0
  456. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/db.py +0 -0
  457. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/inner_graph.py +0 -0
  458. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/inplace.py +0 -0
  459. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/io.py +0 -0
  460. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/merge.py +0 -0
  461. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/push_out.py +0 -0
  462. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/trace.py +0 -0
  463. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/utils.py +0 -0
  464. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/scan_perform.pyx +0 -0
  465. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/scan_perform_ext.py +0 -0
  466. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/utils.py +0 -0
  467. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/views.py +0 -0
  468. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/__init__.py +0 -0
  469. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/basic.py +0 -0
  470. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/linalg.py +0 -0
  471. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/math.py +0 -0
  472. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/rewriting.py +0 -0
  473. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/sharedvar.py +0 -0
  474. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/type.py +0 -0
  475. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/utils.py +0 -0
  476. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/variable.py +0 -0
  477. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/__init__.py +0 -0
  478. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/basic.py +0 -0
  479. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/__init__.py +0 -0
  480. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/_core.py +0 -0
  481. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/batched.py +0 -0
  482. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/blas_c.py +0 -0
  483. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/__init__.py +0 -0
  484. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/alt_blas_common.h +0 -0
  485. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/alt_blas_template.c +0 -0
  486. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/blas_headers.py +0 -0
  487. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/codegen.py +0 -0
  488. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/gemm.py +0 -0
  489. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/gemv.py +0 -0
  490. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/ger.py +0 -0
  491. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blockwise.py +0 -0
  492. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/einsum.py +0 -0
  493. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/elemwise.py +0 -0
  494. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/elemwise_cgen.py +0 -0
  495. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/exceptions.py +0 -0
  496. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/extra_ops.py +0 -0
  497. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/fft.py +0 -0
  498. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/fourier.py +0 -0
  499. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/functional.py +0 -0
  500. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/interpolate.py +0 -0
  501. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/__init__.py +0 -0
  502. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/_lazy.py +0 -0
  503. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/constructors.py +0 -0
  504. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
  505. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
  506. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
  507. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
  508. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
  509. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
  510. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
  511. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/dtype_utils.py +0 -0
  512. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/inverse.py +0 -0
  513. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/products.py +0 -0
  514. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
  515. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/core.py +0 -0
  516. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/general.py +0 -0
  517. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
  518. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
  519. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/psd.py +0 -0
  520. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
  521. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
  522. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/summary.py +0 -0
  523. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/math.py +0 -0
  524. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/nlinalg.py +0 -0
  525. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/optimize.py +0 -0
  526. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/pad.py +0 -0
  527. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/__init__.py +0 -0
  528. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/basic.py +0 -0
  529. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/op.py +0 -0
  530. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  531. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/rewriting/basic.py +0 -0
  532. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/rewriting/jax.py +0 -0
  533. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/rewriting/numba.py +0 -0
  534. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/type.py +0 -0
  535. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/utils.py +0 -0
  536. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/variable.py +0 -0
  537. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/reshape.py +0 -0
  538. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/__init__.py +0 -0
  539. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/assumptions.py +0 -0
  540. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/basic.py +0 -0
  541. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/blas.py +0 -0
  542. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/blas_c.py +0 -0
  543. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/blockwise.py +0 -0
  544. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/einsum.py +0 -0
  545. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/elemwise.py +0 -0
  546. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  547. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/fused_elemwise.py +0 -0
  548. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/jax.py +0 -0
  549. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
  550. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
  551. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
  552. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/products.py +0 -0
  553. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
  554. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/summary.py +0 -0
  555. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
  556. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/math.py +0 -0
  557. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/numba.py +0 -0
  558. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/ofg.py +0 -0
  559. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/optimize.py +0 -0
  560. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/reshape.py +0 -0
  561. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/shape.py +0 -0
  562. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/special.py +0 -0
  563. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/subtensor.py +0 -0
  564. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
  565. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  566. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/shape.py +0 -0
  567. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/sharedvar.py +0 -0
  568. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/signal/__init__.py +0 -0
  569. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/signal/conv.py +0 -0
  570. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/slinalg.py +0 -0
  571. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/sort.py +0 -0
  572. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/special.py +0 -0
  573. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/subtensor.py +0 -0
  574. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/symbolic.py +0 -0
  575. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/type.py +0 -0
  576. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/type_other.py +0 -0
  577. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/utils.py +0 -0
  578. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/var.py +0 -0
  579. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/variable.py +0 -0
  580. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/xlogx.py +0 -0
  581. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/typed_list/__init__.py +0 -0
  582. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/typed_list/basic.py +0 -0
  583. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/typed_list/rewriting.py +0 -0
  584. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/typed_list/type.py +0 -0
  585. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/utils.py +0 -0
  586. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/__init__.py +0 -0
  587. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/basic.py +0 -0
  588. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/indexing.py +0 -0
  589. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/linalg.py +0 -0
  590. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/math.py +0 -0
  591. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/random/__init__.py +0 -0
  592. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/random/basic.py +0 -0
  593. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/random/type.py +0 -0
  594. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/random/variable.py +0 -0
  595. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/reduction.py +0 -0
  596. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/__init__.py +0 -0
  597. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/basic.py +0 -0
  598. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/indexing.py +0 -0
  599. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/math.py +0 -0
  600. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/reduction.py +0 -0
  601. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/shape.py +0 -0
  602. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/utils.py +0 -0
  603. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  604. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/shape.py +0 -0
  605. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/signal.py +0 -0
  606. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/type.py +0 -0
  607. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/vectorization.py +0 -0
  608. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor.egg-info/dependency_links.txt +0 -0
  609. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor.egg-info/entry_points.txt +0 -0
  610. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor.egg-info/requires.txt +0 -0
  611. {pytensor-3.3.1 → pytensor-3.3.2}/pytensor.egg-info/top_level.txt +0 -0
  612. {pytensor-3.3.1 → pytensor-3.3.2}/scripts/mypy-failing.txt +0 -0
  613. {pytensor-3.3.1 → pytensor-3.3.2}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  614. {pytensor-3.3.1 → pytensor-3.3.2}/setup.cfg +0 -0
  615. {pytensor-3.3.1 → pytensor-3.3.2}/setup.py +0 -0
  616. {pytensor-3.3.1 → pytensor-3.3.2}/tests/link/c/c_code/test_cenum.h +0 -0
  617. {pytensor-3.3.1 → pytensor-3.3.2}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  618. {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_basic.py +0 -0
  619. {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_breakpoint.py +0 -0
  620. {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_config.py +0 -0
  621. {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_gradient.py +0 -0
  622. {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_ifelse.py +0 -0
  623. {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_printing.py +0 -0
  624. {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_raise_op.py +0 -0
  625. {pytensor-3.3.1 → pytensor-3.3.2}/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.2
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
@@ -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-09-14T16:15:54+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "bb5967ab72cfc29ee9f47c4a2fd0aaeeb1695268",
15
- "version": "3.3.1"
14
+ "full-revisionid": "895f7795e2ae8ea16e3a4097ce4b92c61c8faf76",
15
+ "version": "3.3.2"
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
 
@@ -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)
@@ -33,12 +33,22 @@ def mlx_funcify_Solve(op, node, **kwargs):
33
33
  @mlx_funcify.register(SolveTriangular)
34
34
  def mlx_funcify_SolveTriangular(op, node, **kwargs):
35
35
  lower = op.lower
36
+ unit_diagonal = op.unit_diagonal
36
37
  A_dtype = getattr(mx, node.inputs[0].dtype)
37
38
  b_dtype = getattr(mx, node.inputs[1].dtype)
38
39
 
39
40
  def solve_triangular(A, b):
41
+ A = A.astype(stream=mx.cpu, dtype=A_dtype)
42
+
43
+ if unit_diagonal:
44
+ # MLX's `solve_triangular` has no `unit_diagonal`. LAPACK's `trtrs`
45
+ # never reads the diagonal in that mode, so overwriting it with ones
46
+ # gives the same answer.
47
+ diagonal_mask = mx.eye(A.shape[-1], dtype=mx.bool_, stream=mx.cpu)
48
+ A = mx.where(diagonal_mask, mx.array(1, dtype=A_dtype), A, stream=mx.cpu)
49
+
40
50
  return mx.linalg.solve_triangular(
41
- A.astype(stream=mx.cpu, dtype=A_dtype),
51
+ A,
42
52
  b.astype(stream=mx.cpu, dtype=b_dtype),
43
53
  upper=not lower,
44
54
  stream=mx.cpu,
@@ -0,0 +1,276 @@
1
+ from functools import singledispatch
2
+
3
+ import mlx.core as mx
4
+ from numpy.random import Generator
5
+
6
+ import pytensor.tensor.random.basic as ptr
7
+ from pytensor.link.mlx.dispatch.basic import mlx_funcify, mlx_typify
8
+ from pytensor.link.mlx.dispatch.tensor_basic import (
9
+ convert_dtype_to_mlx,
10
+ mlx_to_list_shape,
11
+ )
12
+
13
+
14
+ def numpy_generator_to_mlx_key(rng: Generator) -> mx.array:
15
+ """Convert a NumPy Generator to an MLX random key.
16
+
17
+ MLX keys are 64-bit, so we XOR-fold the two halves of the 128-bit PCG64
18
+ state to keep all of its entropy.
19
+ """
20
+ state = rng.bit_generator.state
21
+ if state["bit_generator"] not in ("PCG64", "PCG64DXSM"):
22
+ raise NotImplementedError(
23
+ "MLX RNG conversion only supports the PCG64 bit generator, got "
24
+ f"{state['bit_generator']}."
25
+ )
26
+ state_128 = int(state["state"]["state"])
27
+ upper = (state_128 >> 64) & 0xFFFFFFFFFFFFFFFF
28
+ lower = state_128 & 0xFFFFFFFFFFFFFFFF
29
+ return mx.random.key(upper ^ lower)
30
+
31
+
32
+ def _shape_from_size(size, *parameters) -> list[int] | tuple[int, ...]:
33
+ """Sampling shape: ``size`` if given, else the broadcast of the parameters."""
34
+ if size is not None:
35
+ return mlx_to_list_shape(size)
36
+ return tuple(mx.broadcast_shapes(*(p.shape for p in parameters)))
37
+
38
+
39
+ @mlx_typify.register(Generator)
40
+ def mlx_typify_Generator(rng, **kwargs):
41
+ return numpy_generator_to_mlx_key(rng)
42
+
43
+
44
+ @mlx_funcify.register(ptr.RandomVariable)
45
+ def mlx_funcify_RandomVariable(op, node, **kwargs):
46
+ rv = node.outputs[1]
47
+ out_dtype = rv.type.dtype
48
+
49
+ # MLX random primitives reject float64 regardless of device, so sample in
50
+ # float32 and widen the draw to the declared output dtype afterwards.
51
+ mlx_out_dtype = convert_dtype_to_mlx(out_dtype)
52
+ sample_dtype = mx.float32 if mlx_out_dtype == mx.float64 else mlx_out_dtype
53
+
54
+ sample_fn_inner = mlx_sample_fn(op, node)
55
+
56
+ def sample_fn(rng, size, *parameters):
57
+ new_rng, sampling_key = mx.random.split(rng, num=2)
58
+ sample = sample_fn_inner(sampling_key, size, sample_dtype, *parameters)
59
+ if sample.dtype != mlx_out_dtype:
60
+ sample = sample.astype(mlx_out_dtype)
61
+ return (new_rng, sample)
62
+
63
+ return sample_fn
64
+
65
+
66
+ @singledispatch
67
+ def mlx_sample_fn(op, node):
68
+ raise NotImplementedError(
69
+ f"No MLX implementation for the given distribution: {op.name}"
70
+ )
71
+
72
+
73
+ @mlx_sample_fn.register(ptr.NormalRV)
74
+ def mlx_sample_fn_normal(op, node):
75
+ def sample_fn(rng_key, size, dtype, loc, scale):
76
+ mlx_dtype = convert_dtype_to_mlx(dtype)
77
+ loc = mx.array(loc, dtype=mlx_dtype)
78
+ scale = mx.array(scale, dtype=mlx_dtype)
79
+ shape = _shape_from_size(size, loc, scale)
80
+ return loc + scale * mx.random.normal(shape=shape, dtype=mlx_dtype, key=rng_key)
81
+
82
+ return sample_fn
83
+
84
+
85
+ @mlx_sample_fn.register(ptr.LaplaceRV)
86
+ def mlx_sample_fn_laplace(op, node):
87
+ def sample_fn(rng_key, size, dtype, loc, scale):
88
+ mlx_dtype = convert_dtype_to_mlx(dtype)
89
+ loc = mx.array(loc, dtype=mlx_dtype)
90
+ scale = mx.array(scale, dtype=mlx_dtype)
91
+ shape = _shape_from_size(size, loc, scale)
92
+ return loc + scale * mx.random.laplace(
93
+ shape=shape, dtype=mlx_dtype, key=rng_key
94
+ )
95
+
96
+ return sample_fn
97
+
98
+
99
+ @mlx_sample_fn.register(ptr.GumbelRV)
100
+ def mlx_sample_fn_gumbel(op, node):
101
+ def sample_fn(rng_key, size, dtype, loc, scale):
102
+ mlx_dtype = convert_dtype_to_mlx(dtype)
103
+ loc = mx.array(loc, dtype=mlx_dtype)
104
+ scale = mx.array(scale, dtype=mlx_dtype)
105
+ shape = _shape_from_size(size, loc, scale)
106
+ return loc + scale * mx.random.gumbel(shape=shape, dtype=mlx_dtype, key=rng_key)
107
+
108
+ return sample_fn
109
+
110
+
111
+ @mlx_sample_fn.register(ptr.UniformRV)
112
+ def mlx_sample_fn_uniform(op, node):
113
+ def sample_fn(rng_key, size, dtype, low, high):
114
+ mlx_dtype = convert_dtype_to_mlx(dtype)
115
+ low = mx.array(low, dtype=mlx_dtype)
116
+ high = mx.array(high, dtype=mlx_dtype)
117
+ shape = _shape_from_size(size, low, high)
118
+ return mx.random.uniform(
119
+ low=low, high=high, shape=shape, dtype=mlx_dtype, key=rng_key
120
+ )
121
+
122
+ return sample_fn
123
+
124
+
125
+ @mlx_sample_fn.register(ptr.IntegersRV)
126
+ def mlx_sample_fn_integers(op, node):
127
+ def sample_fn(rng_key, size, dtype, low, high):
128
+ low = mx.array(low)
129
+ high = mx.array(high)
130
+ shape = _shape_from_size(size, low, high)
131
+ # Sample at full int64 width and cast the result: PyTensor casts the
132
+ # output, not the bounds, so narrow/wide dtypes don't corrupt the range.
133
+ return mx.random.randint(
134
+ low=low, high=high, shape=shape, dtype=mx.int64, key=rng_key
135
+ ).astype(convert_dtype_to_mlx(dtype))
136
+
137
+ return sample_fn
138
+
139
+
140
+ @mlx_sample_fn.register(ptr.BernoulliRV)
141
+ def mlx_sample_fn_bernoulli(op, node):
142
+ def sample_fn(rng_key, size, dtype, p):
143
+ p = mx.array(p)
144
+ shape = mlx_to_list_shape(size) if size is not None else None
145
+ # MLX draws bool; PyTensor declares an int dtype.
146
+ return mx.random.bernoulli(p=p, shape=shape, key=rng_key).astype(
147
+ convert_dtype_to_mlx(dtype)
148
+ )
149
+
150
+ return sample_fn
151
+
152
+
153
+ @mlx_sample_fn.register(ptr.CategoricalRV)
154
+ def mlx_sample_fn_categorical(op, node):
155
+ def sample_fn(rng_key, size, dtype, p):
156
+ logits = mx.log(mx.array(p))
157
+ shape = mlx_to_list_shape(size) if size is not None else None
158
+ # MLX draws uint32; PyTensor declares an int dtype.
159
+ return mx.random.categorical(
160
+ logits=logits, axis=-1, shape=shape, key=rng_key
161
+ ).astype(convert_dtype_to_mlx(dtype))
162
+
163
+ return sample_fn
164
+
165
+
166
+ @mlx_sample_fn.register(ptr.MvNormalRV)
167
+ def mlx_sample_fn_mvnormal(op, node):
168
+ method = op.method
169
+
170
+ def sample_fn(rng_key, size, dtype, mean, cov):
171
+ mlx_dtype = convert_dtype_to_mlx(dtype)
172
+ mean = mx.array(mean, dtype=mlx_dtype)
173
+ cov = mx.array(cov, dtype=mlx_dtype)
174
+
175
+ n = cov.shape[-1]
176
+ if size is not None:
177
+ batch_shape = mlx_to_list_shape(size)
178
+ else:
179
+ batch_shape = mx.broadcast_shapes(mean.shape[:-1], cov.shape[:-2])
180
+
181
+ if 0 in tuple(batch_shape):
182
+ # Empty batch dim crashes MLX's compiled matmul; the draw is empty anyway.
183
+ return mx.broadcast_to(mean, [*batch_shape, n])
184
+
185
+ # Factor ``cov = A @ A.T`` so that ``mean + A @ z`` has covariance ``cov``.
186
+ if method == "cholesky":
187
+ A = mx.linalg.cholesky(cov, stream=mx.cpu)
188
+ elif method == "svd":
189
+ U, s, _ = mx.linalg.svd(cov, stream=mx.cpu)
190
+ A = U * mx.sqrt(s)[..., None, :]
191
+ else: # eigh
192
+ w, vecs = mx.linalg.eigh(cov, stream=mx.cpu)
193
+ A = vecs * mx.sqrt(w)[..., None, :]
194
+
195
+ z = mx.random.normal(shape=[*batch_shape, n], dtype=mlx_dtype, key=rng_key)
196
+ return mean + (A @ z[..., None])[..., 0]
197
+
198
+ return sample_fn
199
+
200
+
201
+ @mlx_sample_fn.register(ptr.PermutationRV)
202
+ def mlx_sample_fn_permutation(op, node):
203
+ if op.batch_ndim(node):
204
+ raise NotImplementedError(
205
+ "MLX random.permutation does not support batch dimensions."
206
+ )
207
+
208
+ def sample_fn(rng_key, size, dtype, x):
209
+ return mx.random.permutation(x, key=rng_key)
210
+
211
+ return sample_fn
212
+
213
+
214
+ @mlx_sample_fn.register(ptr.LogNormalRV)
215
+ def mlx_sample_fn_lognormal(op, node):
216
+ def sample_fn(rng_key, size, dtype, mu, sigma):
217
+ mlx_dtype = convert_dtype_to_mlx(dtype)
218
+ mu = mx.array(mu, dtype=mlx_dtype)
219
+ sigma = mx.array(sigma, dtype=mlx_dtype)
220
+ shape = _shape_from_size(size, mu, sigma)
221
+ z = mx.random.normal(shape=shape, dtype=mlx_dtype, key=rng_key)
222
+ return mx.exp(mu + sigma * z)
223
+
224
+ return sample_fn
225
+
226
+
227
+ @mlx_sample_fn.register(ptr.HalfNormalRV)
228
+ def mlx_sample_fn_halfnormal(op, node):
229
+ def sample_fn(rng_key, size, dtype, loc, scale):
230
+ mlx_dtype = convert_dtype_to_mlx(dtype)
231
+ loc = mx.array(loc, dtype=mlx_dtype)
232
+ scale = mx.array(scale, dtype=mlx_dtype)
233
+ shape = _shape_from_size(size, loc, scale)
234
+ z = mx.random.normal(shape=shape, dtype=mlx_dtype, key=rng_key)
235
+ return loc + scale * mx.abs(z)
236
+
237
+ return sample_fn
238
+
239
+
240
+ @mlx_sample_fn.register(ptr.ExponentialRV)
241
+ def mlx_sample_fn_exponential(op, node):
242
+ def sample_fn(rng_key, size, dtype, scale):
243
+ mlx_dtype = convert_dtype_to_mlx(dtype)
244
+ scale = mx.array(scale, dtype=mlx_dtype)
245
+ shape = _shape_from_size(size, scale)
246
+ u = mx.random.uniform(shape=shape, dtype=mlx_dtype, key=rng_key)
247
+ # log1p(-u) avoids -inf when u=0 (u is in [0, 1))
248
+ return -scale * mx.log1p(-u)
249
+
250
+ return sample_fn
251
+
252
+
253
+ @mlx_sample_fn.register(ptr.LogisticRV)
254
+ def mlx_sample_fn_logistic(op, node):
255
+ def sample_fn(rng_key, size, dtype, loc, scale):
256
+ mlx_dtype = convert_dtype_to_mlx(dtype)
257
+ loc = mx.array(loc, dtype=mlx_dtype)
258
+ scale = mx.array(scale, dtype=mlx_dtype)
259
+ shape = _shape_from_size(size, loc, scale)
260
+ u = mx.random.uniform(shape=shape, dtype=mlx_dtype, key=rng_key)
261
+ return loc + scale * mx.log(u / (1 - u))
262
+
263
+ return sample_fn
264
+
265
+
266
+ @mlx_sample_fn.register(ptr.CauchyRV)
267
+ def mlx_sample_fn_cauchy(op, node):
268
+ def sample_fn(rng_key, size, dtype, loc, scale):
269
+ mlx_dtype = convert_dtype_to_mlx(dtype)
270
+ loc = mx.array(loc, dtype=mlx_dtype)
271
+ scale = mx.array(scale, dtype=mlx_dtype)
272
+ shape = _shape_from_size(size, loc, scale)
273
+ u = mx.random.uniform(shape=shape, dtype=mlx_dtype, key=rng_key)
274
+ return loc + scale * mx.tan(mx.pi * (u - 0.5))
275
+
276
+ return sample_fn
@@ -239,6 +239,16 @@ def _coerce_to_int(value):
239
239
  raise
240
240
 
241
241
 
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]
250
+
251
+
242
252
  def _rethrow_dynamic_shape_error(exc):
243
253
  msg = str(exc)
244
254
  if "[eval] Attempting to eval an array during function transformations" in msg:
@@ -0,0 +1,143 @@
1
+ import warnings
2
+
3
+ from pytensor.compile.sharedvalue import SharedVariable, shared
4
+ from pytensor.link.basic import JITLinker
5
+
6
+
7
+ class MLXLinker(JITLinker):
8
+ """A `Linker` that JIT-compiles NumPy-based operations using Apple's MLX."""
9
+
10
+ required_rewrites = ("minimum_compile",)
11
+ incompatible_rewrites = (
12
+ "cxx_only",
13
+ "BlasOpt",
14
+ "local_careduce_fusion",
15
+ "inplace",
16
+ "scan_reduce_trace_prealloc",
17
+ "inline_einsum",
18
+ )
19
+
20
+ def __init__(self, use_compile=True, *args, **kwargs):
21
+ super().__init__(*args, **kwargs)
22
+ self.gen_functors = []
23
+ self.use_compile = use_compile
24
+
25
+ def fgraph_convert(self, fgraph, input_storage, storage_map, **kwargs):
26
+ """Convert a PyTensor FunctionGraph to an MLX-compatible function.
27
+
28
+ Parameters
29
+ ----------
30
+ fgraph : FunctionGraph
31
+ The function graph to convert
32
+
33
+ Returns
34
+ -------
35
+ callable
36
+ An MLX-compatible function
37
+ """
38
+ from pytensor.link.mlx.dispatch import mlx_funcify
39
+ from pytensor.tensor.random.type import RandomType
40
+
41
+ shared_rng_inputs = [
42
+ inp
43
+ for inp in fgraph.inputs
44
+ if (isinstance(inp, SharedVariable) and isinstance(inp.type, RandomType))
45
+ ]
46
+
47
+ # Replace any shared RNG inputs so that their values can be updated in place
48
+ # without affecting the original RNG container. This is necessary because
49
+ # MLX does not accept Generators as inputs, and they will have to
50
+ # be typified
51
+ if shared_rng_inputs:
52
+ warnings.warn(
53
+ f"The RandomType SharedVariables {shared_rng_inputs} will not be used "
54
+ f"in the compiled MLX graph. Instead a copy will be used.",
55
+ UserWarning,
56
+ )
57
+ new_shared_rng_inputs = [
58
+ shared(inp.get_value(borrow=False)) for inp in shared_rng_inputs
59
+ ]
60
+
61
+ fgraph.replace_all(
62
+ zip(shared_rng_inputs, new_shared_rng_inputs, strict=True),
63
+ import_missing=True,
64
+ reason="MLXLinker.fgraph_convert",
65
+ )
66
+
67
+ for old_inp, new_inp in zip(
68
+ shared_rng_inputs, new_shared_rng_inputs, strict=True
69
+ ):
70
+ new_inp_storage = [new_inp.get_value(borrow=True)]
71
+ storage_map[new_inp] = new_inp_storage
72
+ old_inp_storage = storage_map.pop(old_inp)
73
+ # Find index of old_inp_storage in input_storage
74
+ for input_storage_idx, input_storage_item in enumerate(input_storage):
75
+ # We have to establish equality based on identity because input_storage may contain numpy arrays
76
+ if input_storage_item is old_inp_storage:
77
+ break
78
+ else: # no break
79
+ raise ValueError()
80
+ input_storage[input_storage_idx] = new_inp_storage
81
+ # We need to change the order of the inputs of the FunctionGraph
82
+ # so that the new input is in the same position as to old one,
83
+ # to align with the storage_map. We hope this is safe!
84
+ old_inp_fgraph_index = fgraph.inputs.index(old_inp)
85
+ fgraph.remove_input(
86
+ old_inp_fgraph_index,
87
+ reason="MLXLinker.fgraph_convert",
88
+ )
89
+ fgraph.inputs.remove(new_inp)
90
+ fgraph.inputs.insert(old_inp_fgraph_index, new_inp)
91
+
92
+ return mlx_funcify(
93
+ fgraph,
94
+ input_storage=input_storage,
95
+ storage_map=storage_map,
96
+ **kwargs,
97
+ )
98
+
99
+ def jit_compile(self, fn):
100
+ import mlx.core as mx
101
+
102
+ from pytensor.link.mlx.dispatch import mlx_typify
103
+
104
+ if not self.use_compile:
105
+ # Skip compilation and just return the function with MLX typification
106
+ def fn_no_compile(*inputs):
107
+ return fn(*(mlx_typify(inp) for inp in inputs))
108
+
109
+ return fn_no_compile
110
+
111
+ inner_fn = mx.compile(fn)
112
+
113
+ def fn(*inputs, inner_fn=inner_fn):
114
+ return inner_fn(*(mlx_typify(inp) for inp in inputs))
115
+
116
+ return fn
117
+
118
+ def create_thunk_inputs(self, storage_map):
119
+ """Create inputs for the MLX thunk.
120
+
121
+ Parameters
122
+ ----------
123
+ storage_map : dict
124
+ Map from variables to their storage
125
+
126
+ Returns
127
+ -------
128
+ list
129
+ The inputs for the thunk
130
+ """
131
+ from numpy.random import Generator
132
+
133
+ from pytensor.link.mlx.dispatch import mlx_typify
134
+
135
+ thunk_inputs = []
136
+ for n in self.fgraph.inputs:
137
+ sinput = storage_map[n]
138
+ if isinstance(sinput[0], Generator):
139
+ # Convert Generator into MLX PRNG key
140
+ sinput[0] = mlx_typify(sinput[0])
141
+ thunk_inputs.append(sinput)
142
+
143
+ return thunk_inputs
@@ -1,8 +1,7 @@
1
1
  import importlib
2
2
  import re
3
- from collections.abc import Callable, Mapping
3
+ from collections.abc import Callable
4
4
  from dataclasses import dataclass
5
- from typing import Any, cast
6
5
 
7
6
  import numba
8
7
  import numpy as np
@@ -33,9 +32,7 @@ _C_TO_NUMPY: dict[str, DTypeLike] = {
33
32
  @dataclass
34
33
  class Signature:
35
34
  res_dtype: DTypeLike
36
- res_c_type: str
37
35
  arg_dtypes: list[DTypeLike]
38
- arg_c_types: list[str]
39
36
  arg_names: list[str | None]
40
37
 
41
38
  @property
@@ -92,7 +89,6 @@ class Signature:
92
89
 
93
90
  arg_dtypes = []
94
91
  arg_names: list[str | None] = []
95
- arg_c_types = []
96
92
  for raw_arg in raw_args.split(b","):
97
93
  re_match = re.fullmatch(decl_expr, raw_arg)
98
94
  if re_match is None:
@@ -104,7 +100,6 @@ class Signature:
104
100
  except KeyError:
105
101
  raise ValueError(f"Unknown C type: {arg_c_type}")
106
102
 
107
- arg_c_types.append(arg_c_type)
108
103
  arg_dtypes.append(arg_dtype)
109
104
  name = groups["name"]
110
105
  if not name:
@@ -112,36 +107,38 @@ class Signature:
112
107
  else:
113
108
  arg_names.append(name.decode())
114
109
 
115
- return Signature(res_dtype, res_c_type, arg_dtypes, arg_c_types, arg_names)
110
+ return Signature(res_dtype, arg_dtypes, arg_names)
116
111
 
117
112
 
118
- def _available_impls(func: Callable) -> list[tuple[Signature, Any, str]]:
113
+ def _available_impls(func: Callable) -> list[tuple[Signature, str]]:
119
114
  """Find all available implementations for a fused cython function.
120
115
 
121
- Each entry is ``(signature, capsule, capi_name)``, where ``capi_name`` is the key under
116
+ Each entry is ``(signature, capi_name)``, where ``capi_name`` is the key under
122
117
  which the implementation is exported in the module's ``__pyx_capi__`` table. That name is a
123
118
  stable, picklable handle for the C function, used to re-resolve its address at runtime.
124
119
  """
125
120
  impls = []
126
121
  mod = importlib.import_module(func.__module__)
127
122
 
128
- signatures = getattr(func, "__signatures__", None)
129
- if signatures is not None:
130
- # Cython function with __signatures__ should be fused and thus
131
- # indexable
132
- func_map = cast(Mapping, func)
133
- candidates = [func_map[key] for key in signatures]
123
+ if getattr(func, "__signatures__", None) is not None:
124
+ # Cython 3.3 exports typed names and retains the numbered names as aliases.
125
+ # Python specialization names need not match either C API name.
126
+ names = [
127
+ name for name in mod.__pyx_capi__ if name.startswith(f"{func.__name__}[")
128
+ ]
129
+ if not names:
130
+ pattern = re.compile(rf"__pyx_fuse_[0-9_]+{re.escape(func.__name__)}")
131
+ names = [name for name in mod.__pyx_capi__ if pattern.fullmatch(name)]
134
132
  else:
135
- candidates = [func]
136
- for candidate in candidates:
137
- name = candidate.__name__
133
+ names = [func.__name__]
134
+ for name in names:
138
135
  capsule = mod.__pyx_capi__[name]
139
136
  llc = LowLevelCallable(capsule)
140
137
  try:
141
138
  signature = Signature.from_c_types(llc.signature.encode())
142
139
  except KeyError:
143
140
  continue
144
- impls.append((signature, capsule, name))
141
+ impls.append((signature, name))
145
142
  return impls
146
143
 
147
144
 
@@ -178,7 +175,7 @@ class _CythonFunctionSpec:
178
175
  def wrap_cython_function(func, restype, arg_types):
179
176
  impls = _available_impls(func)
180
177
  compatible = []
181
- for sig, _capsule, capi_name in impls:
178
+ for sig, capi_name in impls:
182
179
  if sig.provides(restype, arg_types):
183
180
  compatible.append((sig, capi_name))
184
181
 
@@ -34,7 +34,6 @@ def _qr_full_pivot(
34
34
  pivoting=pivoting,
35
35
  overwrite_a=overwrite_a,
36
36
  check_finite=False,
37
- lwork=lwork,
38
37
  )
39
38
 
40
39
 
@@ -57,7 +56,6 @@ def _qr_full_no_pivot(
57
56
  pivoting=pivoting,
58
57
  overwrite_a=overwrite_a,
59
58
  check_finite=False,
60
- lwork=lwork,
61
59
  )
62
60
 
63
61
 
@@ -80,7 +78,6 @@ def _qr_r_pivot(
80
78
  pivoting=pivoting,
81
79
  overwrite_a=overwrite_a,
82
80
  check_finite=False,
83
- lwork=lwork,
84
81
  )
85
82
 
86
83
 
@@ -103,7 +100,6 @@ def _qr_r_no_pivot(
103
100
  pivoting=pivoting,
104
101
  overwrite_a=overwrite_a,
105
102
  check_finite=False,
106
- lwork=lwork,
107
103
  )
108
104
 
109
105
 
@@ -126,7 +122,6 @@ def _qr_raw_no_pivot(
126
122
  pivoting=pivoting,
127
123
  overwrite_a=overwrite_a,
128
124
  check_finite=False,
129
- lwork=lwork,
130
125
  )
131
126
 
132
127
  return H, tau, R
@@ -151,7 +146,6 @@ def _qr_raw_pivot(
151
146
  pivoting=pivoting,
152
147
  overwrite_a=overwrite_a,
153
148
  check_finite=False,
154
- lwork=lwork,
155
149
  )
156
150
 
157
151
  return H, tau, R, P