pytensor 2.24.2__tar.gz → 2.25.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. {pytensor-2.24.2/pytensor.egg-info → pytensor-2.25.0}/PKG-INFO +2 -2
  2. {pytensor-2.24.2 → pytensor-2.25.0}/doc/conf.py +5 -6
  3. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/config.rst +0 -104
  4. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/index.rst +2 -3
  5. {pytensor-2.24.2 → pytensor-2.25.0}/doc/troubleshooting.rst +1 -1
  6. {pytensor-2.24.2 → pytensor-2.25.0}/pyproject.toml +1 -1
  7. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/__init__.py +3 -5
  8. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/_version.py +3 -3
  9. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/compiledir.py +16 -22
  10. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/compilelock.py +3 -2
  11. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/debugmode.py +8 -9
  12. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/function/__init__.py +55 -44
  13. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/function/types.py +19 -22
  14. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/profiling.py +7 -9
  15. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/configdefaults.py +36 -105
  16. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/configparser.py +129 -21
  17. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/d3viz/d3viz.py +15 -18
  18. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/d3viz/formatting.py +3 -3
  19. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/gradient.py +2 -2
  20. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/basic.py +4 -2
  21. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/destroyhandler.py +3 -4
  22. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/fg.py +88 -89
  23. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/rewriting/basic.py +10 -12
  24. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/rewriting/utils.py +86 -96
  25. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/utils.py +1 -1
  26. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/c/basic.py +6 -8
  27. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/c/cmodule.py +20 -15
  28. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/c/cutils.py +13 -16
  29. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/c/lazylinker_c.py +20 -23
  30. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/c/op.py +26 -24
  31. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/c/params_type.py +5 -14
  32. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/c/type.py +4 -6
  33. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/elemwise.py +2 -2
  34. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/random.py +1 -0
  35. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/scalar.py +3 -9
  36. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/scan.py +2 -2
  37. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/tensor_basic.py +4 -8
  38. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +2 -4
  39. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/vm.py +5 -8
  40. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/misc/check_duplicate_key.py +10 -17
  41. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/misc/elemwise_openmp_speedup.py +2 -1
  42. pytensor-2.25.0/pytensor/misc/pkl_utils.py +64 -0
  43. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/printing.py +34 -37
  44. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/raise_op.py +12 -2
  45. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scalar/basic.py +5 -5
  46. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scalar/c_code/incbet.c +5 -3
  47. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scalar/loop.py +1 -1
  48. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scalar/math.py +13 -29
  49. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scan/op.py +3 -3
  50. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scan/rewriting.py +5 -5
  51. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scan/utils.py +8 -10
  52. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/sparse/basic.py +1 -1
  53. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/basic.py +4 -4
  54. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/blas.py +7 -6
  55. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/blas_headers.py +22 -31
  56. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/blockwise.py +2 -4
  57. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/elemwise.py +27 -42
  58. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/extra_ops.py +1 -1
  59. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/io.py +4 -2
  60. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/math.py +63 -175
  61. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/random/rewriting/basic.py +5 -8
  62. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/random/utils.py +13 -7
  63. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/elemwise.py +4 -5
  64. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/linalg.py +0 -6
  65. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/math.py +2 -5
  66. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/shape.py +6 -3
  67. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/shape.py +2 -4
  68. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/slinalg.py +1 -1
  69. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/subtensor.py +3 -5
  70. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/type.py +1 -1
  71. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/utils.py +31 -14
  72. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/variable.py +4 -6
  73. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/utils.py +22 -50
  74. {pytensor-2.24.2 → pytensor-2.25.0/pytensor.egg-info}/PKG-INFO +2 -2
  75. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor.egg-info/requires.txt +1 -1
  76. {pytensor-2.24.2 → pytensor-2.25.0}/tests/test_config.py +2 -2
  77. {pytensor-2.24.2 → pytensor-2.25.0}/tests/test_raise_op.py +1 -1
  78. {pytensor-2.24.2 → pytensor-2.25.0}/tests/test_rop.py +1 -3
  79. pytensor-2.24.2/pytensor/misc/pkl_utils.py +0 -302
  80. {pytensor-2.24.2 → pytensor-2.25.0}/LICENSE.txt +0 -0
  81. {pytensor-2.24.2 → pytensor-2.25.0}/MANIFEST.in +0 -0
  82. {pytensor-2.24.2 → pytensor-2.25.0}/README.rst +0 -0
  83. {pytensor-2.24.2 → pytensor-2.25.0}/doc/.templates/PLACEHOLDER +0 -0
  84. {pytensor-2.24.2 → pytensor-2.25.0}/doc/.templates/layout.html +0 -0
  85. {pytensor-2.24.2 → pytensor-2.25.0}/doc/LICENSE.txt +0 -0
  86. {pytensor-2.24.2 → pytensor-2.25.0}/doc/README.md +0 -0
  87. {pytensor-2.24.2 → pytensor-2.25.0}/doc/acknowledgement.rst +0 -0
  88. {pytensor-2.24.2 → pytensor-2.25.0}/doc/bcast.png +0 -0
  89. {pytensor-2.24.2 → pytensor-2.25.0}/doc/bcast.svg +0 -0
  90. {pytensor-2.24.2 → pytensor-2.25.0}/doc/core_development_guide.rst +0 -0
  91. {pytensor-2.24.2 → pytensor-2.25.0}/doc/css.inc +0 -0
  92. {pytensor-2.24.2 → pytensor-2.25.0}/doc/dev_start_guide.rst +0 -0
  93. {pytensor-2.24.2 → pytensor-2.25.0}/doc/environment.yml +0 -0
  94. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/apply.png +0 -0
  95. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/apply.svg +0 -0
  96. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/apply2.svg +0 -0
  97. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/creating_a_c_op.rst +0 -0
  98. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  99. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/creating_an_op.rst +0 -0
  100. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/ctype.rst +0 -0
  101. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/extending_faq.rst +0 -0
  102. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
  103. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/graph_rewriting.rst +0 -0
  104. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/graphstructures.rst +0 -0
  105. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/index.rst +0 -0
  106. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/inplace.rst +0 -0
  107. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/op.rst +0 -0
  108. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/other_ops.rst +0 -0
  109. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  110. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  111. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/pipeline.rst +0 -0
  112. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/scan.rst +0 -0
  113. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/tips.rst +0 -0
  114. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/type.rst +0 -0
  115. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/unittest.rst +0 -0
  116. {pytensor-2.24.2 → pytensor-2.25.0}/doc/extending/using_params.rst +0 -0
  117. {pytensor-2.24.2 → pytensor-2.25.0}/doc/faq.rst +0 -0
  118. {pytensor-2.24.2 → pytensor-2.25.0}/doc/generate_dtype_tensor_table.py +0 -0
  119. {pytensor-2.24.2 → pytensor-2.25.0}/doc/glossary.rst +0 -0
  120. {pytensor-2.24.2 → pytensor-2.25.0}/doc/images/Elman_srnn.png +0 -0
  121. {pytensor-2.24.2 → pytensor-2.25.0}/doc/images/PyTensor_RGB.svg +0 -0
  122. {pytensor-2.24.2 → pytensor-2.25.0}/doc/images/blocksparse.png +0 -0
  123. {pytensor-2.24.2 → pytensor-2.25.0}/doc/images/lstm.png +0 -0
  124. {pytensor-2.24.2 → pytensor-2.25.0}/doc/images/lstm_memorycell.png +0 -0
  125. {pytensor-2.24.2 → pytensor-2.25.0}/doc/images/talk2010.gif +0 -0
  126. {pytensor-2.24.2 → pytensor-2.25.0}/doc/images/talk2010.png +0 -0
  127. {pytensor-2.24.2 → pytensor-2.25.0}/doc/index.rst +0 -0
  128. {pytensor-2.24.2 → pytensor-2.25.0}/doc/install.rst +0 -0
  129. {pytensor-2.24.2 → pytensor-2.25.0}/doc/internal/how_to_release.rst +0 -0
  130. {pytensor-2.24.2 → pytensor-2.25.0}/doc/internal/index.rst +0 -0
  131. {pytensor-2.24.2 → pytensor-2.25.0}/doc/internal/metadocumentation.rst +0 -0
  132. {pytensor-2.24.2 → pytensor-2.25.0}/doc/introduction.rst +0 -0
  133. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/compile/debugmode.rst +0 -0
  134. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/compile/function.rst +0 -0
  135. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/compile/index.rst +0 -0
  136. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/compile/io.rst +0 -0
  137. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/compile/mode.rst +0 -0
  138. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/compile/nanguardmode.rst +0 -0
  139. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/compile/opfromgraph.rst +0 -0
  140. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/compile/ops.rst +0 -0
  141. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/compile/profilemode.rst +0 -0
  142. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/compile/shared.rst +0 -0
  143. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  144. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  145. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  146. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  147. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  148. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  149. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  150. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/mlp.html +0 -0
  151. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/mlp.png +0 -0
  152. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/mlp2.html +0 -0
  153. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  154. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/mlp2.png +0 -0
  155. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/ofg.html +0 -0
  156. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/examples/ofg2.html +0 -0
  157. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/index.ipynb +0 -0
  158. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  159. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  160. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  161. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  162. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/gradient.rst +0 -0
  163. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/graph/features.rst +0 -0
  164. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/graph/fgraph.rst +0 -0
  165. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/graph/graph.rst +0 -0
  166. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/graph/index.rst +0 -0
  167. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/graph/op.rst +0 -0
  168. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/graph/type.rst +0 -0
  169. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/graph/utils.rst +0 -0
  170. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/index.rst +0 -0
  171. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/misc/pkl_utils.rst +0 -0
  172. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/printing.rst +0 -0
  173. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/sandbox/index.rst +0 -0
  174. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/sandbox/linalg.rst +0 -0
  175. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/scalar/index.rst +0 -0
  176. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/scan.rst +0 -0
  177. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/sparse/index.rst +0 -0
  178. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/sparse/sandbox.rst +0 -0
  179. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/basic.rst +0 -0
  180. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/basic_opt.rst +0 -0
  181. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/bcast.png +0 -0
  182. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/bcast.svg +0 -0
  183. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/conv.rst +0 -0
  184. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/elemwise.rst +0 -0
  185. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/extra_ops.rst +0 -0
  186. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/fft.rst +0 -0
  187. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/index.rst +0 -0
  188. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/io.rst +0 -0
  189. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/math_opt.rst +0 -0
  190. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/nlinalg.rst +0 -0
  191. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/plot_fft.png +0 -0
  192. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/random/basic.rst +0 -0
  193. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/random/index.rst +0 -0
  194. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/random/utils.rst +0 -0
  195. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/slinalg.rst +0 -0
  196. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/tensor/utils.rst +0 -0
  197. {pytensor-2.24.2 → pytensor-2.25.0}/doc/library/typed_list.rst +0 -0
  198. {pytensor-2.24.2 → pytensor-2.25.0}/doc/links.rst +0 -0
  199. {pytensor-2.24.2 → pytensor-2.25.0}/doc/optimizations.rst +0 -0
  200. {pytensor-2.24.2 → pytensor-2.25.0}/doc/pylintrc +0 -0
  201. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/ccodegen.rst +0 -0
  202. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/compilation.rst +0 -0
  203. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/debugging_with_stepmode.rst +0 -0
  204. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/elemwise_compiler.rst +0 -0
  205. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/function.rst +0 -0
  206. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/functional.rst +0 -0
  207. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/how_to_make_ops.rst +0 -0
  208. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/index.rst +0 -0
  209. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/index2.rst +0 -0
  210. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/interactive_debugger.rst +0 -0
  211. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/logistic_regression_example.rst +0 -0
  212. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/performance.rst +0 -0
  213. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/randomnumbers.rst +0 -0
  214. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/rethinkccodegen.rst +0 -0
  215. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/sandbox.rst +0 -0
  216. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/software.rst +0 -0
  217. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/sparse.rst +0 -0
  218. {pytensor-2.24.2 → pytensor-2.25.0}/doc/sandbox/tensoroptools.rst +0 -0
  219. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/adding.rst +0 -0
  220. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/adding_solution_1.py +0 -0
  221. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/aliasing.rst +0 -0
  222. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/apply.png +0 -0
  223. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/apply.svg +0 -0
  224. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/bcast.png +0 -0
  225. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/broadcasting.rst +0 -0
  226. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/conditions.rst +0 -0
  227. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/debug_faq.rst +0 -0
  228. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/dlogistic.png +0 -0
  229. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/examples.rst +0 -0
  230. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/faq_tutorial.rst +0 -0
  231. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/gradients.rst +0 -0
  232. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/index.rst +0 -0
  233. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/loading_and_saving.rst +0 -0
  234. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/logistic.gp +0 -0
  235. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/logistic.png +0 -0
  236. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/loop.rst +0 -0
  237. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/loop_solution_1.py +0 -0
  238. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/modes.rst +0 -0
  239. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/modes_solution_1.py +0 -0
  240. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/multi_cores.rst +0 -0
  241. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/nan_tutorial.rst +0 -0
  242. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/pics/d3viz.png +0 -0
  243. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  244. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  245. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  246. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/printing_drawing.rst +0 -0
  247. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/profiling.rst +0 -0
  248. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/profiling_example.py +0 -0
  249. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/profiling_example_out.prof +0 -0
  250. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/shape_info.rst +0 -0
  251. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/sparse.rst +0 -0
  252. {pytensor-2.24.2 → pytensor-2.25.0}/doc/tutorial/symbolic_graphs.rst +0 -0
  253. {pytensor-2.24.2 → pytensor-2.25.0}/doc/user_guide.rst +0 -0
  254. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/bin/__init__.py +0 -0
  255. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/bin/pytensor_cache.py +0 -0
  256. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/breakpoint.py +0 -0
  257. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/__init__.py +0 -0
  258. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/builders.py +0 -0
  259. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/function/pfunc.py +0 -0
  260. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/io.py +0 -0
  261. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/mode.py +0 -0
  262. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/monitormode.py +0 -0
  263. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/nanguardmode.py +0 -0
  264. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/ops.py +0 -0
  265. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/compile/sharedvalue.py +0 -0
  266. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/d3viz/__init__.py +0 -0
  267. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  268. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/d3viz/css/d3viz.css +0 -0
  269. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  270. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  271. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/d3viz/js/d3viz.js +0 -0
  272. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  273. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  274. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/__init__.py +0 -0
  275. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/features.py +0 -0
  276. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/null_type.py +0 -0
  277. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/op.py +0 -0
  278. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/replace.py +0 -0
  279. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/rewriting/__init__.py +0 -0
  280. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/rewriting/db.py +0 -0
  281. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/rewriting/kanren.py +0 -0
  282. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/rewriting/unify.py +0 -0
  283. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/graph/type.py +0 -0
  284. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/ifelse.py +0 -0
  285. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/__init__.py +0 -0
  286. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/basic.py +0 -0
  287. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/c/__init__.py +0 -0
  288. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  289. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  290. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/c/cvm.py +0 -0
  291. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/c/exceptions.py +0 -0
  292. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/c/interface.py +0 -0
  293. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/__init__.py +0 -0
  294. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/__init__.py +0 -0
  295. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/basic.py +0 -0
  296. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  297. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  298. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  299. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  300. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/random.py +0 -0
  301. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/scalar.py +0 -0
  302. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/scan.py +0 -0
  303. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/shape.py +0 -0
  304. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/slinalg.py +0 -0
  305. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/sort.py +0 -0
  306. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
  307. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  308. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  309. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/jax/linker.py +0 -0
  310. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/__init__.py +0 -0
  311. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/__init__.py +0 -0
  312. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/basic.py +0 -0
  313. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  314. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  315. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
  316. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/slinalg.py +0 -0
  317. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/sparse.py +0 -0
  318. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  319. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/numba/linker.py +0 -0
  320. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  321. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  322. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  323. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  324. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  325. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/pytorch/linker.py +0 -0
  326. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/link/utils.py +0 -0
  327. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/misc/__init__.py +0 -0
  328. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/misc/check_blas.py +0 -0
  329. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/misc/check_blas_many.sh +0 -0
  330. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/misc/elemwise_time_test.py +0 -0
  331. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/misc/frozendict.py +0 -0
  332. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/misc/may_share_memory.py +0 -0
  333. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/misc/ordered_set.py +0 -0
  334. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/misc/safe_asarray.py +0 -0
  335. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/py.typed +0 -0
  336. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scalar/__init__.py +0 -0
  337. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  338. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  339. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scalar/c_code/gamma.c +0 -0
  340. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scalar/sharedvar.py +0 -0
  341. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scan/__init__.py +0 -0
  342. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scan/basic.py +0 -0
  343. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scan/checkpoints.py +0 -0
  344. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scan/scan_perform.pyx +0 -0
  345. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scan/scan_perform_ext.py +0 -0
  346. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/scan/views.py +0 -0
  347. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/sparse/__init__.py +0 -0
  348. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/sparse/rewriting.py +0 -0
  349. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/sparse/sandbox/__init__.py +0 -0
  350. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/sparse/sandbox/sp.py +0 -0
  351. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/sparse/sandbox/sp2.py +0 -0
  352. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/sparse/sharedvar.py +0 -0
  353. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/sparse/type.py +0 -0
  354. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/sparse/utils.py +0 -0
  355. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/__init__.py +0 -0
  356. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/blas_c.py +0 -0
  357. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/blas_scipy.py +0 -0
  358. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  359. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  360. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  361. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/conv/__init__.py +0 -0
  362. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/conv/abstract_conv.py +0 -0
  363. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/elemwise_cgen.py +0 -0
  364. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/exceptions.py +0 -0
  365. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/fft.py +0 -0
  366. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/fourier.py +0 -0
  367. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/functional.py +0 -0
  368. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/inplace.py +0 -0
  369. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/linalg.py +0 -0
  370. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/nlinalg.py +0 -0
  371. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/random/__init__.py +0 -0
  372. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/random/basic.py +0 -0
  373. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/random/op.py +0 -0
  374. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  375. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
  376. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
  377. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/random/type.py +0 -0
  378. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/random/var.py +0 -0
  379. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/__init__.py +0 -0
  380. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/basic.py +0 -0
  381. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/blas.py +0 -0
  382. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/blas_c.py +0 -0
  383. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
  384. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/blockwise.py +0 -0
  385. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  386. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/jax.py +0 -0
  387. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/special.py +0 -0
  388. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/subtensor.py +0 -0
  389. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  390. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/sharedvar.py +0 -0
  391. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/sort.py +0 -0
  392. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/special.py +0 -0
  393. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/type_other.py +0 -0
  394. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/var.py +0 -0
  395. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/tensor/xlogx.py +0 -0
  396. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/typed_list/__init__.py +0 -0
  397. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/typed_list/basic.py +0 -0
  398. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/typed_list/rewriting.py +0 -0
  399. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/typed_list/type.py +0 -0
  400. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/updates.py +0 -0
  401. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor/version.py +0 -0
  402. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor.egg-info/SOURCES.txt +0 -0
  403. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor.egg-info/dependency_links.txt +0 -0
  404. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor.egg-info/entry_points.txt +0 -0
  405. {pytensor-2.24.2 → pytensor-2.25.0}/pytensor.egg-info/top_level.txt +0 -0
  406. {pytensor-2.24.2 → pytensor-2.25.0}/scripts/mypy-failing.txt +0 -0
  407. {pytensor-2.24.2 → pytensor-2.25.0}/setup.cfg +0 -0
  408. {pytensor-2.24.2 → pytensor-2.25.0}/setup.py +0 -0
  409. {pytensor-2.24.2 → pytensor-2.25.0}/tests/link/c/c_code/test_cenum.h +0 -0
  410. {pytensor-2.24.2 → pytensor-2.25.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  411. {pytensor-2.24.2 → pytensor-2.25.0}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
  412. {pytensor-2.24.2 → pytensor-2.25.0}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
  413. {pytensor-2.24.2 → pytensor-2.25.0}/tests/test_breakpoint.py +0 -0
  414. {pytensor-2.24.2 → pytensor-2.25.0}/tests/test_gradient.py +0 -0
  415. {pytensor-2.24.2 → pytensor-2.25.0}/tests/test_ifelse.py +0 -0
  416. {pytensor-2.24.2 → pytensor-2.25.0}/tests/test_printing.py +0 -0
  417. {pytensor-2.24.2 → pytensor-2.25.0}/tests/test_updates.py +0 -0
  418. {pytensor-2.24.2 → pytensor-2.25.0}/versioneer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytensor
3
- Version: 2.24.2
3
+ Version: 2.25.0
4
4
  Summary: Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs.
5
5
  Author-email: pymc-devs <pymc.devs@gmail.com>
6
6
  License: .. _license:
@@ -75,7 +75,7 @@ License-File: LICENSE.txt
75
75
  Requires-Dist: setuptools>=59.0.0
76
76
  Requires-Dist: scipy<1.14,>=0.14
77
77
  Requires-Dist: numpy<2,>=1.17.0
78
- Requires-Dist: filelock
78
+ Requires-Dist: filelock>=3.15
79
79
  Requires-Dist: etuples
80
80
  Requires-Dist: logical-unification
81
81
  Requires-Dist: miniKanren
@@ -12,11 +12,12 @@
12
12
  # serve to show the default value.
13
13
 
14
14
  # If your extensions are in another directory, add it here. If the directory
15
- # is relative to the documentation root, use os.path.abspath to make it
15
+ # is relative to the documentation root, use Path.absolute to make it
16
16
  # absolute, like shown here.
17
- # sys.path.append(os.path.abspath('some/directory'))
17
+ # sys.path.append(str(Path("some/directory").absolute()))
18
18
 
19
19
  import os
20
+ import inspect
20
21
  import sys
21
22
  import pytensor
22
23
 
@@ -236,11 +237,9 @@ def linkcode_resolve(domain, info):
236
237
  obj = sys.modules[info["module"]]
237
238
  for part in info["fullname"].split("."):
238
239
  obj = getattr(obj, part)
239
- import inspect
240
- import os
241
240
 
242
- fn = inspect.getsourcefile(obj)
243
- fn = os.path.relpath(fn, start=os.path.dirname(pytensor.__file__))
241
+ fn = Path(inspect.getsourcefile(obj))
242
+ fn = fn.relative_to(Path(__file__).parent)
244
243
  source, lineno = inspect.getsourcelines(obj)
245
244
  return fn, lineno, lineno + len(source) - 1
246
245
 
@@ -510,116 +510,12 @@ import ``pytensor`` and print the config variable, as in:
510
510
 
511
511
  Removing these asserts can speed up execution.
512
512
 
513
- .. attribute:: config.dnn__enabled
514
-
515
- String value: ``'auto'``, ``'True'``, ``'False'``, ``'no_check'``
516
-
517
- Default: ``'auto'``
518
-
519
- If ``'auto'``, automatically detect and use
520
- `cuDNN <https://developer.nvidia.com/cudnn>`_ when it is available.
521
- If cuDNN is unavailable, do not raise an error.
522
-
523
- If ``'True'``, require the use of cuDNN. If cuDNN is unavailable, raise an error.
524
-
525
- If ``'False'``, neither use cuDNN nor check if it is available.
526
-
527
- If ``'no_check'``, assume cuDNN is present and that the versions between the
528
- header and library match.
529
-
530
- .. attribute:: config.dnn__include_path
531
-
532
- Default: ``include`` sub-folder in CUDA root directory, or headers paths defined for the compiler.
533
-
534
- Location of the cuDNN header.
535
-
536
- .. attribute:: config.dnn__library_path
537
-
538
- Default: Library sub-folder (``lib64`` on Linux) in CUDA root directory, or
539
- libraries paths defined for the compiler.
540
-
541
- Location of the cuDNN library.
542
-
543
513
  .. attribute:: config.conv__assert_shape
544
514
 
545
515
  If ``True``, ``AbstractConv*`` :class:`Op`\s will verify that user-provided shapes
546
516
  match the run-time shapes. This is a debugging option, and may slow down
547
517
  compilation.
548
518
 
549
- .. attribute:: config.dnn.conv.workmem
550
-
551
- Deprecated, use :attr:`config.dnn__conv__algo_fwd`.
552
-
553
-
554
- .. attribute:: config.dnn.conv.workmem_bwd
555
-
556
- Deprecated, use :attr:`config.dnn__conv__algo_bwd_filter` and
557
- :attr:`config.dnn__conv__algo_bwd_data` instead.
558
-
559
- .. attribute:: config.dnn__conv__algo_fwd
560
-
561
- String value:
562
- ``'small'``, ``'none'``, ``'large'``, ``'fft'``, ``'fft_tiling'``,
563
- ``'winograd'``, ``'winograd_non_fused'``, ``'guess_once'``, ``'guess_on_shape_change'``,
564
- ``'time_once'``, ``'time_on_shape_change'``.
565
-
566
- Default: ``'small'``
567
-
568
- 3d convolution only support ``'none'``, ``'small'``, ``'fft_tiling'``, ``'guess_once'``,
569
- ``'guess_on_shape_change'``, ``'time_once'``, ``'time_on_shape_change'``.
570
-
571
- .. attribute:: config.dnn.conv.algo_bwd
572
-
573
- Deprecated, use :attr:`config.dnn__conv__algo_bwd_filter` and
574
- :attr:`config.dnn__conv__algo_bwd_data` instead.
575
-
576
- .. attribute:: config.dnn__conv__algo_bwd_filter
577
-
578
- String value:
579
- ``'none'``, ``'deterministic'``, ``'fft'``, ``'small'``, ``'winograd_non_fused'``, ``'fft_tiling'``, ``'guess_once'``,
580
- ``'guess_on_shape_change'``, ``'time_once'``, ``'time_on_shape_change'``.
581
-
582
- Default: ``'none'``
583
-
584
- 3d convolution only supports ``'none'``, ``'small'``, ``'guess_once'``,
585
- ``'guess_on_shape_change'``, ``'time_once'``, ``'time_on_shape_change'``.
586
-
587
- .. attribute:: config.dnn__conv__algo_bwd_data
588
-
589
- String value:
590
- ``'none'``, ``'deterministic'``, ``'fft'``, ``'fft_tiling'``, ``'winograd'``,
591
- ``'winograd_non_fused'``, ``'guess_once'``, ``'guess_on_shape_change'``, ``'time_once'``,
592
- ``'time_on_shape_change'``.
593
-
594
- Default: ``'none'``
595
-
596
- 3d convolution only supports ``'none'``, ``'deterministic'``, ``'fft_tiling'``
597
- ``'guess_once'``, ``'guess_on_shape_change'``, ``'time_once'``,
598
- ``'time_on_shape_change'``.
599
-
600
- .. attribute:: config.magma__enabled
601
-
602
- String value: ``'True'``, ``'False'``
603
-
604
- Default: ``'False'``
605
-
606
- If ``'True'``, use `magma <http://icl.cs.utk.edu/magma/>`_ for matrix
607
- computations.
608
-
609
- If ``'False'``, disable magma.
610
-
611
- .. attribute:: config.magma__include_path
612
-
613
- Default: ``''``
614
-
615
- Location of the magma headers.
616
-
617
- .. attribute:: config.magma__library_path
618
-
619
- Default: ``''``
620
-
621
- Location of the magma library.
622
-
623
519
  .. attribute:: config.ctc__root
624
520
 
625
521
  Default: ``''``
@@ -76,10 +76,9 @@ visualize it with :py:func:`pytensor.printing.pydotprint` as follows:
76
76
  .. code:: python
77
77
 
78
78
  from pytensor.printing import pydotprint
79
- import os
79
+ from pathlib import Path
80
80
 
81
- if not os.path.exists('examples'):
82
- os.makedirs('examples')
81
+ Path("examples").mkdir(exist_ok=True)
83
82
  pydotprint(predict, 'examples/mlp.png')
84
83
 
85
84
 
@@ -259,7 +259,7 @@ PyTensor/BLAS speed test:
259
259
 
260
260
  .. code-block:: bash
261
261
 
262
- python `python -c "import os, pytensor; print(os.path.dirname(pytensor.__file__))"`/misc/check_blas.py
262
+ python $(python -c "import pathlib, pytensor; print(pathlib.Path(pytensor.__file__).parent / 'misc/check_blas.py')")
263
263
 
264
264
  This will print a table with different versions of BLAS/numbers of
265
265
  threads on multiple CPUs. It will also print some PyTensor/NumPy
@@ -49,7 +49,7 @@ dependencies = [
49
49
  "setuptools>=59.0.0",
50
50
  "scipy>=0.14,<1.14",
51
51
  "numpy>=1.17.0,<2",
52
- "filelock",
52
+ "filelock>=3.15",
53
53
  "etuples",
54
54
  "logical-unification",
55
55
  "miniKanren",
@@ -23,9 +23,9 @@ __docformat__ = "restructuredtext en"
23
23
  # Set a default logger. It is important to do this before importing some other
24
24
  # pytensor code, since this code may want to log some messages.
25
25
  import logging
26
- import os
27
26
  import sys
28
27
  from functools import singledispatch
28
+ from pathlib import Path
29
29
  from typing import Any, NoReturn, Optional
30
30
 
31
31
  from pytensor.version import version as __version__
@@ -52,10 +52,8 @@ def disable_log_handler(logger=pytensor_logger, handler=logging_default_handler)
52
52
 
53
53
  # Raise a meaningful warning/error if the pytensor directory is in the Python
54
54
  # path.
55
- rpath = os.path.realpath(__path__[0])
56
- for p in sys.path:
57
- if os.path.realpath(p) != rpath:
58
- continue
55
+ rpath = Path(__file__).parent.resolve()
56
+ if any(rpath == Path(p).resolve() for p in sys.path):
59
57
  raise RuntimeError("You have the pytensor directory in your Python path.")
60
58
 
61
59
  from pytensor.configdefaults import config
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2024-07-08T14:11:01+0200",
11
+ "date": "2024-07-09T17:06:59+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "7f623fefbed89442737fd6d8ba11c32d2eab65ed",
15
- "version": "2.24.2"
14
+ "full-revisionid": "a6e79f28775c39996fb746bf3f369b422c94cfcf",
15
+ "version": "2.25.0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -4,7 +4,6 @@ It is used by the "pytensor-cache" CLI tool, located in the /bin folder of the r
4
4
  """
5
5
 
6
6
  import logging
7
- import os
8
7
  import pickle
9
8
  import shutil
10
9
  from collections import Counter
@@ -33,12 +32,11 @@ def cleanup():
33
32
  If there is no key left for a compiled module, we delete the module.
34
33
 
35
34
  """
36
- compiledir = config.compiledir
37
- for directory in os.listdir(compiledir):
35
+ for directory in config.compiledir.iterdir():
38
36
  try:
39
- filename = os.path.join(compiledir, directory, "key.pkl")
37
+ filename = directory / "key.pkl"
40
38
  # print file
41
- with open(filename, "rb") as file:
39
+ with filename.open("rb") as file:
42
40
  try:
43
41
  keydata = pickle.load(file)
44
42
 
@@ -79,7 +77,7 @@ def cleanup():
79
77
  "the directory containing it."
80
78
  )
81
79
  if len(keydata.keys) == 0:
82
- shutil.rmtree(os.path.join(compiledir, directory))
80
+ shutil.rmtree(directory)
83
81
 
84
82
  except (EOFError, AttributeError):
85
83
  _logger.error(
@@ -117,11 +115,11 @@ def print_compiledir_content():
117
115
  big_key_files = []
118
116
  total_key_sizes = 0
119
117
  nb_keys = Counter()
120
- for dir in os.listdir(compiledir):
121
- filename = os.path.join(compiledir, dir, "key.pkl")
122
- if not os.path.exists(filename):
118
+ for dir in config.compiledir.iterdir():
119
+ filename = dir / "key.pkl"
120
+ if not filename.exists():
123
121
  continue
124
- with open(filename, "rb") as file:
122
+ with filename.open("rb") as file:
125
123
  try:
126
124
  keydata = pickle.load(file)
127
125
  ops = list({x for x in flatten(keydata.keys) if isinstance(x, Op)})
@@ -134,15 +132,11 @@ def print_compiledir_content():
134
132
  {x for x in flatten(keydata.keys) if isinstance(x, CType)}
135
133
  )
136
134
  compile_start = compile_end = float("nan")
137
- for fn in os.listdir(os.path.join(compiledir, dir)):
138
- if fn.startswith("mod.c"):
139
- compile_start = os.path.getmtime(
140
- os.path.join(compiledir, dir, fn)
141
- )
142
- elif fn.endswith(".so"):
143
- compile_end = os.path.getmtime(
144
- os.path.join(compiledir, dir, fn)
145
- )
135
+ for fn in dir.iterdir():
136
+ if fn.name == "mod.c":
137
+ compile_start = fn.stat().st_mtime
138
+ elif fn.suffix == ".so":
139
+ compile_end = fn.stat().st_mtime
146
140
  compile_time = compile_end - compile_start
147
141
  if len(ops) == 1:
148
142
  table.append((dir, ops[0], types, compile_time))
@@ -153,7 +147,7 @@ def print_compiledir_content():
153
147
  (dir, ops_to_str, types_to_str, compile_time)
154
148
  )
155
149
 
156
- size = os.path.getsize(filename)
150
+ size = filename.stat().st_size
157
151
  total_key_sizes += size
158
152
  if size > max_key_file_size:
159
153
  big_key_files.append((dir, size, ops))
@@ -239,8 +233,8 @@ def basecompiledir_ls():
239
233
  """
240
234
  subdirs = []
241
235
  others = []
242
- for f in os.listdir(config.base_compiledir):
243
- if os.path.isdir(os.path.join(config.base_compiledir, f)):
236
+ for f in config.base_compiledir.iterdir():
237
+ if f.is_dir():
244
238
  subdirs.append(f)
245
239
  else:
246
240
  others.append(f)
@@ -6,6 +6,7 @@ in the same compilation directory (which can cause crashes).
6
6
  import os
7
7
  import threading
8
8
  from contextlib import contextmanager
9
+ from pathlib import Path
9
10
 
10
11
  import filelock
11
12
 
@@ -35,7 +36,7 @@ def force_unlock(lock_dir: os.PathLike):
35
36
  Path to a directory that was locked with `lock_ctx`.
36
37
  """
37
38
 
38
- fl = filelock.FileLock(os.path.join(lock_dir, ".lock"))
39
+ fl = filelock.FileLock(Path(lock_dir) / ".lock")
39
40
  fl.release(force=True)
40
41
 
41
42
  dir_key = f"{lock_dir}-{os.getpid()}"
@@ -72,7 +73,7 @@ def lock_ctx(
72
73
 
73
74
  if dir_key not in local_mem._locks:
74
75
  local_mem._locks[dir_key] = True
75
- fl = filelock.FileLock(os.path.join(lock_dir, ".lock"))
76
+ fl = filelock.FileLock(Path(lock_dir) / ".lock")
76
77
  fl.acquire(timeout=timeout)
77
78
  try:
78
79
  yield
@@ -30,6 +30,7 @@ from pytensor.configdefaults import config
30
30
  from pytensor.graph.basic import Variable, io_toposort
31
31
  from pytensor.graph.destroyhandler import DestroyHandler
32
32
  from pytensor.graph.features import AlreadyThere, BadOptimization
33
+ from pytensor.graph.fg import Output
33
34
  from pytensor.graph.op import HasInnerGraph, Op
34
35
  from pytensor.graph.utils import InconsistencyError, MethodNotDefined
35
36
  from pytensor.link.basic import Container, LocalLinker
@@ -628,7 +629,9 @@ def _is_used_in_graph(fgraph, var):
628
629
  True if `var` is used by another node in the graph.
629
630
 
630
631
  """
631
- return not (fgraph.clients[var] == [("output", 1)] or fgraph.clients[var] == [])
632
+ return any(
633
+ client for client, _ in fgraph.clients[var] if not isinstance(client.op, Output)
634
+ )
632
635
 
633
636
 
634
637
  def _check_strides_match(a, b, warn_err, op):
@@ -977,7 +980,7 @@ def _check_preallocated_output(
977
980
  # disable memory checks in that mode, since they were already run.
978
981
  try:
979
982
  changed_inner_mode = False
980
- if isinstance(getattr(node, "op", None), HasInnerGraph):
983
+ if isinstance(node.op, HasInnerGraph):
981
984
  fn = node.op.fn
982
985
  if not (fn and hasattr(fn, "maker") and hasattr(fn.maker, "mode")):
983
986
  _logger.warning(f"Expected pytensor function not found in {node.op}.fn")
@@ -1132,18 +1135,14 @@ class _FunctionGraphEvent:
1132
1135
 
1133
1136
  def __init__(self, kind, node, idx=None, reason=None):
1134
1137
  self.kind = kind
1135
- if node == "output":
1136
- self.node = "output"
1137
- self.op = "output"
1138
- else:
1139
- self.node = node
1140
- self.op = node.op
1138
+ self.node = node
1139
+ self.op = node.op
1141
1140
  self.idx = idx
1142
1141
  self.reason = str(reason)
1143
1142
 
1144
1143
  def __str__(self):
1145
1144
  if self.kind == "change":
1146
- if self.op != "output":
1145
+ if not isinstance(self.op, Output):
1147
1146
  msg = str(len(self.node.inputs))
1148
1147
  else:
1149
1148
  msg = ""
@@ -1,9 +1,15 @@
1
1
  import logging
2
2
  import re
3
3
  import traceback as tb
4
+ from collections.abc import Iterable
5
+ from pathlib import Path
4
6
 
7
+ import pytensor.misc.pkl_utils
5
8
  from pytensor.compile.function.pfunc import pfunc
6
9
  from pytensor.compile.function.types import orig_function
10
+ from pytensor.compile.mode import Mode
11
+ from pytensor.compile.profiling import ProfileStats
12
+ from pytensor.graph import Variable
7
13
 
8
14
 
9
15
  __all__ = ["types", "pfunc"]
@@ -13,20 +19,24 @@ _logger = logging.getLogger("pytensor.compile.function")
13
19
 
14
20
 
15
21
  def function_dump(
16
- filename,
17
- inputs,
18
- outputs=None,
19
- mode=None,
20
- updates=None,
21
- givens=None,
22
- no_default_updates=False,
23
- accept_inplace=False,
24
- name=None,
25
- rebuild_strict=True,
26
- allow_input_downcast=None,
27
- profile=None,
28
- on_unused_input=None,
29
- extra_tag_to_remove=None,
22
+ filename: str | Path,
23
+ inputs: Iterable[Variable],
24
+ outputs: Variable | Iterable[Variable] | dict[str, Variable] | None = None,
25
+ mode: str | Mode | None = None,
26
+ updates: Iterable[tuple[Variable, Variable]]
27
+ | dict[Variable, Variable]
28
+ | None = None,
29
+ givens: Iterable[tuple[Variable, Variable]]
30
+ | dict[Variable, Variable]
31
+ | None = None,
32
+ no_default_updates: bool = False,
33
+ accept_inplace: bool = False,
34
+ name: str | None = None,
35
+ rebuild_strict: bool = True,
36
+ allow_input_downcast: bool | None = None,
37
+ profile: bool | ProfileStats | None = None,
38
+ on_unused_input: str | None = None,
39
+ extra_tag_to_remove: str | None = None,
30
40
  ):
31
41
  """
32
42
  This is helpful to make a reproducible case for problems during PyTensor
@@ -59,24 +69,21 @@ def function_dump(
59
69
  `['annotations', 'replacement_of', 'aggregation_scheme', 'roles']`
60
70
 
61
71
  """
62
- assert isinstance(filename, str)
63
- d = dict(
64
- inputs=inputs,
65
- outputs=outputs,
66
- mode=mode,
67
- updates=updates,
68
- givens=givens,
69
- no_default_updates=no_default_updates,
70
- accept_inplace=accept_inplace,
71
- name=name,
72
- rebuild_strict=rebuild_strict,
73
- allow_input_downcast=allow_input_downcast,
74
- profile=profile,
75
- on_unused_input=on_unused_input,
76
- )
77
- with open(filename, "wb") as f:
78
- import pytensor.misc.pkl_utils
79
-
72
+ d = {
73
+ "inputs": inputs,
74
+ "outputs": outputs,
75
+ "mode": mode,
76
+ "updates": updates,
77
+ "givens": givens,
78
+ "no_default_updates": no_default_updates,
79
+ "accept_inplace": accept_inplace,
80
+ "name": name,
81
+ "rebuild_strict": rebuild_strict,
82
+ "allow_input_downcast": allow_input_downcast,
83
+ "profile": profile,
84
+ "on_unused_input": on_unused_input,
85
+ }
86
+ with Path(filename).open("wb") as f:
80
87
  pickler = pytensor.misc.pkl_utils.StripPickler(
81
88
  f, protocol=-1, extra_tag_to_remove=extra_tag_to_remove
82
89
  )
@@ -84,18 +91,22 @@ def function_dump(
84
91
 
85
92
 
86
93
  def function(
87
- inputs,
88
- outputs=None,
89
- mode=None,
90
- updates=None,
91
- givens=None,
92
- no_default_updates=False,
93
- accept_inplace=False,
94
- name=None,
95
- rebuild_strict=True,
96
- allow_input_downcast=None,
97
- profile=None,
98
- on_unused_input=None,
94
+ inputs: Iterable[Variable],
95
+ outputs: Variable | Iterable[Variable] | dict[str, Variable] | None = None,
96
+ mode: str | Mode | None = None,
97
+ updates: Iterable[tuple[Variable, Variable]]
98
+ | dict[Variable, Variable]
99
+ | None = None,
100
+ givens: Iterable[tuple[Variable, Variable]]
101
+ | dict[Variable, Variable]
102
+ | None = None,
103
+ no_default_updates: bool = False,
104
+ accept_inplace: bool = False,
105
+ name: str | None = None,
106
+ rebuild_strict: bool = True,
107
+ allow_input_downcast: bool | None = None,
108
+ profile: bool | ProfileStats | None = None,
109
+ on_unused_input: str | None = None,
99
110
  ):
100
111
  """
101
112
  Return a :class:`callable object <pytensor.compile.function.types.Function>`
@@ -78,8 +78,6 @@ def view_tree_set(fgraph, v, treeset):
78
78
  """
79
79
  treeset.add(v)
80
80
  for cl, v_input_pos_to_cl in fgraph.clients[v]:
81
- if cl == "output":
82
- continue
83
81
  vmap = cl.op.view_map
84
82
  dmap = cl.op.destroy_map
85
83
  for opos, iposlist in chain(vmap.items(), dmap.items()):
@@ -661,7 +659,7 @@ class Function:
661
659
  exist_svs = [i.variable for i in maker.inputs]
662
660
 
663
661
  # Check if given ShareVariables exist
664
- for sv in swap.keys():
662
+ for sv in swap:
665
663
  if sv not in exist_svs:
666
664
  raise ValueError(f"SharedVariable: {sv.name} not found")
667
665
 
@@ -713,9 +711,9 @@ class Function:
713
711
  # it is well tested, we don't share the part of the storage_map.
714
712
  if share_memory:
715
713
  i_o_vars = maker.fgraph.inputs + maker.fgraph.outputs
716
- for key in storage_map.keys():
714
+ for key, val in storage_map.items():
717
715
  if key not in i_o_vars:
718
- new_storage_map[memo[key]] = storage_map[key]
716
+ new_storage_map[memo[key]] = val
719
717
 
720
718
  if not name and self.name:
721
719
  name = self.name + " copy"
@@ -1202,8 +1200,11 @@ def insert_deepcopy(fgraph, wrapped_inputs, wrapped_outputs):
1202
1200
  has_destroyers_attr = hasattr(fgraph, "has_destroyers")
1203
1201
 
1204
1202
  for i in range(len(fgraph.outputs)):
1203
+ original_out = fgraph.outputs[i]
1204
+ output_client = fgraph.get_output_client(i)
1205
+
1205
1206
  views_of_output_i = set()
1206
- view_tree_set(fgraph, alias_root(fgraph.outputs[i]), views_of_output_i)
1207
+ view_tree_set(fgraph, alias_root(original_out), views_of_output_i)
1207
1208
  copied = False
1208
1209
  # do not allow outputs to be aliased
1209
1210
  for j in range(i + 1, len(fgraph.outputs)):
@@ -1212,16 +1213,16 @@ def insert_deepcopy(fgraph, wrapped_inputs, wrapped_outputs):
1212
1213
  if fgraph.outputs[j] in views_of_output_i:
1213
1214
  if wrapped_outputs[i].borrow and wrapped_outputs[j].borrow:
1214
1215
  fgraph.change_node_input(
1215
- "output", i, view_op(fgraph.outputs[i]), reason=reason
1216
+ *output_client, view_op(original_out), reason=reason
1216
1217
  )
1217
1218
  else:
1218
1219
  fgraph.change_node_input(
1219
- "output", i, deep_copy_op(fgraph.outputs[i]), reason=reason
1220
+ *output_client, deep_copy_op(original_out), reason=reason
1220
1221
  )
1221
1222
  copied = True
1222
1223
  break
1223
1224
 
1224
- if not copied:
1225
+ if not copied: # no-break
1225
1226
  for input_j in all_graph_inputs:
1226
1227
  # do not allow outputs to be aliased to an inputs (j), unless
1227
1228
  # a) that j'th input has been 'destroyed' by
@@ -1239,33 +1240,29 @@ def insert_deepcopy(fgraph, wrapped_inputs, wrapped_outputs):
1239
1240
  j = fgraph.inputs.index(input_j)
1240
1241
  if wrapped_outputs[i].borrow and wrapped_inputs[j].borrow:
1241
1242
  fgraph.change_node_input(
1242
- "output",
1243
- i,
1244
- view_op(fgraph.outputs[i]),
1243
+ *output_client,
1244
+ view_op(original_out),
1245
1245
  reason=reason,
1246
1246
  )
1247
1247
  break
1248
1248
  else:
1249
1249
  fgraph.change_node_input(
1250
- "output",
1251
- i,
1252
- deep_copy_op(fgraph.outputs[i]),
1250
+ *output_client,
1251
+ deep_copy_op(original_out),
1253
1252
  reason=reason,
1254
1253
  )
1255
1254
  break
1256
1255
  elif wrapped_outputs[i].borrow:
1257
1256
  fgraph.change_node_input(
1258
- "output",
1259
- i,
1260
- view_op(fgraph.outputs[i]),
1257
+ *output_client,
1258
+ view_op(original_out),
1261
1259
  reason=reason,
1262
1260
  )
1263
1261
  break
1264
1262
  else:
1265
1263
  fgraph.change_node_input(
1266
- "output",
1267
- i,
1268
- deep_copy_op(fgraph.outputs[i]),
1264
+ *output_client,
1265
+ deep_copy_op(original_out),
1269
1266
  reason=reason,
1270
1267
  )
1271
1268
  break
@@ -1449,7 +1446,7 @@ class FunctionMaker:
1449
1446
  if not hasattr(mode.linker, "accept"):
1450
1447
  raise ValueError(
1451
1448
  "'linker' parameter of FunctionMaker should be "
1452
- f"a Linker with an accept method or one of {list(pytensor.compile.mode.predefined_linkers.keys())}"
1449
+ f"a Linker with an accept method or one of {list(pytensor.compile.mode.predefined_linkers)}"
1453
1450
  )
1454
1451
 
1455
1452
  def __init__(