pytensor 2.36.1__tar.gz → 2.36.3__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 (514) hide show
  1. {pytensor-2.36.1/pytensor.egg-info → pytensor-2.36.3}/PKG-INFO +1 -1
  2. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/_version.py +3 -3
  3. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/builders.py +1 -1
  4. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/configdefaults.py +0 -9
  5. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/configparser.py +0 -1
  6. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/gradient.py +2 -5
  7. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/fg.py +6 -2
  8. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/scan.py +7 -2
  9. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/tensor_basic.py +3 -20
  10. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/core.py +0 -18
  11. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/cache.py +49 -0
  12. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/basic.py +1 -35
  13. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/compile_ops.py +26 -19
  14. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/elemwise.py +12 -2
  15. pytensor-2.36.3/pytensor/link/numba/dispatch/linalg/_LAPACK.py +953 -0
  16. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +72 -80
  17. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +10 -6
  18. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/random.py +30 -15
  19. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/scan.py +1 -1
  20. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/slinalg.py +84 -28
  21. pytensor-2.36.3/pytensor/link/numba/dispatch/string_codegen.py +31 -0
  22. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/subtensor.py +1 -2
  23. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/tensor_basic.py +1 -1
  24. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scalar/basic.py +25 -132
  25. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scalar/loop.py +1 -1
  26. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scan/op.py +1 -1
  27. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/basic.py +4 -35
  28. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/blockwise.py +15 -4
  29. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/optimize.py +1 -1
  30. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/reshape.py +42 -15
  31. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/math.py +7 -0
  32. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/subtensor_lift.py +5 -1
  33. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/signal/conv.py +0 -5
  34. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/type.py +8 -11
  35. {pytensor-2.36.1 → pytensor-2.36.3/pytensor.egg-info}/PKG-INFO +1 -1
  36. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor.egg-info/SOURCES.txt +2 -6
  37. pytensor-2.36.1/doc/library/tensor/conv.rst +0 -11
  38. pytensor-2.36.1/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -557
  39. pytensor-2.36.1/pytensor/tensor/conv/__init__.py +0 -10
  40. pytensor-2.36.1/pytensor/tensor/conv/abstract_conv.py +0 -3720
  41. pytensor-2.36.1/tests/tensor/conv/c_code/corr3d_gemm.c +0 -421
  42. pytensor-2.36.1/tests/tensor/conv/c_code/corr_gemm.c +0 -570
  43. {pytensor-2.36.1 → pytensor-2.36.3}/LICENSE.txt +0 -0
  44. {pytensor-2.36.1 → pytensor-2.36.3}/MANIFEST.in +0 -0
  45. {pytensor-2.36.1 → pytensor-2.36.3}/README.rst +0 -0
  46. {pytensor-2.36.1 → pytensor-2.36.3}/doc/.templates/PLACEHOLDER +0 -0
  47. {pytensor-2.36.1 → pytensor-2.36.3}/doc/.templates/layout.html +0 -0
  48. {pytensor-2.36.1 → pytensor-2.36.3}/doc/.templates/nb-badges.html +0 -0
  49. {pytensor-2.36.1 → pytensor-2.36.3}/doc/.templates/rendered_citation.html +0 -0
  50. {pytensor-2.36.1 → pytensor-2.36.3}/doc/LICENSE.txt +0 -0
  51. {pytensor-2.36.1 → pytensor-2.36.3}/doc/README.md +0 -0
  52. {pytensor-2.36.1 → pytensor-2.36.3}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  53. {pytensor-2.36.1 → pytensor-2.36.3}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  54. {pytensor-2.36.1 → pytensor-2.36.3}/doc/acknowledgement.rst +0 -0
  55. {pytensor-2.36.1 → pytensor-2.36.3}/doc/bcast.png +0 -0
  56. {pytensor-2.36.1 → pytensor-2.36.3}/doc/bcast.svg +0 -0
  57. {pytensor-2.36.1 → pytensor-2.36.3}/doc/blog.md +0 -0
  58. {pytensor-2.36.1 → pytensor-2.36.3}/doc/conf.py +0 -0
  59. {pytensor-2.36.1 → pytensor-2.36.3}/doc/core_development_guide.rst +0 -0
  60. {pytensor-2.36.1 → pytensor-2.36.3}/doc/css.inc +0 -0
  61. {pytensor-2.36.1 → pytensor-2.36.3}/doc/dev_start_guide.rst +0 -0
  62. {pytensor-2.36.1 → pytensor-2.36.3}/doc/environment.yml +0 -0
  63. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/apply.png +0 -0
  64. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/apply.svg +0 -0
  65. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/apply2.svg +0 -0
  66. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/creating_a_c_op.rst +0 -0
  67. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  68. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/creating_an_op.rst +0 -0
  69. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/ctype.rst +0 -0
  70. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/extending_faq.rst +0 -0
  71. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/extending_pytensor_solution_1.py +0 -0
  72. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/graph_rewriting.rst +0 -0
  73. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/graphstructures.rst +0 -0
  74. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/index.rst +0 -0
  75. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/inplace.rst +0 -0
  76. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/op.rst +0 -0
  77. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/other_ops.rst +0 -0
  78. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  79. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  80. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/pipeline.rst +0 -0
  81. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/scan.rst +0 -0
  82. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/tips.rst +0 -0
  83. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/type.rst +0 -0
  84. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/unittest.rst +0 -0
  85. {pytensor-2.36.1 → pytensor-2.36.3}/doc/extending/using_params.rst +0 -0
  86. {pytensor-2.36.1 → pytensor-2.36.3}/doc/faq.rst +0 -0
  87. {pytensor-2.36.1 → pytensor-2.36.3}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  88. {pytensor-2.36.1 → pytensor-2.36.3}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
  89. {pytensor-2.36.1 → pytensor-2.36.3}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
  90. {pytensor-2.36.1 → pytensor-2.36.3}/doc/gallery/optimize/root.ipynb +0 -0
  91. {pytensor-2.36.1 → pytensor-2.36.3}/doc/gallery/page_footer.md +0 -0
  92. {pytensor-2.36.1 → pytensor-2.36.3}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  93. {pytensor-2.36.1 → pytensor-2.36.3}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  94. {pytensor-2.36.1 → pytensor-2.36.3}/doc/generate_dtype_tensor_table.py +0 -0
  95. {pytensor-2.36.1 → pytensor-2.36.3}/doc/glossary.rst +0 -0
  96. {pytensor-2.36.1 → pytensor-2.36.3}/doc/images/Elman_srnn.png +0 -0
  97. {pytensor-2.36.1 → pytensor-2.36.3}/doc/images/PyTensor.png +0 -0
  98. {pytensor-2.36.1 → pytensor-2.36.3}/doc/images/PyTensor_RGB.svg +0 -0
  99. {pytensor-2.36.1 → pytensor-2.36.3}/doc/images/PyTensor_logo.png +0 -0
  100. {pytensor-2.36.1 → pytensor-2.36.3}/doc/images/binder.svg +0 -0
  101. {pytensor-2.36.1 → pytensor-2.36.3}/doc/images/blocksparse.png +0 -0
  102. {pytensor-2.36.1 → pytensor-2.36.3}/doc/images/colab.svg +0 -0
  103. {pytensor-2.36.1 → pytensor-2.36.3}/doc/images/github.svg +0 -0
  104. {pytensor-2.36.1 → pytensor-2.36.3}/doc/images/lstm.png +0 -0
  105. {pytensor-2.36.1 → pytensor-2.36.3}/doc/images/lstm_memorycell.png +0 -0
  106. {pytensor-2.36.1 → pytensor-2.36.3}/doc/images/talk2010.gif +0 -0
  107. {pytensor-2.36.1 → pytensor-2.36.3}/doc/images/talk2010.png +0 -0
  108. {pytensor-2.36.1 → pytensor-2.36.3}/doc/index.rst +0 -0
  109. {pytensor-2.36.1 → pytensor-2.36.3}/doc/install.rst +0 -0
  110. {pytensor-2.36.1 → pytensor-2.36.3}/doc/internal/how_to_release.rst +0 -0
  111. {pytensor-2.36.1 → pytensor-2.36.3}/doc/internal/index.rst +0 -0
  112. {pytensor-2.36.1 → pytensor-2.36.3}/doc/internal/metadocumentation.rst +0 -0
  113. {pytensor-2.36.1 → pytensor-2.36.3}/doc/introduction.rst +0 -0
  114. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/compile/debugmode.rst +0 -0
  115. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/compile/function.rst +0 -0
  116. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/compile/index.rst +0 -0
  117. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/compile/io.rst +0 -0
  118. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/compile/mode.rst +0 -0
  119. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/compile/nanguardmode.rst +0 -0
  120. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/compile/opfromgraph.rst +0 -0
  121. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/compile/ops.rst +0 -0
  122. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/compile/profilemode.rst +0 -0
  123. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/compile/shared.rst +0 -0
  124. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/config.rst +0 -0
  125. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  126. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  127. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  128. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  129. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  130. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  131. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  132. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/mlp.html +0 -0
  133. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/mlp.png +0 -0
  134. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/mlp2.html +0 -0
  135. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  136. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/mlp2.png +0 -0
  137. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/ofg.html +0 -0
  138. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/examples/ofg2.html +0 -0
  139. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/index.ipynb +0 -0
  140. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/index.rst +0 -0
  141. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  142. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  143. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  144. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  145. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/graph/features.rst +0 -0
  146. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/graph/fgraph.rst +0 -0
  147. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/graph/graph.rst +0 -0
  148. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/graph/index.rst +0 -0
  149. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/graph/op.rst +0 -0
  150. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/graph/replace.rst +0 -0
  151. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/graph/type.rst +0 -0
  152. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/graph/utils.rst +0 -0
  153. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/index.rst +0 -0
  154. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/misc/pkl_utils.rst +0 -0
  155. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/printing.rst +0 -0
  156. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/scalar/index.rst +0 -0
  157. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/scan.rst +0 -0
  158. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/sparse/index.rst +0 -0
  159. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/sparse/sandbox.rst +0 -0
  160. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/basic.rst +0 -0
  161. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/basic_opt.rst +0 -0
  162. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/bcast.png +0 -0
  163. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/bcast.svg +0 -0
  164. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/elemwise.rst +0 -0
  165. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/extra_ops.rst +0 -0
  166. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/fft.rst +0 -0
  167. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/functional.rst +0 -0
  168. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/index.rst +0 -0
  169. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/io.rst +0 -0
  170. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/math_opt.rst +0 -0
  171. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/nlinalg.rst +0 -0
  172. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/optimize.rst +0 -0
  173. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/plot_fft.png +0 -0
  174. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/random/distributions.rst +0 -0
  175. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/random/index.rst +0 -0
  176. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/slinalg.rst +0 -0
  177. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/tensor/utils.rst +0 -0
  178. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/typed_list.rst +0 -0
  179. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/xtensor/index.md +0 -0
  180. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/xtensor/linalg.md +0 -0
  181. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/xtensor/math.md +0 -0
  182. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/xtensor/module_functions.md +0 -0
  183. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/xtensor/random.md +0 -0
  184. {pytensor-2.36.1 → pytensor-2.36.3}/doc/library/xtensor/type.md +0 -0
  185. {pytensor-2.36.1 → pytensor-2.36.3}/doc/links.rst +0 -0
  186. {pytensor-2.36.1 → pytensor-2.36.3}/doc/optimizations.rst +0 -0
  187. {pytensor-2.36.1 → pytensor-2.36.3}/doc/pylintrc +0 -0
  188. {pytensor-2.36.1 → pytensor-2.36.3}/doc/robots.txt +0 -0
  189. {pytensor-2.36.1 → pytensor-2.36.3}/doc/troubleshooting.rst +0 -0
  190. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/adding.rst +0 -0
  191. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/adding_solution_1.py +0 -0
  192. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/aliasing.rst +0 -0
  193. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/apply.png +0 -0
  194. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/apply.svg +0 -0
  195. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/bcast.png +0 -0
  196. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/broadcasting.rst +0 -0
  197. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/conditions.rst +0 -0
  198. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/debug_faq.rst +0 -0
  199. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/dlogistic.png +0 -0
  200. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/examples.rst +0 -0
  201. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/faq_tutorial.rst +0 -0
  202. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/gradients.rst +0 -0
  203. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/index.rst +0 -0
  204. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/loading_and_saving.rst +0 -0
  205. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/logistic.gp +0 -0
  206. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/logistic.png +0 -0
  207. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/loop.rst +0 -0
  208. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/loop_solution_1.py +0 -0
  209. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/modes.rst +0 -0
  210. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/modes_solution_1.py +0 -0
  211. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/multi_cores.rst +0 -0
  212. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/nan_tutorial.rst +0 -0
  213. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/pics/d3viz.png +0 -0
  214. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  215. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  216. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  217. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/printing_drawing.rst +0 -0
  218. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/prng.rst +0 -0
  219. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/profiling.rst +0 -0
  220. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/profiling_example.py +0 -0
  221. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/profiling_example_out.prof +0 -0
  222. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/shape_info.rst +0 -0
  223. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/sparse.rst +0 -0
  224. {pytensor-2.36.1 → pytensor-2.36.3}/doc/tutorial/symbolic_graphs.rst +0 -0
  225. {pytensor-2.36.1 → pytensor-2.36.3}/doc/user_guide.rst +0 -0
  226. {pytensor-2.36.1 → pytensor-2.36.3}/pyproject.toml +0 -0
  227. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/__init__.py +0 -0
  228. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/bin/__init__.py +0 -0
  229. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/bin/pytensor_cache.py +0 -0
  230. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/breakpoint.py +0 -0
  231. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/__init__.py +0 -0
  232. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/compiledir.py +0 -0
  233. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/compilelock.py +0 -0
  234. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/debugmode.py +0 -0
  235. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/function/__init__.py +0 -0
  236. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/function/pfunc.py +0 -0
  237. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/function/types.py +0 -0
  238. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/io.py +0 -0
  239. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/mode.py +0 -0
  240. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/monitormode.py +0 -0
  241. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/nanguardmode.py +0 -0
  242. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/ops.py +0 -0
  243. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/profiling.py +0 -0
  244. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/compile/sharedvalue.py +0 -0
  245. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/d3viz/__init__.py +0 -0
  246. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  247. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/d3viz/css/d3viz.css +0 -0
  248. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/d3viz/d3viz.py +0 -0
  249. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/d3viz/formatting.py +0 -0
  250. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/d3viz/html/template.html +0 -0
  251. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  252. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  253. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/d3viz/js/d3viz.js +0 -0
  254. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  255. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  256. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/__init__.py +0 -0
  257. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/basic.py +0 -0
  258. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/destroyhandler.py +0 -0
  259. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/features.py +0 -0
  260. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/null_type.py +0 -0
  261. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/op.py +0 -0
  262. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/replace.py +0 -0
  263. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/rewriting/__init__.py +0 -0
  264. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/rewriting/basic.py +0 -0
  265. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/rewriting/db.py +0 -0
  266. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/rewriting/kanren.py +0 -0
  267. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/rewriting/unify.py +0 -0
  268. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/rewriting/utils.py +0 -0
  269. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/traversal.py +0 -0
  270. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/type.py +0 -0
  271. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/graph/utils.py +0 -0
  272. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/ifelse.py +0 -0
  273. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/ipython.py +0 -0
  274. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/__init__.py +0 -0
  275. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/basic.py +0 -0
  276. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/c/__init__.py +0 -0
  277. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/c/basic.py +0 -0
  278. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  279. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  280. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/c/cmodule.py +0 -0
  281. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/c/cutils.py +0 -0
  282. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/c/cvm.py +0 -0
  283. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/c/exceptions.py +0 -0
  284. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/c/interface.py +0 -0
  285. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/c/lazylinker_c.py +0 -0
  286. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/c/op.py +0 -0
  287. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/c/params_type.py +0 -0
  288. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/c/type.py +0 -0
  289. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/__init__.py +0 -0
  290. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/__init__.py +0 -0
  291. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/basic.py +0 -0
  292. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/blas.py +0 -0
  293. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  294. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/einsum.py +0 -0
  295. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  296. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  297. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/math.py +0 -0
  298. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  299. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/pad.py +0 -0
  300. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/random.py +0 -0
  301. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/scalar.py +0 -0
  302. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/shape.py +0 -0
  303. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  304. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  305. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/slinalg.py +0 -0
  306. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/sort.py +0 -0
  307. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/sparse.py +0 -0
  308. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  309. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/linker.py +0 -0
  310. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/jax/ops.py +0 -0
  311. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/__init__.py +0 -0
  312. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/__init__.py +0 -0
  313. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/basic.py +0 -0
  314. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
  315. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
  316. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
  317. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/math.py +0 -0
  318. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/nlinalg.py +0 -0
  319. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/shape.py +0 -0
  320. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  321. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  322. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/slinalg.py +0 -0
  323. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/sort.py +0 -0
  324. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
  325. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/mlx/linker.py +0 -0
  326. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/__init__.py +0 -0
  327. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/__init__.py +0 -0
  328. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/blockwise.py +0 -0
  329. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  330. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  331. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  332. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  333. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  334. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
  335. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  336. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
  337. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +0 -0
  338. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -0
  339. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +0 -0
  340. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -0
  341. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -0
  342. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +0 -0
  343. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +0 -0
  344. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
  345. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  346. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
  347. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/scalar.py +0 -0
  348. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/shape.py +0 -0
  349. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  350. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
  351. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/sort.py +0 -0
  352. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/sparse.py +0 -0
  353. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/typed_list.py +0 -0
  354. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  355. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/numba/linker.py +0 -0
  356. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  357. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  358. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  359. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  360. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  361. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  362. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/dispatch/math.py +0 -0
  363. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
  364. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  365. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  366. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/dispatch/slinalg.py +0 -0
  367. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  368. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  369. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/pytorch/linker.py +0 -0
  370. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/utils.py +0 -0
  371. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/link/vm.py +0 -0
  372. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/misc/__init__.py +0 -0
  373. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/misc/check_blas.py +0 -0
  374. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/misc/check_blas_many.sh +0 -0
  375. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/misc/check_duplicate_key.py +0 -0
  376. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  377. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/misc/elemwise_time_test.py +0 -0
  378. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/misc/frozendict.py +0 -0
  379. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/misc/may_share_memory.py +0 -0
  380. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/misc/ordered_set.py +0 -0
  381. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/misc/pkl_utils.py +0 -0
  382. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/npy_2_compat.py +0 -0
  383. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/printing.py +0 -0
  384. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/py.typed +0 -0
  385. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/raise_op.py +0 -0
  386. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scalar/__init__.py +0 -0
  387. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  388. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  389. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scalar/c_code/gamma.c +0 -0
  390. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scalar/c_code/incbet.c +0 -0
  391. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scalar/math.py +0 -0
  392. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scalar/sharedvar.py +0 -0
  393. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scan/__init__.py +0 -0
  394. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scan/basic.py +0 -0
  395. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scan/checkpoints.py +0 -0
  396. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scan/rewriting.py +0 -0
  397. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scan/scan_perform.pyx +0 -0
  398. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scan/scan_perform_ext.py +0 -0
  399. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scan/utils.py +0 -0
  400. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/scan/views.py +0 -0
  401. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/sparse/__init__.py +0 -0
  402. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/sparse/basic.py +0 -0
  403. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/sparse/linalg.py +0 -0
  404. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/sparse/math.py +0 -0
  405. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/sparse/rewriting.py +0 -0
  406. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/sparse/sharedvar.py +0 -0
  407. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/sparse/type.py +0 -0
  408. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/sparse/utils.py +0 -0
  409. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/sparse/variable.py +0 -0
  410. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/__init__.py +0 -0
  411. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/_linalg/__init__.py +0 -0
  412. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
  413. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/_linalg/solve/rewriting.py +0 -0
  414. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/_linalg/solve/tridiagonal.py +0 -0
  415. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/blas.py +0 -0
  416. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/blas_c.py +0 -0
  417. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/blas_headers.py +0 -0
  418. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  419. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  420. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  421. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/einsum.py +0 -0
  422. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/elemwise.py +0 -0
  423. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/elemwise_cgen.py +0 -0
  424. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/exceptions.py +0 -0
  425. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/extra_ops.py +0 -0
  426. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/fft.py +0 -0
  427. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/fourier.py +0 -0
  428. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/functional.py +0 -0
  429. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/interpolate.py +0 -0
  430. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/linalg.py +0 -0
  431. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/math.py +0 -0
  432. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/nlinalg.py +0 -0
  433. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/pad.py +0 -0
  434. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/random/__init__.py +0 -0
  435. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/random/basic.py +0 -0
  436. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/random/op.py +0 -0
  437. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  438. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/random/rewriting/basic.py +0 -0
  439. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/random/rewriting/jax.py +0 -0
  440. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/random/rewriting/numba.py +0 -0
  441. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/random/type.py +0 -0
  442. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/random/utils.py +0 -0
  443. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/random/var.py +0 -0
  444. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/__init__.py +0 -0
  445. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/basic.py +0 -0
  446. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/blas.py +0 -0
  447. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/blas_c.py +0 -0
  448. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/blockwise.py +0 -0
  449. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/einsum.py +0 -0
  450. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/elemwise.py +0 -0
  451. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  452. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/jax.py +0 -0
  453. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/linalg.py +0 -0
  454. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/numba.py +0 -0
  455. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/ofg.py +0 -0
  456. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/reshape.py +0 -0
  457. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/shape.py +0 -0
  458. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/special.py +0 -0
  459. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/subtensor.py +0 -0
  460. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  461. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/shape.py +0 -0
  462. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/sharedvar.py +0 -0
  463. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/signal/__init__.py +0 -0
  464. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/slinalg.py +0 -0
  465. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/sort.py +0 -0
  466. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/special.py +0 -0
  467. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/subtensor.py +0 -0
  468. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/type_other.py +0 -0
  469. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/utils.py +0 -0
  470. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/var.py +0 -0
  471. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/variable.py +0 -0
  472. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/tensor/xlogx.py +0 -0
  473. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/typed_list/__init__.py +0 -0
  474. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/typed_list/basic.py +0 -0
  475. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/typed_list/rewriting.py +0 -0
  476. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/typed_list/type.py +0 -0
  477. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/updates.py +0 -0
  478. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/utils.py +0 -0
  479. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/__init__.py +0 -0
  480. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/basic.py +0 -0
  481. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/indexing.py +0 -0
  482. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/linalg.py +0 -0
  483. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/math.py +0 -0
  484. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/random.py +0 -0
  485. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/reduction.py +0 -0
  486. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/rewriting/__init__.py +0 -0
  487. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/rewriting/basic.py +0 -0
  488. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/rewriting/indexing.py +0 -0
  489. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/rewriting/math.py +0 -0
  490. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/rewriting/reduction.py +0 -0
  491. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/rewriting/shape.py +0 -0
  492. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/rewriting/utils.py +0 -0
  493. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  494. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/shape.py +0 -0
  495. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/type.py +0 -0
  496. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor/xtensor/vectorization.py +0 -0
  497. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor.egg-info/dependency_links.txt +0 -0
  498. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor.egg-info/entry_points.txt +0 -0
  499. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor.egg-info/requires.txt +0 -0
  500. {pytensor-2.36.1 → pytensor-2.36.3}/pytensor.egg-info/top_level.txt +0 -0
  501. {pytensor-2.36.1 → pytensor-2.36.3}/scripts/mypy-failing.txt +0 -0
  502. {pytensor-2.36.1 → pytensor-2.36.3}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  503. {pytensor-2.36.1 → pytensor-2.36.3}/setup.cfg +0 -0
  504. {pytensor-2.36.1 → pytensor-2.36.3}/setup.py +0 -0
  505. {pytensor-2.36.1 → pytensor-2.36.3}/tests/link/c/c_code/test_cenum.h +0 -0
  506. {pytensor-2.36.1 → pytensor-2.36.3}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  507. {pytensor-2.36.1 → pytensor-2.36.3}/tests/test_breakpoint.py +0 -0
  508. {pytensor-2.36.1 → pytensor-2.36.3}/tests/test_config.py +0 -0
  509. {pytensor-2.36.1 → pytensor-2.36.3}/tests/test_gradient.py +0 -0
  510. {pytensor-2.36.1 → pytensor-2.36.3}/tests/test_ifelse.py +0 -0
  511. {pytensor-2.36.1 → pytensor-2.36.3}/tests/test_printing.py +0 -0
  512. {pytensor-2.36.1 → pytensor-2.36.3}/tests/test_raise_op.py +0 -0
  513. {pytensor-2.36.1 → pytensor-2.36.3}/tests/test_rop.py +0 -0
  514. {pytensor-2.36.1 → pytensor-2.36.3}/tests/test_updates.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 2.36.1
3
+ Version: 2.36.3
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-21T14:56:52+0000",
11
+ "date": "2026-01-07T19:04:45+0100",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "409a4b2a02e64acc0ca12cd0e046e99fd6f535b9",
15
- "version": "2.36.1"
14
+ "full-revisionid": "ac11da625fc3155790bc0b4794807232b73de0b8",
15
+ "version": "2.36.3"
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):
@@ -270,15 +270,6 @@ def add_basic_configvars():
270
270
  in_c_key=False,
271
271
  )
272
272
 
273
- config.add(
274
- "conv__assert_shape",
275
- "If True, AbstractConv* ops will verify that user-provided"
276
- " shapes match the runtime shapes (debugging option,"
277
- " may slow down compilation)",
278
- BoolParam(False),
279
- in_c_key=False,
280
- )
281
-
282
273
  config.add(
283
274
  "print_global_stats",
284
275
  "Print some global statistics (time spent) at the end",
@@ -71,7 +71,6 @@ class PyTensorConfigParser:
71
71
  pickle_test_value: bool
72
72
  cast_policy: str
73
73
  device: str
74
- conv__assert_shape: bool
75
74
  print_global_stats: bool
76
75
  unpickle_function: bool
77
76
  # add_compile_configvars
@@ -2104,16 +2104,13 @@ def jacobian(
2104
2104
  idx, expr, *wrt = args
2105
2105
  return grad(expr[idx], wrt, **grad_kwargs)
2106
2106
 
2107
- jacobian_matrices, updates = pytensor.scan(
2107
+ jacobian_matrices = pytensor.scan(
2108
2108
  inner_function,
2109
2109
  sequences=pytensor.tensor.arange(expression.size),
2110
2110
  non_sequences=[expression.ravel(), *wrt],
2111
+ return_updates=False,
2111
2112
  return_list=True,
2112
2113
  )
2113
- if updates:
2114
- raise ValueError(
2115
- "The scan used to build the jacobian matrices returned a list of updates"
2116
- )
2117
2114
 
2118
2115
  if jacobian_matrices[0].ndim < (expression.ndim + wrt[0].ndim):
2119
2116
  # There was some raveling or squeezing done prior to getting the jacobians
@@ -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
@@ -10,7 +10,7 @@ from pytensor.scan.op import Scan
10
10
 
11
11
 
12
12
  @jax_funcify.register(Scan)
13
- def jax_funcify_Scan(op: Scan, **kwargs):
13
+ def jax_funcify_Scan(op: Scan, node, **kwargs):
14
14
  # Note: This implementation is different from the internal PyTensor Scan op.
15
15
  # In particular, we don't make use of the provided buffers for recurring outputs (MIT-SOT, SIT-SOT)
16
16
  # These buffers include the initial state and enough space to store as many intermediate results as needed.
@@ -29,7 +29,10 @@ def jax_funcify_Scan(op: Scan, **kwargs):
29
29
 
30
30
  # Optimize inner graph (exclude any defalut rewrites that are incompatible with JAX mode)
31
31
  rewriter = (
32
- get_mode(op.mode).including("jax").excluding(*JAX._optimizer.exclude).optimizer
32
+ get_mode(op.mode)
33
+ .including("jax")
34
+ .excluding("numba", *JAX._optimizer.exclude)
35
+ .optimizer
33
36
  )
34
37
  rewriter(op.fgraph)
35
38
  scan_inner_func = jax_funcify(op.fgraph, **kwargs)
@@ -216,6 +219,8 @@ def jax_funcify_Scan(op: Scan, **kwargs):
216
219
  if trace.shape[0] > buffer_size:
217
220
  # Trace is longer than buffer, keep just the last `buffer.shape[0]` entries
218
221
  partial_trace = trace[-buffer_size:]
222
+ elif trace.shape[0] == buffer_size:
223
+ partial_trace = trace
219
224
  else:
220
225
  # Trace is shorter than buffer, this happens when we keep the initial_state
221
226
  if init_state.ndim < buffer.ndim:
@@ -17,16 +17,15 @@ from pytensor.tensor.basic import (
17
17
  ScalarFromTensor,
18
18
  Split,
19
19
  TensorFromScalar,
20
- Tri,
21
20
  get_scalar_constant_value,
22
21
  )
23
22
  from pytensor.tensor.exceptions import NotScalarConstantError
24
23
  from pytensor.tensor.shape import Shape_i
25
24
 
26
25
 
27
- ARANGE_CONCRETE_VALUE_ERROR = """JAX requires the arguments of `jax.numpy.arange`
28
- to be constants. The graph that you defined thus cannot be JIT-compiled
29
- by JAX. An example of a graph that can be compiled to JAX:
26
+ ARANGE_CONCRETE_VALUE_ERROR = """JAX requires the arguments of `jax.numpy.arange` to be constants.
27
+ The graph that you defined thus cannot be JIT-compiled by JAX.
28
+ An example of a graph that can be compiled to JAX:
30
29
  >>> import pytensor.tensor as pt
31
30
  >>> pt.arange(1, 10, 2)
32
31
  """
@@ -185,19 +184,3 @@ def jax_funcify_ScalarFromTensor(op, **kwargs):
185
184
  return jnp.array(x).flatten()[0]
186
185
 
187
186
  return scalar_from_tensor
188
-
189
-
190
- @jax_funcify.register(Tri)
191
- def jax_funcify_Tri(op, node, **kwargs):
192
- # node.inputs is N, M, k
193
- const_args = [getattr(x, "data", None) for x in node.inputs]
194
-
195
- def tri(*args):
196
- # args is N, M, k
197
- args = [
198
- x if const_x is None else const_x
199
- for x, const_x in zip(args, const_args, strict=True)
200
- ]
201
- return jnp.tri(*args, dtype=op.dtype)
202
-
203
- return tri
@@ -13,7 +13,6 @@ from pytensor.tensor.basic import (
13
13
  ScalarFromTensor,
14
14
  Split,
15
15
  TensorFromScalar,
16
- Tri,
17
16
  get_scalar_constant_value,
18
17
  )
19
18
  from pytensor.tensor.exceptions import NotScalarConstantError
@@ -219,23 +218,6 @@ def mlx_funcify_ScalarFromTensor(op, **kwargs):
219
218
  return scalar_from_tensor
220
219
 
221
220
 
222
- @mlx_funcify.register(Tri)
223
- def mlx_funcify_Tri(op, node, **kwargs):
224
- # node.inputs -> N, M, k
225
- const_args = [getattr(inp, "data", None) for inp in node.inputs]
226
- dtype = convert_dtype_to_mlx(op.dtype)
227
-
228
- def tri(*args):
229
- # Replace args with compile-time constants when available
230
- args = [
231
- arg if const_a is None else const_a
232
- for arg, const_a in zip(args, const_args, strict=True)
233
- ]
234
- return mx.tri(*args, dtype=dtype)
235
-
236
- return tri
237
-
238
-
239
221
  @mlx_funcify.register(AllocEmpty)
240
222
  def mlx_funcify_AllocEmpty(op, node, **kwargs):
241
223
  dtype = convert_dtype_to_mlx(op.dtype)
@@ -5,6 +5,9 @@ from tempfile import NamedTemporaryFile
5
5
  from typing import Any
6
6
  from weakref import WeakKeyDictionary
7
7
 
8
+ import numba
9
+ from llvmlite import ir
10
+ from numba.core import cgutils
8
11
  from numba.core.caching import CacheImpl, _CacheLocator
9
12
 
10
13
  from pytensor.configdefaults import config
@@ -127,3 +130,49 @@ def compile_numba_function_src(
127
130
  CACHED_SRC_FUNCTIONS[res] = cache_key
128
131
 
129
132
  return res # type: ignore
133
+
134
+
135
+ @numba.extending.intrinsic(prefer_literal=True)
136
+ def _call_cached_ptr(typingctx, get_ptr_func, func_type_ref, unique_func_name_lit):
137
+ """
138
+ Enable caching of function pointers returned by `get_ptr_func`.
139
+
140
+ When one of our Numba-dispatched functions depends on a pointer to a compiled function function (e.g. when we call
141
+ cython_lapack routines), numba will refuse to cache the function, because the pointer may change between runs.
142
+
143
+ This intrinsic allows us to cache the pointer ourselves, by storing it in a global variable keyed by a literal
144
+ `unique_func_name_lit`. The first time the intrinsic is called, it will call `get_ptr_func` to get the pointer, store it
145
+ in the global variable, and return it. Subsequent calls will load the pointer from the global variable.
146
+ """
147
+ func_type = func_type_ref.instance_type
148
+ cache_key = unique_func_name_lit.literal_value
149
+
150
+ def codegen(context, builder, signature, args):
151
+ ptr_ty = ir.PointerType(ir.IntType(8))
152
+ null = ptr_ty(None)
153
+ align = 64
154
+
155
+ mod = builder.module
156
+ var = cgutils.add_global_variable(mod, ptr_ty, f"_ptr_cache_{cache_key}")
157
+ var.align = align
158
+ var.linkage = "private"
159
+ var.initializer = null
160
+
161
+ var_val = builder.load_atomic(var, "acquire", align)
162
+ result_ptr = cgutils.alloca_once_value(builder, var_val)
163
+
164
+ with builder.if_then(builder.icmp_signed("==", var_val, null), likely=False):
165
+ sig = typingctx.resolve_function_type(get_ptr_func, [], {})
166
+ f = context.get_function(get_ptr_func, sig)
167
+ new_ptr = f(builder, [])
168
+ new_ptr = builder.inttoptr(new_ptr, ptr_ty)
169
+ builder.store_atomic(new_ptr, var, "release", align)
170
+ builder.store(new_ptr, result_ptr)
171
+
172
+ sfunc = cgutils.create_struct_proxy(func_type)(context, builder)
173
+ sfunc.c_addr = builder.load(result_ptr)
174
+
175
+ return sfunc._getvalue()
176
+
177
+ sig = func_type(get_ptr_func, func_type_ref, unique_func_name_lit)
178
+ return sig, codegen
@@ -171,40 +171,6 @@ def create_numba_signature(
171
171
  return numba.types.void(*input_types)
172
172
 
173
173
 
174
- def create_tuple_creator(f, n):
175
- """Construct a compile-time ``tuple``-comprehension-like loop.
176
-
177
- See https://github.com/numba/numba/issues/2771#issuecomment-414358902
178
- """
179
- warnings.warn(
180
- "create_tuple_creator is deprecated and will be removed in a future release",
181
- FutureWarning,
182
- )
183
-
184
- assert n > 0
185
-
186
- f = numba_njit(f)
187
-
188
- @numba_njit
189
- def creator(args):
190
- return (f(0, *args),)
191
-
192
- for i in range(1, n):
193
-
194
- @numba_njit
195
- def creator(args, creator=creator, i=i):
196
- return (*creator(args), f(i, *args))
197
-
198
- return numba_njit(lambda *args: creator(args))
199
-
200
-
201
- def create_tuple_string(x):
202
- if len(x) == 1:
203
- return f"({x[0]},)"
204
- else:
205
- return f"({', '.join(x)})"
206
-
207
-
208
174
  @numba.extending.intrinsic
209
175
  def direct_cast(typingctx, val, typ):
210
176
  if isinstance(typ, numba.types.TypeRef):
@@ -478,7 +444,7 @@ def numba_funcify_ensure_cache(op, *args, **kwargs) -> tuple[Callable, str | Non
478
444
  src=f"def {op_name}(*args): return jitable_func(*args)",
479
445
  function_name=op_name,
480
446
  global_env=globals() | {"jitable_func": jitable_func},
481
- cache_key=cache_key,
447
+ cache_key=f"{cache_key}_fastmath{int(config.numba__fastmath)}",
482
448
  )
483
449
  return numba_njit(cached_func, cache=True), cache_key
484
450
 
@@ -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)
@@ -14,11 +14,11 @@ from pytensor.link.numba.cache import (
14
14
  )
15
15
  from pytensor.link.numba.dispatch import basic as numba_basic
16
16
  from pytensor.link.numba.dispatch.basic import (
17
- create_tuple_string,
18
17
  numba_funcify_and_cache_key,
19
18
  register_funcify_and_cache_key,
20
19
  register_funcify_default_op_cache_key,
21
20
  )
21
+ from pytensor.link.numba.dispatch.string_codegen import create_tuple_string
22
22
  from pytensor.link.numba.dispatch.vectorize_codegen import (
23
23
  _vectorized,
24
24
  encode_literals,
@@ -466,6 +466,16 @@ def numba_funcify_DimShuffle(op: DimShuffle, node, **kwargs):
466
466
 
467
467
  return squeeze_to_0d
468
468
 
469
+ elif op.input_ndim == 0:
470
+ # DimShuffle can only be an expand_dims or a no_op
471
+ # This branch uses asarray in case we get a scalar due to https://github.com/numba/numba/issues/10358
472
+ new_shape = shape_template
473
+ new_strides = strides_template
474
+
475
+ @numba_basic.numba_njit
476
+ def dimshuffle(x):
477
+ return as_strided(np.asarray(x), shape=new_shape, strides=new_strides)
478
+
469
479
  else:
470
480
 
471
481
  @numba_basic.numba_njit
@@ -490,7 +500,7 @@ def numba_funcify_DimShuffle(op: DimShuffle, node, **kwargs):
490
500
 
491
501
  return as_strided(x, shape=new_shape, strides=new_strides)
492
502
 
493
- cache_version = 1
503
+ cache_version = 2
494
504
  return dimshuffle, cache_version
495
505
 
496
506