pytensor 2.36.0__tar.gz → 2.36.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. {pytensor-2.36.0/pytensor.egg-info → pytensor-2.36.2}/PKG-INFO +1 -1
  2. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/_version.py +3 -3
  3. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/builders.py +1 -1
  4. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/fg.py +6 -2
  5. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/cache.py +1 -1
  6. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/basic.py +1 -1
  7. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/compile_ops.py +26 -19
  8. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/random.py +30 -15
  9. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/subtensor.py +0 -1
  10. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/scalar.py +9 -0
  11. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/basic.py +2 -90
  12. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/loop.py +1 -1
  13. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/basic.py +17 -57
  14. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/op.py +1 -1
  15. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/math.py +21 -70
  16. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/__init__.py +7 -0
  17. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/optimize.py +1 -1
  18. pytensor-2.36.2/pytensor/tensor/reshape.py +524 -0
  19. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/__init__.py +1 -0
  20. pytensor-2.36.2/pytensor/tensor/rewriting/reshape.py +49 -0
  21. {pytensor-2.36.0 → pytensor-2.36.2/pytensor.egg-info}/PKG-INFO +1 -1
  22. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor.egg-info/SOURCES.txt +2 -0
  23. {pytensor-2.36.0 → pytensor-2.36.2}/LICENSE.txt +0 -0
  24. {pytensor-2.36.0 → pytensor-2.36.2}/MANIFEST.in +0 -0
  25. {pytensor-2.36.0 → pytensor-2.36.2}/README.rst +0 -0
  26. {pytensor-2.36.0 → pytensor-2.36.2}/doc/.templates/PLACEHOLDER +0 -0
  27. {pytensor-2.36.0 → pytensor-2.36.2}/doc/.templates/layout.html +0 -0
  28. {pytensor-2.36.0 → pytensor-2.36.2}/doc/.templates/nb-badges.html +0 -0
  29. {pytensor-2.36.0 → pytensor-2.36.2}/doc/.templates/rendered_citation.html +0 -0
  30. {pytensor-2.36.0 → pytensor-2.36.2}/doc/LICENSE.txt +0 -0
  31. {pytensor-2.36.0 → pytensor-2.36.2}/doc/README.md +0 -0
  32. {pytensor-2.36.0 → pytensor-2.36.2}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  33. {pytensor-2.36.0 → pytensor-2.36.2}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  34. {pytensor-2.36.0 → pytensor-2.36.2}/doc/acknowledgement.rst +0 -0
  35. {pytensor-2.36.0 → pytensor-2.36.2}/doc/bcast.png +0 -0
  36. {pytensor-2.36.0 → pytensor-2.36.2}/doc/bcast.svg +0 -0
  37. {pytensor-2.36.0 → pytensor-2.36.2}/doc/blog.md +0 -0
  38. {pytensor-2.36.0 → pytensor-2.36.2}/doc/conf.py +0 -0
  39. {pytensor-2.36.0 → pytensor-2.36.2}/doc/core_development_guide.rst +0 -0
  40. {pytensor-2.36.0 → pytensor-2.36.2}/doc/css.inc +0 -0
  41. {pytensor-2.36.0 → pytensor-2.36.2}/doc/dev_start_guide.rst +0 -0
  42. {pytensor-2.36.0 → pytensor-2.36.2}/doc/environment.yml +0 -0
  43. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/apply.png +0 -0
  44. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/apply.svg +0 -0
  45. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/apply2.svg +0 -0
  46. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/creating_a_c_op.rst +0 -0
  47. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  48. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/creating_an_op.rst +0 -0
  49. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/ctype.rst +0 -0
  50. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/extending_faq.rst +0 -0
  51. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/extending_pytensor_solution_1.py +0 -0
  52. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/graph_rewriting.rst +0 -0
  53. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/graphstructures.rst +0 -0
  54. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/index.rst +0 -0
  55. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/inplace.rst +0 -0
  56. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/op.rst +0 -0
  57. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/other_ops.rst +0 -0
  58. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  59. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  60. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/pipeline.rst +0 -0
  61. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/scan.rst +0 -0
  62. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/tips.rst +0 -0
  63. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/type.rst +0 -0
  64. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/unittest.rst +0 -0
  65. {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/using_params.rst +0 -0
  66. {pytensor-2.36.0 → pytensor-2.36.2}/doc/faq.rst +0 -0
  67. {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  68. {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
  69. {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
  70. {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/optimize/root.ipynb +0 -0
  71. {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/page_footer.md +0 -0
  72. {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  73. {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  74. {pytensor-2.36.0 → pytensor-2.36.2}/doc/generate_dtype_tensor_table.py +0 -0
  75. {pytensor-2.36.0 → pytensor-2.36.2}/doc/glossary.rst +0 -0
  76. {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/Elman_srnn.png +0 -0
  77. {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/PyTensor.png +0 -0
  78. {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/PyTensor_RGB.svg +0 -0
  79. {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/PyTensor_logo.png +0 -0
  80. {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/binder.svg +0 -0
  81. {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/blocksparse.png +0 -0
  82. {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/colab.svg +0 -0
  83. {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/github.svg +0 -0
  84. {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/lstm.png +0 -0
  85. {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/lstm_memorycell.png +0 -0
  86. {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/talk2010.gif +0 -0
  87. {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/talk2010.png +0 -0
  88. {pytensor-2.36.0 → pytensor-2.36.2}/doc/index.rst +0 -0
  89. {pytensor-2.36.0 → pytensor-2.36.2}/doc/install.rst +0 -0
  90. {pytensor-2.36.0 → pytensor-2.36.2}/doc/internal/how_to_release.rst +0 -0
  91. {pytensor-2.36.0 → pytensor-2.36.2}/doc/internal/index.rst +0 -0
  92. {pytensor-2.36.0 → pytensor-2.36.2}/doc/internal/metadocumentation.rst +0 -0
  93. {pytensor-2.36.0 → pytensor-2.36.2}/doc/introduction.rst +0 -0
  94. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/debugmode.rst +0 -0
  95. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/function.rst +0 -0
  96. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/index.rst +0 -0
  97. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/io.rst +0 -0
  98. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/mode.rst +0 -0
  99. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/nanguardmode.rst +0 -0
  100. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/opfromgraph.rst +0 -0
  101. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/ops.rst +0 -0
  102. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/profilemode.rst +0 -0
  103. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/shared.rst +0 -0
  104. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/config.rst +0 -0
  105. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  106. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  107. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  108. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  109. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  110. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  111. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  112. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/mlp.html +0 -0
  113. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/mlp.png +0 -0
  114. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/mlp2.html +0 -0
  115. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  116. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/mlp2.png +0 -0
  117. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/ofg.html +0 -0
  118. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/ofg2.html +0 -0
  119. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/index.ipynb +0 -0
  120. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/index.rst +0 -0
  121. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  122. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  123. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  124. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  125. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/features.rst +0 -0
  126. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/fgraph.rst +0 -0
  127. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/graph.rst +0 -0
  128. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/index.rst +0 -0
  129. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/op.rst +0 -0
  130. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/replace.rst +0 -0
  131. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/type.rst +0 -0
  132. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/utils.rst +0 -0
  133. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/index.rst +0 -0
  134. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/misc/pkl_utils.rst +0 -0
  135. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/printing.rst +0 -0
  136. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/scalar/index.rst +0 -0
  137. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/scan.rst +0 -0
  138. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/sparse/index.rst +0 -0
  139. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/sparse/sandbox.rst +0 -0
  140. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/basic.rst +0 -0
  141. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/basic_opt.rst +0 -0
  142. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/bcast.png +0 -0
  143. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/bcast.svg +0 -0
  144. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/conv.rst +0 -0
  145. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/elemwise.rst +0 -0
  146. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/extra_ops.rst +0 -0
  147. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/fft.rst +0 -0
  148. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/functional.rst +0 -0
  149. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/index.rst +0 -0
  150. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/io.rst +0 -0
  151. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/math_opt.rst +0 -0
  152. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/nlinalg.rst +0 -0
  153. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/optimize.rst +0 -0
  154. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/plot_fft.png +0 -0
  155. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/random/distributions.rst +0 -0
  156. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/random/index.rst +0 -0
  157. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/slinalg.rst +0 -0
  158. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/utils.rst +0 -0
  159. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/typed_list.rst +0 -0
  160. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/xtensor/index.md +0 -0
  161. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/xtensor/linalg.md +0 -0
  162. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/xtensor/math.md +0 -0
  163. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/xtensor/module_functions.md +0 -0
  164. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/xtensor/random.md +0 -0
  165. {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/xtensor/type.md +0 -0
  166. {pytensor-2.36.0 → pytensor-2.36.2}/doc/links.rst +0 -0
  167. {pytensor-2.36.0 → pytensor-2.36.2}/doc/optimizations.rst +0 -0
  168. {pytensor-2.36.0 → pytensor-2.36.2}/doc/pylintrc +0 -0
  169. {pytensor-2.36.0 → pytensor-2.36.2}/doc/robots.txt +0 -0
  170. {pytensor-2.36.0 → pytensor-2.36.2}/doc/troubleshooting.rst +0 -0
  171. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/adding.rst +0 -0
  172. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/adding_solution_1.py +0 -0
  173. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/aliasing.rst +0 -0
  174. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/apply.png +0 -0
  175. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/apply.svg +0 -0
  176. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/bcast.png +0 -0
  177. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/broadcasting.rst +0 -0
  178. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/conditions.rst +0 -0
  179. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/debug_faq.rst +0 -0
  180. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/dlogistic.png +0 -0
  181. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/examples.rst +0 -0
  182. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/faq_tutorial.rst +0 -0
  183. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/gradients.rst +0 -0
  184. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/index.rst +0 -0
  185. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/loading_and_saving.rst +0 -0
  186. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/logistic.gp +0 -0
  187. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/logistic.png +0 -0
  188. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/loop.rst +0 -0
  189. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/loop_solution_1.py +0 -0
  190. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/modes.rst +0 -0
  191. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/modes_solution_1.py +0 -0
  192. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/multi_cores.rst +0 -0
  193. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/nan_tutorial.rst +0 -0
  194. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/pics/d3viz.png +0 -0
  195. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  196. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  197. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  198. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/printing_drawing.rst +0 -0
  199. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/prng.rst +0 -0
  200. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/profiling.rst +0 -0
  201. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/profiling_example.py +0 -0
  202. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/profiling_example_out.prof +0 -0
  203. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/shape_info.rst +0 -0
  204. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/sparse.rst +0 -0
  205. {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/symbolic_graphs.rst +0 -0
  206. {pytensor-2.36.0 → pytensor-2.36.2}/doc/user_guide.rst +0 -0
  207. {pytensor-2.36.0 → pytensor-2.36.2}/pyproject.toml +0 -0
  208. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/__init__.py +0 -0
  209. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/bin/__init__.py +0 -0
  210. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/bin/pytensor_cache.py +0 -0
  211. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/breakpoint.py +0 -0
  212. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/__init__.py +0 -0
  213. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/compiledir.py +0 -0
  214. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/compilelock.py +0 -0
  215. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/debugmode.py +0 -0
  216. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/function/__init__.py +0 -0
  217. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/function/pfunc.py +0 -0
  218. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/function/types.py +0 -0
  219. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/io.py +0 -0
  220. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/mode.py +0 -0
  221. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/monitormode.py +0 -0
  222. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/nanguardmode.py +0 -0
  223. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/ops.py +0 -0
  224. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/profiling.py +0 -0
  225. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/sharedvalue.py +0 -0
  226. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/configdefaults.py +0 -0
  227. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/configparser.py +0 -0
  228. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/__init__.py +0 -0
  229. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  230. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/css/d3viz.css +0 -0
  231. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/d3viz.py +0 -0
  232. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/formatting.py +0 -0
  233. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/html/template.html +0 -0
  234. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  235. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  236. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/js/d3viz.js +0 -0
  237. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  238. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  239. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/gradient.py +0 -0
  240. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/__init__.py +0 -0
  241. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/basic.py +0 -0
  242. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/destroyhandler.py +0 -0
  243. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/features.py +0 -0
  244. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/null_type.py +0 -0
  245. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/op.py +0 -0
  246. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/replace.py +0 -0
  247. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/rewriting/__init__.py +0 -0
  248. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/rewriting/basic.py +0 -0
  249. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/rewriting/db.py +0 -0
  250. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/rewriting/kanren.py +0 -0
  251. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/rewriting/unify.py +0 -0
  252. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/rewriting/utils.py +0 -0
  253. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/traversal.py +0 -0
  254. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/type.py +0 -0
  255. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/utils.py +0 -0
  256. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/ifelse.py +0 -0
  257. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/ipython.py +0 -0
  258. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/__init__.py +0 -0
  259. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/basic.py +0 -0
  260. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/__init__.py +0 -0
  261. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/basic.py +0 -0
  262. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  263. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  264. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/cmodule.py +0 -0
  265. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/cutils.py +0 -0
  266. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/cvm.py +0 -0
  267. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/exceptions.py +0 -0
  268. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/interface.py +0 -0
  269. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/lazylinker_c.py +0 -0
  270. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/op.py +0 -0
  271. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/params_type.py +0 -0
  272. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/type.py +0 -0
  273. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/__init__.py +0 -0
  274. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/__init__.py +0 -0
  275. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/basic.py +0 -0
  276. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/blas.py +0 -0
  277. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  278. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/einsum.py +0 -0
  279. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  280. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  281. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/math.py +0 -0
  282. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  283. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/pad.py +0 -0
  284. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/random.py +0 -0
  285. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/scalar.py +0 -0
  286. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/scan.py +0 -0
  287. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/shape.py +0 -0
  288. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  289. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  290. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/slinalg.py +0 -0
  291. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/sort.py +0 -0
  292. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/sparse.py +0 -0
  293. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  294. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  295. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/linker.py +0 -0
  296. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/ops.py +0 -0
  297. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/__init__.py +0 -0
  298. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/__init__.py +0 -0
  299. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/basic.py +0 -0
  300. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
  301. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/core.py +0 -0
  302. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
  303. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
  304. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/math.py +0 -0
  305. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/nlinalg.py +0 -0
  306. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/shape.py +0 -0
  307. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  308. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  309. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/slinalg.py +0 -0
  310. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/sort.py +0 -0
  311. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
  312. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/linker.py +0 -0
  313. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/__init__.py +0 -0
  314. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/__init__.py +0 -0
  315. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  316. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  317. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/elemwise.py +0 -0
  318. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  319. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
  320. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  321. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  322. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  323. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
  324. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  325. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -0
  326. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
  327. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +0 -0
  328. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -0
  329. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +0 -0
  330. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -0
  331. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -0
  332. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +0 -0
  333. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +0 -0
  334. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +0 -0
  335. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
  336. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  337. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
  338. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/scalar.py +0 -0
  339. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/scan.py +0 -0
  340. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/shape.py +0 -0
  341. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  342. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  343. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/slinalg.py +0 -0
  344. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/sort.py +0 -0
  345. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/sparse.py +0 -0
  346. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  347. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/typed_list.py +0 -0
  348. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  349. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/linker.py +0 -0
  350. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  351. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  352. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  353. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  354. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  355. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  356. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/math.py +0 -0
  357. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
  358. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  359. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/slinalg.py +0 -0
  360. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  361. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  362. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/linker.py +0 -0
  363. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/utils.py +0 -0
  364. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/vm.py +0 -0
  365. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/__init__.py +0 -0
  366. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/check_blas.py +0 -0
  367. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/check_blas_many.sh +0 -0
  368. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/check_duplicate_key.py +0 -0
  369. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  370. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/elemwise_time_test.py +0 -0
  371. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/frozendict.py +0 -0
  372. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/may_share_memory.py +0 -0
  373. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/ordered_set.py +0 -0
  374. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/pkl_utils.py +0 -0
  375. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/npy_2_compat.py +0 -0
  376. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/printing.py +0 -0
  377. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/py.typed +0 -0
  378. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/raise_op.py +0 -0
  379. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/__init__.py +0 -0
  380. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  381. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  382. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/c_code/gamma.c +0 -0
  383. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/c_code/incbet.c +0 -0
  384. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/math.py +0 -0
  385. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/sharedvar.py +0 -0
  386. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/__init__.py +0 -0
  387. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/checkpoints.py +0 -0
  388. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/rewriting.py +0 -0
  389. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/scan_perform.pyx +0 -0
  390. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/scan_perform_ext.py +0 -0
  391. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/utils.py +0 -0
  392. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/views.py +0 -0
  393. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/__init__.py +0 -0
  394. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/basic.py +0 -0
  395. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/linalg.py +0 -0
  396. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/rewriting.py +0 -0
  397. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/sharedvar.py +0 -0
  398. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/type.py +0 -0
  399. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/utils.py +0 -0
  400. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/variable.py +0 -0
  401. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/_linalg/__init__.py +0 -0
  402. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
  403. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/_linalg/solve/rewriting.py +0 -0
  404. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/_linalg/solve/tridiagonal.py +0 -0
  405. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/basic.py +0 -0
  406. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/blas.py +0 -0
  407. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/blas_c.py +0 -0
  408. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/blas_headers.py +0 -0
  409. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/blockwise.py +0 -0
  410. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  411. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  412. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  413. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/conv/__init__.py +0 -0
  414. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/conv/abstract_conv.py +0 -0
  415. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/einsum.py +0 -0
  416. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/elemwise.py +0 -0
  417. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/elemwise_cgen.py +0 -0
  418. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/exceptions.py +0 -0
  419. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/extra_ops.py +0 -0
  420. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/fft.py +0 -0
  421. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/fourier.py +0 -0
  422. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/functional.py +0 -0
  423. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/interpolate.py +0 -0
  424. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/linalg.py +0 -0
  425. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/math.py +0 -0
  426. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/nlinalg.py +0 -0
  427. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/pad.py +0 -0
  428. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/__init__.py +0 -0
  429. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/basic.py +0 -0
  430. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/op.py +0 -0
  431. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  432. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/rewriting/basic.py +0 -0
  433. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/rewriting/jax.py +0 -0
  434. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/rewriting/numba.py +0 -0
  435. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/type.py +0 -0
  436. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/utils.py +0 -0
  437. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/var.py +0 -0
  438. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/basic.py +0 -0
  439. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/blas.py +0 -0
  440. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/blas_c.py +0 -0
  441. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/blockwise.py +0 -0
  442. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/einsum.py +0 -0
  443. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/elemwise.py +0 -0
  444. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  445. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/jax.py +0 -0
  446. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/linalg.py +0 -0
  447. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/math.py +0 -0
  448. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/numba.py +0 -0
  449. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/ofg.py +0 -0
  450. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/shape.py +0 -0
  451. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/special.py +0 -0
  452. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/subtensor.py +0 -0
  453. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
  454. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  455. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/shape.py +0 -0
  456. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/sharedvar.py +0 -0
  457. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/signal/__init__.py +0 -0
  458. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/signal/conv.py +0 -0
  459. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/slinalg.py +0 -0
  460. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/sort.py +0 -0
  461. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/special.py +0 -0
  462. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/subtensor.py +0 -0
  463. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/type.py +0 -0
  464. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/type_other.py +0 -0
  465. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/utils.py +0 -0
  466. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/var.py +0 -0
  467. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/variable.py +0 -0
  468. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/xlogx.py +0 -0
  469. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/typed_list/__init__.py +0 -0
  470. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/typed_list/basic.py +0 -0
  471. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/typed_list/rewriting.py +0 -0
  472. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/typed_list/type.py +0 -0
  473. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/updates.py +0 -0
  474. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/utils.py +0 -0
  475. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/__init__.py +0 -0
  476. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/basic.py +0 -0
  477. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/indexing.py +0 -0
  478. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/linalg.py +0 -0
  479. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/math.py +0 -0
  480. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/random.py +0 -0
  481. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/reduction.py +0 -0
  482. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/__init__.py +0 -0
  483. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/basic.py +0 -0
  484. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/indexing.py +0 -0
  485. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/math.py +0 -0
  486. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/reduction.py +0 -0
  487. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/shape.py +0 -0
  488. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/utils.py +0 -0
  489. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  490. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/shape.py +0 -0
  491. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/type.py +0 -0
  492. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/vectorization.py +0 -0
  493. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor.egg-info/dependency_links.txt +0 -0
  494. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor.egg-info/entry_points.txt +0 -0
  495. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor.egg-info/requires.txt +0 -0
  496. {pytensor-2.36.0 → pytensor-2.36.2}/pytensor.egg-info/top_level.txt +0 -0
  497. {pytensor-2.36.0 → pytensor-2.36.2}/scripts/mypy-failing.txt +0 -0
  498. {pytensor-2.36.0 → pytensor-2.36.2}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  499. {pytensor-2.36.0 → pytensor-2.36.2}/setup.cfg +0 -0
  500. {pytensor-2.36.0 → pytensor-2.36.2}/setup.py +0 -0
  501. {pytensor-2.36.0 → pytensor-2.36.2}/tests/link/c/c_code/test_cenum.h +0 -0
  502. {pytensor-2.36.0 → pytensor-2.36.2}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  503. {pytensor-2.36.0 → pytensor-2.36.2}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
  504. {pytensor-2.36.0 → pytensor-2.36.2}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
  505. {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_breakpoint.py +0 -0
  506. {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_config.py +0 -0
  507. {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_gradient.py +0 -0
  508. {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_ifelse.py +0 -0
  509. {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_printing.py +0 -0
  510. {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_raise_op.py +0 -0
  511. {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_rop.py +0 -0
  512. {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_updates.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 2.36.0
3
+ Version: 2.36.2
4
4
  Summary: Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs.
5
5
  Author-email: pymc-devs <pymc.devs@gmail.com>
6
6
  License-Expression: BSD-3-Clause
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-12-15T22:58:11+0100",
11
+ "date": "2026-01-02T17:20:52+0100",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "6319fac84ebc71ad079c5986c6c302a52e254198",
15
- "version": "2.36.0"
14
+ "full-revisionid": "0f864a33958e68e5110d043c4b5ef549cd1d6074",
15
+ "version": "2.36.2"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -872,7 +872,7 @@ class OpFromGraph(Op, HasInnerGraph):
872
872
 
873
873
  def clone(self):
874
874
  res = copy(self)
875
- res.fgraph = res.fgraph.clone()
875
+ res.fgraph = res.fgraph.clone(clone_inner_graphs=True)
876
876
  return res
877
877
 
878
878
  def perform(self, node, inputs, outputs):
@@ -838,9 +838,13 @@ class FunctionGraph(MetaObject):
838
838
  def __repr__(self):
839
839
  return f"FunctionGraph({', '.join(graph_as_string(self.inputs, self.outputs))})"
840
840
 
841
- def clone(self, check_integrity=True) -> "FunctionGraph":
841
+ def clone(
842
+ self, check_integrity=True, clone_inner_graphs: bool = False
843
+ ) -> "FunctionGraph":
842
844
  """Clone the graph."""
843
- return self.clone_get_equiv(check_integrity)[0]
845
+ return self.clone_get_equiv(
846
+ check_integrity, clone_inner_graphs=clone_inner_graphs
847
+ )[0]
844
848
 
845
849
  def clone_get_equiv(
846
850
  self, check_integrity: bool = True, attach_feature: bool = True, **kwargs
@@ -11,7 +11,7 @@ from pytensor.configdefaults import config
11
11
 
12
12
 
13
13
  NUMBA_CACHE_PATH = config.base_compiledir / "numba"
14
- NUMBA_CACHE_PATH.mkdir(exist_ok=True)
14
+ NUMBA_CACHE_PATH.mkdir(parents=True, exist_ok=True)
15
15
  CACHED_SRC_FUNCTIONS: WeakKeyDictionary[Callable, str] = WeakKeyDictionary()
16
16
 
17
17
 
@@ -478,7 +478,7 @@ def numba_funcify_ensure_cache(op, *args, **kwargs) -> tuple[Callable, str | Non
478
478
  src=f"def {op_name}(*args): return jitable_func(*args)",
479
479
  function_name=op_name,
480
480
  global_env=globals() | {"jitable_func": jitable_func},
481
- cache_key=cache_key,
481
+ cache_key=f"{cache_key}_fastmath{int(config.numba__fastmath)}",
482
482
  )
483
483
  return numba_njit(cached_func, cache=True), cache_key
484
484
 
@@ -1,5 +1,6 @@
1
1
  from copy import deepcopy
2
2
  from hashlib import sha256
3
+ from textwrap import dedent
3
4
 
4
5
  import numba
5
6
  import numpy as np
@@ -10,6 +11,7 @@ from pytensor.compile.io import In, Out
10
11
  from pytensor.compile.mode import NUMBA
11
12
  from pytensor.compile.ops import DeepCopyOp, TypeCastingOp
12
13
  from pytensor.ifelse import IfElse
14
+ from pytensor.link.numba.cache import compile_numba_function_src
13
15
  from pytensor.link.numba.dispatch import basic as numba_basic
14
16
  from pytensor.link.numba.dispatch.basic import (
15
17
  numba_funcify_and_cache_key,
@@ -106,30 +108,35 @@ def numba_funcify_DeepCopyOp(op, node, **kwargs):
106
108
  @register_funcify_default_op_cache_key(IfElse)
107
109
  def numba_funcify_IfElse(op, **kwargs):
108
110
  n_outs = op.n_outs
111
+ as_view = op.as_view
109
112
 
110
- if n_outs > 1:
111
-
112
- @numba_basic.numba_njit
113
- def ifelse(cond, *args):
114
- if cond:
115
- res = args[:n_outs]
116
- else:
117
- res = args[n_outs:]
118
-
119
- return res
113
+ true_names = [f"t{i}" for i in range(n_outs)]
114
+ false_names = [f"f{i}" for i in range(n_outs)]
115
+ arg_list = ", ".join((*true_names, *false_names))
120
116
 
117
+ if as_view:
118
+ true_returns = ", ".join(true_names)
121
119
  else:
120
+ true_returns = ", ".join(f"{name}.copy()" for name in true_names)
121
+ # We only ever view (alias) variables from the true branch. False branch variables must always be copied.
122
+ false_returns = ", ".join(f"{name}.copy()" for name in false_names)
123
+
124
+ func_src = dedent(
125
+ f"""
126
+ def ifelse(cond, {arg_list}):
127
+ if cond:
128
+ return {true_returns}
129
+ else:
130
+ return {false_returns}
131
+ """
132
+ )
122
133
 
123
- @numba_basic.numba_njit
124
- def ifelse(cond, *args):
125
- if cond:
126
- res = args[:n_outs]
127
- else:
128
- res = args[n_outs:]
129
-
130
- return res[0]
134
+ ifelse_func = numba_basic.numba_njit(
135
+ compile_numba_function_src(func_src, "ifelse", globals())
136
+ )
131
137
 
132
- return ifelse
138
+ cache_version = 1
139
+ return ifelse_func, cache_version
133
140
 
134
141
 
135
142
  @register_funcify_and_cache_key(CheckAndRaise)
@@ -216,14 +216,16 @@ def core_MvNormalRV(op, node):
216
216
 
217
217
  @numba_core_rv_funcify.register(ptr.DirichletRV)
218
218
  def core_DirichletRV(op, node):
219
+ dtype = op.dtype
220
+
219
221
  @numba_basic.numba_njit
220
222
  def random_fn(rng, alpha):
221
- y = np.empty_like(alpha)
223
+ y = np.empty_like(alpha, dtype=dtype)
222
224
  for i in range(len(alpha)):
223
225
  y[i] = rng.gamma(alpha[i], 1.0)
224
226
  return y / y.sum()
225
227
 
226
- return random_fn
228
+ return random_fn, 1
227
229
 
228
230
 
229
231
  @numba_core_rv_funcify.register(ptr.GumbelRV)
@@ -410,7 +412,7 @@ def numba_funcify_RandomVariable(op: RandomVariableWithCoreShape, node, **kwargs
410
412
  rv_op: RandomVariable = rv_node.op
411
413
 
412
414
  try:
413
- core_rv_fn = numba_core_rv_funcify(rv_op, rv_node)
415
+ core_rv_fn_and_cache_key = numba_core_rv_funcify(rv_op, rv_node)
414
416
  except NotImplementedError:
415
417
  py_impl = generate_fallback_impl(rv_op, node=rv_node, **kwargs)
416
418
 
@@ -420,6 +422,16 @@ def numba_funcify_RandomVariable(op: RandomVariableWithCoreShape, node, **kwargs
420
422
 
421
423
  return fallback_rv, None
422
424
 
425
+ match core_rv_fn_and_cache_key:
426
+ case (core_rv_fn, (int() | None) as core_cache_key):
427
+ pass
428
+ case (_core_rv_fn, invalid_core_cache_key):
429
+ raise ValueError(
430
+ f"Invalid core_cache_key returned from numba_core_rv_funcify: {invalid_core_cache_key}. Must be int or None."
431
+ )
432
+ case core_rv_fn:
433
+ core_cache_key = "__None__"
434
+
423
435
  size = rv_op.size_param(rv_node)
424
436
  dist_params = rv_op.dist_params(rv_node)
425
437
  size_len = None if isinstance(size.type, NoneTypeT) else get_vector_length(size)
@@ -469,16 +481,19 @@ def numba_funcify_RandomVariable(op: RandomVariableWithCoreShape, node, **kwargs
469
481
 
470
482
  return impl
471
483
 
472
- rv_op_props_dict = rv_op.props_dict() if hasattr(rv_op, "props_dict") else {}
473
- random_rv_key_contents = (
474
- type(op),
475
- type(rv_op),
476
- rv_op,
477
- tuple(rv_op_props_dict.items()),
478
- size_len,
479
- core_shape_len,
480
- inplace,
481
- input_bc_patterns,
482
- )
483
- random_rv_key = sha256(str(random_rv_key_contents).encode()).hexdigest()
484
+ if core_cache_key is None:
485
+ # If the core RV can't be cached, then the whole RV can't be cached
486
+ random_rv_key = None # type: ignore[unreachable]
487
+ else:
488
+ random_rv_key_contents = (
489
+ type(op),
490
+ type(rv_op),
491
+ tuple(rv_op._props_dict().items()), # type: ignore[attr-defined]
492
+ size_len,
493
+ core_shape_len,
494
+ input_bc_patterns,
495
+ output_bc_patterns,
496
+ core_cache_key,
497
+ )
498
+ random_rv_key = sha256(str(random_rv_key_contents).encode()).hexdigest()
484
499
  return random, random_rv_key
@@ -649,7 +649,6 @@ def vector_integer_advanced_indexing(
649
649
  codegen,
650
650
  function_name=func_name,
651
651
  global_env=globals(),
652
- cache_key=cache_key,
653
652
  )
654
653
  )
655
654
  return ret_func, cache_key
@@ -5,6 +5,7 @@ import torch
5
5
  from pytensor.link.pytorch.dispatch.basic import pytorch_funcify
6
6
  from pytensor.scalar.basic import (
7
7
  Cast,
8
+ Clip,
8
9
  Invert,
9
10
  ScalarOp,
10
11
  )
@@ -71,6 +72,14 @@ def pytorch_funcify_Softplus(op, node, **kwargs):
71
72
  return torch.nn.Softplus()
72
73
 
73
74
 
75
+ @pytorch_funcify.register(Clip)
76
+ def pytorch_funcify_Clip(op, node, **kwargs):
77
+ def clip(x, min_val, max_val):
78
+ return torch.where(x < min_val, min_val, torch.where(x > max_val, max_val, x))
79
+
80
+ return clip
81
+
82
+
74
83
  @pytorch_funcify.register(ScalarLoop)
75
84
  def pytorch_funicify_ScalarLoop(op, node, **kwargs):
76
85
  update = pytorch_funcify(op.fgraph, **kwargs)
@@ -4300,14 +4300,8 @@ class Composite(ScalarInnerGraphOp):
4300
4300
  self._fgraph = fgraph
4301
4301
  return self._fgraph
4302
4302
 
4303
- def clone_float32(self):
4304
- # This will not modify the fgraph or the nodes
4305
- new_ins, new_outs = composite_f32.apply(self.fgraph)
4306
- return Composite(new_ins, new_outs)
4307
-
4308
4303
  def clone(self):
4309
- new_ins, new_outs = composite_f32.apply(self.fgraph)
4310
- return Composite(new_ins, new_outs)
4304
+ return self.__class__(self.fgraph.inputs, self.fgraph.outputs)
4311
4305
 
4312
4306
  def output_types(self, input_types):
4313
4307
  if tuple(input_types) != self.inputs_type:
@@ -4423,86 +4417,4 @@ class Composite(ScalarInnerGraphOp):
4423
4417
  return self.c_code_template % d
4424
4418
 
4425
4419
  def c_code_cache_version_outer(self) -> tuple[int, ...]:
4426
- return (6,)
4427
-
4428
-
4429
- class Compositef32:
4430
- # This is a dict of scalar op classes that need special handling
4431
- special: dict = {}
4432
-
4433
- def apply(self, fgraph):
4434
- mapping = {}
4435
- topo = fgraph.toposort()
4436
- for i in fgraph.inputs:
4437
- if i.dtype == "float16":
4438
- mapping[i] = get_scalar_type("float32")()
4439
- if hasattr(i.tag, "test_value"):
4440
- mapping[i].tag.test_value = i.tag.test_value
4441
- else:
4442
- mapping[i] = i
4443
- for node in topo:
4444
- # Patch up for constants
4445
- for i in node.inputs:
4446
- if i not in mapping:
4447
- assert type(i) is ScalarConstant
4448
- if i.type == float16:
4449
- ni = ScalarConstant(float32, i.data)
4450
- else:
4451
- ni = i
4452
- mapping[i] = ni
4453
- if isinstance(node.op, tuple(self.special)):
4454
- self.special[type(node.op)](node, mapping)
4455
- continue
4456
- new_node = node.clone_with_new_inputs(
4457
- [mapping[inp] for inp in node.inputs], strict=False
4458
- )
4459
- # make sure we don't produce any float16.
4460
- assert not any(o.dtype == "float16" for o in new_node.outputs)
4461
- mapping.update(zip(node.outputs, new_node.outputs, strict=True))
4462
-
4463
- new_ins = [mapping[inp] for inp in fgraph.inputs]
4464
- new_outs = [mapping[out] for out in fgraph.outputs]
4465
- return new_ins, new_outs
4466
-
4467
-
4468
- composite_f32 = Compositef32()
4469
-
4470
-
4471
- def handle_cast(node, mapping):
4472
- inp = mapping[node.inputs[0]]
4473
- out = node.outputs[0]
4474
- node_ok = False
4475
- if node.op.o_type == float16:
4476
- if node.inputs[0].type == float32:
4477
- # cast f32 -> f16, remove
4478
- mapping[out] = inp
4479
- return
4480
- else:
4481
- # cast to f16, convert to f32
4482
- new_out = cast(inp, "float32")
4483
- # change the node for the following if
4484
- node = new_out.owner
4485
- mapping[out] = new_out
4486
- node_ok = True
4487
- if node.inputs[0].type == float16:
4488
- if node.op.o_type == inp.type:
4489
- # cast f16 to new input type, remove
4490
- mapping[out] = inp
4491
- return
4492
- if not node_ok:
4493
- new_node = node.clone_with_new_inputs([inp], strict=False)
4494
- mapping[out] = new_node.outputs[0]
4495
-
4496
-
4497
- Compositef32.special[Cast] = handle_cast
4498
-
4499
-
4500
- def handle_composite(node, mapping):
4501
- new_op = node.op.clone_float32()
4502
- new_outs = new_op(*[mapping[i] for i in node.inputs], return_list=True)
4503
- assert len(new_outs) == len(node.outputs)
4504
- for o, no in zip(node.outputs, new_outs, strict=True):
4505
- mapping[o] = no
4506
-
4507
-
4508
- Compositef32.special[Composite] = handle_composite
4420
+ return (7,)
@@ -123,7 +123,7 @@ class ScalarLoop(ScalarInnerGraphOp):
123
123
  update, until = self.outputs, None
124
124
  init = self.inputs[: len(update)]
125
125
  constant = self.inputs[len(update) :]
126
- return ScalarLoop(
126
+ return self.__class__(
127
127
  init=init,
128
128
  update=update,
129
129
  constant=constant,
@@ -1,5 +1,6 @@
1
1
  import typing
2
2
  import warnings
3
+ from functools import reduce
3
4
  from itertools import chain
4
5
 
5
6
  import numpy as np
@@ -16,7 +17,6 @@ from pytensor.graph.type import HasShape
16
17
  from pytensor.graph.utils import MissingInputError, TestValueError
17
18
  from pytensor.scan.op import Scan, ScanInfo
18
19
  from pytensor.scan.utils import expand_empty, safe_new, until
19
- from pytensor.tensor.basic import get_underlying_scalar_constant_value
20
20
  from pytensor.tensor.exceptions import NotScalarConstantError
21
21
  from pytensor.tensor.math import minimum
22
22
  from pytensor.tensor.shape import shape_padleft
@@ -143,31 +143,6 @@ def get_updates_and_outputs(ls):
143
143
  raise ValueError(error_msg)
144
144
 
145
145
 
146
- def isNaN_or_Inf_or_None(x):
147
- isNone = x is None
148
- try:
149
- isNaN = np.isnan(x)
150
- isInf = np.isinf(x)
151
- isStr = isinstance(x, str)
152
- except Exception:
153
- isNaN = False
154
- isInf = False
155
- isStr = False
156
- if not isNaN and not isInf:
157
- try:
158
- val = get_underlying_scalar_constant_value(x)
159
- isInf = np.isinf(val)
160
- isNaN = np.isnan(val)
161
- except Exception:
162
- isNaN = False
163
- isInf = False
164
- if isinstance(x, Constant) and isinstance(x.data, str):
165
- isStr = True
166
- else:
167
- isStr = False
168
- return isNone or isNaN or isInf or isStr
169
-
170
-
171
146
  def _manage_output_api_change(outputs, updates, return_updates):
172
147
  if return_updates:
173
148
  warnings.warn(
@@ -505,7 +480,7 @@ def scan(
505
480
 
506
481
  # This helper eagerly skips the Scan if n_steps is known to be 1
507
482
  single_step_requested = False
508
- if isinstance(n_steps, float | int):
483
+ if isinstance(n_steps, int | float):
509
484
  single_step_requested = n_steps == 1
510
485
  else:
511
486
  try:
@@ -676,33 +651,20 @@ def scan(
676
651
  if nw_name is not None:
677
652
  nw_seq.name = nw_name
678
653
 
679
- # Since we've added all sequences now we need to level them up based on
680
- # n_steps or their different shapes
681
- lengths_vec = [seq.shape[0] for seq in scan_seqs]
682
-
683
- if not isNaN_or_Inf_or_None(n_steps):
684
- # ^ N_steps should also be considered
685
- lengths_vec.append(pt.as_tensor(n_steps))
686
-
687
- if len(lengths_vec) == 0:
688
- # ^ No information about the number of steps
689
- raise ValueError(
690
- "No information about the number of steps "
691
- "provided. Either provide a value for "
692
- "n_steps argument of scan or provide an input "
693
- "sequence"
694
- )
695
-
696
- # If the user has provided the number of steps, do that regardless ( and
697
- # raise an error if the sequences are not long enough )
698
- if isNaN_or_Inf_or_None(n_steps):
699
- actual_n_steps = lengths_vec[0]
700
- for contestant in lengths_vec[1:]:
701
- actual_n_steps = minimum(actual_n_steps, contestant)
654
+ if n_steps is None:
655
+ if not scan_seqs:
656
+ raise ValueError(
657
+ "No information about the number of steps provided. "
658
+ "Either provide a value for n_steps argument of scan or provide an input sequence."
659
+ )
660
+ actual_n_steps = reduce(minimum, [seq.shape[0] for seq in scan_seqs])
702
661
  else:
703
- actual_n_steps = pt.as_tensor(n_steps)
662
+ actual_n_steps = pt.as_tensor(n_steps, dtype="int64", ndim=0)
704
663
 
664
+ # Since we've added all sequences now we need to level them off based on
665
+ # n_steps or their different shapes
705
666
  scan_seqs = [seq[:actual_n_steps] for seq in scan_seqs]
667
+
706
668
  # Conventions :
707
669
  # mit_mot = multiple input taps, multiple output taps ( only provided
708
670
  # by the gradient function )
@@ -899,10 +861,8 @@ def scan(
899
861
  raw_inner_outputs = fn(*args)
900
862
 
901
863
  condition, outputs, updates = get_updates_and_outputs(raw_inner_outputs)
902
- if condition is not None:
903
- as_while = True
904
- else:
905
- as_while = False
864
+ as_while = condition is not None
865
+
906
866
  ##
907
867
  # Step 3. Check if we actually need scan and remove it if we don't
908
868
  ##
@@ -934,7 +894,7 @@ def scan(
934
894
 
935
895
  # extract still missing inputs (there still might be so) and add them
936
896
  # as non sequences at the end of our args
937
- if condition is not None:
897
+ if as_while:
938
898
  outputs.append(condition)
939
899
  fake_nonseqs = [x.type() for x in non_seqs]
940
900
  fake_outputs = clone_replace(
@@ -1252,8 +1212,8 @@ def scan(
1252
1212
  rightOrder = (
1253
1213
  mit_sot_rightOrder
1254
1214
  + sit_sot_rightOrder
1255
- + untraced_sit_sot_rightOrder
1256
1215
  + nit_sot_rightOrder
1216
+ + untraced_sit_sot_rightOrder
1257
1217
  )
1258
1218
  scan_out_list = [None] * len(rightOrder)
1259
1219
  for idx, pos in enumerate(rightOrder):
@@ -1521,7 +1521,7 @@ class Scan(Op, ScanMethodsMixin, HasInnerGraph):
1521
1521
 
1522
1522
  def clone(self) -> "Scan":
1523
1523
  res = copy(self)
1524
- res.fgraph = res.fgraph.clone()
1524
+ res.fgraph = res.fgraph.clone(clone_inner_graphs=True)
1525
1525
  return res
1526
1526
 
1527
1527
  def make_thunk(self, node, storage_map, compute_map, no_recycling, impl=None):