pytensor 3.0.3__tar.gz → 3.0.4__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 (600) hide show
  1. {pytensor-3.0.3/pytensor.egg-info → pytensor-3.0.4}/PKG-INFO +1 -1
  2. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/_version.py +3 -3
  3. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/__init__.py +4 -0
  4. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/core.py +8 -0
  5. pytensor-3.0.4/pytensor/assumptions/permutation.py +75 -0
  6. pytensor-3.0.4/pytensor/assumptions/selection.py +127 -0
  7. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/specify.py +8 -0
  8. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/subtensor.py +14 -3
  9. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/triangular.py +20 -9
  10. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/executor.py +17 -0
  11. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/traversal.py +3 -1
  12. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/ifelse.py +9 -20
  13. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/blockwise.py +6 -1
  14. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/elemwise.py +147 -24
  15. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/constructors.py +17 -5
  16. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/random.py +24 -14
  17. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/shape.py +2 -2
  18. pytensor-3.0.4/pytensor/link/numba/dispatch/signal/conv.py +125 -0
  19. pytensor-3.0.4/pytensor/link/numba/dispatch/vectorize_codegen.py +1102 -0
  20. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scalar/basic.py +1 -2
  21. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/rewriting/merge.py +0 -3
  22. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/rewriting/push_out.py +0 -3
  23. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/sparse/rewriting.py +17 -22
  24. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/elemwise.py +11 -3
  25. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/products.py +22 -26
  26. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/optimize.py +3 -2
  27. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/random/rewriting/basic.py +9 -10
  28. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/random/rewriting/numba.py +3 -0
  29. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/assumptions.py +1 -1
  30. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/basic.py +50 -60
  31. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/blas_c.py +10 -12
  32. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/elemwise.py +226 -64
  33. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/extra_ops.py +0 -12
  34. pytensor-3.0.4/pytensor/tensor/rewriting/indexed_elemwise.py +774 -0
  35. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/linalg/products.py +137 -2
  36. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/numba.py +32 -1
  37. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/shape.py +52 -30
  38. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/subtensor.py +85 -91
  39. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/subtensor_lift.py +66 -85
  40. pytensor-3.0.4/pytensor/tensor/rewriting/uncanonicalize.py +230 -0
  41. {pytensor-3.0.3 → pytensor-3.0.4/pytensor.egg-info}/PKG-INFO +1 -1
  42. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor.egg-info/SOURCES.txt +3 -0
  43. pytensor-3.0.3/pytensor/link/numba/dispatch/signal/conv.py +0 -71
  44. pytensor-3.0.3/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -585
  45. pytensor-3.0.3/pytensor/tensor/rewriting/uncanonicalize.py +0 -234
  46. {pytensor-3.0.3 → pytensor-3.0.4}/LICENSE.txt +0 -0
  47. {pytensor-3.0.3 → pytensor-3.0.4}/MANIFEST.in +0 -0
  48. {pytensor-3.0.3 → pytensor-3.0.4}/README.rst +0 -0
  49. {pytensor-3.0.3 → pytensor-3.0.4}/doc/.templates/PLACEHOLDER +0 -0
  50. {pytensor-3.0.3 → pytensor-3.0.4}/doc/.templates/layout.html +0 -0
  51. {pytensor-3.0.3 → pytensor-3.0.4}/doc/.templates/nb-badges.html +0 -0
  52. {pytensor-3.0.3 → pytensor-3.0.4}/doc/.templates/rendered_citation.html +0 -0
  53. {pytensor-3.0.3 → pytensor-3.0.4}/doc/LICENSE.txt +0 -0
  54. {pytensor-3.0.3 → pytensor-3.0.4}/doc/README.md +0 -0
  55. {pytensor-3.0.3 → pytensor-3.0.4}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
  56. {pytensor-3.0.3 → pytensor-3.0.4}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
  57. {pytensor-3.0.3 → pytensor-3.0.4}/doc/acknowledgement.rst +0 -0
  58. {pytensor-3.0.3 → pytensor-3.0.4}/doc/bcast.png +0 -0
  59. {pytensor-3.0.3 → pytensor-3.0.4}/doc/bcast.svg +0 -0
  60. {pytensor-3.0.3 → pytensor-3.0.4}/doc/blog.md +0 -0
  61. {pytensor-3.0.3 → pytensor-3.0.4}/doc/conf.py +0 -0
  62. {pytensor-3.0.3 → pytensor-3.0.4}/doc/core_development_guide.rst +0 -0
  63. {pytensor-3.0.3 → pytensor-3.0.4}/doc/css.inc +0 -0
  64. {pytensor-3.0.3 → pytensor-3.0.4}/doc/dev_start_guide.rst +0 -0
  65. {pytensor-3.0.3 → pytensor-3.0.4}/doc/environment.yml +0 -0
  66. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/apply.png +0 -0
  67. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/apply.svg +0 -0
  68. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/apply2.svg +0 -0
  69. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/creating_a_c_op.rst +0 -0
  70. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  71. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/creating_an_op.rst +0 -0
  72. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/ctype.rst +0 -0
  73. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/extending_faq.rst +0 -0
  74. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/extending_pytensor_solution_1.py +0 -0
  75. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/graph_rewriting.rst +0 -0
  76. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/graphstructures.rst +0 -0
  77. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/index.rst +0 -0
  78. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/inplace.rst +0 -0
  79. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/op.rst +0 -0
  80. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/other_ops.rst +0 -0
  81. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  82. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  83. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/pipeline.rst +0 -0
  84. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/scan.rst +0 -0
  85. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/tips.rst +0 -0
  86. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/type.rst +0 -0
  87. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/unittest.rst +0 -0
  88. {pytensor-3.0.3 → pytensor-3.0.4}/doc/extending/using_params.rst +0 -0
  89. {pytensor-3.0.3 → pytensor-3.0.4}/doc/faq.rst +0 -0
  90. {pytensor-3.0.3 → pytensor-3.0.4}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
  91. {pytensor-3.0.3 → pytensor-3.0.4}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
  92. {pytensor-3.0.3 → pytensor-3.0.4}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
  93. {pytensor-3.0.3 → pytensor-3.0.4}/doc/gallery/optimize/root.ipynb +0 -0
  94. {pytensor-3.0.3 → pytensor-3.0.4}/doc/gallery/page_footer.md +0 -0
  95. {pytensor-3.0.3 → pytensor-3.0.4}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
  96. {pytensor-3.0.3 → pytensor-3.0.4}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
  97. {pytensor-3.0.3 → pytensor-3.0.4}/doc/generate_dtype_tensor_table.py +0 -0
  98. {pytensor-3.0.3 → pytensor-3.0.4}/doc/glossary.rst +0 -0
  99. {pytensor-3.0.3 → pytensor-3.0.4}/doc/images/Elman_srnn.png +0 -0
  100. {pytensor-3.0.3 → pytensor-3.0.4}/doc/images/PyTensor.png +0 -0
  101. {pytensor-3.0.3 → pytensor-3.0.4}/doc/images/PyTensor_RGB.svg +0 -0
  102. {pytensor-3.0.3 → pytensor-3.0.4}/doc/images/PyTensor_logo.png +0 -0
  103. {pytensor-3.0.3 → pytensor-3.0.4}/doc/images/binder.svg +0 -0
  104. {pytensor-3.0.3 → pytensor-3.0.4}/doc/images/blocksparse.png +0 -0
  105. {pytensor-3.0.3 → pytensor-3.0.4}/doc/images/colab.svg +0 -0
  106. {pytensor-3.0.3 → pytensor-3.0.4}/doc/images/github.svg +0 -0
  107. {pytensor-3.0.3 → pytensor-3.0.4}/doc/images/lstm.png +0 -0
  108. {pytensor-3.0.3 → pytensor-3.0.4}/doc/images/lstm_memorycell.png +0 -0
  109. {pytensor-3.0.3 → pytensor-3.0.4}/doc/images/talk2010.gif +0 -0
  110. {pytensor-3.0.3 → pytensor-3.0.4}/doc/images/talk2010.png +0 -0
  111. {pytensor-3.0.3 → pytensor-3.0.4}/doc/index.rst +0 -0
  112. {pytensor-3.0.3 → pytensor-3.0.4}/doc/install.rst +0 -0
  113. {pytensor-3.0.3 → pytensor-3.0.4}/doc/internal/how_to_release.rst +0 -0
  114. {pytensor-3.0.3 → pytensor-3.0.4}/doc/internal/index.rst +0 -0
  115. {pytensor-3.0.3 → pytensor-3.0.4}/doc/internal/metadocumentation.rst +0 -0
  116. {pytensor-3.0.3 → pytensor-3.0.4}/doc/introduction.rst +0 -0
  117. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/compile/debugmode.rst +0 -0
  118. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/compile/function.rst +0 -0
  119. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/compile/index.rst +0 -0
  120. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/compile/io.rst +0 -0
  121. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/compile/mode.rst +0 -0
  122. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/compile/nanguardmode.rst +0 -0
  123. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/compile/opfromgraph.rst +0 -0
  124. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/compile/ops.rst +0 -0
  125. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/compile/profilemode.rst +0 -0
  126. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/compile/shared.rst +0 -0
  127. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/config.rst +0 -0
  128. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  129. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  130. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  131. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  132. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  133. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  134. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  135. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/mlp.html +0 -0
  136. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/mlp.png +0 -0
  137. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/mlp2.html +0 -0
  138. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  139. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/mlp2.png +0 -0
  140. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/ofg.html +0 -0
  141. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/examples/ofg2.html +0 -0
  142. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/index.ipynb +0 -0
  143. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/index.rst +0 -0
  144. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  145. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  146. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  147. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  148. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/graph/features.rst +0 -0
  149. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/graph/fgraph.rst +0 -0
  150. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/graph/graph.rst +0 -0
  151. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/graph/index.rst +0 -0
  152. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/graph/op.rst +0 -0
  153. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/graph/replace.rst +0 -0
  154. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/graph/type.rst +0 -0
  155. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/graph/utils.rst +0 -0
  156. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/index.rst +0 -0
  157. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/misc/pkl_utils.rst +0 -0
  158. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/printing.rst +0 -0
  159. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/scalar/index.rst +0 -0
  160. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/scan.rst +0 -0
  161. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/sparse/index.rst +0 -0
  162. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/sparse/sandbox.rst +0 -0
  163. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/basic.rst +0 -0
  164. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/basic_opt.rst +0 -0
  165. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/bcast.png +0 -0
  166. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/bcast.svg +0 -0
  167. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/elemwise.rst +0 -0
  168. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/extra_ops.rst +0 -0
  169. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/fft.rst +0 -0
  170. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/functional.rst +0 -0
  171. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/index.rst +0 -0
  172. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/io.rst +0 -0
  173. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/linalg.rst +0 -0
  174. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/math_opt.rst +0 -0
  175. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/nlinalg.rst +0 -0
  176. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/optimize.rst +0 -0
  177. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/plot_fft.png +0 -0
  178. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/random.rst +0 -0
  179. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/slinalg.rst +0 -0
  180. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/tensor/utils.rst +0 -0
  181. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/typed_list.rst +0 -0
  182. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/xtensor/index.md +0 -0
  183. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/xtensor/linalg.md +0 -0
  184. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/xtensor/math.md +0 -0
  185. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/xtensor/module_functions.md +0 -0
  186. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/xtensor/random.md +0 -0
  187. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/xtensor/signal.md +0 -0
  188. {pytensor-3.0.3 → pytensor-3.0.4}/doc/library/xtensor/type.md +0 -0
  189. {pytensor-3.0.3 → pytensor-3.0.4}/doc/links.rst +0 -0
  190. {pytensor-3.0.3 → pytensor-3.0.4}/doc/optimizations.rst +0 -0
  191. {pytensor-3.0.3 → pytensor-3.0.4}/doc/pylintrc +0 -0
  192. {pytensor-3.0.3 → pytensor-3.0.4}/doc/robots.txt +0 -0
  193. {pytensor-3.0.3 → pytensor-3.0.4}/doc/troubleshooting.rst +0 -0
  194. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/adding.rst +0 -0
  195. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/adding_solution_1.py +0 -0
  196. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/aliasing.rst +0 -0
  197. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/apply.png +0 -0
  198. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/apply.svg +0 -0
  199. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/bcast.png +0 -0
  200. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/broadcasting.rst +0 -0
  201. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/conditions.rst +0 -0
  202. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/debug_faq.rst +0 -0
  203. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/dlogistic.png +0 -0
  204. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/examples.rst +0 -0
  205. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/faq_tutorial.rst +0 -0
  206. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/gradients.rst +0 -0
  207. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/index.rst +0 -0
  208. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/loading_and_saving.rst +0 -0
  209. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/logistic.gp +0 -0
  210. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/logistic.png +0 -0
  211. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/loop.rst +0 -0
  212. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/loop_solution_1.py +0 -0
  213. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/modes.rst +0 -0
  214. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/modes_solution_1.py +0 -0
  215. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/multi_cores.rst +0 -0
  216. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/nan_tutorial.rst +0 -0
  217. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/pics/d3viz.png +0 -0
  218. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  219. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  220. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  221. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/printing_drawing.rst +0 -0
  222. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/prng.rst +0 -0
  223. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/profiling.rst +0 -0
  224. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/profiling_example.py +0 -0
  225. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/profiling_example_out.prof +0 -0
  226. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/shape_info.rst +0 -0
  227. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/sparse.rst +0 -0
  228. {pytensor-3.0.3 → pytensor-3.0.4}/doc/tutorial/symbolic_graphs.rst +0 -0
  229. {pytensor-3.0.3 → pytensor-3.0.4}/doc/user_guide.rst +0 -0
  230. {pytensor-3.0.3 → pytensor-3.0.4}/pyproject.toml +0 -0
  231. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/__init__.py +0 -0
  232. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/_sparse_lazy.py +0 -0
  233. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/alloc.py +0 -0
  234. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/blockwise.py +0 -0
  235. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/diagonal.py +0 -0
  236. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/dimshuffle.py +0 -0
  237. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/dot.py +0 -0
  238. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/elemwise.py +0 -0
  239. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/orthogonal.py +0 -0
  240. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/positive_definite.py +0 -0
  241. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/reshape.py +0 -0
  242. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/shape.py +0 -0
  243. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/assumptions/symmetric.py +0 -0
  244. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/basic.py +0 -0
  245. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/bin/__init__.py +0 -0
  246. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/bin/pytensor_cache.py +0 -0
  247. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/breakpoint.py +0 -0
  248. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/__init__.py +0 -0
  249. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/aliasing.py +0 -0
  250. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/builders.py +0 -0
  251. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/compiledir.py +0 -0
  252. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/compilelock.py +0 -0
  253. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/debug/__init__.py +0 -0
  254. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/debug/debugmode.py +0 -0
  255. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/debug/dump.py +0 -0
  256. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/debug/monitormode.py +0 -0
  257. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/debug/nanguardmode.py +0 -0
  258. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/debug/profiling.py +0 -0
  259. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/io.py +0 -0
  260. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/maker.py +0 -0
  261. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/mode.py +0 -0
  262. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/ops.py +0 -0
  263. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/rebuild.py +0 -0
  264. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/compile/sharedvalue.py +0 -0
  265. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/configdefaults.py +0 -0
  266. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/configparser.py +0 -0
  267. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/d3viz/__init__.py +0 -0
  268. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  269. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/d3viz/css/d3viz.css +0 -0
  270. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/d3viz/d3viz.py +0 -0
  271. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/d3viz/formatting.py +0 -0
  272. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/d3viz/html/template.html +0 -0
  273. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  274. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  275. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/d3viz/js/d3viz.js +0 -0
  276. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  277. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  278. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/gradient.py +0 -0
  279. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/__init__.py +0 -0
  280. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/basic.py +0 -0
  281. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/destroyhandler.py +0 -0
  282. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/features.py +0 -0
  283. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/fg.py +0 -0
  284. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/null_type.py +0 -0
  285. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/op.py +0 -0
  286. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/replace.py +0 -0
  287. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/rewriting/__init__.py +0 -0
  288. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/rewriting/basic.py +0 -0
  289. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/rewriting/db.py +0 -0
  290. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/rewriting/kanren.py +0 -0
  291. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/rewriting/unify.py +0 -0
  292. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/rewriting/utils.py +0 -0
  293. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/type.py +0 -0
  294. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/graph/utils.py +0 -0
  295. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/ipython.py +0 -0
  296. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/__init__.py +0 -0
  297. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/basic.py +0 -0
  298. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/c/__init__.py +0 -0
  299. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/c/basic.py +0 -0
  300. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  301. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  302. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/c/cmodule.py +0 -0
  303. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/c/cutils.py +0 -0
  304. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/c/cvm.py +0 -0
  305. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/c/exceptions.py +0 -0
  306. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/c/interface.py +0 -0
  307. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/c/lazylinker_c.py +0 -0
  308. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/c/op.py +0 -0
  309. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/c/params_type.py +0 -0
  310. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/c/type.py +0 -0
  311. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/__init__.py +0 -0
  312. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/__init__.py +0 -0
  313. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/basic.py +0 -0
  314. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/blas.py +0 -0
  315. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  316. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/einsum.py +0 -0
  317. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  318. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  319. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
  320. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
  321. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
  322. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
  323. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
  324. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
  325. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
  326. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/math.py +0 -0
  327. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/pad.py +0 -0
  328. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/random.py +0 -0
  329. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/scalar.py +0 -0
  330. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/scan.py +0 -0
  331. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/shape.py +0 -0
  332. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
  333. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
  334. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/sort.py +0 -0
  335. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/sparse.py +0 -0
  336. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  337. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  338. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/linker.py +0 -0
  339. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/jax/ops.py +0 -0
  340. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/__init__.py +0 -0
  341. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/__init__.py +0 -0
  342. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/basic.py +0 -0
  343. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/blas.py +0 -0
  344. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
  345. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/einsum.py +0 -0
  346. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
  347. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
  348. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
  349. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/linalg/decomposition.py +0 -0
  350. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/linalg/inverse.py +0 -0
  351. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
  352. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/linalg/solvers.py +0 -0
  353. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/linalg/summary.py +0 -0
  354. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/math.py +0 -0
  355. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/pad.py +0 -0
  356. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/scalar.py +0 -0
  357. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/shape.py +0 -0
  358. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
  359. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
  360. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/sort.py +0 -0
  361. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
  362. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/dispatch/tensor_basic.py +0 -0
  363. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/mlx/linker.py +0 -0
  364. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/__init__.py +0 -0
  365. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/cache.py +0 -0
  366. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/__init__.py +0 -0
  367. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/basic.py +0 -0
  368. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
  369. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  370. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  371. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
  372. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
  373. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
  374. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
  375. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
  376. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
  377. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
  378. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
  379. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -0
  380. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
  381. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
  382. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
  383. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
  384. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
  385. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
  386. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
  387. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
  388. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
  389. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
  390. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
  391. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
  392. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
  393. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
  394. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
  395. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
  396. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
  397. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
  398. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
  399. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/scalar.py +0 -0
  400. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/scan.py +0 -0
  401. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
  402. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/sort.py +0 -0
  403. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
  404. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
  405. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
  406. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
  407. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
  408. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  409. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  410. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/dispatch/typed_list.py +0 -0
  411. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/numba/linker.py +0 -0
  412. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  413. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  414. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  415. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
  416. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  417. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  418. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
  419. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
  420. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
  421. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
  422. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
  423. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/math.py +0 -0
  424. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  425. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/shape.py +0 -0
  426. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  427. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
  428. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/pytorch/linker.py +0 -0
  429. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/utils.py +0 -0
  430. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/link/vm.py +0 -0
  431. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/misc/__init__.py +0 -0
  432. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/misc/check_blas.py +0 -0
  433. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/misc/check_blas_many.sh +0 -0
  434. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/misc/check_duplicate_key.py +0 -0
  435. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  436. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/misc/elemwise_time_test.py +0 -0
  437. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/misc/frozendict.py +0 -0
  438. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/misc/may_share_memory.py +0 -0
  439. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/misc/ordered_set.py +0 -0
  440. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/misc/pkl_utils.py +0 -0
  441. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/npy_2_compat.py +0 -0
  442. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/printing.py +0 -0
  443. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/py.typed +0 -0
  444. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/raise_op.py +0 -0
  445. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scalar/__init__.py +0 -0
  446. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  447. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  448. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scalar/c_code/gamma.c +0 -0
  449. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scalar/c_code/incbet.c +0 -0
  450. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scalar/loop.py +0 -0
  451. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scalar/math.py +0 -0
  452. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scalar/sharedvar.py +0 -0
  453. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/__init__.py +0 -0
  454. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/basic.py +0 -0
  455. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/checkpoints.py +0 -0
  456. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/op.py +0 -0
  457. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/rewriting/__init__.py +0 -0
  458. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/rewriting/db.py +0 -0
  459. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/rewriting/inplace.py +0 -0
  460. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/rewriting/io.py +0 -0
  461. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/rewriting/trace.py +0 -0
  462. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/rewriting/utils.py +0 -0
  463. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/scan_perform.pyx +0 -0
  464. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/scan_perform_ext.py +0 -0
  465. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/utils.py +0 -0
  466. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/scan/views.py +0 -0
  467. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/sparse/__init__.py +0 -0
  468. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/sparse/basic.py +0 -0
  469. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/sparse/linalg.py +0 -0
  470. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/sparse/math.py +0 -0
  471. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/sparse/sharedvar.py +0 -0
  472. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/sparse/type.py +0 -0
  473. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/sparse/utils.py +0 -0
  474. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/sparse/variable.py +0 -0
  475. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/__init__.py +0 -0
  476. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/basic.py +0 -0
  477. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/blas.py +0 -0
  478. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/blas_c.py +0 -0
  479. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/blas_headers.py +0 -0
  480. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/blockwise.py +0 -0
  481. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  482. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  483. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  484. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/einsum.py +0 -0
  485. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/elemwise_cgen.py +0 -0
  486. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/exceptions.py +0 -0
  487. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/extra_ops.py +0 -0
  488. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/fft.py +0 -0
  489. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/fourier.py +0 -0
  490. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/functional.py +0 -0
  491. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/interpolate.py +0 -0
  492. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/__init__.py +0 -0
  493. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/_lazy.py +0 -0
  494. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/constructors.py +0 -0
  495. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
  496. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
  497. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
  498. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
  499. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
  500. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
  501. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
  502. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/dtype_utils.py +0 -0
  503. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/inverse.py +0 -0
  504. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
  505. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/solvers/core.py +0 -0
  506. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/solvers/general.py +0 -0
  507. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
  508. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
  509. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/solvers/psd.py +0 -0
  510. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
  511. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
  512. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/linalg/summary.py +0 -0
  513. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/math.py +0 -0
  514. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/nlinalg.py +0 -0
  515. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/pad.py +0 -0
  516. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/random/__init__.py +0 -0
  517. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/random/basic.py +0 -0
  518. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/random/op.py +0 -0
  519. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  520. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/random/rewriting/jax.py +0 -0
  521. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/random/type.py +0 -0
  522. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/random/utils.py +0 -0
  523. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/random/variable.py +0 -0
  524. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/reshape.py +0 -0
  525. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/__init__.py +0 -0
  526. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/blas.py +0 -0
  527. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/blockwise.py +0 -0
  528. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/einsum.py +0 -0
  529. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/jax.py +0 -0
  530. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
  531. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
  532. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
  533. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
  534. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/linalg/summary.py +0 -0
  535. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
  536. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/math.py +0 -0
  537. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/ofg.py +0 -0
  538. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/optimize.py +0 -0
  539. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/reshape.py +0 -0
  540. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/rewriting/special.py +0 -0
  541. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/shape.py +0 -0
  542. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/sharedvar.py +0 -0
  543. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/signal/__init__.py +0 -0
  544. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/signal/conv.py +0 -0
  545. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/slinalg.py +0 -0
  546. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/sort.py +0 -0
  547. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/special.py +0 -0
  548. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/subtensor.py +0 -0
  549. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/symbolic.py +0 -0
  550. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/type.py +0 -0
  551. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/type_other.py +0 -0
  552. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/utils.py +0 -0
  553. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/var.py +0 -0
  554. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/variable.py +0 -0
  555. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/tensor/xlogx.py +0 -0
  556. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/typed_list/__init__.py +0 -0
  557. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/typed_list/basic.py +0 -0
  558. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/typed_list/rewriting.py +0 -0
  559. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/typed_list/type.py +0 -0
  560. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/utils.py +0 -0
  561. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/__init__.py +0 -0
  562. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/basic.py +0 -0
  563. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/indexing.py +0 -0
  564. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/linalg.py +0 -0
  565. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/math.py +0 -0
  566. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/random/__init__.py +0 -0
  567. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/random/basic.py +0 -0
  568. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/random/type.py +0 -0
  569. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/random/variable.py +0 -0
  570. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/reduction.py +0 -0
  571. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/rewriting/__init__.py +0 -0
  572. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/rewriting/basic.py +0 -0
  573. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/rewriting/indexing.py +0 -0
  574. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/rewriting/math.py +0 -0
  575. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/rewriting/reduction.py +0 -0
  576. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/rewriting/shape.py +0 -0
  577. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/rewriting/utils.py +0 -0
  578. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/rewriting/vectorization.py +0 -0
  579. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/shape.py +0 -0
  580. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/signal.py +0 -0
  581. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/type.py +0 -0
  582. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor/xtensor/vectorization.py +0 -0
  583. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor.egg-info/dependency_links.txt +0 -0
  584. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor.egg-info/entry_points.txt +0 -0
  585. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor.egg-info/requires.txt +0 -0
  586. {pytensor-3.0.3 → pytensor-3.0.4}/pytensor.egg-info/top_level.txt +0 -0
  587. {pytensor-3.0.3 → pytensor-3.0.4}/scripts/mypy-failing.txt +0 -0
  588. {pytensor-3.0.3 → pytensor-3.0.4}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
  589. {pytensor-3.0.3 → pytensor-3.0.4}/setup.cfg +0 -0
  590. {pytensor-3.0.3 → pytensor-3.0.4}/setup.py +0 -0
  591. {pytensor-3.0.3 → pytensor-3.0.4}/tests/link/c/c_code/test_cenum.h +0 -0
  592. {pytensor-3.0.3 → pytensor-3.0.4}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  593. {pytensor-3.0.3 → pytensor-3.0.4}/tests/test_basic.py +0 -0
  594. {pytensor-3.0.3 → pytensor-3.0.4}/tests/test_breakpoint.py +0 -0
  595. {pytensor-3.0.3 → pytensor-3.0.4}/tests/test_config.py +0 -0
  596. {pytensor-3.0.3 → pytensor-3.0.4}/tests/test_gradient.py +0 -0
  597. {pytensor-3.0.3 → pytensor-3.0.4}/tests/test_ifelse.py +0 -0
  598. {pytensor-3.0.3 → pytensor-3.0.4}/tests/test_printing.py +0 -0
  599. {pytensor-3.0.3 → pytensor-3.0.4}/tests/test_raise_op.py +0 -0
  600. {pytensor-3.0.3 → pytensor-3.0.4}/tests/test_rop.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytensor
3
- Version: 3.0.3
3
+ Version: 3.0.4
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": "2026-05-20T17:31:39-0500",
11
+ "date": "2026-06-02T00:24:22+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "b712ea6e6a7541ce24c47f8869699178958dadf6",
15
- "version": "3.0.3"
14
+ "full-revisionid": "1df3475ac881a6bb182828c3dc8e36ed0439827f",
15
+ "version": "3.0.4"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -6,8 +6,10 @@ import pytensor.assumptions.blockwise
6
6
  import pytensor.assumptions.diagonal
7
7
  import pytensor.assumptions.dimshuffle
8
8
  import pytensor.assumptions.orthogonal
9
+ import pytensor.assumptions.permutation
9
10
  import pytensor.assumptions.positive_definite
10
11
  import pytensor.assumptions.reshape
12
+ import pytensor.assumptions.selection
11
13
  import pytensor.assumptions.shape
12
14
  import pytensor.assumptions.subtensor
13
15
  import pytensor.assumptions.symmetric
@@ -18,7 +20,9 @@ from pytensor.assumptions.core import (
18
20
  IMPLIES,
19
21
  LOWER_TRIANGULAR,
20
22
  ORTHOGONAL,
23
+ PERMUTATION,
21
24
  POSITIVE_DEFINITE,
25
+ SELECTION,
22
26
  SYMMETRIC,
23
27
  UPPER_TRIANGULAR,
24
28
  AssumptionFeature,
@@ -101,6 +101,8 @@ UPPER_TRIANGULAR = AssumptionKey("upper_triangular", short_name="triu")
101
101
  SYMMETRIC = AssumptionKey("symmetric", short_name="sym")
102
102
  POSITIVE_DEFINITE = AssumptionKey("positive_definite", short_name="pd")
103
103
  ORTHOGONAL = AssumptionKey("orthogonal", short_name="orth")
104
+ SELECTION = AssumptionKey("selection", short_name="sel")
105
+ PERMUTATION = AssumptionKey("permutation", short_name="perm")
104
106
 
105
107
  ALL_KEYS = (
106
108
  DIAGONAL,
@@ -109,11 +111,14 @@ ALL_KEYS = (
109
111
  SYMMETRIC,
110
112
  POSITIVE_DEFINITE,
111
113
  ORTHOGONAL,
114
+ SELECTION,
115
+ PERMUTATION,
112
116
  )
113
117
 
114
118
  # Implications about structural properties derivably from other structural properties
115
119
  register_implies(DIAGONAL, LOWER_TRIANGULAR, UPPER_TRIANGULAR, SYMMETRIC)
116
120
  register_implies(POSITIVE_DEFINITE, SYMMETRIC)
121
+ register_implies(PERMUTATION, SELECTION, ORTHOGONAL)
117
122
 
118
123
 
119
124
  def register_assumption(
@@ -211,6 +216,9 @@ class AssumptionFeature(Feature):
211
216
  else:
212
217
  self.cache[(new_var, key)] = FactState.join(old_state, new_state)
213
218
  self._var_to_keys.setdefault(new_var, set()).add(key)
219
+ # new_var gained a fact whose implications were cached UNKNOWN before it was
220
+ # known; flag it so the next get() sweep re-derives those stale entries.
221
+ self._stale_vars.add(new_var)
214
222
 
215
223
  self._stale_vars.update(node.outputs)
216
224
 
@@ -0,0 +1,75 @@
1
+ import numpy as np
2
+
3
+ from pytensor.assumptions.alloc import eye_identity_rule
4
+ from pytensor.assumptions.core import (
5
+ PERMUTATION,
6
+ FactState,
7
+ all_inputs_have_key,
8
+ propagate_first,
9
+ register_assumption,
10
+ register_constant_inference,
11
+ )
12
+ from pytensor.assumptions.dimshuffle import left_expand_dims_propagates_matrix_property
13
+ from pytensor.assumptions.subtensor import subtensor_propagates_matrix_property
14
+ from pytensor.tensor.basic import Eye
15
+ from pytensor.tensor.elemwise import DimShuffle
16
+ from pytensor.tensor.linalg.constructors import BlockDiagonal
17
+ from pytensor.tensor.linalg.inverse import MatrixInverse, MatrixPinv
18
+ from pytensor.tensor.linalg.products import KroneckerProduct
19
+ from pytensor.tensor.math import Dot
20
+ from pytensor.tensor.subtensor import Subtensor
21
+ from pytensor.tensor.variable import TensorConstant
22
+
23
+
24
+ # A PERMUTATION matrix is a square 0/1 matrix with exactly one 1 in every row and every
25
+ # column -- a reordering of the identity's columns. It is a square SELECTION and is
26
+ # ORTHOGONAL; unlike a general selection it is closed under transpose and inverse
27
+ # (P.T = P^{-1} is again a permutation).
28
+
29
+
30
+ def _permutation_from_constant(var: TensorConstant) -> FactState:
31
+ """Recognize a constant PERMUTATION matrix from its data, caching the scan on
32
+ ``var.tag.is_permutation``."""
33
+ cached: FactState | None = getattr(var.tag, "is_permutation", None)
34
+ if cached is not None:
35
+ return cached
36
+
37
+ data = np.asarray(var.data)
38
+ if data.ndim < 2 or data.shape[-1] != data.shape[-2]:
39
+ result = FactState.FALSE
40
+ else:
41
+ # The row/column-sum reductions are cheaper and short-circuit the full-size binary
42
+ # scan; a doubly-stochastic matrix shows the binary check is still required.
43
+ is_permutation = (
44
+ bool(np.all(data.sum(axis=-2) == 1))
45
+ and bool(np.all(data.sum(axis=-1) == 1))
46
+ and bool(np.all((data == 0) | (data == 1)))
47
+ )
48
+ result = FactState.TRUE if is_permutation else FactState.FALSE
49
+
50
+ var.tag.is_permutation = result
51
+ return result
52
+
53
+
54
+ register_constant_inference(PERMUTATION, _permutation_from_constant)
55
+
56
+ # eye(n, m, k) is a permutation iff it is the square identity -- the same condition that
57
+ # makes it orthogonal.
58
+ register_assumption(PERMUTATION, Eye)(eye_identity_rule)
59
+ # The symmetric group is closed under matmul and inversion.
60
+ register_assumption(PERMUTATION, Dot)(all_inputs_have_key)
61
+ register_assumption(PERMUTATION, MatrixInverse)(propagate_first)
62
+ register_assumption(PERMUTATION, MatrixPinv)(propagate_first)
63
+ register_assumption(PERMUTATION, BlockDiagonal)(all_inputs_have_key)
64
+ register_assumption(PERMUTATION, KroneckerProduct)(all_inputs_have_key)
65
+ register_assumption(PERMUTATION, Subtensor)(subtensor_propagates_matrix_property)
66
+
67
+
68
+ @register_assumption(PERMUTATION, DimShuffle)
69
+ def _dimshuffle(key, op, feature, fgraph, node, input_states):
70
+ """Permutation survives matrix transpose (P.T = P^{-1}) and batch left-expand-dims."""
71
+ if input_states[0] is not FactState.TRUE:
72
+ return [FactState.UNKNOWN]
73
+ if op.is_matrix_transpose or left_expand_dims_propagates_matrix_property(op):
74
+ return [FactState.TRUE]
75
+ return [FactState.UNKNOWN]
@@ -0,0 +1,127 @@
1
+ import numpy as np
2
+
3
+ from pytensor.assumptions.core import (
4
+ SELECTION,
5
+ FactState,
6
+ all_inputs_have_key,
7
+ register_assumption,
8
+ register_constant_inference,
9
+ true_if,
10
+ )
11
+ from pytensor.assumptions.subtensor import subtensor_propagates_matrix_property
12
+ from pytensor.graph.basic import Variable
13
+ from pytensor.tensor.basic import Eye
14
+ from pytensor.tensor.linalg.constructors import BlockDiagonal
15
+ from pytensor.tensor.linalg.products import KroneckerProduct
16
+ from pytensor.tensor.subtensor import AdvancedSubtensor, Subtensor
17
+ from pytensor.tensor.variable import TensorConstant
18
+
19
+
20
+ def _selection_from_constant(var: TensorConstant) -> FactState:
21
+ """Recognize a constant SELECTION matrix from its data, caching the O(n*k) scan on
22
+ ``var.tag.is_selection``."""
23
+ cached: FactState | None = getattr(var.tag, "is_selection", None)
24
+ if cached is not None:
25
+ return cached
26
+
27
+ data = np.asarray(var.data)
28
+ if data.ndim < 2:
29
+ result = FactState.FALSE
30
+ else:
31
+ if not (data.sum(axis=-2) == 1).all():
32
+ is_selection = False
33
+ elif data.dtype.kind in "uib":
34
+ is_selection = data.max(initial=1) <= 1 and data.min(initial=0) >= 0
35
+ else:
36
+ is_selection = bool(((data == 0) | (data == 1)).all())
37
+ result = FactState.TRUE if is_selection else FactState.FALSE
38
+
39
+ var.tag.is_selection = result
40
+ return result
41
+
42
+
43
+ register_constant_inference(SELECTION, _selection_from_constant)
44
+
45
+
46
+ def column_selection_index(op, node) -> Variable | None:
47
+ """Return the 1-D integer index of an ``x[..., idx]`` advanced subtensor, or ``None``.
48
+
49
+ Matches every axis but the last a full slice, the last an integer vector. Selecting
50
+ columns preserves selection for any ``idx``; selecting rows does not, so only this
51
+ pattern is recognized.
52
+ """
53
+ x = node.inputs[0]
54
+ ndim = x.type.ndim
55
+ idx_list = op.idx_list
56
+ if ndim < 2 or len(idx_list) != ndim:
57
+ return None
58
+
59
+ full = slice(None, None, None)
60
+ if any(entry != full for entry in idx_list[:-1]):
61
+ return None
62
+
63
+ last = idx_list[-1]
64
+ if not isinstance(last, int) or isinstance(last, bool):
65
+ return None
66
+
67
+ index_var: Variable = node.inputs[1:][last]
68
+ if index_var.type.ndim != 1 or not index_var.type.dtype.startswith(("int", "uint")):
69
+ return None
70
+ return index_var
71
+
72
+
73
+ @register_assumption(SELECTION, Eye)
74
+ def _eye(key, op, feature, fgraph, node, input_states):
75
+ """``eye(n, m, k)`` is a selection iff ``k == 0`` (main diagonal) and ``n >= m``
76
+ (no trailing zero columns)."""
77
+ n, m, k = node.inputs
78
+ if not isinstance(k, TensorConstant):
79
+ return [FactState.UNKNOWN]
80
+ if k.data.item() != 0:
81
+ return [FactState.FALSE]
82
+ if n is m:
83
+ return [FactState.TRUE]
84
+ if isinstance(n, TensorConstant) and isinstance(m, TensorConstant):
85
+ return true_if(n.data.item() >= m.data.item(), else_false=True)
86
+ rows, cols = node.outputs[0].type.shape[-2:]
87
+ if rows is not None and cols is not None:
88
+ return true_if(rows >= cols, else_false=True)
89
+ return [FactState.UNKNOWN]
90
+
91
+
92
+ register_assumption(SELECTION, BlockDiagonal)(all_inputs_have_key)
93
+ register_assumption(SELECTION, KroneckerProduct)(all_inputs_have_key)
94
+
95
+
96
+ @register_assumption(SELECTION, AdvancedSubtensor)
97
+ def _advanced_subtensor(key, op, feature, fgraph, node, input_states):
98
+ if (
99
+ input_states[0] is FactState.TRUE
100
+ and column_selection_index(op, node) is not None
101
+ ):
102
+ return [FactState.TRUE]
103
+ return [FactState.UNKNOWN]
104
+
105
+
106
+ @register_assumption(SELECTION, Subtensor)
107
+ def _subtensor(key, op, feature, fgraph, node, input_states):
108
+ # Batch-axis indexing (trailing two axes untouched) keeps every per-matrix property.
109
+ states = subtensor_propagates_matrix_property(
110
+ key, op, feature, fgraph, node, input_states
111
+ )
112
+ if states[0] is FactState.TRUE:
113
+ return states
114
+
115
+ # A column slice keeps a subset of the one-hot columns -- still a selection.
116
+ if input_states[0] is FactState.TRUE:
117
+ x = node.inputs[0]
118
+ idx_list = op.idx_list
119
+ full = slice(None, None, None)
120
+ if (
121
+ 2 <= x.type.ndim == len(idx_list)
122
+ and all(entry == full for entry in idx_list[:-1])
123
+ and isinstance(idx_list[-1], slice)
124
+ ):
125
+ return [FactState.TRUE]
126
+
127
+ return [FactState.UNKNOWN]
@@ -67,6 +67,8 @@ def assume(
67
67
  symmetric: bool | None = None,
68
68
  positive_definite: bool | None = None,
69
69
  orthogonal: bool | None = None,
70
+ selection: bool | None = None,
71
+ permutation: bool | None = None,
70
72
  ):
71
73
  """Attach structural assumptions to a symbolic tensor.
72
74
 
@@ -90,6 +92,10 @@ def assume(
90
92
  Assert that *x* is (or is not) positive-definite.
91
93
  orthogonal : bool, optional
92
94
  Assert that *x* is (or is not) orthogonal.
95
+ selection : bool, optional
96
+ Assert that *x* is (or is not) a selection matrix
97
+ permutation : bool, optional
98
+ Assert that *x* is (or is not) a permutation matrix
93
99
 
94
100
  Returns
95
101
  -------
@@ -113,6 +119,8 @@ def assume(
113
119
  "symmetric": symmetric,
114
120
  "positive_definite": positive_definite,
115
121
  "orthogonal": orthogonal,
122
+ "selection": selection,
123
+ "permutation": permutation,
116
124
  }
117
125
  assumptions = {
118
126
  name: FactState.TRUE if value else FactState.FALSE
@@ -1,6 +1,10 @@
1
1
  from pytensor.assumptions.core import (
2
2
  ALL_KEYS,
3
- ORTHOGONAL,
3
+ DIAGONAL,
4
+ LOWER_TRIANGULAR,
5
+ POSITIVE_DEFINITE,
6
+ SYMMETRIC,
7
+ UPPER_TRIANGULAR,
4
8
  FactState,
5
9
  register_assumption,
6
10
  true_if,
@@ -46,7 +50,7 @@ def incsubtensor_propagates_matrix_property(
46
50
  - ``set`` over a partial batch region: every output slice comes from ``base``
47
51
  or ``value``, so both must carry the property.
48
52
  - ``inc``: the written region becomes ``base + value``; the property must be
49
- closed under addition -- true for every key except ``orthogonal``.
53
+ closed under addition (diagonal, triangular, symmetric, positive-definite).
50
54
 
51
55
  An index that reaches into the core axes is left to the per-key rules (e.g.
52
56
  the diagonal-position write handled by ``indexes_diagonal``).
@@ -66,7 +70,14 @@ def incsubtensor_propagates_matrix_property(
66
70
  return [value_state]
67
71
  return true_if(base_state is FactState.TRUE and value_state is FactState.TRUE)
68
72
 
69
- if key is ORTHOGONAL:
73
+ # Closed under addition
74
+ if key not in (
75
+ DIAGONAL,
76
+ LOWER_TRIANGULAR,
77
+ UPPER_TRIANGULAR,
78
+ SYMMETRIC,
79
+ POSITIVE_DEFINITE,
80
+ ):
70
81
  return [FactState.UNKNOWN]
71
82
  return true_if(base_state is FactState.TRUE and value_state is FactState.TRUE)
72
83
 
@@ -136,21 +136,32 @@ def _lu_upper(key, op, feature, fgraph, node, input_states):
136
136
  return states
137
137
 
138
138
 
139
- def _dimshuffle_left_expand_dims(key, op, feature, fgraph, node, input_states):
140
- """Triangularity survives left-expand-dims (batch broadcast).
139
+ @register_assumption(LOWER_TRIANGULAR, DimShuffle)
140
+ def _lower_dimshuffle(key, op, feature, fgraph, node, input_states):
141
+ """Mirror lower-triangularity through left-expand-dims and matrix transpose.
141
142
 
142
- Matrix transpose swaps lower<->upper, so it is *not* propagated under
143
- the same key.
143
+ Left-expand-dims preserves the matrix exactly and transpose swaps the two
144
+ triangles, swapping their fact states.
144
145
  """
145
- if input_states[0] is not FactState.TRUE:
146
- return [FactState.UNKNOWN]
146
+ if op.is_matrix_transpose:
147
+ return [feature.get(node.inputs[0], UPPER_TRIANGULAR)]
147
148
  if left_expand_dims_propagates_matrix_property(op):
148
- return [FactState.TRUE]
149
+ return [input_states[0]]
149
150
  return [FactState.UNKNOWN]
150
151
 
151
152
 
152
- register_assumption(LOWER_TRIANGULAR, DimShuffle)(_dimshuffle_left_expand_dims)
153
- register_assumption(UPPER_TRIANGULAR, DimShuffle)(_dimshuffle_left_expand_dims)
153
+ @register_assumption(UPPER_TRIANGULAR, DimShuffle)
154
+ def _upper_dimshuffle(key, op, feature, fgraph, node, input_states):
155
+ """Mirror upper-triangularity through left-expand-dims and matrix transpose.
156
+
157
+ Left-expand-dims preserves the matrix exactly and transpose swaps the two
158
+ triangles, swapping their fact states.
159
+ """
160
+ if op.is_matrix_transpose:
161
+ return [feature.get(node.inputs[0], LOWER_TRIANGULAR)]
162
+ if left_expand_dims_propagates_matrix_property(op):
163
+ return [input_states[0]]
164
+ return [FactState.UNKNOWN]
154
165
 
155
166
 
156
167
  @register_assumption(LOWER_TRIANGULAR, Elemwise)
@@ -395,6 +395,23 @@ class Function:
395
395
  )
396
396
  fg_cpy.update_mapping = maker.fgraph.update_mapping
397
397
 
398
+ # Warn if any shared variable with a deleted update is being
399
+ # destroyed (mutated inplace) by a node in the copied graph.
400
+ # In that case the shared variable storage will still be mutated
401
+ # even though the update is not applied.
402
+ if delete_updates and hasattr(maker.fgraph, "destroyers"):
403
+ for in_idx in maker.fgraph.update_mapping.values():
404
+ input_var = maker.fgraph.inputs[in_idx]
405
+ for destroyer in maker.fgraph.destroyers(input_var):
406
+ if destroyer in memo:
407
+ warnings.warn(
408
+ f"Shared variable '{input_var.name}' will still be mutated "
409
+ "even though its update is being deleted, because an "
410
+ "operation in the graph modifies it inplace.",
411
+ UserWarning,
412
+ stacklevel=2,
413
+ )
414
+
398
415
  # Re initialize Outs and swap update and variable in Ins
399
416
  # By doing this, we can pass FunctionMaker.check_unused_inputs()
400
417
  if delete_updates:
@@ -526,9 +526,11 @@ def walk_toposort(
526
526
 
527
527
  Notes
528
528
  -----
529
-
530
529
  ``deps(i)`` should behave like a pure function (no funny business with internal state).
531
530
 
531
+ The implementation uses identity (``is``), so items returned by ``deps``
532
+ must be the *same objects* as those yielded by ``graphs``.
533
+
532
534
  The order of the return value list is determined by the order of nodes
533
535
  returned by the `deps` function.
534
536
  """
@@ -423,21 +423,16 @@ def ifelse(
423
423
  @node_rewriter([IfElse])
424
424
  def cond_make_inplace(fgraph, node):
425
425
  op = node.op
426
- if (
427
- isinstance(op, IfElse)
428
- and not op.as_view
429
- and
430
- # For big graph, do not make inplace scalar to speed up
431
- # optimization.
432
- (
433
- len(fgraph.apply_nodes) < 500
434
- or not all(getattr(o.type, "ndim", -1) == 0 for o in node.outputs)
435
- )
426
+ if op.as_view:
427
+ return False
428
+ # For big graph, do not make inplace scalar to speed up optimization.
429
+ if len(fgraph.apply_nodes) >= 500 and all(
430
+ getattr(o.type, "ndim", -1) == 0 for o in node.outputs
436
431
  ):
437
- return IfElse(n_outs=op.n_outs, as_view=True, name=op.name)(
438
- *node.inputs, return_list=True
439
- )
440
- return False
432
+ return False
433
+ return IfElse(n_outs=op.n_outs, as_view=True, name=op.name)(
434
+ *node.inputs, return_list=True
435
+ )
441
436
 
442
437
 
443
438
  optdb.register(
@@ -549,8 +544,6 @@ def ifelse_lift_single_if_through_acceptable_ops(fgraph, main_node):
549
544
  @node_rewriter([IfElse])
550
545
  def cond_merge_ifs_true(fgraph, node):
551
546
  op = node.op
552
- if not isinstance(op, IfElse):
553
- return False
554
547
  t_ins = node.inputs[1:][: op.n_outs]
555
548
 
556
549
  replace = {}
@@ -576,8 +569,6 @@ def cond_merge_ifs_true(fgraph, node):
576
569
  @node_rewriter([IfElse])
577
570
  def cond_merge_ifs_false(fgraph, node):
578
571
  op = node.op
579
- if not isinstance(op, IfElse):
580
- return False
581
572
  f_ins = node.inputs[1:][op.n_outs :]
582
573
 
583
574
  replace = {}
@@ -656,8 +647,6 @@ class CondMerge(GraphRewriter):
656
647
  def cond_remove_identical(fgraph, node):
657
648
  op = node.op
658
649
 
659
- if not isinstance(op, IfElse):
660
- return False
661
650
  aes = node.inputs[1:][: op.n_outs]
662
651
  fs = node.inputs[1:][op.n_outs :]
663
652
 
@@ -11,6 +11,9 @@ from pytensor.link.numba.dispatch.basic import (
11
11
  register_funcify_and_cache_key,
12
12
  )
13
13
  from pytensor.link.numba.dispatch.vectorize_codegen import (
14
+ NO_INDEXED_INPUTS,
15
+ NO_INDEXED_OUTPUTS,
16
+ NO_SIZE,
14
17
  _jit_options,
15
18
  _vectorized,
16
19
  encode_literals,
@@ -90,7 +93,9 @@ def numba_funcify_Blockwise(op: BlockwiseWithCoreShape, node, **kwargs):
90
93
  (), # constant_inputs
91
94
  inputs,
92
95
  tuple_core_shapes,
93
- None, # size
96
+ NO_SIZE,
97
+ NO_INDEXED_INPUTS,
98
+ NO_INDEXED_OUTPUTS,
94
99
  )
95
100
 
96
101
  return impl