pytensor 3.0.0__tar.gz → 3.0.1__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 (572) hide show
  1. {pytensor-3.0.0/pytensor.egg-info → pytensor-3.0.1}/PKG-INFO +1 -1
  2. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/__init__.py +18 -1
  3. pytensor-3.0.1/pytensor/_sparse_lazy.py +31 -0
  4. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/_version.py +3 -3
  5. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/basic.py +4 -0
  6. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/builders.py +65 -1
  7. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/sharedvalue.py +4 -0
  8. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/features.py +30 -26
  9. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/elemwise.py +1 -12
  10. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/linalg/solvers.py +15 -1
  11. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/elemwise.py +1 -12
  12. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/compile_ops.py +4 -2
  13. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/cython_support.py +5 -2
  14. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/elemwise.py +0 -119
  15. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/elemwise.py +29 -28
  16. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/printing.py +28 -0
  17. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scalar/math.py +5 -1
  18. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/basic.py +34 -51
  19. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/blas.py +4 -8
  20. pytensor-3.0.1/pytensor/tensor/linalg/_lazy.py +12 -0
  21. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/constructors.py +1 -2
  22. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/decomposition/cholesky.py +1 -1
  23. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/decomposition/eigen.py +1 -1
  24. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/decomposition/lu.py +2 -3
  25. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/decomposition/qr.py +4 -4
  26. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/decomposition/schur.py +2 -3
  27. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/products.py +28 -34
  28. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/solvers/general.py +1 -1
  29. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/solvers/linear_control.py +2 -2
  30. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/solvers/psd.py +2 -2
  31. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/solvers/triangular.py +2 -2
  32. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/solvers/tridiagonal.py +5 -5
  33. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/random/basic.py +3 -6
  34. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/basic.py +225 -190
  35. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/elemwise.py +4 -10
  36. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/linalg/solvers.py +100 -1
  37. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/math.py +195 -237
  38. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/ofg.py +2 -1
  39. pytensor-3.0.1/pytensor/tensor/rewriting/special.py +99 -0
  40. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/subtensor_lift.py +3 -3
  41. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/signal/conv.py +6 -2
  42. pytensor-3.0.1/pytensor/tensor/special.py +235 -0
  43. pytensor-3.0.1/pytensor/tensor/symbolic.py +10 -0
  44. pytensor-3.0.1/pytensor/tensor/xlogx.py +37 -0
  45. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/utils.py +75 -0
  46. {pytensor-3.0.0 → pytensor-3.0.1/pytensor.egg-info}/PKG-INFO +1 -1
  47. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor.egg-info/SOURCES.txt +3 -0
  48. pytensor-3.0.1/tests/test_basic.py +65 -0
  49. pytensor-3.0.0/pytensor/tensor/rewriting/special.py +0 -175
  50. pytensor-3.0.0/pytensor/tensor/special.py +0 -819
  51. pytensor-3.0.0/pytensor/tensor/xlogx.py +0 -66
  52. pytensor-3.0.0/tests/test_basic.py +0 -34
  53. {pytensor-3.0.0 → pytensor-3.0.1}/LICENSE.txt +0 -0
  54. {pytensor-3.0.0 → pytensor-3.0.1}/MANIFEST.in +0 -0
  55. {pytensor-3.0.0 → pytensor-3.0.1}/README.rst +0 -0
  56. {pytensor-3.0.0 → pytensor-3.0.1}/doc/.templates/PLACEHOLDER +0 -0
  57. {pytensor-3.0.0 → pytensor-3.0.1}/doc/.templates/layout.html +0 -0
  58. {pytensor-3.0.0 → pytensor-3.0.1}/doc/.templates/nb-badges.html +0 -0
  59. {pytensor-3.0.0 → pytensor-3.0.1}/doc/.templates/rendered_citation.html +0 -0
  60. {pytensor-3.0.0 → pytensor-3.0.1}/doc/LICENSE.txt +0 -0
  61. {pytensor-3.0.0 → pytensor-3.0.1}/doc/README.md +0 -0
  62. {pytensor-3.0.0 → pytensor-3.0.1}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  63. {pytensor-3.0.0 → pytensor-3.0.1}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  64. {pytensor-3.0.0 → pytensor-3.0.1}/doc/acknowledgement.rst +0 -0
  65. {pytensor-3.0.0 → pytensor-3.0.1}/doc/bcast.png +0 -0
  66. {pytensor-3.0.0 → pytensor-3.0.1}/doc/bcast.svg +0 -0
  67. {pytensor-3.0.0 → pytensor-3.0.1}/doc/blog.md +0 -0
  68. {pytensor-3.0.0 → pytensor-3.0.1}/doc/conf.py +0 -0
  69. {pytensor-3.0.0 → pytensor-3.0.1}/doc/core_development_guide.rst +0 -0
  70. {pytensor-3.0.0 → pytensor-3.0.1}/doc/css.inc +0 -0
  71. {pytensor-3.0.0 → pytensor-3.0.1}/doc/dev_start_guide.rst +0 -0
  72. {pytensor-3.0.0 → pytensor-3.0.1}/doc/environment.yml +0 -0
  73. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/apply.png +0 -0
  74. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/apply.svg +0 -0
  75. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/apply2.svg +0 -0
  76. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/creating_a_c_op.rst +0 -0
  77. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  78. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/creating_an_op.rst +0 -0
  79. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/ctype.rst +0 -0
  80. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/extending_faq.rst +0 -0
  81. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/extending_pytensor_solution_1.py +0 -0
  82. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/graph_rewriting.rst +0 -0
  83. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/graphstructures.rst +0 -0
  84. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/index.rst +0 -0
  85. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/inplace.rst +0 -0
  86. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/op.rst +0 -0
  87. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/other_ops.rst +0 -0
  88. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  89. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  90. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/pipeline.rst +0 -0
  91. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/scan.rst +0 -0
  92. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/tips.rst +0 -0
  93. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/type.rst +0 -0
  94. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/unittest.rst +0 -0
  95. {pytensor-3.0.0 → pytensor-3.0.1}/doc/extending/using_params.rst +0 -0
  96. {pytensor-3.0.0 → pytensor-3.0.1}/doc/faq.rst +0 -0
  97. {pytensor-3.0.0 → pytensor-3.0.1}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  98. {pytensor-3.0.0 → pytensor-3.0.1}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
  99. {pytensor-3.0.0 → pytensor-3.0.1}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
  100. {pytensor-3.0.0 → pytensor-3.0.1}/doc/gallery/optimize/root.ipynb +0 -0
  101. {pytensor-3.0.0 → pytensor-3.0.1}/doc/gallery/page_footer.md +0 -0
  102. {pytensor-3.0.0 → pytensor-3.0.1}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  103. {pytensor-3.0.0 → pytensor-3.0.1}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  104. {pytensor-3.0.0 → pytensor-3.0.1}/doc/generate_dtype_tensor_table.py +0 -0
  105. {pytensor-3.0.0 → pytensor-3.0.1}/doc/glossary.rst +0 -0
  106. {pytensor-3.0.0 → pytensor-3.0.1}/doc/images/Elman_srnn.png +0 -0
  107. {pytensor-3.0.0 → pytensor-3.0.1}/doc/images/PyTensor.png +0 -0
  108. {pytensor-3.0.0 → pytensor-3.0.1}/doc/images/PyTensor_RGB.svg +0 -0
  109. {pytensor-3.0.0 → pytensor-3.0.1}/doc/images/PyTensor_logo.png +0 -0
  110. {pytensor-3.0.0 → pytensor-3.0.1}/doc/images/binder.svg +0 -0
  111. {pytensor-3.0.0 → pytensor-3.0.1}/doc/images/blocksparse.png +0 -0
  112. {pytensor-3.0.0 → pytensor-3.0.1}/doc/images/colab.svg +0 -0
  113. {pytensor-3.0.0 → pytensor-3.0.1}/doc/images/github.svg +0 -0
  114. {pytensor-3.0.0 → pytensor-3.0.1}/doc/images/lstm.png +0 -0
  115. {pytensor-3.0.0 → pytensor-3.0.1}/doc/images/lstm_memorycell.png +0 -0
  116. {pytensor-3.0.0 → pytensor-3.0.1}/doc/images/talk2010.gif +0 -0
  117. {pytensor-3.0.0 → pytensor-3.0.1}/doc/images/talk2010.png +0 -0
  118. {pytensor-3.0.0 → pytensor-3.0.1}/doc/index.rst +0 -0
  119. {pytensor-3.0.0 → pytensor-3.0.1}/doc/install.rst +0 -0
  120. {pytensor-3.0.0 → pytensor-3.0.1}/doc/internal/how_to_release.rst +0 -0
  121. {pytensor-3.0.0 → pytensor-3.0.1}/doc/internal/index.rst +0 -0
  122. {pytensor-3.0.0 → pytensor-3.0.1}/doc/internal/metadocumentation.rst +0 -0
  123. {pytensor-3.0.0 → pytensor-3.0.1}/doc/introduction.rst +0 -0
  124. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/compile/debugmode.rst +0 -0
  125. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/compile/function.rst +0 -0
  126. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/compile/index.rst +0 -0
  127. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/compile/io.rst +0 -0
  128. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/compile/mode.rst +0 -0
  129. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/compile/nanguardmode.rst +0 -0
  130. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/compile/opfromgraph.rst +0 -0
  131. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/compile/ops.rst +0 -0
  132. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/compile/profilemode.rst +0 -0
  133. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/compile/shared.rst +0 -0
  134. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/config.rst +0 -0
  135. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  136. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  137. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  138. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  139. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  140. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  141. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  142. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/mlp.html +0 -0
  143. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/mlp.png +0 -0
  144. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/mlp2.html +0 -0
  145. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  146. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/mlp2.png +0 -0
  147. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/ofg.html +0 -0
  148. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/examples/ofg2.html +0 -0
  149. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/index.ipynb +0 -0
  150. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/index.rst +0 -0
  151. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  152. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  153. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  154. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  155. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/graph/features.rst +0 -0
  156. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/graph/fgraph.rst +0 -0
  157. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/graph/graph.rst +0 -0
  158. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/graph/index.rst +0 -0
  159. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/graph/op.rst +0 -0
  160. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/graph/replace.rst +0 -0
  161. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/graph/type.rst +0 -0
  162. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/graph/utils.rst +0 -0
  163. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/index.rst +0 -0
  164. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/misc/pkl_utils.rst +0 -0
  165. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/printing.rst +0 -0
  166. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/scalar/index.rst +0 -0
  167. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/scan.rst +0 -0
  168. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/sparse/index.rst +0 -0
  169. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/sparse/sandbox.rst +0 -0
  170. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/basic.rst +0 -0
  171. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/basic_opt.rst +0 -0
  172. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/bcast.png +0 -0
  173. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/bcast.svg +0 -0
  174. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/elemwise.rst +0 -0
  175. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/extra_ops.rst +0 -0
  176. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/fft.rst +0 -0
  177. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/functional.rst +0 -0
  178. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/index.rst +0 -0
  179. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/io.rst +0 -0
  180. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/linalg.rst +0 -0
  181. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/math_opt.rst +0 -0
  182. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/nlinalg.rst +0 -0
  183. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/optimize.rst +0 -0
  184. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/plot_fft.png +0 -0
  185. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/random.rst +0 -0
  186. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/slinalg.rst +0 -0
  187. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/tensor/utils.rst +0 -0
  188. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/typed_list.rst +0 -0
  189. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/xtensor/index.md +0 -0
  190. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/xtensor/linalg.md +0 -0
  191. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/xtensor/math.md +0 -0
  192. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/xtensor/module_functions.md +0 -0
  193. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/xtensor/random.md +0 -0
  194. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/xtensor/signal.md +0 -0
  195. {pytensor-3.0.0 → pytensor-3.0.1}/doc/library/xtensor/type.md +0 -0
  196. {pytensor-3.0.0 → pytensor-3.0.1}/doc/links.rst +0 -0
  197. {pytensor-3.0.0 → pytensor-3.0.1}/doc/optimizations.rst +0 -0
  198. {pytensor-3.0.0 → pytensor-3.0.1}/doc/pylintrc +0 -0
  199. {pytensor-3.0.0 → pytensor-3.0.1}/doc/robots.txt +0 -0
  200. {pytensor-3.0.0 → pytensor-3.0.1}/doc/troubleshooting.rst +0 -0
  201. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/adding.rst +0 -0
  202. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/adding_solution_1.py +0 -0
  203. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/aliasing.rst +0 -0
  204. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/apply.png +0 -0
  205. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/apply.svg +0 -0
  206. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/bcast.png +0 -0
  207. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/broadcasting.rst +0 -0
  208. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/conditions.rst +0 -0
  209. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/debug_faq.rst +0 -0
  210. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/dlogistic.png +0 -0
  211. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/examples.rst +0 -0
  212. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/faq_tutorial.rst +0 -0
  213. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/gradients.rst +0 -0
  214. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/index.rst +0 -0
  215. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/loading_and_saving.rst +0 -0
  216. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/logistic.gp +0 -0
  217. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/logistic.png +0 -0
  218. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/loop.rst +0 -0
  219. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/loop_solution_1.py +0 -0
  220. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/modes.rst +0 -0
  221. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/modes_solution_1.py +0 -0
  222. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/multi_cores.rst +0 -0
  223. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/nan_tutorial.rst +0 -0
  224. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/pics/d3viz.png +0 -0
  225. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  226. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  227. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  228. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/printing_drawing.rst +0 -0
  229. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/prng.rst +0 -0
  230. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/profiling.rst +0 -0
  231. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/profiling_example.py +0 -0
  232. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/profiling_example_out.prof +0 -0
  233. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/shape_info.rst +0 -0
  234. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/sparse.rst +0 -0
  235. {pytensor-3.0.0 → pytensor-3.0.1}/doc/tutorial/symbolic_graphs.rst +0 -0
  236. {pytensor-3.0.0 → pytensor-3.0.1}/doc/user_guide.rst +0 -0
  237. {pytensor-3.0.0 → pytensor-3.0.1}/pyproject.toml +0 -0
  238. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/bin/__init__.py +0 -0
  239. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/bin/pytensor_cache.py +0 -0
  240. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/breakpoint.py +0 -0
  241. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/__init__.py +0 -0
  242. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/aliasing.py +0 -0
  243. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/compiledir.py +0 -0
  244. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/compilelock.py +0 -0
  245. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/debug/__init__.py +0 -0
  246. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/debug/debugmode.py +0 -0
  247. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/debug/dump.py +0 -0
  248. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/debug/monitormode.py +0 -0
  249. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/debug/nanguardmode.py +0 -0
  250. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/debug/profiling.py +0 -0
  251. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/executor.py +0 -0
  252. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/io.py +0 -0
  253. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/maker.py +0 -0
  254. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/mode.py +0 -0
  255. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/ops.py +0 -0
  256. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/compile/rebuild.py +0 -0
  257. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/configdefaults.py +0 -0
  258. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/configparser.py +0 -0
  259. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/d3viz/__init__.py +0 -0
  260. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  261. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/d3viz/css/d3viz.css +0 -0
  262. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/d3viz/d3viz.py +0 -0
  263. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/d3viz/formatting.py +0 -0
  264. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/d3viz/html/template.html +0 -0
  265. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  266. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  267. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/d3viz/js/d3viz.js +0 -0
  268. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  269. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  270. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/gradient.py +0 -0
  271. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/__init__.py +0 -0
  272. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/basic.py +0 -0
  273. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/destroyhandler.py +0 -0
  274. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/fg.py +0 -0
  275. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/null_type.py +0 -0
  276. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/op.py +0 -0
  277. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/replace.py +0 -0
  278. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/rewriting/__init__.py +0 -0
  279. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/rewriting/basic.py +0 -0
  280. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/rewriting/db.py +0 -0
  281. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/rewriting/kanren.py +0 -0
  282. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/rewriting/unify.py +0 -0
  283. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/rewriting/utils.py +0 -0
  284. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/traversal.py +0 -0
  285. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/type.py +0 -0
  286. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/graph/utils.py +0 -0
  287. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/ifelse.py +0 -0
  288. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/ipython.py +0 -0
  289. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/__init__.py +0 -0
  290. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/basic.py +0 -0
  291. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/c/__init__.py +0 -0
  292. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/c/basic.py +0 -0
  293. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  294. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  295. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/c/cmodule.py +0 -0
  296. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/c/cutils.py +0 -0
  297. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/c/cvm.py +0 -0
  298. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/c/exceptions.py +0 -0
  299. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/c/interface.py +0 -0
  300. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/c/lazylinker_c.py +0 -0
  301. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/c/op.py +0 -0
  302. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/c/params_type.py +0 -0
  303. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/c/type.py +0 -0
  304. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/__init__.py +0 -0
  305. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/__init__.py +0 -0
  306. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/basic.py +0 -0
  307. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/blas.py +0 -0
  308. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  309. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/einsum.py +0 -0
  310. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  311. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
  312. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
  313. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
  314. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
  315. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
  316. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
  317. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/math.py +0 -0
  318. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/pad.py +0 -0
  319. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/random.py +0 -0
  320. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/scalar.py +0 -0
  321. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/scan.py +0 -0
  322. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/shape.py +0 -0
  323. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  324. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  325. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/sort.py +0 -0
  326. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/sparse.py +0 -0
  327. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  328. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  329. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/linker.py +0 -0
  330. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/jax/ops.py +0 -0
  331. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/__init__.py +0 -0
  332. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/__init__.py +0 -0
  333. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/basic.py +0 -0
  334. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/blas.py +0 -0
  335. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
  336. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/einsum.py +0 -0
  337. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
  338. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
  339. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/linalg/decomposition.py +0 -0
  340. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/linalg/inverse.py +0 -0
  341. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
  342. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/linalg/solvers.py +0 -0
  343. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/linalg/summary.py +0 -0
  344. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/math.py +0 -0
  345. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/pad.py +0 -0
  346. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/scalar.py +0 -0
  347. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/shape.py +0 -0
  348. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  349. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  350. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/sort.py +0 -0
  351. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
  352. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/dispatch/tensor_basic.py +0 -0
  353. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/mlx/linker.py +0 -0
  354. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/__init__.py +0 -0
  355. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/cache.py +0 -0
  356. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/__init__.py +0 -0
  357. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/basic.py +0 -0
  358. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  359. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  360. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
  361. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  362. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
  363. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  364. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  365. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
  366. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
  367. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
  368. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  369. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -0
  370. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
  371. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
  372. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
  373. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
  374. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
  375. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
  376. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
  377. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
  378. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
  379. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
  380. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
  381. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
  382. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
  383. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
  384. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
  385. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
  386. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  387. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/random.py +0 -0
  388. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/scalar.py +0 -0
  389. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/scan.py +0 -0
  390. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/shape.py +0 -0
  391. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  392. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  393. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/sort.py +0 -0
  394. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
  395. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
  396. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
  397. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
  398. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
  399. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  400. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  401. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/typed_list.py +0 -0
  402. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  403. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/numba/linker.py +0 -0
  404. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  405. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  406. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  407. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  408. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  409. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
  410. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
  411. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
  412. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
  413. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
  414. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/math.py +0 -0
  415. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  416. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  417. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  418. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  419. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/pytorch/linker.py +0 -0
  420. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/utils.py +0 -0
  421. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/link/vm.py +0 -0
  422. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/misc/__init__.py +0 -0
  423. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/misc/check_blas.py +0 -0
  424. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/misc/check_blas_many.sh +0 -0
  425. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/misc/check_duplicate_key.py +0 -0
  426. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  427. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/misc/elemwise_time_test.py +0 -0
  428. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/misc/frozendict.py +0 -0
  429. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/misc/may_share_memory.py +0 -0
  430. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/misc/ordered_set.py +0 -0
  431. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/misc/pkl_utils.py +0 -0
  432. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/npy_2_compat.py +0 -0
  433. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/py.typed +0 -0
  434. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/raise_op.py +0 -0
  435. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scalar/__init__.py +0 -0
  436. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scalar/basic.py +0 -0
  437. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  438. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  439. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scalar/c_code/gamma.c +0 -0
  440. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scalar/c_code/incbet.c +0 -0
  441. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scalar/loop.py +0 -0
  442. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scalar/sharedvar.py +0 -0
  443. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scan/__init__.py +0 -0
  444. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scan/basic.py +0 -0
  445. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scan/checkpoints.py +0 -0
  446. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scan/op.py +0 -0
  447. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scan/rewriting.py +0 -0
  448. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scan/scan_perform.pyx +0 -0
  449. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scan/scan_perform_ext.py +0 -0
  450. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scan/utils.py +0 -0
  451. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/scan/views.py +0 -0
  452. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/sparse/__init__.py +0 -0
  453. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/sparse/basic.py +0 -0
  454. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/sparse/linalg.py +0 -0
  455. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/sparse/math.py +0 -0
  456. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/sparse/rewriting.py +0 -0
  457. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/sparse/sharedvar.py +0 -0
  458. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/sparse/type.py +0 -0
  459. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/sparse/utils.py +0 -0
  460. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/sparse/variable.py +0 -0
  461. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/__init__.py +0 -0
  462. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/blas_c.py +0 -0
  463. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/blas_headers.py +0 -0
  464. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/blockwise.py +0 -0
  465. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  466. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  467. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  468. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/einsum.py +0 -0
  469. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/elemwise.py +0 -0
  470. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/elemwise_cgen.py +0 -0
  471. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/exceptions.py +0 -0
  472. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/extra_ops.py +0 -0
  473. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/fft.py +0 -0
  474. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/fourier.py +0 -0
  475. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/functional.py +0 -0
  476. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/interpolate.py +0 -0
  477. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/__init__.py +0 -0
  478. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
  479. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
  480. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/dtype_utils.py +0 -0
  481. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/inverse.py +0 -0
  482. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
  483. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/solvers/core.py +0 -0
  484. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
  485. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/linalg/summary.py +0 -0
  486. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/math.py +0 -0
  487. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/nlinalg.py +0 -0
  488. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/optimize.py +0 -0
  489. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/pad.py +0 -0
  490. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/random/__init__.py +0 -0
  491. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/random/op.py +0 -0
  492. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  493. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/random/rewriting/basic.py +0 -0
  494. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/random/rewriting/jax.py +0 -0
  495. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/random/rewriting/numba.py +0 -0
  496. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/random/type.py +0 -0
  497. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/random/utils.py +0 -0
  498. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/random/variable.py +0 -0
  499. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/reshape.py +0 -0
  500. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/__init__.py +0 -0
  501. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/blas.py +0 -0
  502. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/blas_c.py +0 -0
  503. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/blockwise.py +0 -0
  504. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/einsum.py +0 -0
  505. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  506. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/jax.py +0 -0
  507. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
  508. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
  509. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
  510. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/linalg/products.py +0 -0
  511. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/linalg/summary.py +0 -0
  512. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
  513. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/numba.py +0 -0
  514. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/optimize.py +0 -0
  515. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/reshape.py +0 -0
  516. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/shape.py +0 -0
  517. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/subtensor.py +0 -0
  518. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  519. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/shape.py +0 -0
  520. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/sharedvar.py +0 -0
  521. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/signal/__init__.py +0 -0
  522. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/slinalg.py +0 -0
  523. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/sort.py +0 -0
  524. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/subtensor.py +0 -0
  525. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/type.py +0 -0
  526. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/type_other.py +0 -0
  527. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/utils.py +0 -0
  528. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/var.py +0 -0
  529. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/tensor/variable.py +0 -0
  530. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/typed_list/__init__.py +0 -0
  531. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/typed_list/basic.py +0 -0
  532. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/typed_list/rewriting.py +0 -0
  533. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/typed_list/type.py +0 -0
  534. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/__init__.py +0 -0
  535. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/basic.py +0 -0
  536. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/indexing.py +0 -0
  537. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/linalg.py +0 -0
  538. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/math.py +0 -0
  539. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/random/__init__.py +0 -0
  540. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/random/basic.py +0 -0
  541. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/random/type.py +0 -0
  542. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/random/variable.py +0 -0
  543. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/reduction.py +0 -0
  544. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/rewriting/__init__.py +0 -0
  545. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/rewriting/basic.py +0 -0
  546. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/rewriting/indexing.py +0 -0
  547. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/rewriting/math.py +0 -0
  548. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/rewriting/reduction.py +0 -0
  549. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/rewriting/shape.py +0 -0
  550. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/rewriting/utils.py +0 -0
  551. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  552. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/shape.py +0 -0
  553. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/signal.py +0 -0
  554. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/type.py +0 -0
  555. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor/xtensor/vectorization.py +0 -0
  556. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor.egg-info/dependency_links.txt +0 -0
  557. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor.egg-info/entry_points.txt +0 -0
  558. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor.egg-info/requires.txt +0 -0
  559. {pytensor-3.0.0 → pytensor-3.0.1}/pytensor.egg-info/top_level.txt +0 -0
  560. {pytensor-3.0.0 → pytensor-3.0.1}/scripts/mypy-failing.txt +0 -0
  561. {pytensor-3.0.0 → pytensor-3.0.1}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  562. {pytensor-3.0.0 → pytensor-3.0.1}/setup.cfg +0 -0
  563. {pytensor-3.0.0 → pytensor-3.0.1}/setup.py +0 -0
  564. {pytensor-3.0.0 → pytensor-3.0.1}/tests/link/c/c_code/test_cenum.h +0 -0
  565. {pytensor-3.0.0 → pytensor-3.0.1}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  566. {pytensor-3.0.0 → pytensor-3.0.1}/tests/test_breakpoint.py +0 -0
  567. {pytensor-3.0.0 → pytensor-3.0.1}/tests/test_config.py +0 -0
  568. {pytensor-3.0.0 → pytensor-3.0.1}/tests/test_gradient.py +0 -0
  569. {pytensor-3.0.0 → pytensor-3.0.1}/tests/test_ifelse.py +0 -0
  570. {pytensor-3.0.0 → pytensor-3.0.1}/tests/test_printing.py +0 -0
  571. {pytensor-3.0.0 → pytensor-3.0.1}/tests/test_raise_op.py +0 -0
  572. {pytensor-3.0.0 → pytensor-3.0.1}/tests/test_rop.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 3.0.0
3
+ Version: 3.0.1
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
@@ -1,3 +1,6 @@
1
+ import sys
2
+
3
+
1
4
  __docformat__ = "restructuredtext en"
2
5
 
3
6
 
@@ -14,7 +17,6 @@ from pytensor.configdefaults import config
14
17
 
15
18
  # isort: off
16
19
  from pytensor import tensor
17
- from pytensor import sparse
18
20
  from pytensor.compile import (
19
21
  In,
20
22
  Mode,
@@ -32,9 +34,24 @@ from pytensor.scan.basic import scan
32
34
  from pytensor.scan.views import map
33
35
  from pytensor.compile.builders import OpFromGraph
34
36
  from pytensor.link.jax.ops import wrap_jax
37
+ from pytensor import _sparse_lazy
35
38
  # isort: on
36
39
 
37
40
 
41
+ def __getattr__(name):
42
+ if name == "sparse":
43
+ # During pytensor.sparse's own import, submodules may do
44
+ # `import pytensor.sparse.X as Y` which probes pytensor.sparse via
45
+ # getattr before the parent attribute has been set. Return the
46
+ # partially-loaded module from sys.modules to avoid re-entry.
47
+ if "pytensor.sparse" in sys.modules:
48
+ return sys.modules["pytensor.sparse"]
49
+ import pytensor.sparse as sparse
50
+
51
+ return sparse
52
+ raise AttributeError(f"module 'pytensor' has no attribute {name!r}")
53
+
54
+
38
55
  # Some config variables are registered by submodules. Only after all those
39
56
  # imports were executed, we can warn about remaining flags provided by the user
40
57
  # through PYTENSOR_FLAGS.
@@ -0,0 +1,31 @@
1
+ """Lazy registration of scipy.sparse handlers on pytensor's dispatchers.
2
+
3
+ Imported by `pytensor/__init__.py` so `pytensor.sparse` doesn't have to be
4
+ loaded eagerly at startup. The fallbacks match `type(x).__module__` against
5
+ `scipy.sparse` as a string, so this module itself doesn't import scipy.sparse;
6
+ the real handlers (and their scipy.sparse dependency) are pulled in only when
7
+ an actual scipy.sparse value is passed to `as_symbolic` / `shared`.
8
+ """
9
+
10
+ from pytensor.basic import _as_symbolic
11
+ from pytensor.compile.sharedvalue import shared_constructor
12
+
13
+
14
+ def _lazy_as_symbolic_sparse(x):
15
+ if type(x).__module__.startswith("scipy.sparse"):
16
+ from pytensor.sparse.basic import as_symbolic_sparse
17
+
18
+ return as_symbolic_sparse
19
+ return None
20
+
21
+
22
+ def _lazy_shared_sparse(x):
23
+ if type(x).__module__.startswith("scipy.sparse"):
24
+ from pytensor.sparse.sharedvar import sparse_constructor
25
+
26
+ return sparse_constructor
27
+ return None
28
+
29
+
30
+ _as_symbolic.register_lazy(_lazy_as_symbolic_sparse) # type: ignore[attr-defined]
31
+ shared_constructor.register_lazy(_lazy_shared_sparse) # type: ignore[attr-defined]
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2026-05-01T19:05:54+0200",
11
+ "date": "2026-05-07T19:28:03+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "b3cfb34cb33c8e2283952f430fa657f2326c3328",
15
- "version": "3.0.0"
14
+ "full-revisionid": "10852419d00cf04f0c89c034f04ddfa9e5067e63",
15
+ "version": "3.0.1"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -2,6 +2,7 @@ from functools import singledispatch
2
2
  from typing import Any
3
3
 
4
4
  from pytensor.graph import Variable
5
+ from pytensor.utils import add_lazy_dispatcher
5
6
 
6
7
 
7
8
  def as_symbolic(x: Any, name: str | None = None, **kwargs) -> Variable:
@@ -40,3 +41,6 @@ def _as_symbolic(x: Any, **kwargs) -> Variable:
40
41
  from pytensor.tensor import as_tensor_variable
41
42
 
42
43
  return as_tensor_variable(x, **kwargs)
44
+
45
+
46
+ add_lazy_dispatcher(_as_symbolic)
@@ -11,6 +11,7 @@ from itertools import chain
11
11
  from typing import cast
12
12
 
13
13
  from pytensor.compile.maker import function
14
+ from pytensor.compile.mode import get_mode
14
15
  from pytensor.compile.rebuild import rebuild_collect_shared
15
16
  from pytensor.compile.sharedvalue import SharedVariable
16
17
  from pytensor.gradient import DisconnectedType, disconnected_type, grad, pushforward
@@ -917,7 +918,9 @@ class OpFromGraph(Op, HasInnerGraph):
917
918
  if getattr(self, "_fn", None) is not None:
918
919
  return self._fn
919
920
 
920
- self._fn = function(self.inner_inputs, self.inner_outputs, **self.kwargs)
921
+ kwargs = self.kwargs.copy()
922
+ mode = get_mode(kwargs.pop("mode", None)).excluding("symbolic_op_recognition")
923
+ self._fn = function(self.inner_inputs, self.inner_outputs, mode=mode, **kwargs)
921
924
  self._fn.trust_input = True
922
925
 
923
926
  return self._fn
@@ -940,3 +943,64 @@ class OpFromGraph(Op, HasInnerGraph):
940
943
  # zip strict not specified because we are in a hot loop
941
944
  for output, variable in zip(outputs, variables):
942
945
  output[0] = variable
946
+
947
+
948
+ class SymbolicOp(OpFromGraph):
949
+ r"""OpFromGraph subclass that builds the inner graph from input types.
950
+
951
+ Subclasses define the forward graph via :meth:`build_inner_graph` and
952
+ optionally override :meth:`pullback` / :meth:`pushforward`.
953
+
954
+ Override :meth:`filter_inputs` to coerce raw arguments (e.g. Python
955
+ scalars) into typed Variables at call sites.
956
+
957
+ Set the class attribute ``inline`` to control whether the inner graph is
958
+ inlined during compilation (default ``False``).
959
+ """
960
+
961
+ inline: bool = False
962
+
963
+ def __init_subclass__(cls, **kwargs):
964
+ super().__init_subclass__(**kwargs)
965
+ if "__props__" in cls.__dict__:
966
+ # MetaType installs props-only __hash__ and __eq__ which ignores the inner graph
967
+ # override with fgraph-aware version
968
+ cls.__hash__ = OpFromGraph.__hash__
969
+ cls.__eq__ = OpFromGraph.__eq__
970
+
971
+ @staticmethod
972
+ def filter_inputs(*inputs):
973
+ return inputs
974
+
975
+ def build_inner_graph(self, *inputs) -> list[Variable]:
976
+ raise NotImplementedError
977
+
978
+ def __init__(self, input_types=None, **kwargs):
979
+ """Construct op for the given input Types.
980
+
981
+ When input_types is None, construction is deferred until the first
982
+ __call__, which inspects the actual input types and builds the graph.
983
+ """
984
+ for prop in getattr(type(self), "__props__", ()):
985
+ if prop in kwargs:
986
+ setattr(self, prop, kwargs.pop(prop))
987
+ self._init_kwargs = kwargs
988
+ if input_types is not None:
989
+ kwargs.setdefault("inline", type(self).inline)
990
+ kwargs.setdefault("strict", True)
991
+ dummy_inputs = [t() for t in input_types]
992
+ outputs = self.build_inner_graph(*dummy_inputs)
993
+ super().__init__(dummy_inputs, outputs, **kwargs)
994
+
995
+ def __call__(self, *inputs, **kwargs):
996
+ inputs = self.filter_inputs(*inputs)
997
+ input_types = tuple(inp.type for inp in inputs)
998
+
999
+ if hasattr(self, "fgraph") and input_types == tuple(self.input_types):
1000
+ return super().__call__(*inputs, **kwargs)
1001
+
1002
+ init_kwargs = dict(self._init_kwargs)
1003
+ for prop in getattr(type(self), "__props__", ()):
1004
+ init_kwargs[prop] = getattr(self, prop)
1005
+ op = type(self)(input_types=list(input_types), **init_kwargs)
1006
+ return super(SymbolicOp, op).__call__(*inputs, **kwargs)
@@ -10,6 +10,7 @@ from pytensor.graph.basic import Variable
10
10
  from pytensor.graph.utils import add_tag_trace
11
11
  from pytensor.link.basic import Container
12
12
  from pytensor.link.c.type import generic
13
+ from pytensor.utils import add_lazy_dispatcher
13
14
 
14
15
 
15
16
  if TYPE_CHECKING:
@@ -223,3 +224,6 @@ def shared_constructor(value, name=None, strict=False, allow_downcast=None, **kw
223
224
  allow_downcast=allow_downcast,
224
225
  name=name,
225
226
  )
227
+
228
+
229
+ add_lazy_dispatcher(shared_constructor)
@@ -510,8 +510,8 @@ class FullHistory(Feature):
510
510
  from pytensor.graph.features import FullHistory
511
511
  from pytensor.graph.rewriting.utils import rewrite_graph
512
512
 
513
- x = pt.scalar("x")
514
- out = pt.log(pt.exp(x) / pt.sum(pt.exp(x)))
513
+ x = pt.vector("x")
514
+ out = pt.log(pt.exp(x) / pt.sum(pt.exp(x), keepdims=True))
515
515
 
516
516
  fg = FunctionGraph(outputs=[out])
517
517
  history = FullHistory()
@@ -528,22 +528,24 @@ class FullHistory(Feature):
528
528
  pytensor.dprint(history.next())
529
529
 
530
530
  .. testoutput::
531
- Log [id A] 4
532
- └─ True_div [id B] 3
533
- ├─ Exp [id C] 2
531
+ Log [id A] 5
532
+ └─ True_div [id B] 4
533
+ ├─ Exp [id C] 3
534
534
  │ └─ x [id D]
535
- └─ Sum{axes=None} [id E] 1
536
- └─ Exp [id F] 0
537
- └─ x [id D]
535
+ └─ ExpandDims{axis=0} [id E] 2
536
+ └─ Sum{axes=None} [id F] 1
537
+ └─ Exp [id G] 0
538
+ └─ x [id D]
538
539
  >> MergeOptimizer
539
- Log [id A] 3
540
- └─ True_div [id B] 2
540
+ Log [id A] 4
541
+ └─ True_div [id B] 3
541
542
  ├─ Exp [id C] 0
542
543
  │ └─ x [id D]
543
- └─ Sum{axes=None} [id E] 1
544
- └─ Exp [id C] 0
545
- └─ ···
546
- >> local_mul_canonizer
544
+ └─ ExpandDims{axis=0} [id E] 2
545
+ └─ Sum{axes=None} [id F] 1
546
+ └─ Exp [id C] 0
547
+ └─ ···
548
+ >> local_softmax_stabilize
547
549
  Log [id A] 1
548
550
  └─ Softmax{axis=None} [id B] 0
549
551
  └─ x [id C]
@@ -564,22 +566,24 @@ class FullHistory(Feature):
564
566
  Log [id A] 1
565
567
  └─ Softmax{axis=None} [id B] 0
566
568
  └─ x [id C]
567
- >> local_mul_canonizer
568
- Log [id A] 3
569
- └─ True_div [id B] 2
569
+ >> local_softmax_stabilize
570
+ Log [id A] 4
571
+ └─ True_div [id B] 3
570
572
  ├─ Exp [id C] 0
571
573
  │ └─ x [id D]
572
- └─ Sum{axes=None} [id E] 1
573
- └─ Exp [id C] 0
574
- └─ ···
574
+ └─ ExpandDims{axis=0} [id E] 2
575
+ └─ Sum{axes=None} [id F] 1
576
+ └─ Exp [id C] 0
577
+ └─ ···
575
578
  >> MergeOptimizer
576
- Log [id A] 4
577
- └─ True_div [id B] 3
578
- ├─ Exp [id C] 2
579
+ Log [id A] 5
580
+ └─ True_div [id B] 4
581
+ ├─ Exp [id C] 3
579
582
  │ └─ x [id D]
580
- └─ Sum{axes=None} [id E] 1
581
- └─ Exp [id F] 0
582
- └─ x [id D]
583
+ └─ ExpandDims{axis=0} [id E] 2
584
+ └─ Sum{axes=None} [id F] 1
585
+ └─ Exp [id G] 0
586
+ └─ x [id D]
583
587
 
584
588
 
585
589
  .. testcode::
@@ -3,7 +3,7 @@ import jax.numpy as jnp
3
3
 
4
4
  from pytensor.link.jax.dispatch.basic import jax_funcify
5
5
  from pytensor.tensor.elemwise import CAReduce, DimShuffle, Elemwise
6
- from pytensor.tensor.special import LogSoftmax, Softmax, SoftmaxGrad
6
+ from pytensor.tensor.special import LogSoftmax, Softmax
7
7
 
8
8
 
9
9
  @jax_funcify.register(Elemwise)
@@ -94,17 +94,6 @@ def jax_funcify_Softmax(op, **kwargs):
94
94
  return softmax
95
95
 
96
96
 
97
- @jax_funcify.register(SoftmaxGrad)
98
- def jax_funcify_SoftmaxGrad(op, **kwargs):
99
- axis = op.axis
100
-
101
- def softmax_grad(dy, sm):
102
- dy_times_sm = dy * sm
103
- return dy_times_sm - jnp.sum(dy_times_sm, axis=axis, keepdims=True) * sm
104
-
105
- return softmax_grad
106
-
107
-
108
97
  @jax_funcify.register(LogSoftmax)
109
98
  def jax_funcify_LogSoftmax(op, **kwargs):
110
99
  axis = op.axis
@@ -82,8 +82,22 @@ def jax_funcify_ChoSolve(op, **kwargs):
82
82
 
83
83
 
84
84
  @jax_funcify.register(SolveSylvester)
85
- def jax_funcify_SolveSylsterer(op, **kwargs):
85
+ def jax_funcify_SolveSylvester(op, **kwargs):
86
+ @jax.custom_vjp
86
87
  def solve_sylvester(a, b, c):
87
88
  return jax.scipy.linalg.solve_sylvester(a, b, c)
88
89
 
90
+ def _fwd(a, b, c):
91
+ x = jax.scipy.linalg.solve_sylvester(a, b, c)
92
+ return x, (a, b, x)
93
+
94
+ def _bwd(res, dx):
95
+ a, b, x = res
96
+ dc = jax.scipy.linalg.solve_sylvester(a.conj().T, b.conj().T, dx)
97
+ da = -dc @ x.conj().T
98
+ db = -x.conj().T @ dc
99
+ return da, db, dc
100
+
101
+ solve_sylvester.defvjp(_fwd, _bwd)
102
+
89
103
  return solve_sylvester
@@ -14,7 +14,7 @@ from pytensor.scalar.basic import (
14
14
  Mul,
15
15
  )
16
16
  from pytensor.tensor.elemwise import CAReduce, DimShuffle, Elemwise
17
- from pytensor.tensor.special import LogSoftmax, Softmax, SoftmaxGrad
17
+ from pytensor.tensor.special import LogSoftmax, Softmax
18
18
 
19
19
 
20
20
  @mlx_funcify.register(DimShuffle)
@@ -105,17 +105,6 @@ def mlx_funcify_Softmax(op, **kwargs):
105
105
  return softmax
106
106
 
107
107
 
108
- @mlx_funcify.register(SoftmaxGrad)
109
- def mlx_funcify_SoftmaxGrad(op, **kwargs):
110
- axis = op.axis
111
-
112
- def softmax_grad(dy, sm):
113
- dy_times_sm = dy * sm
114
- return dy_times_sm - mx.sum(dy_times_sm, axis=axis, keepdims=True) * sm
115
-
116
- return softmax_grad
117
-
118
-
119
108
  @mlx_funcify.register(LogSoftmax)
120
109
  def mlx_funcify_LogSoftmax(op, **kwargs):
121
110
  axis = op.axis
@@ -50,7 +50,9 @@ def numba_deepcopy_tensor(x):
50
50
 
51
51
 
52
52
  @register_funcify_and_cache_key(OpFromGraph)
53
- def numba_funcify_OpFromGraph(op, node=None, **kwargs):
53
+ def numba_funcify_OpFromGraph(
54
+ op, node=None, mode=NUMBA.excluding("symbolic_op_recognition"), **kwargs
55
+ ):
54
56
  _ = kwargs.pop("storage_map", None)
55
57
 
56
58
  # Apply inner rewrites
@@ -64,7 +66,7 @@ def numba_funcify_OpFromGraph(op, node=None, **kwargs):
64
66
  input_specs=input_specs,
65
67
  accept_inplace=True,
66
68
  )
67
- NUMBA.optimizer(fgraph)
69
+ mode.optimizer(fgraph)
68
70
  output_specs = [Out(o, borrow=False) for o in fgraph.outputs]
69
71
  insert_deepcopy(fgraph, wrapped_inputs=input_specs, wrapped_outputs=output_specs)
70
72
  fgraph_fn, fgraph_cache_key = numba_funcify_and_cache_key(
@@ -27,6 +27,7 @@ _C_TO_NUMPY: dict[str, DTypeLike] = {
27
27
  "long double": np.longdouble,
28
28
  "float complex": np.csingle,
29
29
  "double complex": np.cdouble,
30
+ "Py_ssize_t": np.intp,
30
31
  }
31
32
 
32
33
 
@@ -83,8 +84,10 @@ class Signature:
83
84
  raw_args = groups["args"]
84
85
 
85
86
  decl_expr = re.compile(
86
- rb"\s*(?P<type>((long )|(unsigned )|(signed )|(double )|)"
87
- rb"((double)|(float)|(int)|(short)|(char)|(long)|(bool)|(complex)))"
87
+ rb"\s*(?P<type>"
88
+ rb"((long )|(unsigned )|(signed )|(double )|)"
89
+ rb"((double)|(float)|(int)|(short)|(char)|(long)|(bool)|(complex))"
90
+ rb"|Py_ssize_t)"
88
91
  rb"(\s(?P<name>[\w_]*))?\s*"
89
92
  )
90
93
 
@@ -36,13 +36,10 @@ from pytensor.scalar.basic import (
36
36
  Sub,
37
37
  TrueDiv,
38
38
  get_scalar_type,
39
- maximum,
40
39
  )
41
- from pytensor.scalar.basic import add as add_as
42
40
  from pytensor.tensor.blas import BatchedDot
43
41
  from pytensor.tensor.elemwise import CAReduce, DimShuffle, Elemwise
44
42
  from pytensor.tensor.math import Argmax, Dot, MulWithoutZeros, Sum
45
- from pytensor.tensor.special import LogSoftmax, Softmax, SoftmaxGrad
46
43
 
47
44
 
48
45
  @singledispatch
@@ -505,122 +502,6 @@ def numba_funcify_DimShuffle(op: DimShuffle, node, **kwargs):
505
502
  return dimshuffle, cache_version
506
503
 
507
504
 
508
- @register_funcify_default_op_cache_key(Softmax)
509
- def numba_funcify_Softmax(op, node, **kwargs):
510
- ndim = node.inputs[0].type.ndim
511
- inp_dtype = node.inputs[0].type.numpy_dtype
512
- axis = op.axis
513
-
514
- if ndim > 1 and axis is not None:
515
- reduce_max_py = create_multiaxis_reducer(
516
- maximum,
517
- identity=-np.inf,
518
- axes=(axis,),
519
- ndim=ndim,
520
- out_dtype=inp_dtype,
521
- keepdims=True,
522
- )
523
- reduce_sum_py = create_multiaxis_reducer(
524
- add_as,
525
- identity=0.0,
526
- axes=(axis,),
527
- ndim=ndim,
528
- out_dtype=inp_dtype,
529
- keepdims=True,
530
- )
531
-
532
- jit_fn = numba_basic.numba_njit(boundscheck=False)
533
- reduce_max = jit_fn(reduce_max_py)
534
- reduce_sum = jit_fn(reduce_sum_py)
535
- else:
536
- reduce_max = np.max
537
- reduce_sum = np.sum
538
-
539
- @numba_basic.numba_njit(boundscheck=False)
540
- def softmax(x):
541
- z = reduce_max(x)
542
- e_x = np.exp(x - z)
543
- w = reduce_sum(e_x)
544
- sm = e_x / w
545
- return sm
546
-
547
- cache_version = 1
548
- return softmax, cache_version
549
-
550
-
551
- @register_funcify_default_op_cache_key(SoftmaxGrad)
552
- def numba_funcify_SoftmaxGrad(op, node, **kwargs):
553
- ndim = node.inputs[0].type.ndim
554
- inp_dtype = node.inputs[0].type.numpy_dtype
555
-
556
- axis = op.axis
557
- if ndim > 1 and axis is not None:
558
- reduce_sum_py = create_multiaxis_reducer(
559
- add_as,
560
- identity=0.0,
561
- axes=(axis,),
562
- ndim=ndim,
563
- out_dtype=inp_dtype,
564
- keepdims=True,
565
- )
566
-
567
- jit_fn = numba_basic.numba_njit(boundscheck=False)
568
- reduce_sum = jit_fn(reduce_sum_py)
569
- else:
570
- reduce_sum = np.sum
571
-
572
- @numba_basic.numba_njit(boundscheck=False)
573
- def softmax_grad(dy, sm):
574
- dy_times_sm = dy * sm
575
- sum_dy_times_sm = reduce_sum(dy_times_sm)
576
- dx = dy_times_sm - sum_dy_times_sm * sm
577
- return dx
578
-
579
- cache_version = 1
580
- return softmax_grad, cache_version
581
-
582
-
583
- @register_funcify_default_op_cache_key(LogSoftmax)
584
- def numba_funcify_LogSoftmax(op, node, **kwargs):
585
- ndim = node.inputs[0].type.ndim
586
- inp_dtype = node.inputs[0].type.numpy_dtype
587
- axis = op.axis
588
-
589
- if ndim > 1 and axis is not None:
590
- reduce_max_py = create_multiaxis_reducer(
591
- maximum,
592
- identity=-np.inf,
593
- axes=(axis,),
594
- ndim=ndim,
595
- out_dtype=inp_dtype,
596
- keepdims=True,
597
- )
598
- reduce_sum_py = create_multiaxis_reducer(
599
- add_as,
600
- identity=0.0,
601
- axes=(axis,),
602
- ndim=ndim,
603
- out_dtype=inp_dtype,
604
- keepdims=True,
605
- )
606
-
607
- jit_fn = numba_basic.numba_njit(boundscheck=False)
608
- reduce_max = jit_fn(reduce_max_py)
609
- reduce_sum = jit_fn(reduce_sum_py)
610
- else:
611
- reduce_max = np.max
612
- reduce_sum = np.sum
613
-
614
- @numba_basic.numba_njit(boundscheck=False)
615
- def log_softmax(x):
616
- xdev = x - reduce_max(x)
617
- lsm = xdev - np.log(reduce_sum(np.exp(xdev)))
618
- return lsm
619
-
620
- cache_version = 1
621
- return log_softmax, cache_version
622
-
623
-
624
505
  @register_funcify_default_op_cache_key(Argmax)
625
506
  def numba_funcify_Argmax(op, node, **kwargs):
626
507
  axis = op.axis
@@ -6,7 +6,7 @@ from pytensor.link.pytorch.dispatch.basic import pytorch_funcify
6
6
  from pytensor.scalar import ScalarLoop
7
7
  from pytensor.tensor.elemwise import DimShuffle, Elemwise
8
8
  from pytensor.tensor.math import All, Any, Max, Min, Prod, Sum
9
- from pytensor.tensor.special import LogSoftmax, Softmax, SoftmaxGrad
9
+ from pytensor.tensor.special import LogSoftmax, Softmax
10
10
 
11
11
 
12
12
  @pytorch_funcify.register(Elemwise)
@@ -129,9 +129,34 @@ def pytorch_funcify_min(op, **kwargs):
129
129
  return torch_min
130
130
 
131
131
 
132
+ def _pytorch_softmax_dispatch(torch_fn, axis):
133
+ if axis is None:
134
+
135
+ def fn(x):
136
+ return torch_fn(x.ravel(), dim=0).reshape(x.shape)
137
+
138
+ elif len(axis) == 1:
139
+
140
+ def fn(x):
141
+ return torch_fn(x, dim=axis[0])
142
+
143
+ else:
144
+
145
+ def fn(x):
146
+ orig_shape = x.shape
147
+ x = torch.movedim(x, axis, tuple(range(-len(axis), 0)))
148
+ unflatten_shape = x.shape[: -len(axis)]
149
+ x = x.reshape(*unflatten_shape, -1)
150
+ x = torch_fn(x, dim=-1)
151
+ x = x.reshape(*unflatten_shape, *[orig_shape[a] for a in axis])
152
+ x = torch.movedim(x, tuple(range(-len(axis), 0)), axis)
153
+ return x
154
+
155
+ return fn
156
+
157
+
132
158
  @pytorch_funcify.register(Softmax)
133
159
  def pytorch_funcify_Softmax(op, **kwargs):
134
- axis = op.axis
135
160
  dtype = kwargs["node"].inputs[0].dtype
136
161
 
137
162
  if not dtype.startswith("float"):
@@ -139,18 +164,11 @@ def pytorch_funcify_Softmax(op, **kwargs):
139
164
  "Pytorch Softmax is not currently implemented for non-float types."
140
165
  )
141
166
 
142
- def softmax(x):
143
- if axis is not None:
144
- return torch.softmax(x, dim=axis)
145
- else:
146
- return torch.softmax(x.ravel(), dim=0).reshape(x.shape)
147
-
148
- return softmax
167
+ return _pytorch_softmax_dispatch(torch.softmax, op.axis)
149
168
 
150
169
 
151
170
  @pytorch_funcify.register(LogSoftmax)
152
171
  def pytorch_funcify_LogSoftmax(op, **kwargs):
153
- axis = op.axis
154
172
  dtype = kwargs["node"].inputs[0].dtype
155
173
 
156
174
  if not dtype.startswith("float"):
@@ -158,24 +176,7 @@ def pytorch_funcify_LogSoftmax(op, **kwargs):
158
176
  "Pytorch LogSoftmax is not currently implemented for non-float types."
159
177
  )
160
178
 
161
- def log_softmax(x):
162
- if axis is not None:
163
- return torch.log_softmax(x, dim=axis)
164
- else:
165
- return torch.log_softmax(x.ravel(), dim=0).reshape(x.shape)
166
-
167
- return log_softmax
168
-
169
-
170
- @pytorch_funcify.register(SoftmaxGrad)
171
- def jax_funcify_SoftmaxGrad(op, **kwargs):
172
- axis = op.axis
173
-
174
- def softmax_grad(dy, sm):
175
- dy_times_sm = dy * sm
176
- return dy_times_sm - torch.sum(dy_times_sm, dim=axis, keepdim=True) * sm
177
-
178
- return softmax_grad
179
+ return _pytorch_softmax_dispatch(torch.log_softmax, op.axis)
179
180
 
180
181
 
181
182
  def elemwise_ravel_fn(base_fn, op, node, **kwargs):