pytensor 3.3.0__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 (630) hide show
  1. {pytensor-3.3.0/pytensor.egg-info → pytensor-3.3.2}/PKG-INFO +3 -3
  2. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/graph/index.rst +1 -0
  3. pytensor-3.3.2/doc/library/graph/traversal.rst +8 -0
  4. {pytensor-3.3.0 → pytensor-3.3.2}/pyproject.toml +8 -3
  5. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/_version.py +3 -3
  6. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/mode.py +3 -1
  7. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/d3viz/d3viz.py +1 -1
  8. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/gradient.py +2 -2
  9. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/basic.py +1 -2
  10. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/fg.py +1 -1
  11. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/replace.py +0 -2
  12. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/rewriting/basic.py +20 -10
  13. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/traversal.py +5 -4
  14. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/__init__.py +1 -0
  15. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/basic.py +3 -1
  16. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/solvers.py +31 -1
  17. pytensor-3.3.2/pytensor/link/mlx/dispatch/random.py +276 -0
  18. pytensor-3.3.2/pytensor/link/mlx/dispatch/scalar/__init__.py +10 -0
  19. pytensor-3.3.2/pytensor/link/mlx/dispatch/scalar/beta.py +1124 -0
  20. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/erf.py +14 -21
  21. pytensor-3.3.2/pytensor/link/mlx/dispatch/scalar/gammainc.py +549 -0
  22. pytensor-3.3.2/pytensor/link/mlx/dispatch/scalar/helpers.py +136 -0
  23. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/tensor_basic.py +10 -0
  24. pytensor-3.3.2/pytensor/link/mlx/linker.py +143 -0
  25. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/__init__.py +3 -0
  26. pytensor-3.3.2/pytensor/link/numba/dispatch/_patch_list_to_tuple.py +330 -0
  27. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/_patch_pointer_add.py +8 -5
  28. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/cython_support.py +17 -20
  29. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/elemwise.py +87 -7
  30. pytensor-3.3.2/pytensor/link/numba/dispatch/linalg/_BLAS.py +74 -0
  31. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -44
  32. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -6
  33. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +1 -1
  34. pytensor-3.3.2/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +134 -0
  35. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/scalar.py +2 -8
  36. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/subtensor.py +100 -38
  37. pytensor-3.3.2/pytensor/link/numba/dispatch/tensor_basic.py +445 -0
  38. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scalar/basic.py +11 -0
  39. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scalar/math.py +3 -0
  40. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/basic.py +6 -6
  41. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/blockwise.py +20 -5
  42. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/summary.py +4 -7
  43. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/math.py +37 -12
  44. pytensor-3.3.2/pytensor/tensor/rewriting/ofg.py +83 -0
  45. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/subtensor.py +48 -22
  46. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/subtensor.py +14 -15
  47. {pytensor-3.3.0 → pytensor-3.3.2/pytensor.egg-info}/PKG-INFO +3 -3
  48. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor.egg-info/SOURCES.txt +6 -0
  49. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor.egg-info/requires.txt +2 -2
  50. pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/__init__.py +0 -1
  51. pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/helpers.py +0 -62
  52. pytensor-3.3.0/pytensor/link/mlx/linker.py +0 -79
  53. pytensor-3.3.0/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -113
  54. pytensor-3.3.0/pytensor/link/numba/dispatch/tensor_basic.py +0 -257
  55. pytensor-3.3.0/pytensor/tensor/rewriting/ofg.py +0 -34
  56. {pytensor-3.3.0 → pytensor-3.3.2}/LICENSE.txt +0 -0
  57. {pytensor-3.3.0 → pytensor-3.3.2}/MANIFEST.in +0 -0
  58. {pytensor-3.3.0 → pytensor-3.3.2}/README.rst +0 -0
  59. {pytensor-3.3.0 → pytensor-3.3.2}/doc/.templates/PLACEHOLDER +0 -0
  60. {pytensor-3.3.0 → pytensor-3.3.2}/doc/.templates/layout.html +0 -0
  61. {pytensor-3.3.0 → pytensor-3.3.2}/doc/.templates/nb-badges.html +0 -0
  62. {pytensor-3.3.0 → pytensor-3.3.2}/doc/.templates/rendered_citation.html +0 -0
  63. {pytensor-3.3.0 → pytensor-3.3.2}/doc/LICENSE.txt +0 -0
  64. {pytensor-3.3.0 → pytensor-3.3.2}/doc/README.md +0 -0
  65. {pytensor-3.3.0 → pytensor-3.3.2}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  66. {pytensor-3.3.0 → pytensor-3.3.2}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  67. {pytensor-3.3.0 → pytensor-3.3.2}/doc/acknowledgement.rst +0 -0
  68. {pytensor-3.3.0 → pytensor-3.3.2}/doc/bcast.png +0 -0
  69. {pytensor-3.3.0 → pytensor-3.3.2}/doc/bcast.svg +0 -0
  70. {pytensor-3.3.0 → pytensor-3.3.2}/doc/blog.md +0 -0
  71. {pytensor-3.3.0 → pytensor-3.3.2}/doc/conf.py +0 -0
  72. {pytensor-3.3.0 → pytensor-3.3.2}/doc/core_development_guide.rst +0 -0
  73. {pytensor-3.3.0 → pytensor-3.3.2}/doc/css.inc +0 -0
  74. {pytensor-3.3.0 → pytensor-3.3.2}/doc/dev_start_guide.rst +0 -0
  75. {pytensor-3.3.0 → pytensor-3.3.2}/doc/environment.yml +0 -0
  76. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/apply.png +0 -0
  77. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/apply.svg +0 -0
  78. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/apply2.svg +0 -0
  79. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/creating_a_c_op.rst +0 -0
  80. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  81. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/creating_an_op.rst +0 -0
  82. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/ctype.rst +0 -0
  83. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/extending_faq.rst +0 -0
  84. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/extending_pytensor_solution_1.py +0 -0
  85. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/graph_rewriting.rst +0 -0
  86. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/graphstructures.rst +0 -0
  87. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/index.rst +0 -0
  88. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/inplace.rst +0 -0
  89. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/op.rst +0 -0
  90. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/other_ops.rst +0 -0
  91. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  92. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  93. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/pipeline.rst +0 -0
  94. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/scan.rst +0 -0
  95. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/tips.rst +0 -0
  96. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/type.rst +0 -0
  97. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/unification_kanren.rst +0 -0
  98. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/unittest.rst +0 -0
  99. {pytensor-3.3.0 → pytensor-3.3.2}/doc/extending/using_params.rst +0 -0
  100. {pytensor-3.3.0 → pytensor-3.3.2}/doc/faq.rst +0 -0
  101. {pytensor-3.3.0 → pytensor-3.3.2}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  102. {pytensor-3.3.0 → pytensor-3.3.2}/doc/gallery/applications/tiny_transformer_llm.ipynb +0 -0
  103. {pytensor-3.3.0 → pytensor-3.3.2}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
  104. {pytensor-3.3.0 → pytensor-3.3.2}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
  105. {pytensor-3.3.0 → pytensor-3.3.2}/doc/gallery/optimize/root.ipynb +0 -0
  106. {pytensor-3.3.0 → pytensor-3.3.2}/doc/gallery/page_footer.md +0 -0
  107. {pytensor-3.3.0 → pytensor-3.3.2}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  108. {pytensor-3.3.0 → pytensor-3.3.2}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  109. {pytensor-3.3.0 → pytensor-3.3.2}/doc/generate_dtype_tensor_table.py +0 -0
  110. {pytensor-3.3.0 → pytensor-3.3.2}/doc/glossary.rst +0 -0
  111. {pytensor-3.3.0 → pytensor-3.3.2}/doc/images/Elman_srnn.png +0 -0
  112. {pytensor-3.3.0 → pytensor-3.3.2}/doc/images/PyTensor.png +0 -0
  113. {pytensor-3.3.0 → pytensor-3.3.2}/doc/images/PyTensor_RGB.svg +0 -0
  114. {pytensor-3.3.0 → pytensor-3.3.2}/doc/images/PyTensor_logo.png +0 -0
  115. {pytensor-3.3.0 → pytensor-3.3.2}/doc/images/binder.svg +0 -0
  116. {pytensor-3.3.0 → pytensor-3.3.2}/doc/images/blocksparse.png +0 -0
  117. {pytensor-3.3.0 → pytensor-3.3.2}/doc/images/colab.svg +0 -0
  118. {pytensor-3.3.0 → pytensor-3.3.2}/doc/images/github.svg +0 -0
  119. {pytensor-3.3.0 → pytensor-3.3.2}/doc/images/lstm.png +0 -0
  120. {pytensor-3.3.0 → pytensor-3.3.2}/doc/images/lstm_memorycell.png +0 -0
  121. {pytensor-3.3.0 → pytensor-3.3.2}/doc/images/talk2010.gif +0 -0
  122. {pytensor-3.3.0 → pytensor-3.3.2}/doc/images/talk2010.png +0 -0
  123. {pytensor-3.3.0 → pytensor-3.3.2}/doc/index.rst +0 -0
  124. {pytensor-3.3.0 → pytensor-3.3.2}/doc/install.rst +0 -0
  125. {pytensor-3.3.0 → pytensor-3.3.2}/doc/internal/how_to_release.rst +0 -0
  126. {pytensor-3.3.0 → pytensor-3.3.2}/doc/internal/index.rst +0 -0
  127. {pytensor-3.3.0 → pytensor-3.3.2}/doc/internal/metadocumentation.rst +0 -0
  128. {pytensor-3.3.0 → pytensor-3.3.2}/doc/introduction.rst +0 -0
  129. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/compile/debugmode.rst +0 -0
  130. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/compile/function.rst +0 -0
  131. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/compile/index.rst +0 -0
  132. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/compile/io.rst +0 -0
  133. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/compile/mode.rst +0 -0
  134. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/compile/nanguardmode.rst +0 -0
  135. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/compile/opfromgraph.rst +0 -0
  136. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/compile/ops.rst +0 -0
  137. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/compile/profilemode.rst +0 -0
  138. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/compile/shared.rst +0 -0
  139. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/config.rst +0 -0
  140. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  141. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  142. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  143. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  144. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  145. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  146. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  147. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp.html +0 -0
  148. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp.png +0 -0
  149. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp2.html +0 -0
  150. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  151. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp2.png +0 -0
  152. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/ofg.html +0 -0
  153. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/examples/ofg2.html +0 -0
  154. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/index.ipynb +0 -0
  155. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/index.rst +0 -0
  156. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  157. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  158. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  159. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  160. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/graph/features.rst +0 -0
  161. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/graph/fgraph.rst +0 -0
  162. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/graph/graph.rst +0 -0
  163. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/graph/op.rst +0 -0
  164. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/graph/replace.rst +0 -0
  165. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/graph/type.rst +0 -0
  166. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/graph/utils.rst +0 -0
  167. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/index.rst +0 -0
  168. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/misc/pkl_utils.rst +0 -0
  169. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/printing.rst +0 -0
  170. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/scalar/index.rst +0 -0
  171. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/scan.rst +0 -0
  172. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/sparse/index.rst +0 -0
  173. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/sparse/sandbox.rst +0 -0
  174. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/basic.rst +0 -0
  175. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/basic_opt.rst +0 -0
  176. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/bcast.png +0 -0
  177. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/bcast.svg +0 -0
  178. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/elemwise.rst +0 -0
  179. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/extra_ops.rst +0 -0
  180. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/fft.rst +0 -0
  181. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/functional.rst +0 -0
  182. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/index.rst +0 -0
  183. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/io.rst +0 -0
  184. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/linalg.rst +0 -0
  185. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/math_opt.rst +0 -0
  186. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/nlinalg.rst +0 -0
  187. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/optimize.rst +0 -0
  188. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/plot_fft.png +0 -0
  189. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/random.rst +0 -0
  190. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/slinalg.rst +0 -0
  191. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/tensor/utils.rst +0 -0
  192. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/typed_list.rst +0 -0
  193. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/xtensor/index.md +0 -0
  194. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/xtensor/linalg.md +0 -0
  195. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/xtensor/math.md +0 -0
  196. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/xtensor/module_functions.md +0 -0
  197. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/xtensor/random.md +0 -0
  198. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/xtensor/signal.md +0 -0
  199. {pytensor-3.3.0 → pytensor-3.3.2}/doc/library/xtensor/type.md +0 -0
  200. {pytensor-3.3.0 → pytensor-3.3.2}/doc/links.rst +0 -0
  201. {pytensor-3.3.0 → pytensor-3.3.2}/doc/optimizations.rst +0 -0
  202. {pytensor-3.3.0 → pytensor-3.3.2}/doc/pylintrc +0 -0
  203. {pytensor-3.3.0 → pytensor-3.3.2}/doc/robots.txt +0 -0
  204. {pytensor-3.3.0 → pytensor-3.3.2}/doc/troubleshooting.rst +0 -0
  205. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/adding.rst +0 -0
  206. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/adding_solution_1.py +0 -0
  207. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/aliasing.rst +0 -0
  208. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/apply.png +0 -0
  209. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/apply.svg +0 -0
  210. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/bcast.png +0 -0
  211. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/broadcasting.rst +0 -0
  212. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/conditions.rst +0 -0
  213. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/debug_faq.rst +0 -0
  214. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/dlogistic.png +0 -0
  215. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/examples.rst +0 -0
  216. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/faq_tutorial.rst +0 -0
  217. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/gradients.rst +0 -0
  218. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/index.rst +0 -0
  219. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/loading_and_saving.rst +0 -0
  220. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/logistic.gp +0 -0
  221. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/logistic.png +0 -0
  222. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/loop.rst +0 -0
  223. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/loop_solution_1.py +0 -0
  224. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/modes.rst +0 -0
  225. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/modes_solution_1.py +0 -0
  226. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/multi_cores.rst +0 -0
  227. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/nan_tutorial.rst +0 -0
  228. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/pics/d3viz.png +0 -0
  229. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  230. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  231. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  232. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/printing_drawing.rst +0 -0
  233. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/prng.rst +0 -0
  234. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/profiling.rst +0 -0
  235. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/profiling_example.py +0 -0
  236. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/profiling_example_out.prof +0 -0
  237. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/shape_info.rst +0 -0
  238. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/sparse.rst +0 -0
  239. {pytensor-3.3.0 → pytensor-3.3.2}/doc/tutorial/symbolic_graphs.rst +0 -0
  240. {pytensor-3.3.0 → pytensor-3.3.2}/doc/user_guide.rst +0 -0
  241. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/__init__.py +0 -0
  242. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/_sparse_lazy.py +0 -0
  243. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/__init__.py +0 -0
  244. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/alloc.py +0 -0
  245. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/blockwise.py +0 -0
  246. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/core.py +0 -0
  247. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/diagonal.py +0 -0
  248. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/dimshuffle.py +0 -0
  249. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/dot.py +0 -0
  250. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/elemwise.py +0 -0
  251. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/orthogonal.py +0 -0
  252. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/permutation.py +0 -0
  253. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/positive_definite.py +0 -0
  254. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/reshape.py +0 -0
  255. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/selection.py +0 -0
  256. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/shape.py +0 -0
  257. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/specify.py +0 -0
  258. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/subtensor.py +0 -0
  259. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/symmetric.py +0 -0
  260. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/assumptions/triangular.py +0 -0
  261. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/basic.py +0 -0
  262. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/bin/__init__.py +0 -0
  263. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/bin/pytensor_cache.py +0 -0
  264. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/breakpoint.py +0 -0
  265. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/__init__.py +0 -0
  266. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/aliasing.py +0 -0
  267. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/builders.py +0 -0
  268. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/compiledir.py +0 -0
  269. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/compilelock.py +0 -0
  270. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/debug/__init__.py +0 -0
  271. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/debug/debugmode.py +0 -0
  272. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/debug/dump.py +0 -0
  273. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/debug/monitormode.py +0 -0
  274. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/debug/nanguardmode.py +0 -0
  275. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/debug/profiling.py +0 -0
  276. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/executor.py +0 -0
  277. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/inner_function.py +0 -0
  278. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/io.py +0 -0
  279. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/maker.py +0 -0
  280. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/ops.py +0 -0
  281. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/rebuild.py +0 -0
  282. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/rewriting.py +0 -0
  283. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/compile/sharedvalue.py +0 -0
  284. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/configdefaults.py +0 -0
  285. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/configparser.py +0 -0
  286. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/d3viz/__init__.py +0 -0
  287. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  288. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/d3viz/css/d3viz.css +0 -0
  289. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/d3viz/formatting.py +0 -0
  290. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/d3viz/html/template.html +0 -0
  291. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  292. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  293. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/d3viz/js/d3viz.js +0 -0
  294. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  295. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  296. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/__init__.py +0 -0
  297. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/destroyhandler.py +0 -0
  298. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/features.py +0 -0
  299. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/null_type.py +0 -0
  300. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/op.py +0 -0
  301. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/rewriting/__init__.py +0 -0
  302. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/rewriting/db.py +0 -0
  303. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/rewriting/kanren.py +0 -0
  304. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/rewriting/reachability.py +0 -0
  305. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/rewriting/unify.py +0 -0
  306. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/rewriting/utils.py +0 -0
  307. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/type.py +0 -0
  308. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/graph/utils.py +0 -0
  309. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/ifelse.py +0 -0
  310. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/ipython.py +0 -0
  311. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/__init__.py +0 -0
  312. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/basic.py +0 -0
  313. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/c/__init__.py +0 -0
  314. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/c/basic.py +0 -0
  315. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  316. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  317. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/c/cmodule.py +0 -0
  318. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/c/cutils.py +0 -0
  319. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/c/cvm.py +0 -0
  320. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/c/exceptions.py +0 -0
  321. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/c/interface.py +0 -0
  322. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/c/lazylinker_c.py +0 -0
  323. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/c/op.py +0 -0
  324. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/c/params_type.py +0 -0
  325. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/c/type.py +0 -0
  326. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/__init__.py +0 -0
  327. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/__init__.py +0 -0
  328. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/basic.py +0 -0
  329. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/blas.py +0 -0
  330. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  331. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/einsum.py +0 -0
  332. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  333. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  334. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
  335. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
  336. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
  337. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
  338. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
  339. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
  340. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
  341. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/math.py +0 -0
  342. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/pad.py +0 -0
  343. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/random.py +0 -0
  344. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/scalar.py +0 -0
  345. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/scan.py +0 -0
  346. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/shape.py +0 -0
  347. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  348. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  349. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/sort.py +0 -0
  350. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/sparse.py +0 -0
  351. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  352. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  353. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/linker.py +0 -0
  354. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/jax/ops.py +0 -0
  355. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/__init__.py +0 -0
  356. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/blas.py +0 -0
  357. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
  358. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/einsum.py +0 -0
  359. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
  360. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
  361. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
  362. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/decomposition.py +0 -0
  363. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/inverse.py +0 -0
  364. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
  365. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/summary.py +0 -0
  366. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/math.py +0 -0
  367. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/pad.py +0 -0
  368. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/basic.py +0 -0
  369. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/bessel.py +0 -0
  370. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/erfcinv.py +0 -0
  371. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/gamma.py +0 -0
  372. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/math.py +0 -0
  373. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/shape.py +0 -0
  374. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  375. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  376. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/sort.py +0 -0
  377. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
  378. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/__init__.py +0 -0
  379. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/cache.py +0 -0
  380. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/_llvmlite_self_ref.py +0 -0
  381. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/basic.py +0 -0
  382. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  383. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
  384. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  385. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  386. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
  387. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  388. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  389. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
  390. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
  391. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
  392. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  393. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
  394. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
  395. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
  396. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
  397. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
  398. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
  399. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
  400. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
  401. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
  402. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
  403. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
  404. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
  405. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
  406. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
  407. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
  408. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
  409. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  410. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/random.py +0 -0
  411. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/scan.py +0 -0
  412. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/shape.py +0 -0
  413. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  414. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  415. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sort.py +0 -0
  416. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
  417. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
  418. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
  419. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
  420. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
  421. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/typed_list.py +0 -0
  422. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  423. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/numba/linker.py +0 -0
  424. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  425. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  426. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  427. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  428. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  429. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  430. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
  431. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
  432. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
  433. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
  434. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
  435. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/math.py +0 -0
  436. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  437. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  438. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  439. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  440. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/pytorch/linker.py +0 -0
  441. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/utils.py +0 -0
  442. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/link/vm.py +0 -0
  443. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/misc/__init__.py +0 -0
  444. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/misc/check_blas.py +0 -0
  445. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/misc/check_blas_many.sh +0 -0
  446. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/misc/check_duplicate_key.py +0 -0
  447. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  448. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/misc/elemwise_time_test.py +0 -0
  449. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/misc/frozendict.py +0 -0
  450. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/misc/may_share_memory.py +0 -0
  451. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/misc/ordered_set.py +0 -0
  452. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/misc/pkl_utils.py +0 -0
  453. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/npy_2_compat.py +0 -0
  454. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/printing.py +0 -0
  455. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/py.typed +0 -0
  456. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/raise_op.py +0 -0
  457. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scalar/__init__.py +0 -0
  458. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  459. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  460. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scalar/c_code/gamma.c +0 -0
  461. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scalar/c_code/incbet.c +0 -0
  462. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scalar/loop.py +0 -0
  463. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scalar/sharedvar.py +0 -0
  464. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/__init__.py +0 -0
  465. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/basic.py +0 -0
  466. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/checkpoints.py +0 -0
  467. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/op.py +0 -0
  468. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/rewriting/__init__.py +0 -0
  469. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/rewriting/db.py +0 -0
  470. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/rewriting/inner_graph.py +0 -0
  471. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/rewriting/inplace.py +0 -0
  472. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/rewriting/io.py +0 -0
  473. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/rewriting/merge.py +0 -0
  474. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/rewriting/push_out.py +0 -0
  475. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/rewriting/trace.py +0 -0
  476. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/rewriting/utils.py +0 -0
  477. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/scan_perform.pyx +0 -0
  478. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/scan_perform_ext.py +0 -0
  479. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/utils.py +0 -0
  480. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/scan/views.py +0 -0
  481. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/sparse/__init__.py +0 -0
  482. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/sparse/basic.py +0 -0
  483. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/sparse/linalg.py +0 -0
  484. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/sparse/math.py +0 -0
  485. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/sparse/rewriting.py +0 -0
  486. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/sparse/sharedvar.py +0 -0
  487. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/sparse/type.py +0 -0
  488. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/sparse/utils.py +0 -0
  489. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/sparse/variable.py +0 -0
  490. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/__init__.py +0 -0
  491. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/blas/__init__.py +0 -0
  492. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/blas/_core.py +0 -0
  493. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/blas/batched.py +0 -0
  494. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/blas/blas_c.py +0 -0
  495. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/__init__.py +0 -0
  496. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/alt_blas_common.h +0 -0
  497. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/alt_blas_template.c +0 -0
  498. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/blas_headers.py +0 -0
  499. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/codegen.py +0 -0
  500. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/blas/gemm.py +0 -0
  501. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/blas/gemv.py +0 -0
  502. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/blas/ger.py +0 -0
  503. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/einsum.py +0 -0
  504. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/elemwise.py +0 -0
  505. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/elemwise_cgen.py +0 -0
  506. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/exceptions.py +0 -0
  507. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/extra_ops.py +0 -0
  508. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/fft.py +0 -0
  509. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/fourier.py +0 -0
  510. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/functional.py +0 -0
  511. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/interpolate.py +0 -0
  512. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/__init__.py +0 -0
  513. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/_lazy.py +0 -0
  514. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/constructors.py +0 -0
  515. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
  516. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
  517. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
  518. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
  519. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
  520. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
  521. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
  522. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/dtype_utils.py +0 -0
  523. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/inverse.py +0 -0
  524. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/products.py +0 -0
  525. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
  526. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/core.py +0 -0
  527. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/general.py +0 -0
  528. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
  529. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
  530. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/psd.py +0 -0
  531. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
  532. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
  533. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/linalg/summary.py +0 -0
  534. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/math.py +0 -0
  535. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/nlinalg.py +0 -0
  536. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/optimize.py +0 -0
  537. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/pad.py +0 -0
  538. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/random/__init__.py +0 -0
  539. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/random/basic.py +0 -0
  540. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/random/op.py +0 -0
  541. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  542. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/random/rewriting/basic.py +0 -0
  543. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/random/rewriting/jax.py +0 -0
  544. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/random/rewriting/numba.py +0 -0
  545. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/random/type.py +0 -0
  546. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/random/utils.py +0 -0
  547. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/random/variable.py +0 -0
  548. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/reshape.py +0 -0
  549. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/__init__.py +0 -0
  550. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/assumptions.py +0 -0
  551. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/basic.py +0 -0
  552. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/blas.py +0 -0
  553. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/blas_c.py +0 -0
  554. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/blockwise.py +0 -0
  555. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/einsum.py +0 -0
  556. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/elemwise.py +0 -0
  557. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  558. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/fused_elemwise.py +0 -0
  559. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/jax.py +0 -0
  560. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
  561. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
  562. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
  563. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/products.py +0 -0
  564. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
  565. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
  566. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/numba.py +0 -0
  567. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/optimize.py +0 -0
  568. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/reshape.py +0 -0
  569. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/shape.py +0 -0
  570. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/special.py +0 -0
  571. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
  572. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  573. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/shape.py +0 -0
  574. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/sharedvar.py +0 -0
  575. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/signal/__init__.py +0 -0
  576. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/signal/conv.py +0 -0
  577. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/slinalg.py +0 -0
  578. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/sort.py +0 -0
  579. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/special.py +0 -0
  580. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/symbolic.py +0 -0
  581. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/type.py +0 -0
  582. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/type_other.py +0 -0
  583. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/utils.py +0 -0
  584. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/var.py +0 -0
  585. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/variable.py +0 -0
  586. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/tensor/xlogx.py +0 -0
  587. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/typed_list/__init__.py +0 -0
  588. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/typed_list/basic.py +0 -0
  589. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/typed_list/rewriting.py +0 -0
  590. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/typed_list/type.py +0 -0
  591. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/utils.py +0 -0
  592. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/__init__.py +0 -0
  593. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/basic.py +0 -0
  594. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/indexing.py +0 -0
  595. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/linalg.py +0 -0
  596. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/math.py +0 -0
  597. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/random/__init__.py +0 -0
  598. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/random/basic.py +0 -0
  599. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/random/type.py +0 -0
  600. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/random/variable.py +0 -0
  601. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/reduction.py +0 -0
  602. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/rewriting/__init__.py +0 -0
  603. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/rewriting/basic.py +0 -0
  604. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/rewriting/indexing.py +0 -0
  605. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/rewriting/math.py +0 -0
  606. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/rewriting/reduction.py +0 -0
  607. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/rewriting/shape.py +0 -0
  608. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/rewriting/utils.py +0 -0
  609. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  610. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/shape.py +0 -0
  611. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/signal.py +0 -0
  612. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/type.py +0 -0
  613. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor/xtensor/vectorization.py +0 -0
  614. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor.egg-info/dependency_links.txt +0 -0
  615. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor.egg-info/entry_points.txt +0 -0
  616. {pytensor-3.3.0 → pytensor-3.3.2}/pytensor.egg-info/top_level.txt +0 -0
  617. {pytensor-3.3.0 → pytensor-3.3.2}/scripts/mypy-failing.txt +0 -0
  618. {pytensor-3.3.0 → pytensor-3.3.2}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  619. {pytensor-3.3.0 → pytensor-3.3.2}/setup.cfg +0 -0
  620. {pytensor-3.3.0 → pytensor-3.3.2}/setup.py +0 -0
  621. {pytensor-3.3.0 → pytensor-3.3.2}/tests/link/c/c_code/test_cenum.h +0 -0
  622. {pytensor-3.3.0 → pytensor-3.3.2}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  623. {pytensor-3.3.0 → pytensor-3.3.2}/tests/test_basic.py +0 -0
  624. {pytensor-3.3.0 → pytensor-3.3.2}/tests/test_breakpoint.py +0 -0
  625. {pytensor-3.3.0 → pytensor-3.3.2}/tests/test_config.py +0 -0
  626. {pytensor-3.3.0 → pytensor-3.3.2}/tests/test_gradient.py +0 -0
  627. {pytensor-3.3.0 → pytensor-3.3.2}/tests/test_ifelse.py +0 -0
  628. {pytensor-3.3.0 → pytensor-3.3.2}/tests/test_printing.py +0 -0
  629. {pytensor-3.3.0 → pytensor-3.3.2}/tests/test_raise_op.py +0 -0
  630. {pytensor-3.3.0 → 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.0
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
@@ -31,7 +31,7 @@ License-File: LICENSE.txt
31
31
  Requires-Dist: setuptools>=59.0.0
32
32
  Requires-Dist: scipy<2,>=1
33
33
  Requires-Dist: numpy>=2.0
34
- Requires-Dist: numba<=0.66.0,>=0.58
34
+ Requires-Dist: numba<=0.67.0,>=0.58
35
35
  Requires-Dist: filelock>=3.15
36
36
  Provides-Extra: complete
37
37
  Requires-Dist: pytensor[jax]; extra == "complete"
@@ -57,7 +57,7 @@ Provides-Extra: jax
57
57
  Requires-Dist: jax; extra == "jax"
58
58
  Requires-Dist: jaxlib; extra == "jax"
59
59
  Provides-Extra: numba
60
- Requires-Dist: numba<=0.66.0,>=0.58; extra == "numba"
60
+ Requires-Dist: numba<=0.67.0,>=0.58; extra == "numba"
61
61
  Requires-Dist: llvmlite; extra == "numba"
62
62
  Provides-Extra: kanren
63
63
  Requires-Dist: etuples; extra == "kanren"
@@ -17,5 +17,6 @@
17
17
  replace
18
18
  features
19
19
  op
20
+ traversal
20
21
  type
21
22
  utils
@@ -0,0 +1,8 @@
1
+ .. _libdoc_graph_traversal:
2
+
3
+ ================================================
4
+ :mod:`traversal` -- Graph Traversal Utilities
5
+ ================================================
6
+
7
+ .. automodule:: pytensor.graph.traversal
8
+ :members:
@@ -50,7 +50,7 @@ dependencies = [
50
50
  "setuptools>=59.0.0",
51
51
  "scipy>=1,<2",
52
52
  "numpy>=2.0",
53
- "numba>=0.58,<=0.66.0",
53
+ "numba>=0.58,<=0.67.0",
54
54
  "filelock>=3.15",
55
55
  ]
56
56
 
@@ -78,7 +78,7 @@ tests = [
78
78
  ]
79
79
  rtd = ["sphinx>=5.1.0,<6", "pygments", "pydot"]
80
80
  jax = ["jax", "jaxlib"]
81
- numba = ["numba>=0.58,<=0.66.0", "llvmlite"]
81
+ numba = ["numba>=0.58,<=0.67.0", "llvmlite"]
82
82
  kanren = [
83
83
  "etuples",
84
84
  "logical-unification",
@@ -131,7 +131,11 @@ filterwarnings =[
131
131
 
132
132
  [tool.ruff]
133
133
  line-length = 88
134
- exclude = ["pytensor/_version.py"]
134
+ # _patch_list_to_tuple.py is copied verbatim from numba; keep it diffable upstream
135
+ exclude = [
136
+ "pytensor/_version.py",
137
+ "pytensor/link/numba/dispatch/_patch_list_to_tuple.py",
138
+ ]
135
139
 
136
140
  [tool.ruff.format]
137
141
  docstring-code-format = true
@@ -147,6 +151,7 @@ unfixable = [
147
151
 
148
152
  [tool.ruff.lint.isort]
149
153
  lines-after-imports = 2
154
+ known-first-party = ["pytensor", "tests"]
150
155
 
151
156
  [tool.ruff.lint.per-file-ignores]
152
157
  # TODO: Get rid of these:
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2026-08-12T10:16:27+0200",
11
+ "date": "2026-09-14T16:15:54+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "aa1bc7772eb11ed8def2814374aeb5da03da590c",
15
- "version": "3.3.0"
14
+ "full-revisionid": "895f7795e2ae8ea16e3a4097ce4b92c61c8faf76",
15
+ "version": "3.3.2"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -524,7 +524,9 @@ JAX = Mode(
524
524
  )
525
525
  PYTORCH = Mode(
526
526
  PytorchLinker(),
527
- RewriteDatabaseQuery(include=["fast_run"]),
527
+ # `Composite` has no PyTorch dispatch (it has no `nfunc_spec` to look up in torch),
528
+ # and torch fuses its own kernels anyway.
529
+ RewriteDatabaseQuery(include=["fast_run"], exclude=["fusion"]),
528
530
  )
529
531
 
530
532
  MLX = Mode(
@@ -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
@@ -1335,8 +1335,8 @@ def _populate_grad_dict(var_to_app_to_idx, grad_dict, wrt, cost_name=None):
1335
1335
  raise ValueError(
1336
1336
  f"{node.op} returned the wrong number of gradient terms."
1337
1337
  )
1338
- # We can not enforce this, as AdvancedSubtensor1 has an option to
1339
- # return the sparse grad for optimization reason.
1338
+ # We can not enforce this, as sparse Ops have an option to return a
1339
+ # structured grad for optimization reason.
1340
1340
 
1341
1341
  # for ig, i in zip(input_grads, inputs):
1342
1342
  # if (not isinstance(ig.type, (DisconnectedType, NullType)) and
@@ -45,13 +45,12 @@ _MOVED_FUNCTIONS = {
45
45
  "graph_inputs",
46
46
  "explicit_graph_inputs",
47
47
  "vars_between",
48
- "orhpans_between",
48
+ "orphans_between",
49
49
  "applys_between",
50
50
  "apply_depends_on",
51
51
  "truncated_graph_inputs",
52
52
  "general_toposort",
53
53
  "io_toposort",
54
- "list_of_nodes",
55
54
  "get_var_by_name",
56
55
  }
57
56
 
@@ -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.
@@ -123,8 +123,6 @@ def graph_replace(
123
123
  Replace mapping
124
124
  strict: bool
125
125
  Raise an error if some replacements were not used
126
- return_unused: bool
127
- Return replacements that were not used
128
126
 
129
127
  Returns
130
128
  -------
@@ -43,7 +43,6 @@ from pytensor.graph.traversal import (
43
43
  )
44
44
  from pytensor.graph.utils import AssocList, InconsistencyError
45
45
  from pytensor.misc.ordered_set import OrderedSet
46
- from pytensor.utils import flatten
47
46
 
48
47
 
49
48
  _logger = logging.getLogger("pytensor.graph.rewriting.basic")
@@ -705,6 +704,15 @@ class MergeOptimizer(GraphRewriter):
705
704
  fgraph.attach_feature(MergeFeature())
706
705
 
707
706
  def apply(self, fgraph):
707
+ def has_direct_destroyer(var):
708
+ """Whether any direct client destroys `var` (view-chain destroyers not seen)."""
709
+ return any(
710
+ i in destroyed_idxs
711
+ for client, i in fgraph.clients[var]
712
+ if client.op.destroy_map
713
+ for destroyed_idxs in client.op.destroy_map.values()
714
+ )
715
+
708
716
  sched = fgraph.merge_feature.scheduled
709
717
  nb_fail = 0
710
718
  t0 = time.perf_counter()
@@ -755,15 +763,17 @@ class MergeOptimizer(GraphRewriter):
755
763
  continue
756
764
 
757
765
  if hasattr(fgraph, "destroy_handler"):
758
- # If both nodes have clients that destroy them, we
759
- # can't merge them.
760
- clients = (
761
- fgraph.clients[pairs[0][0]] + fgraph.clients[pairs[0][1]]
762
- )
763
- if any(
764
- i in flatten(c.op.destroy_map.values())
765
- for c, i in clients
766
- if c.op.destroy_map
766
+ # Merging two variables that both have a destroyer is
767
+ # always rejected by `DestroyHandler` validation
768
+ # ("multiple destroyers") -- skip those outright
769
+ # instead of paying a checkpoint + failed validate +
770
+ # revert per scheduled pair. A single-destroyer merge
771
+ # may still be feasible, and destroyers reachable only
772
+ # through view chains are rare: both are left to
773
+ # validation, keeping this check O(clients) with no
774
+ # droot recomputation.
775
+ if has_direct_destroyer(pairs[0][0]) and has_direct_destroyer(
776
+ pairs[0][1]
767
777
  ):
768
778
  continue
769
779
 
@@ -145,12 +145,13 @@ def apply_ancestors(
145
145
  graphs: Iterable[Variable],
146
146
  blockers: Iterable[Variable] | None = None,
147
147
  ) -> Generator[Apply, None, None]:
148
- """Return the Apply nodes that contribute to those in given graphs (inclusive)."""
148
+ """Return the Apply nodes that contribute to those in given graphs, excluding the owners of the blockers."""
149
149
  seen = {None} # This filters out Variables without an owner
150
+ blockers = frozenset(blockers or ())
150
151
  for var in ancestors(graphs, blockers):
151
152
  # For multi-output nodes, we'll see multiple variables
152
153
  # but we should only yield the Apply once
153
- if (apply := var.owner) not in seen:
154
+ if var not in blockers and (apply := var.owner) not in seen:
154
155
  yield apply
155
156
  seen.add(apply)
156
157
  return
@@ -665,9 +666,9 @@ def toposort_with_orderings(
665
666
  Parameters
666
667
  ----------
667
668
  graphs : list or tuple of Variable instances
668
- Graph inputs.
669
- outputs : list or tuple of Apply instances
670
669
  Graph outputs.
670
+ blockers : list or tuple of Variable instances
671
+ Graph inputs.
671
672
  orderings : dict
672
673
  Keys are `Apply` or `Variable` instances, values are lists of `Apply` or `Variable` instances.
673
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)
@@ -4,6 +4,7 @@ import mlx.core as mx
4
4
 
5
5
  from pytensor.link.mlx.dispatch.basic import mlx_funcify
6
6
  from pytensor.tensor.linalg.solvers.general import Solve
7
+ from pytensor.tensor.linalg.solvers.psd import CholeskySolve
7
8
  from pytensor.tensor.linalg.solvers.triangular import SolveTriangular
8
9
 
9
10
 
@@ -32,15 +33,44 @@ def mlx_funcify_Solve(op, node, **kwargs):
32
33
  @mlx_funcify.register(SolveTriangular)
33
34
  def mlx_funcify_SolveTriangular(op, node, **kwargs):
34
35
  lower = op.lower
36
+ unit_diagonal = op.unit_diagonal
35
37
  A_dtype = getattr(mx, node.inputs[0].dtype)
36
38
  b_dtype = getattr(mx, node.inputs[1].dtype)
37
39
 
38
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
+
39
50
  return mx.linalg.solve_triangular(
40
- A.astype(stream=mx.cpu, dtype=A_dtype),
51
+ A,
41
52
  b.astype(stream=mx.cpu, dtype=b_dtype),
42
53
  upper=not lower,
43
54
  stream=mx.cpu,
44
55
  )
45
56
 
46
57
  return solve_triangular
58
+
59
+
60
+ @mlx_funcify.register(CholeskySolve)
61
+ def mlx_funcify_CholeskySolve(op, node, **kwargs):
62
+ lower = op.lower
63
+ c_dtype = getattr(mx, node.inputs[0].dtype)
64
+ b_dtype = getattr(mx, node.inputs[1].dtype)
65
+
66
+ # MLX has no cho_solve, so with A = L L.T we solve L y = b then L.T x = y.
67
+ def cho_solve(c, b):
68
+ c = c.astype(stream=mx.cpu, dtype=c_dtype)
69
+ b = b.astype(stream=mx.cpu, dtype=b_dtype)
70
+ c_T = mx.swapaxes(c, -1, -2, stream=mx.cpu)
71
+ L, L_T = (c, c_T) if lower else (c_T, c)
72
+
73
+ y = mx.linalg.solve_triangular(L, b, upper=False, stream=mx.cpu)
74
+ return mx.linalg.solve_triangular(L_T, y, upper=True, stream=mx.cpu)
75
+
76
+ return cho_solve
@@ -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
@@ -0,0 +1,10 @@
1
+ from pytensor.link.mlx.dispatch.scalar import (
2
+ basic,
3
+ bessel,
4
+ beta,
5
+ erf,
6
+ erfcinv,
7
+ gamma,
8
+ gammainc,
9
+ math,
10
+ )