pytensor 3.2.3__tar.gz → 3.3.0__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 (621) hide show
  1. {pytensor-3.2.3/pytensor.egg-info → pytensor-3.3.0}/PKG-INFO +4 -3
  2. {pytensor-3.2.3 → pytensor-3.3.0}/pyproject.toml +13 -5
  3. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/_version.py +3 -3
  4. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/rewriting.py +9 -9
  5. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/features.py +4 -4
  6. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/unify.py +2 -1
  7. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/scalar.py +17 -2
  8. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/subtensor.py +7 -1
  9. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/basic.py +23 -7
  10. pytensor-3.3.0/pytensor/link/mlx/dispatch/blockwise.py +64 -0
  11. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/linalg/decomposition.py +9 -8
  12. pytensor-3.3.0/pytensor/link/mlx/dispatch/linalg/summary.py +38 -0
  13. pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/__init__.py +1 -0
  14. pytensor-3.2.3/pytensor/link/mlx/dispatch/scalar.py → pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/basic.py +9 -51
  15. pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/bessel.py +525 -0
  16. pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/erf.py +333 -0
  17. pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/erfcinv.py +150 -0
  18. pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/gamma.py +56 -0
  19. pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/helpers.py +62 -0
  20. pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/math.py +174 -0
  21. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/random.py +1 -1
  22. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +6 -11
  23. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/basic.py +6 -6
  24. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/math.py +8 -1
  25. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/__init__.py +4 -0
  26. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/extra_ops.py +4 -0
  27. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/math.py +0 -49
  28. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/pad.py +214 -226
  29. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/math.py +31 -99
  30. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/ofg.py +2 -2
  31. pytensor-3.3.0/pytensor/tensor/rewriting/special.py +184 -0
  32. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/subtensor.py +52 -1
  33. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/subtensor_lift.py +106 -8
  34. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/special.py +103 -5
  35. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/utils.py +9 -3
  36. {pytensor-3.2.3 → pytensor-3.3.0/pytensor.egg-info}/PKG-INFO +4 -3
  37. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor.egg-info/SOURCES.txt +8 -1
  38. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor.egg-info/requires.txt +2 -2
  39. pytensor-3.2.3/pytensor/link/mlx/dispatch/blockwise.py +0 -42
  40. pytensor-3.2.3/pytensor/link/mlx/dispatch/linalg/summary.py +0 -46
  41. pytensor-3.2.3/pytensor/tensor/rewriting/special.py +0 -97
  42. {pytensor-3.2.3 → pytensor-3.3.0}/LICENSE.txt +0 -0
  43. {pytensor-3.2.3 → pytensor-3.3.0}/MANIFEST.in +0 -0
  44. {pytensor-3.2.3 → pytensor-3.3.0}/README.rst +0 -0
  45. {pytensor-3.2.3 → pytensor-3.3.0}/doc/.templates/PLACEHOLDER +0 -0
  46. {pytensor-3.2.3 → pytensor-3.3.0}/doc/.templates/layout.html +0 -0
  47. {pytensor-3.2.3 → pytensor-3.3.0}/doc/.templates/nb-badges.html +0 -0
  48. {pytensor-3.2.3 → pytensor-3.3.0}/doc/.templates/rendered_citation.html +0 -0
  49. {pytensor-3.2.3 → pytensor-3.3.0}/doc/LICENSE.txt +0 -0
  50. {pytensor-3.2.3 → pytensor-3.3.0}/doc/README.md +0 -0
  51. {pytensor-3.2.3 → pytensor-3.3.0}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  52. {pytensor-3.2.3 → pytensor-3.3.0}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  53. {pytensor-3.2.3 → pytensor-3.3.0}/doc/acknowledgement.rst +0 -0
  54. {pytensor-3.2.3 → pytensor-3.3.0}/doc/bcast.png +0 -0
  55. {pytensor-3.2.3 → pytensor-3.3.0}/doc/bcast.svg +0 -0
  56. {pytensor-3.2.3 → pytensor-3.3.0}/doc/blog.md +0 -0
  57. {pytensor-3.2.3 → pytensor-3.3.0}/doc/conf.py +0 -0
  58. {pytensor-3.2.3 → pytensor-3.3.0}/doc/core_development_guide.rst +0 -0
  59. {pytensor-3.2.3 → pytensor-3.3.0}/doc/css.inc +0 -0
  60. {pytensor-3.2.3 → pytensor-3.3.0}/doc/dev_start_guide.rst +0 -0
  61. {pytensor-3.2.3 → pytensor-3.3.0}/doc/environment.yml +0 -0
  62. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/apply.png +0 -0
  63. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/apply.svg +0 -0
  64. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/apply2.svg +0 -0
  65. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/creating_a_c_op.rst +0 -0
  66. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  67. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/creating_an_op.rst +0 -0
  68. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/ctype.rst +0 -0
  69. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/extending_faq.rst +0 -0
  70. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
  71. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/graph_rewriting.rst +0 -0
  72. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/graphstructures.rst +0 -0
  73. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/index.rst +0 -0
  74. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/inplace.rst +0 -0
  75. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/op.rst +0 -0
  76. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/other_ops.rst +0 -0
  77. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  78. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  79. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/pipeline.rst +0 -0
  80. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/scan.rst +0 -0
  81. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/tips.rst +0 -0
  82. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/type.rst +0 -0
  83. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/unification_kanren.rst +0 -0
  84. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/unittest.rst +0 -0
  85. {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/using_params.rst +0 -0
  86. {pytensor-3.2.3 → pytensor-3.3.0}/doc/faq.rst +0 -0
  87. {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  88. {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/applications/tiny_transformer_llm.ipynb +0 -0
  89. {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
  90. {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
  91. {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/optimize/root.ipynb +0 -0
  92. {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/page_footer.md +0 -0
  93. {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  94. {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  95. {pytensor-3.2.3 → pytensor-3.3.0}/doc/generate_dtype_tensor_table.py +0 -0
  96. {pytensor-3.2.3 → pytensor-3.3.0}/doc/glossary.rst +0 -0
  97. {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/Elman_srnn.png +0 -0
  98. {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/PyTensor.png +0 -0
  99. {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/PyTensor_RGB.svg +0 -0
  100. {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/PyTensor_logo.png +0 -0
  101. {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/binder.svg +0 -0
  102. {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/blocksparse.png +0 -0
  103. {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/colab.svg +0 -0
  104. {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/github.svg +0 -0
  105. {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/lstm.png +0 -0
  106. {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/lstm_memorycell.png +0 -0
  107. {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/talk2010.gif +0 -0
  108. {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/talk2010.png +0 -0
  109. {pytensor-3.2.3 → pytensor-3.3.0}/doc/index.rst +0 -0
  110. {pytensor-3.2.3 → pytensor-3.3.0}/doc/install.rst +0 -0
  111. {pytensor-3.2.3 → pytensor-3.3.0}/doc/internal/how_to_release.rst +0 -0
  112. {pytensor-3.2.3 → pytensor-3.3.0}/doc/internal/index.rst +0 -0
  113. {pytensor-3.2.3 → pytensor-3.3.0}/doc/internal/metadocumentation.rst +0 -0
  114. {pytensor-3.2.3 → pytensor-3.3.0}/doc/introduction.rst +0 -0
  115. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/debugmode.rst +0 -0
  116. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/function.rst +0 -0
  117. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/index.rst +0 -0
  118. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/io.rst +0 -0
  119. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/mode.rst +0 -0
  120. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/nanguardmode.rst +0 -0
  121. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/opfromgraph.rst +0 -0
  122. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/ops.rst +0 -0
  123. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/profilemode.rst +0 -0
  124. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/shared.rst +0 -0
  125. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/config.rst +0 -0
  126. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  127. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  128. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  129. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  130. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  131. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  132. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  133. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/mlp.html +0 -0
  134. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/mlp.png +0 -0
  135. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/mlp2.html +0 -0
  136. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  137. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/mlp2.png +0 -0
  138. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/ofg.html +0 -0
  139. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/ofg2.html +0 -0
  140. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/index.ipynb +0 -0
  141. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/index.rst +0 -0
  142. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  143. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  144. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  145. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  146. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/features.rst +0 -0
  147. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/fgraph.rst +0 -0
  148. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/graph.rst +0 -0
  149. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/index.rst +0 -0
  150. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/op.rst +0 -0
  151. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/replace.rst +0 -0
  152. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/type.rst +0 -0
  153. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/utils.rst +0 -0
  154. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/index.rst +0 -0
  155. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/misc/pkl_utils.rst +0 -0
  156. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/printing.rst +0 -0
  157. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/scalar/index.rst +0 -0
  158. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/scan.rst +0 -0
  159. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/sparse/index.rst +0 -0
  160. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/sparse/sandbox.rst +0 -0
  161. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/basic.rst +0 -0
  162. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/basic_opt.rst +0 -0
  163. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/bcast.png +0 -0
  164. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/bcast.svg +0 -0
  165. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/elemwise.rst +0 -0
  166. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/extra_ops.rst +0 -0
  167. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/fft.rst +0 -0
  168. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/functional.rst +0 -0
  169. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/index.rst +0 -0
  170. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/io.rst +0 -0
  171. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/linalg.rst +0 -0
  172. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/math_opt.rst +0 -0
  173. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/nlinalg.rst +0 -0
  174. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/optimize.rst +0 -0
  175. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/plot_fft.png +0 -0
  176. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/random.rst +0 -0
  177. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/slinalg.rst +0 -0
  178. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/utils.rst +0 -0
  179. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/typed_list.rst +0 -0
  180. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/index.md +0 -0
  181. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/linalg.md +0 -0
  182. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/math.md +0 -0
  183. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/module_functions.md +0 -0
  184. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/random.md +0 -0
  185. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/signal.md +0 -0
  186. {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/type.md +0 -0
  187. {pytensor-3.2.3 → pytensor-3.3.0}/doc/links.rst +0 -0
  188. {pytensor-3.2.3 → pytensor-3.3.0}/doc/optimizations.rst +0 -0
  189. {pytensor-3.2.3 → pytensor-3.3.0}/doc/pylintrc +0 -0
  190. {pytensor-3.2.3 → pytensor-3.3.0}/doc/robots.txt +0 -0
  191. {pytensor-3.2.3 → pytensor-3.3.0}/doc/troubleshooting.rst +0 -0
  192. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/adding.rst +0 -0
  193. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/adding_solution_1.py +0 -0
  194. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/aliasing.rst +0 -0
  195. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/apply.png +0 -0
  196. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/apply.svg +0 -0
  197. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/bcast.png +0 -0
  198. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/broadcasting.rst +0 -0
  199. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/conditions.rst +0 -0
  200. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/debug_faq.rst +0 -0
  201. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/dlogistic.png +0 -0
  202. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/examples.rst +0 -0
  203. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/faq_tutorial.rst +0 -0
  204. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/gradients.rst +0 -0
  205. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/index.rst +0 -0
  206. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/loading_and_saving.rst +0 -0
  207. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/logistic.gp +0 -0
  208. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/logistic.png +0 -0
  209. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/loop.rst +0 -0
  210. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/loop_solution_1.py +0 -0
  211. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/modes.rst +0 -0
  212. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/modes_solution_1.py +0 -0
  213. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/multi_cores.rst +0 -0
  214. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/nan_tutorial.rst +0 -0
  215. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/pics/d3viz.png +0 -0
  216. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  217. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  218. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  219. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/printing_drawing.rst +0 -0
  220. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/prng.rst +0 -0
  221. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/profiling.rst +0 -0
  222. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/profiling_example.py +0 -0
  223. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/profiling_example_out.prof +0 -0
  224. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/shape_info.rst +0 -0
  225. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/sparse.rst +0 -0
  226. {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/symbolic_graphs.rst +0 -0
  227. {pytensor-3.2.3 → pytensor-3.3.0}/doc/user_guide.rst +0 -0
  228. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/__init__.py +0 -0
  229. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/_sparse_lazy.py +0 -0
  230. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/__init__.py +0 -0
  231. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/alloc.py +0 -0
  232. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/blockwise.py +0 -0
  233. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/core.py +0 -0
  234. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/diagonal.py +0 -0
  235. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/dimshuffle.py +0 -0
  236. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/dot.py +0 -0
  237. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/elemwise.py +0 -0
  238. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/orthogonal.py +0 -0
  239. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/permutation.py +0 -0
  240. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/positive_definite.py +0 -0
  241. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/reshape.py +0 -0
  242. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/selection.py +0 -0
  243. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/shape.py +0 -0
  244. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/specify.py +0 -0
  245. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/subtensor.py +0 -0
  246. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/symmetric.py +0 -0
  247. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/triangular.py +0 -0
  248. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/basic.py +0 -0
  249. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/bin/__init__.py +0 -0
  250. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/bin/pytensor_cache.py +0 -0
  251. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/breakpoint.py +0 -0
  252. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/__init__.py +0 -0
  253. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/aliasing.py +0 -0
  254. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/builders.py +0 -0
  255. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/compiledir.py +0 -0
  256. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/compilelock.py +0 -0
  257. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/debug/__init__.py +0 -0
  258. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/debug/debugmode.py +0 -0
  259. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/debug/dump.py +0 -0
  260. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/debug/monitormode.py +0 -0
  261. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/debug/nanguardmode.py +0 -0
  262. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/debug/profiling.py +0 -0
  263. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/executor.py +0 -0
  264. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/inner_function.py +0 -0
  265. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/io.py +0 -0
  266. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/maker.py +0 -0
  267. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/mode.py +0 -0
  268. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/ops.py +0 -0
  269. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/rebuild.py +0 -0
  270. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/sharedvalue.py +0 -0
  271. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/configdefaults.py +0 -0
  272. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/configparser.py +0 -0
  273. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/__init__.py +0 -0
  274. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  275. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/css/d3viz.css +0 -0
  276. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/d3viz.py +0 -0
  277. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/formatting.py +0 -0
  278. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/html/template.html +0 -0
  279. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  280. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  281. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/js/d3viz.js +0 -0
  282. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  283. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  284. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/gradient.py +0 -0
  285. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/__init__.py +0 -0
  286. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/basic.py +0 -0
  287. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/destroyhandler.py +0 -0
  288. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/fg.py +0 -0
  289. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/null_type.py +0 -0
  290. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/op.py +0 -0
  291. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/replace.py +0 -0
  292. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/__init__.py +0 -0
  293. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/basic.py +0 -0
  294. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/db.py +0 -0
  295. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/kanren.py +0 -0
  296. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/reachability.py +0 -0
  297. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/utils.py +0 -0
  298. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/traversal.py +0 -0
  299. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/type.py +0 -0
  300. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/utils.py +0 -0
  301. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/ifelse.py +0 -0
  302. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/ipython.py +0 -0
  303. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/__init__.py +0 -0
  304. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/basic.py +0 -0
  305. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/__init__.py +0 -0
  306. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/basic.py +0 -0
  307. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  308. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  309. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/cmodule.py +0 -0
  310. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/cutils.py +0 -0
  311. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/cvm.py +0 -0
  312. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/exceptions.py +0 -0
  313. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/interface.py +0 -0
  314. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/lazylinker_c.py +0 -0
  315. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/op.py +0 -0
  316. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/params_type.py +0 -0
  317. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/type.py +0 -0
  318. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/__init__.py +0 -0
  319. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/__init__.py +0 -0
  320. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/basic.py +0 -0
  321. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/blas.py +0 -0
  322. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  323. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
  324. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  325. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  326. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
  327. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
  328. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
  329. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
  330. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
  331. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
  332. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
  333. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/math.py +0 -0
  334. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/pad.py +0 -0
  335. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/random.py +0 -0
  336. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/scan.py +0 -0
  337. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/shape.py +0 -0
  338. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  339. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  340. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/sort.py +0 -0
  341. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
  342. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  343. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/linker.py +0 -0
  344. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/ops.py +0 -0
  345. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/__init__.py +0 -0
  346. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/__init__.py +0 -0
  347. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/blas.py +0 -0
  348. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/einsum.py +0 -0
  349. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
  350. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
  351. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
  352. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/linalg/inverse.py +0 -0
  353. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
  354. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/linalg/solvers.py +0 -0
  355. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/math.py +0 -0
  356. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/pad.py +0 -0
  357. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/shape.py +0 -0
  358. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  359. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  360. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/sort.py +0 -0
  361. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
  362. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/tensor_basic.py +0 -0
  363. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/linker.py +0 -0
  364. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/__init__.py +0 -0
  365. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/cache.py +0 -0
  366. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/__init__.py +0 -0
  367. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/_llvmlite_self_ref.py +0 -0
  368. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/_patch_pointer_add.py +0 -0
  369. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/basic.py +0 -0
  370. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  371. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
  372. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  373. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/elemwise.py +0 -0
  374. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  375. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
  376. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  377. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
  378. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  379. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  380. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
  381. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
  382. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
  383. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  384. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -0
  385. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
  386. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
  387. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
  388. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
  389. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
  390. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
  391. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
  392. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
  393. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
  394. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
  395. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
  396. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
  397. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
  398. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
  399. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
  400. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
  401. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
  402. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
  403. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  404. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/scalar.py +0 -0
  405. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/scan.py +0 -0
  406. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/shape.py +0 -0
  407. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  408. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  409. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/sort.py +0 -0
  410. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
  411. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
  412. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
  413. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
  414. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
  415. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  416. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  417. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/typed_list.py +0 -0
  418. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/linker.py +0 -0
  419. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  420. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  421. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  422. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  423. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  424. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  425. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
  426. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
  427. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
  428. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
  429. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
  430. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
  431. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  432. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  433. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  434. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  435. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/linker.py +0 -0
  436. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/utils.py +0 -0
  437. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/vm.py +0 -0
  438. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/__init__.py +0 -0
  439. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/check_blas.py +0 -0
  440. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/check_blas_many.sh +0 -0
  441. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/check_duplicate_key.py +0 -0
  442. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  443. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/elemwise_time_test.py +0 -0
  444. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/frozendict.py +0 -0
  445. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/may_share_memory.py +0 -0
  446. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/ordered_set.py +0 -0
  447. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/pkl_utils.py +0 -0
  448. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/npy_2_compat.py +0 -0
  449. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/printing.py +0 -0
  450. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/py.typed +0 -0
  451. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/raise_op.py +0 -0
  452. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/__init__.py +0 -0
  453. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  454. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  455. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/c_code/gamma.c +0 -0
  456. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/c_code/incbet.c +0 -0
  457. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/loop.py +0 -0
  458. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/math.py +0 -0
  459. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/sharedvar.py +0 -0
  460. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/__init__.py +0 -0
  461. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/basic.py +0 -0
  462. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/checkpoints.py +0 -0
  463. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/op.py +0 -0
  464. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/__init__.py +0 -0
  465. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/db.py +0 -0
  466. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/inner_graph.py +0 -0
  467. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/inplace.py +0 -0
  468. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/io.py +0 -0
  469. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/merge.py +0 -0
  470. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/push_out.py +0 -0
  471. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/trace.py +0 -0
  472. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/utils.py +0 -0
  473. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/scan_perform.pyx +0 -0
  474. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/scan_perform_ext.py +0 -0
  475. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/utils.py +0 -0
  476. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/views.py +0 -0
  477. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/__init__.py +0 -0
  478. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/basic.py +0 -0
  479. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/linalg.py +0 -0
  480. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/rewriting.py +0 -0
  481. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/sharedvar.py +0 -0
  482. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/type.py +0 -0
  483. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/utils.py +0 -0
  484. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/variable.py +0 -0
  485. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/basic.py +0 -0
  486. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/__init__.py +0 -0
  487. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/_core.py +0 -0
  488. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/batched.py +0 -0
  489. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/blas_c.py +0 -0
  490. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/c_code/__init__.py +0 -0
  491. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/c_code/alt_blas_common.h +0 -0
  492. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/c_code/alt_blas_template.c +0 -0
  493. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/c_code/blas_headers.py +0 -0
  494. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/c_code/codegen.py +0 -0
  495. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/gemm.py +0 -0
  496. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/gemv.py +0 -0
  497. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/ger.py +0 -0
  498. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blockwise.py +0 -0
  499. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/einsum.py +0 -0
  500. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/elemwise.py +0 -0
  501. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/elemwise_cgen.py +0 -0
  502. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/exceptions.py +0 -0
  503. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/fft.py +0 -0
  504. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/fourier.py +0 -0
  505. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/functional.py +0 -0
  506. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/interpolate.py +0 -0
  507. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/__init__.py +0 -0
  508. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/_lazy.py +0 -0
  509. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/constructors.py +0 -0
  510. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
  511. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
  512. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
  513. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
  514. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
  515. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
  516. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
  517. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/dtype_utils.py +0 -0
  518. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/inverse.py +0 -0
  519. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/products.py +0 -0
  520. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
  521. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/core.py +0 -0
  522. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/general.py +0 -0
  523. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
  524. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
  525. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/psd.py +0 -0
  526. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
  527. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
  528. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/summary.py +0 -0
  529. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/nlinalg.py +0 -0
  530. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/optimize.py +0 -0
  531. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/__init__.py +0 -0
  532. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/basic.py +0 -0
  533. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/op.py +0 -0
  534. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  535. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
  536. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
  537. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
  538. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/type.py +0 -0
  539. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/utils.py +0 -0
  540. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/variable.py +0 -0
  541. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/reshape.py +0 -0
  542. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/__init__.py +0 -0
  543. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/assumptions.py +0 -0
  544. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/basic.py +0 -0
  545. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/blas.py +0 -0
  546. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/blas_c.py +0 -0
  547. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/blockwise.py +0 -0
  548. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/einsum.py +0 -0
  549. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/elemwise.py +0 -0
  550. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  551. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/fused_elemwise.py +0 -0
  552. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/jax.py +0 -0
  553. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
  554. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
  555. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
  556. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/products.py +0 -0
  557. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
  558. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/summary.py +0 -0
  559. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
  560. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/numba.py +0 -0
  561. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/optimize.py +0 -0
  562. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/reshape.py +0 -0
  563. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/shape.py +0 -0
  564. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  565. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/shape.py +0 -0
  566. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/sharedvar.py +0 -0
  567. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/signal/__init__.py +0 -0
  568. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/signal/conv.py +0 -0
  569. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/slinalg.py +0 -0
  570. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/sort.py +0 -0
  571. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/subtensor.py +0 -0
  572. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/symbolic.py +0 -0
  573. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/type.py +0 -0
  574. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/type_other.py +0 -0
  575. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/var.py +0 -0
  576. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/variable.py +0 -0
  577. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/xlogx.py +0 -0
  578. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/typed_list/__init__.py +0 -0
  579. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/typed_list/basic.py +0 -0
  580. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/typed_list/rewriting.py +0 -0
  581. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/typed_list/type.py +0 -0
  582. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/utils.py +0 -0
  583. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/__init__.py +0 -0
  584. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/basic.py +0 -0
  585. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/indexing.py +0 -0
  586. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/linalg.py +0 -0
  587. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/math.py +0 -0
  588. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/random/__init__.py +0 -0
  589. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/random/basic.py +0 -0
  590. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/random/type.py +0 -0
  591. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/random/variable.py +0 -0
  592. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/reduction.py +0 -0
  593. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/__init__.py +0 -0
  594. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/basic.py +0 -0
  595. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/indexing.py +0 -0
  596. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/math.py +0 -0
  597. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/reduction.py +0 -0
  598. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/shape.py +0 -0
  599. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/utils.py +0 -0
  600. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  601. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/shape.py +0 -0
  602. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/signal.py +0 -0
  603. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/type.py +0 -0
  604. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/vectorization.py +0 -0
  605. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor.egg-info/dependency_links.txt +0 -0
  606. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor.egg-info/entry_points.txt +0 -0
  607. {pytensor-3.2.3 → pytensor-3.3.0}/pytensor.egg-info/top_level.txt +0 -0
  608. {pytensor-3.2.3 → pytensor-3.3.0}/scripts/mypy-failing.txt +0 -0
  609. {pytensor-3.2.3 → pytensor-3.3.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  610. {pytensor-3.2.3 → pytensor-3.3.0}/setup.cfg +0 -0
  611. {pytensor-3.2.3 → pytensor-3.3.0}/setup.py +0 -0
  612. {pytensor-3.2.3 → pytensor-3.3.0}/tests/link/c/c_code/test_cenum.h +0 -0
  613. {pytensor-3.2.3 → pytensor-3.3.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  614. {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_basic.py +0 -0
  615. {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_breakpoint.py +0 -0
  616. {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_config.py +0 -0
  617. {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_gradient.py +0 -0
  618. {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_ifelse.py +0 -0
  619. {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_printing.py +0 -0
  620. {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_raise_op.py +0 -0
  621. {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_rop.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 3.2.3
3
+ Version: 3.3.0
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
@@ -24,13 +24,14 @@ Classifier: Programming Language :: Python :: 3
24
24
  Classifier: Programming Language :: Python :: 3.12
25
25
  Classifier: Programming Language :: Python :: 3.13
26
26
  Classifier: Programming Language :: Python :: 3.14
27
+ Classifier: Programming Language :: Python :: Free Threading :: 1 - Unstable
27
28
  Requires-Python: <3.15,>=3.12
28
29
  Description-Content-Type: text/x-rst
29
30
  License-File: LICENSE.txt
30
31
  Requires-Dist: setuptools>=59.0.0
31
32
  Requires-Dist: scipy<2,>=1
32
33
  Requires-Dist: numpy>=2.0
33
- Requires-Dist: numba<=0.65.1,>=0.58
34
+ Requires-Dist: numba<=0.66.0,>=0.58
34
35
  Requires-Dist: filelock>=3.15
35
36
  Provides-Extra: complete
36
37
  Requires-Dist: pytensor[jax]; extra == "complete"
@@ -56,7 +57,7 @@ Provides-Extra: jax
56
57
  Requires-Dist: jax; extra == "jax"
57
58
  Requires-Dist: jaxlib; extra == "jax"
58
59
  Provides-Extra: numba
59
- Requires-Dist: numba<=0.65.1,>=0.58; extra == "numba"
60
+ Requires-Dist: numba<=0.66.0,>=0.58; extra == "numba"
60
61
  Requires-Dist: llvmlite; extra == "numba"
61
62
  Provides-Extra: kanren
62
63
  Requires-Dist: etuples; extra == "kanren"
@@ -33,6 +33,7 @@ classifiers = [
33
33
  "Programming Language :: Python :: 3.12",
34
34
  "Programming Language :: Python :: 3.13",
35
35
  "Programming Language :: Python :: 3.14",
36
+ "Programming Language :: Python :: Free Threading :: 1 - Unstable",
36
37
  ]
37
38
 
38
39
  keywords = [
@@ -49,7 +50,7 @@ dependencies = [
49
50
  "setuptools>=59.0.0",
50
51
  "scipy>=1,<2",
51
52
  "numpy>=2.0",
52
- "numba>=0.58,<=0.65.1",
53
+ "numba>=0.58,<=0.66.0",
53
54
  "filelock>=3.15",
54
55
  ]
55
56
 
@@ -77,7 +78,7 @@ tests = [
77
78
  ]
78
79
  rtd = ["sphinx>=5.1.0,<6", "pygments", "pydot"]
79
80
  jax = ["jax", "jaxlib"]
80
- numba = ["numba>=0.58,<=0.65.1", "llvmlite"]
81
+ numba = ["numba>=0.58,<=0.66.0", "llvmlite"]
81
82
  kanren = [
82
83
  "etuples",
83
84
  "logical-unification",
@@ -185,11 +186,18 @@ files = ["pytensor", "tests"]
185
186
  build = "*"
186
187
  # Uncomment to skip builds that compile but fail when trying to test (maybe due to incompatibility with runner)
187
188
  # archs = ["auto64"]
188
- # Disable any-platform (pp*), 32-bit builds, and free-threaded builds (cp*t-*)
189
+ # Disable any-platform (pp*) and 32-bit builds
189
190
  # Additional options to consider: "*musllinux*"
190
- skip = ["pp*", "*-win32", "*-manylinux_i686", "cp*t-*"]
191
+ skip = ["pp*", "*-win32", "*-manylinux_i686"]
192
+ # Free-threaded (cp*t-*) wheels are built by default. The compiled extensions
193
+ # are not marked free-threading-safe, so importing them re-enables the GIL
194
+ # (with a warning). That's fine: they're no longer loaded by default.
191
195
  build-frontend = "build"
192
- test-command = 'python -c "import pytensor; print(pytensor.__version__); from pytensor.scan import scan_perform; print(scan_perform.get_version())"'
196
+ # Import the compiled extensions and evaluate a function to check the wheel loads and
197
+ # runs everywhere, including free-threaded builds. cxx="" disables the C backend (the
198
+ # minimal wheel-test env has no libpython to link a runtime-compiled thunk against) and
199
+ # FAST_COMPILE avoids numba, which crashes on free-threaded Windows.
200
+ test-command = '''python -c "import pytensor; pytensor.config.cxx = ''; import pytensor.tensor as pt; print(pytensor.__version__); from pytensor.scan import scan_perform; print(scan_perform.get_version()); x = pt.vector(); f = pytensor.function([x], (x * 2).sum(), mode='FAST_COMPILE'); assert float(f([1.0, 2.0, 3.0])) == 12.0"'''
193
201
  test-skip = ["*musllinux*", "*i686*"]
194
202
 
195
203
  # Testing seems to be running into issues locating libs where expected
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2026-07-24T23:30:42+0200",
11
+ "date": "2026-08-12T10:16:27+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "42a11f84b1656f2e8c42b3ce05cd602fbcc1c6f8",
15
- "version": "3.2.3"
14
+ "full-revisionid": "aa1bc7772eb11ed8def2814374aeb5da03da590c",
15
+ "version": "3.3.0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -7,7 +7,7 @@ from pytensor.compile.aliasing import (
7
7
  add_supervisor_to_fgraph,
8
8
  insert_deepcopy,
9
9
  )
10
- from pytensor.compile.builders import OpFromGraph
10
+ from pytensor.compile.builders import OpFromGraph, SymbolicOp
11
11
  from pytensor.compile.io import In, Out
12
12
  from pytensor.compile.mode import optdb
13
13
  from pytensor.graph.basic import Apply, Variable
@@ -134,12 +134,12 @@ def rewrite_ofg_inner_graph(linker, op, node, inner, *, mode):
134
134
  )
135
135
 
136
136
 
137
- def _ofg_inner_optimizer(mode):
138
- # Recognition rewrites fold a pattern into an inner-graph op (e.g.
139
- # ``exp(x) / sum(exp(x))`` -> ``Softmax``, itself an ``OpFromGraph``). Running
140
- # them on an ``OpFromGraph`` inner graph -- which may *be* that pattern --
141
- # would re-create the op inside itself and recurse without end.
142
- return mode.excluding("symbolic_op_recognition").optimizer
137
+ def _ofg_inner_optimizer(mode, op):
138
+ # Recognition would re-create a `SymbolicOp` inside its own inner graph and never
139
+ # terminate. Any other `OpFromGraph` must keep it, or wrapping destabilizes the body.
140
+ if isinstance(op, SymbolicOp):
141
+ return mode.excluding("symbolic_op_recognition").optimizer
142
+ return mode.optimizer
143
143
 
144
144
 
145
145
  @rewrite_ofg_inner_graph.register(VMLinker)
@@ -152,7 +152,7 @@ def destructive_rewrite_ofg_inner_graph(linker, op, node, inner, *, mode):
152
152
  # still be baked between purely internal buffers.
153
153
  input_specs = [In(x, borrow=True, mutable=False) for x in inner.inputs]
154
154
  add_supervisor_to_fgraph(fgraph=inner, input_specs=input_specs, accept_inplace=True)
155
- _ofg_inner_optimizer(mode).rewrite(inner)
155
+ _ofg_inner_optimizer(mode, op).rewrite(inner)
156
156
  # The op's outputs must not alias its inputs or each other (it declares no
157
157
  # view_map, so the outer graph cannot see such aliases); deepcopies break any
158
158
  # boundary alias the optimized graph ends up with.
@@ -165,7 +165,7 @@ def destructive_rewrite_ofg_inner_graph(linker, op, node, inner, *, mode):
165
165
  @rewrite_ofg_inner_graph.register(MLXLinker)
166
166
  def functional_rewrite_ofg_inner_graph(linker, op, node, inner, *, mode):
167
167
  """Structurally optimize the inner graph for the functional JIT backends."""
168
- _ofg_inner_optimizer(mode).rewrite(inner)
168
+ _ofg_inner_optimizer(mode, op).rewrite(inner)
169
169
 
170
170
 
171
171
  @graph_rewriter
@@ -546,10 +546,10 @@ class FullHistory(Feature):
546
546
  └─ ···
547
547
  >> local_softmax_stabilize
548
548
  Log [id A] 1
549
- └─ Softmax{axis=None} [id B] 0
549
+ └─ Softmax{axis=(0,)} [id B] 0
550
550
  └─ x [id C]
551
551
  >> local_logsoftmax
552
- LogSoftmax{axis=None} [id A] 0
552
+ LogSoftmax{axis=(0,)} [id A] 0
553
553
  └─ x [id B]
554
554
 
555
555
 
@@ -563,7 +563,7 @@ class FullHistory(Feature):
563
563
  .. testoutput::
564
564
  >> local_logsoftmax
565
565
  Log [id A] 1
566
- └─ Softmax{axis=None} [id B] 0
566
+ └─ Softmax{axis=(0,)} [id B] 0
567
567
  └─ x [id C]
568
568
  >> local_softmax_stabilize
569
569
  Log [id A] 4
@@ -591,7 +591,7 @@ class FullHistory(Feature):
591
591
 
592
592
  .. testoutput::
593
593
  Log [id A] 1
594
- └─ Softmax{axis=None} [id B] 0
594
+ └─ Softmax{axis=(0,)} [id B] 0
595
595
  └─ x [id C]
596
596
 
597
597
 
@@ -572,7 +572,8 @@ def reify_pattern(pattern, subs: Mapping[PatternVar | Asterisk, Any]):
572
572
  inputs.extend(captured)
573
573
  else:
574
574
  inputs.append(reify_pattern(p, subs))
575
- return op.make_node(*inputs).default_output()
575
+ # Call the Op, so those that build state lazily (SymbolicOp) are constructed
576
+ return op(*inputs)
576
577
 
577
578
  if isinstance(pattern, OpPattern):
578
579
  op_type = pattern.op_type
@@ -263,14 +263,29 @@ def jax_funcify_Erfinv(op, **kwargs):
263
263
 
264
264
 
265
265
  @jax_funcify.register(BetaIncInv)
266
- @jax_funcify.register(Erfcx)
267
- @jax_funcify.register(Erfcinv)
268
266
  def jax_funcify_from_tfp(op, **kwargs):
269
267
  tfp_jax_op = try_import_tfp_jax_op(op)
270
268
 
271
269
  return tfp_jax_op
272
270
 
273
271
 
272
+ @jax_funcify.register(Erfcx)
273
+ def jax_funcify_Erfcx(op, **kwargs):
274
+ if hasattr(jax.scipy.special, "erfcx"):
275
+ return jax.scipy.special.erfcx
276
+ # jax < 0.11 has no native erfcx
277
+ return try_import_tfp_jax_op(op)
278
+
279
+
280
+ @jax_funcify.register(Erfcinv)
281
+ def jax_funcify_Erfcinv(op, **kwargs):
282
+ def erfcinv(x):
283
+ # erfc(z) = 2 ndtr(-z * sqrt(2)), so z = -ndtri(x / 2) / sqrt(2)
284
+ return -jax.scipy.special.ndtri(x / 2) / jnp.sqrt(2)
285
+
286
+ return erfcinv
287
+
288
+
274
289
  @jax_funcify.register(NdtriExp)
275
290
  def jax_funcify_NdtriExp(op, **kwargs):
276
291
  def ndtri_exp(x):
@@ -1,3 +1,5 @@
1
+ import jax.numpy as jnp
2
+
1
3
  from pytensor.link.jax.dispatch.basic import jax_funcify
2
4
  from pytensor.tensor.subtensor import (
3
5
  AdvancedIncSubtensor,
@@ -60,7 +62,11 @@ def jax_funcify_IncSubtensor(op, node, **kwargs):
60
62
  indices = indices[0]
61
63
 
62
64
  if isinstance(op, AdvancedIncSubtensor):
63
- op._check_runtime_broadcast_of_vector_index(node, x, y, indices)
65
+ # jax_typify downgrades 0d arrays to Python scalars, which have no .shape,
66
+ # so re-arrayify y for a check that is written against array values.
67
+ op._check_runtime_broadcast_of_vector_index(
68
+ node, x, jnp.asarray(y), indices
69
+ )
64
70
 
65
71
  return jax_fn(x, indices, y)
66
72
 
@@ -15,25 +15,36 @@ from pytensor.link.utils import fgraph_to_python
15
15
  from pytensor.raise_op import Assert, CheckAndRaise
16
16
 
17
17
 
18
+ def float64_supported():
19
+ """Return whether the current default device can operate on float64.
20
+
21
+ MLX implements float64 on the CPU only; the Metal backend rejects it outright.
22
+ """
23
+ return mx.default_device() == mx.cpu
24
+
25
+
18
26
  def convert_dtype_to_mlx(dtype_str, auto_cast_unsupported=True):
19
27
  """Convert PyTensor dtype strings to MLX dtype objects.
20
28
 
21
29
  MLX expects dtype objects rather than string literals for type conversion.
22
30
  This function maps common dtype strings to their MLX equivalents.
23
31
 
32
+ float64 survives when the default device supports it and is narrowed to float32
33
+ otherwise. complex128 is always narrowed, MLX having no wider complex type.
34
+
24
35
  Parameters
25
36
  ----------
26
37
  dtype_str : str or MLX dtype
27
38
  The dtype to convert
28
- auto_cast_unsupported : bool
29
- If True, automatically cast unsupported dtypes to supported ones with warnings
39
+ auto_cast_unsupported : bool, optional
40
+ If True, narrow dtypes the current device cannot handle, warning as it does so.
41
+ If False, return the requested dtype and let any later failure surface. Default
42
+ True.
30
43
 
31
44
  Returns
32
45
  -------
33
46
  MLX dtype object
34
47
  """
35
- import warnings
36
-
37
48
  if isinstance(dtype_str, str):
38
49
  if dtype_str == "bool":
39
50
  return mx.bool_
@@ -58,11 +69,12 @@ def convert_dtype_to_mlx(dtype_str, auto_cast_unsupported=True):
58
69
  elif dtype_str == "float32":
59
70
  return mx.float32
60
71
  elif dtype_str == "float64":
61
- if auto_cast_unsupported:
72
+ if auto_cast_unsupported and not float64_supported():
62
73
  warnings.warn(
63
74
  "MLX does not support float64 on GPU. Automatically casting to float32. "
64
- "This may result in reduced precision. To avoid this warning, "
65
- "explicitly use float32 in your code or set floatX='float32' in PyTensor config.",
75
+ "This may result in reduced precision. To keep float64, run on the CPU "
76
+ "device with mx.set_default_device(mx.cpu); to avoid this warning, use "
77
+ "float32 or set floatX='float32' in PyTensor config.",
66
78
  UserWarning,
67
79
  stacklevel=3,
68
80
  )
@@ -116,6 +128,10 @@ def mlx_typify(data, **kwargs):
116
128
 
117
129
  @mlx_typify.register(np.ndarray)
118
130
  def mlx_typify_tensor(data, dtype=None, **kwargs):
131
+ # mx.array narrows float64 input to float32 unless the dtype is named explicitly,
132
+ # and it does so on the CPU too, where float64 is perfectly usable
133
+ if dtype is None and data.dtype == np.float64 and float64_supported():
134
+ dtype = mx.float64
119
135
  return _nan_safe_constant(data, dtype=dtype)
120
136
 
121
137
 
@@ -0,0 +1,64 @@
1
+ import mlx.core as mx
2
+
3
+ from pytensor.link.mlx.dispatch import mlx_funcify
4
+ from pytensor.tensor.blockwise import Blockwise, _check_runtime_broadcast_core
5
+
6
+
7
+ @mlx_funcify.register(Blockwise)
8
+ def funcify_Blockwise(op: Blockwise, node, **kwargs):
9
+ core_node = op._create_dummy_core_node(node.inputs)
10
+ core_f = mlx_funcify(op.core_op, node=core_node)
11
+
12
+ batch_ndim = op.batch_ndim(node)
13
+ if batch_ndim == 0:
14
+ return core_f
15
+
16
+ multi_output = len(node.outputs) > 1
17
+ core_ndims = [len(sig) for sig in op.inputs_sig]
18
+
19
+ # Hoisted out of the per-call path, unlike Blockwise._check_runtime_broadcast.
20
+ batch_bcast = [inp.type.broadcastable[:batch_ndim] for inp in node.inputs]
21
+
22
+ # Decide batching purely from static shapes so a graph batches identically
23
+ # here and in every other backend: a batch axis broadcasts (is never mapped)
24
+ # only when its static size is exactly 1, or the input lacks it entirely.
25
+ squeeze_axes, padded_batch = [], []
26
+ for inp, n_core_dims in zip(node.inputs, core_ndims):
27
+ batch_shape = inp.type.shape[: inp.type.ndim - n_core_dims]
28
+ squeeze_axes.append(tuple(i for i, s in enumerate(batch_shape) if s == 1))
29
+ padded_batch.append((1,) * (batch_ndim - len(batch_shape)) + tuple(batch_shape))
30
+
31
+ # Nest one mx.vmap per mapped batch axis (innermost first, so array axis 0
32
+ # tracks the outermost batch dim). All-broadcast axes are squeezed out of
33
+ # every input above and re-inserted as size-1 dims after the mapped call.
34
+ fn, expand_axes = core_f, []
35
+ for axis in reversed(range(batch_ndim)):
36
+ in_axes = tuple(None if shape[axis] == 1 else 0 for shape in padded_batch)
37
+ if all(ax is None for ax in in_axes):
38
+ expand_axes.append(axis)
39
+ else:
40
+ fn = mx.vmap(fn, in_axes=in_axes)
41
+
42
+ expand_axes.sort()
43
+
44
+ def blockwise(*args):
45
+ # Other backends reject a runtime size-1 batch dim that is not statically
46
+ # broadcastable; match them rather than silently broadcasting here.
47
+ _check_runtime_broadcast_core(args, batch_bcast, batch_ndim)
48
+
49
+ squeezed = [
50
+ mx.squeeze(arg, axes) if axes else arg
51
+ for arg, axes in zip(args, squeeze_axes)
52
+ ]
53
+ out = fn(*squeezed)
54
+ if not expand_axes:
55
+ return tuple(out) if multi_output else out
56
+
57
+ # Re-insert the never-mapped all-broadcast axes as size-1 dims, in
58
+ # ascending order so each insertion's index stays valid for the next.
59
+ outs = out if multi_output else (out,)
60
+ for ax in expand_axes:
61
+ outs = [mx.expand_dims(o, ax) for o in outs]
62
+ return tuple(outs) if multi_output else outs[0]
63
+
64
+ return blockwise
@@ -139,14 +139,15 @@ def mlx_funcify_PivotToPermutations(op, **kwargs):
139
139
  inverse = op.inverse
140
140
 
141
141
  def pivot_to_permutations(pivots):
142
- pivots = mx.array(pivots)
143
- n = pivots.shape[0]
144
- p_inv = mx.arange(n, dtype=mx.int32)
145
- for i in range(n):
146
- p_inv[i], p_inv[pivots[i]] = p_inv[pivots[i]], p_inv[i]
147
- if inverse:
148
- return p_inv
149
- return mx.argsort(p_inv)
142
+ with mx.stream(mx.cpu):
143
+ pivots = mx.array(pivots)
144
+ n = pivots.shape[0]
145
+ p_inv = mx.arange(n, dtype=mx.int32)
146
+ for i in range(n):
147
+ p_inv[i], p_inv[pivots[i]] = p_inv[pivots[i]], p_inv[i]
148
+ if inverse:
149
+ return p_inv
150
+ return mx.argsort(p_inv)
150
151
 
151
152
  return pivot_to_permutations
152
153
 
@@ -0,0 +1,38 @@
1
+ import mlx.core as mx
2
+
3
+ from pytensor.link.mlx.dispatch.basic import mlx_funcify
4
+ from pytensor.tensor.linalg.summary import Det, SLogDet
5
+
6
+
7
+ def _lu_det_parts(x):
8
+ """Compute sign and logdet via LU factorization. Call within a CPU stream context."""
9
+ lu, pivots = mx.linalg.lu_factor(x)
10
+ diag_u = mx.diagonal(lu)
11
+ n_swaps = mx.sum(pivots != mx.arange(pivots.shape[0], dtype=pivots.dtype))
12
+ pivot_sign = 1 - 2 * (n_swaps % 2)
13
+ sign = pivot_sign * mx.prod(mx.sign(diag_u))
14
+ logabsdet = mx.sum(mx.log(mx.abs(diag_u)))
15
+ return sign, logabsdet
16
+
17
+
18
+ @mlx_funcify.register(Det)
19
+ def mlx_funcify_Det(op, node, **kwargs):
20
+ X_dtype = getattr(mx, node.inputs[0].dtype)
21
+
22
+ def det(x):
23
+ with mx.stream(mx.cpu):
24
+ sign, logabsdet = _lu_det_parts(x.astype(dtype=X_dtype))
25
+ return sign * mx.exp(logabsdet)
26
+
27
+ return det
28
+
29
+
30
+ @mlx_funcify.register(SLogDet)
31
+ def mlx_funcify_SLogDet(op, node, **kwargs):
32
+ X_dtype = getattr(mx, node.inputs[0].dtype)
33
+
34
+ def slogdet(x):
35
+ with mx.stream(mx.cpu):
36
+ return _lu_det_parts(x.astype(dtype=X_dtype))
37
+
38
+ return slogdet
@@ -0,0 +1 @@
1
+ from pytensor.link.mlx.dispatch.scalar import basic, bessel, erf, erfcinv, gamma, math
@@ -5,16 +5,15 @@ import mlx.core as mx
5
5
  from pytensor.link.mlx.dispatch.basic import convert_dtype_to_mlx, mlx_funcify
6
6
  from pytensor.scalar.basic import (
7
7
  Cast,
8
+ Clip,
8
9
  Composite,
9
10
  Identity,
10
11
  Mod,
11
12
  ScalarOp,
12
13
  Second,
13
14
  )
14
- from pytensor.scalar.math import Erfc, Erfcx, Log1mexp, Sigmoid, Softplus
15
15
 
16
16
 
17
- # MLX name overrides for nfunc_spec names that don't match mlx.core
18
17
  MLX_NFUNC_OVERRIDES = {
19
18
  "true_divide": "divide",
20
19
  "invert": "bitwise_invert",
@@ -96,6 +95,14 @@ def mlx_funcify_Mod(op, **kwargs):
96
95
  return mlx_mod
97
96
 
98
97
 
98
+ @mlx_funcify.register(Clip)
99
+ def mlx_funcify_Clip(op, **kwargs):
100
+ def clip(x, min, max):
101
+ return mx.where(x < min, min, mx.where(x > max, max, x))
102
+
103
+ return clip
104
+
105
+
99
106
  @mlx_funcify.register(Identity)
100
107
  def mlx_funcify_Identity(op, **kwargs):
101
108
  def identity(x):
@@ -115,55 +122,6 @@ def mlx_funcify_Second(op, **kwargs):
115
122
  return second
116
123
 
117
124
 
118
- @mlx_funcify.register(Sigmoid)
119
- def mlx_funcify_Sigmoid(op, **kwargs):
120
- return mx.sigmoid
121
-
122
-
123
- @mlx_funcify.register(Erfc)
124
- def mlx_funcify_Erfc(op, **kwargs):
125
- def erfc(x):
126
- return 1.0 - mx.erf(x)
127
-
128
- return erfc
129
-
130
-
131
- @mlx_funcify.register(Erfcx)
132
- def mlx_funcify_Erfcx(op, **kwargs):
133
- def erfcx(x):
134
- return mx.exp(x * x) * (1.0 - mx.erf(x))
135
-
136
- return erfcx
137
-
138
-
139
- @mlx_funcify.register(Softplus)
140
- def mlx_funcify_Softplus(op, **kwargs):
141
- def softplus(x):
142
- return mx.where(
143
- x < -37.0,
144
- mx.exp(x),
145
- mx.where(
146
- x < 18.0,
147
- mx.log1p(mx.exp(x)),
148
- mx.where(
149
- x < 33.3,
150
- x + mx.exp(-x),
151
- x,
152
- ),
153
- ),
154
- )
155
-
156
- return softplus
157
-
158
-
159
- @mlx_funcify.register(Log1mexp)
160
- def mlx_funcify_Log1mexp(op, node, **kwargs):
161
- def log1mexp(x):
162
- return mx.where(x < mx.log(0.5), mx.log1p(-mx.exp(x)), mx.log(-mx.expm1(x)))
163
-
164
- return log1mexp
165
-
166
-
167
125
  @mlx_funcify.register(Composite)
168
126
  def mlx_funcify_Composite(op, node=None, **kwargs):
169
127
  return mlx_funcify(op.fgraph, squeeze_output=True)