pytensor 2.24.1__tar.gz → 2.24.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. {pytensor-2.24.1/pytensor.egg-info → pytensor-2.24.2}/PKG-INFO +2 -1
  2. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/gradients.rst +10 -0
  3. {pytensor-2.24.1 → pytensor-2.24.2}/pyproject.toml +2 -1
  4. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/_version.py +3 -3
  5. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/gradient.py +80 -1
  6. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/basic.py +4 -1
  7. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/nlinalg.py +5 -6
  8. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/pytorch/dispatch/basic.py +17 -1
  9. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/pkl_utils.py +1 -1
  10. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/basic.py +1 -0
  11. pytensor-2.24.2/pytensor/scalar/c_code/incbet.c +311 -0
  12. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/math.py +19 -2
  13. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/basic.py +11 -8
  14. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/basic.py +73 -48
  15. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/extra_ops.py +3 -3
  16. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/math.py +86 -11
  17. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/op.py +4 -5
  18. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/rewriting/basic.py +4 -1
  19. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/utils.py +11 -7
  20. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/math.py +2 -2
  21. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/shape.py +31 -5
  22. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/subtensor.py +109 -0
  23. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/shape.py +4 -4
  24. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/slinalg.py +4 -4
  25. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/subtensor.py +8 -3
  26. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/utils.py +3 -2
  27. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/variable.py +4 -2
  28. {pytensor-2.24.1 → pytensor-2.24.2/pytensor.egg-info}/PKG-INFO +2 -1
  29. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor.egg-info/SOURCES.txt +1 -0
  30. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor.egg-info/requires.txt +1 -0
  31. {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_gradient.py +39 -0
  32. {pytensor-2.24.1 → pytensor-2.24.2}/LICENSE.txt +0 -0
  33. {pytensor-2.24.1 → pytensor-2.24.2}/MANIFEST.in +0 -0
  34. {pytensor-2.24.1 → pytensor-2.24.2}/README.rst +0 -0
  35. {pytensor-2.24.1 → pytensor-2.24.2}/doc/.templates/PLACEHOLDER +0 -0
  36. {pytensor-2.24.1 → pytensor-2.24.2}/doc/.templates/layout.html +0 -0
  37. {pytensor-2.24.1 → pytensor-2.24.2}/doc/LICENSE.txt +0 -0
  38. {pytensor-2.24.1 → pytensor-2.24.2}/doc/README.md +0 -0
  39. {pytensor-2.24.1 → pytensor-2.24.2}/doc/acknowledgement.rst +0 -0
  40. {pytensor-2.24.1 → pytensor-2.24.2}/doc/bcast.png +0 -0
  41. {pytensor-2.24.1 → pytensor-2.24.2}/doc/bcast.svg +0 -0
  42. {pytensor-2.24.1 → pytensor-2.24.2}/doc/conf.py +0 -0
  43. {pytensor-2.24.1 → pytensor-2.24.2}/doc/core_development_guide.rst +0 -0
  44. {pytensor-2.24.1 → pytensor-2.24.2}/doc/css.inc +0 -0
  45. {pytensor-2.24.1 → pytensor-2.24.2}/doc/dev_start_guide.rst +0 -0
  46. {pytensor-2.24.1 → pytensor-2.24.2}/doc/environment.yml +0 -0
  47. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/apply.png +0 -0
  48. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/apply.svg +0 -0
  49. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/apply2.svg +0 -0
  50. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/creating_a_c_op.rst +0 -0
  51. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  52. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/creating_an_op.rst +0 -0
  53. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/ctype.rst +0 -0
  54. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/extending_faq.rst +0 -0
  55. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/extending_pytensor_solution_1.py +0 -0
  56. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/graph_rewriting.rst +0 -0
  57. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/graphstructures.rst +0 -0
  58. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/index.rst +0 -0
  59. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/inplace.rst +0 -0
  60. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/op.rst +0 -0
  61. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/other_ops.rst +0 -0
  62. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  63. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  64. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/pipeline.rst +0 -0
  65. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/scan.rst +0 -0
  66. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/tips.rst +0 -0
  67. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/type.rst +0 -0
  68. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/unittest.rst +0 -0
  69. {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/using_params.rst +0 -0
  70. {pytensor-2.24.1 → pytensor-2.24.2}/doc/faq.rst +0 -0
  71. {pytensor-2.24.1 → pytensor-2.24.2}/doc/generate_dtype_tensor_table.py +0 -0
  72. {pytensor-2.24.1 → pytensor-2.24.2}/doc/glossary.rst +0 -0
  73. {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/Elman_srnn.png +0 -0
  74. {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/PyTensor_RGB.svg +0 -0
  75. {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/blocksparse.png +0 -0
  76. {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/lstm.png +0 -0
  77. {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/lstm_memorycell.png +0 -0
  78. {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/talk2010.gif +0 -0
  79. {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/talk2010.png +0 -0
  80. {pytensor-2.24.1 → pytensor-2.24.2}/doc/index.rst +0 -0
  81. {pytensor-2.24.1 → pytensor-2.24.2}/doc/install.rst +0 -0
  82. {pytensor-2.24.1 → pytensor-2.24.2}/doc/internal/how_to_release.rst +0 -0
  83. {pytensor-2.24.1 → pytensor-2.24.2}/doc/internal/index.rst +0 -0
  84. {pytensor-2.24.1 → pytensor-2.24.2}/doc/internal/metadocumentation.rst +0 -0
  85. {pytensor-2.24.1 → pytensor-2.24.2}/doc/introduction.rst +0 -0
  86. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/debugmode.rst +0 -0
  87. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/function.rst +0 -0
  88. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/index.rst +0 -0
  89. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/io.rst +0 -0
  90. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/mode.rst +0 -0
  91. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/nanguardmode.rst +0 -0
  92. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/opfromgraph.rst +0 -0
  93. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/ops.rst +0 -0
  94. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/profilemode.rst +0 -0
  95. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/shared.rst +0 -0
  96. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/config.rst +0 -0
  97. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  98. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  99. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  100. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  101. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  102. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  103. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  104. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/mlp.html +0 -0
  105. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/mlp.png +0 -0
  106. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/mlp2.html +0 -0
  107. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  108. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/mlp2.png +0 -0
  109. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/ofg.html +0 -0
  110. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/ofg2.html +0 -0
  111. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/index.ipynb +0 -0
  112. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/index.rst +0 -0
  113. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  114. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  115. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  116. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  117. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/gradient.rst +0 -0
  118. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/features.rst +0 -0
  119. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/fgraph.rst +0 -0
  120. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/graph.rst +0 -0
  121. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/index.rst +0 -0
  122. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/op.rst +0 -0
  123. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/type.rst +0 -0
  124. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/utils.rst +0 -0
  125. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/index.rst +0 -0
  126. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/misc/pkl_utils.rst +0 -0
  127. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/printing.rst +0 -0
  128. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/sandbox/index.rst +0 -0
  129. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/sandbox/linalg.rst +0 -0
  130. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/scalar/index.rst +0 -0
  131. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/scan.rst +0 -0
  132. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/sparse/index.rst +0 -0
  133. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/sparse/sandbox.rst +0 -0
  134. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/basic.rst +0 -0
  135. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/basic_opt.rst +0 -0
  136. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/bcast.png +0 -0
  137. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/bcast.svg +0 -0
  138. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/conv.rst +0 -0
  139. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/elemwise.rst +0 -0
  140. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/extra_ops.rst +0 -0
  141. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/fft.rst +0 -0
  142. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/index.rst +0 -0
  143. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/io.rst +0 -0
  144. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/math_opt.rst +0 -0
  145. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/nlinalg.rst +0 -0
  146. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/plot_fft.png +0 -0
  147. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/random/basic.rst +0 -0
  148. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/random/index.rst +0 -0
  149. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/random/utils.rst +0 -0
  150. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/slinalg.rst +0 -0
  151. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/utils.rst +0 -0
  152. {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/typed_list.rst +0 -0
  153. {pytensor-2.24.1 → pytensor-2.24.2}/doc/links.rst +0 -0
  154. {pytensor-2.24.1 → pytensor-2.24.2}/doc/optimizations.rst +0 -0
  155. {pytensor-2.24.1 → pytensor-2.24.2}/doc/pylintrc +0 -0
  156. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/ccodegen.rst +0 -0
  157. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/compilation.rst +0 -0
  158. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/debugging_with_stepmode.rst +0 -0
  159. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/elemwise_compiler.rst +0 -0
  160. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/function.rst +0 -0
  161. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/functional.rst +0 -0
  162. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/how_to_make_ops.rst +0 -0
  163. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/index.rst +0 -0
  164. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/index2.rst +0 -0
  165. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/interactive_debugger.rst +0 -0
  166. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/logistic_regression_example.rst +0 -0
  167. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/performance.rst +0 -0
  168. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/randomnumbers.rst +0 -0
  169. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/rethinkccodegen.rst +0 -0
  170. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/sandbox.rst +0 -0
  171. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/software.rst +0 -0
  172. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/sparse.rst +0 -0
  173. {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/tensoroptools.rst +0 -0
  174. {pytensor-2.24.1 → pytensor-2.24.2}/doc/troubleshooting.rst +0 -0
  175. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/adding.rst +0 -0
  176. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/adding_solution_1.py +0 -0
  177. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/aliasing.rst +0 -0
  178. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/apply.png +0 -0
  179. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/apply.svg +0 -0
  180. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/bcast.png +0 -0
  181. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/broadcasting.rst +0 -0
  182. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/conditions.rst +0 -0
  183. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/debug_faq.rst +0 -0
  184. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/dlogistic.png +0 -0
  185. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/examples.rst +0 -0
  186. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/faq_tutorial.rst +0 -0
  187. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/index.rst +0 -0
  188. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/loading_and_saving.rst +0 -0
  189. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/logistic.gp +0 -0
  190. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/logistic.png +0 -0
  191. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/loop.rst +0 -0
  192. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/loop_solution_1.py +0 -0
  193. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/modes.rst +0 -0
  194. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/modes_solution_1.py +0 -0
  195. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/multi_cores.rst +0 -0
  196. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/nan_tutorial.rst +0 -0
  197. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/pics/d3viz.png +0 -0
  198. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  199. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  200. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  201. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/printing_drawing.rst +0 -0
  202. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/profiling.rst +0 -0
  203. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/profiling_example.py +0 -0
  204. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/profiling_example_out.prof +0 -0
  205. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/shape_info.rst +0 -0
  206. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/sparse.rst +0 -0
  207. {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/symbolic_graphs.rst +0 -0
  208. {pytensor-2.24.1 → pytensor-2.24.2}/doc/user_guide.rst +0 -0
  209. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/__init__.py +0 -0
  210. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/bin/__init__.py +0 -0
  211. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/bin/pytensor_cache.py +0 -0
  212. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/breakpoint.py +0 -0
  213. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/__init__.py +0 -0
  214. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/builders.py +0 -0
  215. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/compiledir.py +0 -0
  216. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/compilelock.py +0 -0
  217. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/debugmode.py +0 -0
  218. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/function/__init__.py +0 -0
  219. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/function/pfunc.py +0 -0
  220. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/function/types.py +0 -0
  221. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/io.py +0 -0
  222. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/mode.py +0 -0
  223. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/monitormode.py +0 -0
  224. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/nanguardmode.py +0 -0
  225. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/ops.py +0 -0
  226. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/profiling.py +0 -0
  227. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/sharedvalue.py +0 -0
  228. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/configdefaults.py +0 -0
  229. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/configparser.py +0 -0
  230. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/__init__.py +0 -0
  231. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  232. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/css/d3viz.css +0 -0
  233. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/d3viz.py +0 -0
  234. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/formatting.py +0 -0
  235. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  236. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  237. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/js/d3viz.js +0 -0
  238. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  239. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  240. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/__init__.py +0 -0
  241. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/destroyhandler.py +0 -0
  242. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/features.py +0 -0
  243. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/fg.py +0 -0
  244. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/null_type.py +0 -0
  245. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/op.py +0 -0
  246. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/replace.py +0 -0
  247. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/rewriting/__init__.py +0 -0
  248. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/rewriting/basic.py +0 -0
  249. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/rewriting/db.py +0 -0
  250. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/rewriting/kanren.py +0 -0
  251. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/rewriting/unify.py +0 -0
  252. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/rewriting/utils.py +0 -0
  253. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/type.py +0 -0
  254. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/utils.py +0 -0
  255. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/ifelse.py +0 -0
  256. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/__init__.py +0 -0
  257. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/basic.py +0 -0
  258. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/__init__.py +0 -0
  259. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/basic.py +0 -0
  260. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  261. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  262. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/cmodule.py +0 -0
  263. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/cutils.py +0 -0
  264. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/cvm.py +0 -0
  265. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/exceptions.py +0 -0
  266. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/interface.py +0 -0
  267. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/lazylinker_c.py +0 -0
  268. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/op.py +0 -0
  269. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/params_type.py +0 -0
  270. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/type.py +0 -0
  271. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/__init__.py +0 -0
  272. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/__init__.py +0 -0
  273. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/basic.py +0 -0
  274. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  275. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  276. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  277. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/random.py +0 -0
  278. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/scalar.py +0 -0
  279. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/scan.py +0 -0
  280. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/shape.py +0 -0
  281. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/slinalg.py +0 -0
  282. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/sort.py +0 -0
  283. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/sparse.py +0 -0
  284. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  285. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  286. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/linker.py +0 -0
  287. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/__init__.py +0 -0
  288. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/__init__.py +0 -0
  289. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/basic.py +0 -0
  290. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  291. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/elemwise.py +0 -0
  292. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  293. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
  294. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/random.py +0 -0
  295. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/scalar.py +0 -0
  296. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/scan.py +0 -0
  297. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/slinalg.py +0 -0
  298. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/sparse.py +0 -0
  299. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  300. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  301. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  302. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/linker.py +0 -0
  303. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
  304. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  305. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  306. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
  307. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/pytorch/linker.py +0 -0
  308. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/utils.py +0 -0
  309. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/vm.py +0 -0
  310. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/__init__.py +0 -0
  311. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/check_blas.py +0 -0
  312. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/check_blas_many.sh +0 -0
  313. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/check_duplicate_key.py +0 -0
  314. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  315. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/elemwise_time_test.py +0 -0
  316. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/frozendict.py +0 -0
  317. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/may_share_memory.py +0 -0
  318. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/ordered_set.py +0 -0
  319. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/safe_asarray.py +0 -0
  320. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/printing.py +0 -0
  321. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/py.typed +0 -0
  322. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/raise_op.py +0 -0
  323. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/__init__.py +0 -0
  324. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  325. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  326. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/c_code/gamma.c +0 -0
  327. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/loop.py +0 -0
  328. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/sharedvar.py +0 -0
  329. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/__init__.py +0 -0
  330. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/basic.py +0 -0
  331. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/checkpoints.py +0 -0
  332. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/op.py +0 -0
  333. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/rewriting.py +0 -0
  334. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/scan_perform.pyx +0 -0
  335. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/scan_perform_ext.py +0 -0
  336. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/utils.py +0 -0
  337. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/views.py +0 -0
  338. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/__init__.py +0 -0
  339. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/rewriting.py +0 -0
  340. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/sandbox/__init__.py +0 -0
  341. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/sandbox/sp.py +0 -0
  342. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/sandbox/sp2.py +0 -0
  343. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/sharedvar.py +0 -0
  344. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/type.py +0 -0
  345. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/utils.py +0 -0
  346. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/__init__.py +0 -0
  347. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/blas.py +0 -0
  348. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/blas_c.py +0 -0
  349. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/blas_headers.py +0 -0
  350. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/blas_scipy.py +0 -0
  351. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/blockwise.py +0 -0
  352. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  353. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  354. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  355. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/conv/__init__.py +0 -0
  356. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/conv/abstract_conv.py +0 -0
  357. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/elemwise.py +0 -0
  358. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/elemwise_cgen.py +0 -0
  359. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/exceptions.py +0 -0
  360. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/fft.py +0 -0
  361. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/fourier.py +0 -0
  362. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/functional.py +0 -0
  363. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/inplace.py +0 -0
  364. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/io.py +0 -0
  365. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/linalg.py +0 -0
  366. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/nlinalg.py +0 -0
  367. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/__init__.py +0 -0
  368. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/basic.py +0 -0
  369. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  370. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/rewriting/jax.py +0 -0
  371. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/rewriting/numba.py +0 -0
  372. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/type.py +0 -0
  373. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/var.py +0 -0
  374. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/__init__.py +0 -0
  375. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/basic.py +0 -0
  376. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/blas.py +0 -0
  377. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/blas_c.py +0 -0
  378. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
  379. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/blockwise.py +0 -0
  380. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/elemwise.py +0 -0
  381. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  382. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/jax.py +0 -0
  383. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/linalg.py +0 -0
  384. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/special.py +0 -0
  385. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  386. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/sharedvar.py +0 -0
  387. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/sort.py +0 -0
  388. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/special.py +0 -0
  389. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/type.py +0 -0
  390. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/type_other.py +0 -0
  391. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/var.py +0 -0
  392. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/xlogx.py +0 -0
  393. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/typed_list/__init__.py +0 -0
  394. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/typed_list/basic.py +0 -0
  395. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/typed_list/rewriting.py +0 -0
  396. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/typed_list/type.py +0 -0
  397. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/updates.py +0 -0
  398. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/utils.py +0 -0
  399. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/version.py +0 -0
  400. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor.egg-info/dependency_links.txt +0 -0
  401. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor.egg-info/entry_points.txt +0 -0
  402. {pytensor-2.24.1 → pytensor-2.24.2}/pytensor.egg-info/top_level.txt +0 -0
  403. {pytensor-2.24.1 → pytensor-2.24.2}/scripts/mypy-failing.txt +0 -0
  404. {pytensor-2.24.1 → pytensor-2.24.2}/setup.cfg +0 -0
  405. {pytensor-2.24.1 → pytensor-2.24.2}/setup.py +0 -0
  406. {pytensor-2.24.1 → pytensor-2.24.2}/tests/link/c/c_code/test_cenum.h +0 -0
  407. {pytensor-2.24.1 → pytensor-2.24.2}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  408. {pytensor-2.24.1 → pytensor-2.24.2}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
  409. {pytensor-2.24.1 → pytensor-2.24.2}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
  410. {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_breakpoint.py +0 -0
  411. {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_config.py +0 -0
  412. {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_ifelse.py +0 -0
  413. {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_printing.py +0 -0
  414. {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_raise_op.py +0 -0
  415. {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_rop.py +0 -0
  416. {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_updates.py +0 -0
  417. {pytensor-2.24.1 → pytensor-2.24.2}/versioneer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytensor
3
- Version: 2.24.1
3
+ Version: 2.24.2
4
4
  Summary: Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs.
5
5
  Author-email: pymc-devs <pymc.devs@gmail.com>
6
6
  License: .. _license:
@@ -94,6 +94,7 @@ Requires-Dist: pytest-cov>=2.6.1; extra == "tests"
94
94
  Requires-Dist: coverage>=5.1; extra == "tests"
95
95
  Requires-Dist: pytest-benchmark; extra == "tests"
96
96
  Requires-Dist: pytest-mock; extra == "tests"
97
+ Requires-Dist: pytest-sphinx; extra == "tests"
97
98
  Provides-Extra: rtd
98
99
  Requires-Dist: sphinx<6,>=5.1.0; extra == "rtd"
99
100
  Requires-Dist: pygments; extra == "rtd"
@@ -267,6 +267,16 @@ or, making use of the R-operator:
267
267
  >>> f([4, 4], [2, 2])
268
268
  array([ 4., 4.])
269
269
 
270
+ There is a builtin helper that uses the first method
271
+
272
+ >>> x = pt.dvector('x')
273
+ >>> v = pt.dvector('v')
274
+ >>> y = pt.sum(x ** 2)
275
+ >>> Hv = pytensor.gradient.hessian_vector_product(y, x, v)
276
+ >>> f = pytensor.function([x, v], Hv)
277
+ >>> f([4, 4], [2, 2])
278
+ array([ 4., 4.])
279
+
270
280
 
271
281
  Final Pointers
272
282
  ==============
@@ -75,6 +75,7 @@ tests = [
75
75
  "coverage>=5.1",
76
76
  "pytest-benchmark",
77
77
  "pytest-mock",
78
+ "pytest-sphinx",
78
79
  ]
79
80
  rtd = ["sphinx>=5.1.0,<6", "pygments", "pydot", "pydot2", "pydot-ng"]
80
81
  jax = ["jax", "jaxlib"]
@@ -116,7 +117,7 @@ versionfile_build = "pytensor/_version.py"
116
117
  tag_prefix = "rel-"
117
118
 
118
119
  [tool.pytest]
119
- addopts = "--durations=50"
120
+ addopts = "--durations=50 --doctest-modules pytensor --ignore=pytensor/misc/check_duplicate_key.py --ignore=pytensor/link"
120
121
  testpaths = "tests/"
121
122
 
122
123
  [tool.ruff]
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2024-07-04T12:10:31+0200",
11
+ "date": "2024-07-08T14:11:01+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "afc1a6caf595cb1bf08c9cb1901e1b9e0bb98efc",
15
- "version": "2.24.1"
14
+ "full-revisionid": "7f623fefbed89442737fd6d8ba11c32d2eab65ed",
15
+ "version": "2.24.2"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -2050,6 +2050,85 @@ def hessian(cost, wrt, consider_constant=None, disconnected_inputs="raise"):
2050
2050
  return as_list_or_tuple(using_list, using_tuple, hessians)
2051
2051
 
2052
2052
 
2053
+ def hessian_vector_product(cost, wrt, p, **grad_kwargs):
2054
+ """Return the expression of the Hessian times a vector p.
2055
+
2056
+ Notes
2057
+ -----
2058
+ This function uses backward autodiff twice to obtain the desired expression.
2059
+ You may want to manually build the equivalent expression by combining backward
2060
+ followed by forward (if all Ops support it) autodiff.
2061
+ See {ref}`docs/_tutcomputinggrads#Hessian-times-a-Vector` for how to do this.
2062
+
2063
+ Parameters
2064
+ ----------
2065
+ cost: Scalar (0-dimensional) variable.
2066
+ wrt: Vector (1-dimensional tensor) 'Variable' or list of Vectors
2067
+ p: Vector (1-dimensional tensor) 'Variable' or list of Vectors
2068
+ Each vector will be used for the hessp wirt to exach input variable
2069
+ **grad_kwargs:
2070
+ Keyword arguments passed to `grad` function.
2071
+
2072
+ Returns
2073
+ -------
2074
+ :class:` Vector or list of Vectors
2075
+ The Hessian times p of the `cost` with respect to (elements of) `wrt`.
2076
+
2077
+ Examples
2078
+ --------
2079
+
2080
+ .. testcode::
2081
+
2082
+ import numpy as np
2083
+ from scipy.optimize import minimize
2084
+ from pytensor import function
2085
+ from pytensor.tensor import vector
2086
+ from pytensor.gradient import grad, hessian_vector_product
2087
+
2088
+ x = vector('x')
2089
+ p = vector('p')
2090
+
2091
+ rosen = (100 * (x[1:] - x[:-1] ** 2) ** 2 + (1 - x[:-1]) ** 2).sum()
2092
+ rosen_jac = grad(rosen, x)
2093
+ rosen_hessp = hessian_vector_product(rosen, x, p)
2094
+
2095
+ rosen_fn = function([x], rosen)
2096
+ rosen_jac_fn = function([x], rosen_jac)
2097
+ rosen_hessp_fn = function([x, p], rosen_hessp)
2098
+ x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
2099
+ res = minimize(
2100
+ rosen_fn,
2101
+ x0,
2102
+ method="Newton-CG",
2103
+ jac=rosen_jac_fn,
2104
+ hessp=rosen_hessp_fn,
2105
+ options={"xtol": 1e-8},
2106
+ )
2107
+ print(res.x)
2108
+
2109
+ .. testoutput::
2110
+
2111
+ [1. 1. 1. 0.99999999 0.99999999]
2112
+
2113
+
2114
+
2115
+ """
2116
+ wrt_list = wrt if isinstance(wrt, Sequence) else [wrt]
2117
+ p_list = p if isinstance(p, Sequence) else [p]
2118
+ grad_wrt_list = grad(cost, wrt=wrt_list, **grad_kwargs)
2119
+ hessian_cost = pytensor.tensor.add(
2120
+ *[
2121
+ (grad_wrt * p).sum()
2122
+ for grad_wrt, p in zip(grad_wrt_list, p_list, strict=True)
2123
+ ]
2124
+ )
2125
+ Hp_list = grad(hessian_cost, wrt=wrt_list, **grad_kwargs)
2126
+
2127
+ if isinstance(wrt, Variable):
2128
+ return Hp_list[0]
2129
+ return Hp_list
2130
+
2131
+
2053
2132
  def _is_zero(x):
2054
2133
  """
2055
2134
  Returns 'yes', 'no', or 'maybe' indicating whether x
@@ -2241,7 +2320,7 @@ def grad_clip(x, lower_bound, upper_bound):
2241
2320
  >>> z2 = pytensor.gradient.grad(x**2, x)
2242
2321
  >>> f = pytensor.function([x], outputs = [z, z2])
2243
2322
  >>> print(f(2.0))
2244
- [array(1.0), array(4.0)]
2323
+ [array(1.), array(4.)]
2245
2324
 
2246
2325
  Notes
2247
2326
  -----
@@ -1034,7 +1034,10 @@ def orphans_between(
1034
1034
 
1035
1035
  Examples
1036
1036
  --------
1037
- >>> orphans_between([x], [(x+y).out])
1037
+ >>> from pytensor.graph.basic import orphans_between
1038
+ >>> from pytensor.tensor import scalars
1039
+ >>> x, y = scalars("xy")
1040
+ >>> list(orphans_between([x], [(x+y)]))
1038
1041
  [y]
1039
1042
 
1040
1043
  """
@@ -1,4 +1,5 @@
1
1
  import jax.numpy as jnp
2
+ import numpy as np
2
3
 
3
4
  from pytensor.link.jax.dispatch import jax_funcify
4
5
  from pytensor.tensor.blas import BatchedDot
@@ -137,12 +138,10 @@ def jax_funcify_Argmax(op, **kwargs):
137
138
 
138
139
  # NumPy does not support multiple axes for argmax; this is a
139
140
  # work-around
140
- keep_axes = jnp.array(
141
- [i for i in range(x.ndim) if i not in axes], dtype="int64"
142
- )
141
+ keep_axes = np.array([i for i in range(x.ndim) if i not in axes], dtype="int64")
143
142
  # Not-reduced axes in front
144
143
  transposed_x = jnp.transpose(
145
- x, jnp.concatenate((keep_axes, jnp.array(axes, dtype="int64")))
144
+ x, tuple(np.concatenate((keep_axes, np.array(axes, dtype="int64"))))
146
145
  )
147
146
  kept_shape = transposed_x.shape[: len(keep_axes)]
148
147
  reduced_shape = transposed_x.shape[len(keep_axes) :]
@@ -151,9 +150,9 @@ def jax_funcify_Argmax(op, **kwargs):
151
150
  # Otherwise reshape would complain citing float arg
152
151
  new_shape = (
153
152
  *kept_shape,
154
- jnp.prod(jnp.array(reduced_shape, dtype="int64"), dtype="int64"),
153
+ np.prod(np.array(reduced_shape, dtype="int64"), dtype="int64"),
155
154
  )
156
- reshaped_x = transposed_x.reshape(new_shape)
155
+ reshaped_x = transposed_x.reshape(tuple(new_shape))
157
156
 
158
157
  max_idx_res = jnp.argmax(reshaped_x, axis=-1).astype("int64")
159
158
 
@@ -6,7 +6,7 @@ from pytensor.compile.ops import DeepCopyOp
6
6
  from pytensor.graph.fg import FunctionGraph
7
7
  from pytensor.link.utils import fgraph_to_python
8
8
  from pytensor.raise_op import CheckAndRaise
9
- from pytensor.tensor.basic import Alloc, AllocEmpty, ARange, Join
9
+ from pytensor.tensor.basic import Alloc, AllocEmpty, ARange, Eye, Join
10
10
 
11
11
 
12
12
  @singledispatch
@@ -100,3 +100,19 @@ def pytorch_funcify_Join(op, **kwargs):
100
100
  return torch.cat(tensors, dim=axis)
101
101
 
102
102
  return join
103
+
104
+
105
+ @pytorch_funcify.register(Eye)
106
+ def pytorch_funcify_eye(op, **kwargs):
107
+ torch_dtype = getattr(torch, op.dtype)
108
+
109
+ def eye(N, M, k):
110
+ major, minor = (M, N) if k > 0 else (N, M)
111
+ k_abs = torch.abs(k)
112
+ zeros = torch.zeros(N, M, dtype=torch_dtype)
113
+ if k_abs < major:
114
+ l_ones = torch.min(major - k_abs, minor)
115
+ return zeros.diagonal_scatter(torch.ones(l_ones, dtype=torch_dtype), k)
116
+ return zeros
117
+
118
+ return eye
@@ -239,7 +239,7 @@ def dump(
239
239
  >>> foo_2 = pytensor.shared(1, name='foo')
240
240
  >>> with open('model.zip', 'wb') as f:
241
241
  ... dump((foo_1, foo_2, np.array(2)), f)
242
- >>> np.load('model.zip').keys()
242
+ >>> list(np.load('model.zip').keys())
243
243
  ['foo', 'foo_2', 'array_0', 'pkl']
244
244
  >>> np.load('model.zip')['foo']
245
245
  array(0)
@@ -208,6 +208,7 @@ class autocast_float_as:
208
208
 
209
209
  Examples
210
210
  --------
211
+ >>> from pytensor.tensor import fvector
211
212
  >>> with autocast_float_as('float32'):
212
213
  ... assert (fvector() + 1.1).dtype == 'float32' # temporary downcasting
213
214
  >>> assert (fvector() + 1.1).dtype == 'float64' # back to default behaviour
@@ -0,0 +1,311 @@
1
+ /* adapted from file incbet.c, obtained from the Cephes library (MIT License)
2
+ Cephes Math Library, Release 2.8: June, 2000
3
+ Copyright 1984, 1995, 2000 by Stephen L. Moshier
4
+ */
5
+
6
+ //For GPU support
7
+ #ifdef __CUDACC__
8
+ #define DEVICE __device__
9
+ #else
10
+ #define DEVICE
11
+ #endif
12
+
13
+ #include <float.h>
14
+ #include <math.h>
15
+ #include <stdio.h>
16
+ #include <numpy/npy_math.h>
17
+
18
+
19
+ #define MINLOG -170.0
20
+ #define MAXLOG +170.0
21
+ #define MAXGAM 171.624376956302725
22
+ #define EPSILON 2.2204460492503131e-16
23
+
24
+ DEVICE static double pseries(double, double, double);
25
+ DEVICE static double incbcf(double, double, double);
26
+ DEVICE static double incbd(double, double, double);
27
+
28
+ static double big = 4.503599627370496e15;
29
+ static double biginv = 2.22044604925031308085e-16;
30
+
31
+
32
+ DEVICE double BetaInc(double a, double b, double x)
33
+ {
34
+ double xc, y, w, t;
35
+ /* check function arguments */
36
+ if (a <= 0.0) return NPY_NAN;
37
+ if (b <= 0.0) return NPY_NAN;
38
+ if (x < 0.0) return NPY_NAN;
39
+ if (1.0 < x) return NPY_NAN;
40
+
41
+ /* some special cases */
42
+ if (x == 0.0) return 0.0;
43
+ if (x == 1.0) return 1.0;
44
+
45
+ if ( (b * x) <= 1.0 && x <= 0.95)
46
+ {
47
+ return pseries(a, b, x);
48
+ }
49
+
50
+ xc = 1.0 - x;
51
+ /* reverse a and b if x is greater than the mean */
52
+ if (x > (a / (a + b)))
53
+ {
54
+ t = BetaInc(b, a, xc);
55
+ if (t <= EPSILON) return 1.0 - EPSILON;
56
+ return 1.0 - t;
57
+ }
58
+
59
+ /* Choose expansion for better convergence. */
60
+ y = x * (a+b-2.0) - (a-1.0);
61
+ if( y < 0.0 )
62
+ w = incbcf( a, b, x );
63
+ else
64
+ w = incbd( a, b, x ) / xc;
65
+
66
+ y = a * log(x);
67
+ t = b * log(xc);
68
+ if( (a+b) < MAXGAM && fabs(y) < MAXLOG && fabs(t) < MAXLOG )
69
+ {
70
+ t = pow(xc, b);
71
+ t *= pow(x, a);
72
+ t /= a;
73
+ t *= w;
74
+ t *= tgamma(a + b) / (tgamma(a) * tgamma(b));
75
+
76
+ return t;
77
+ }
78
+
79
+ /* Resort to logarithms. */
80
+ y += t + lgamma(a+b) - lgamma(a) - lgamma(b);
81
+ y += log(w / a);
82
+ if( y < MINLOG )
83
+ t = 0.0;
84
+ else
85
+ t = exp(y);
86
+
87
+ return t;
88
+ }
89
+
90
+ /* Continued fraction expansion #1
91
+ * for incomplete beta integral
92
+ */
93
+
94
+ DEVICE static double incbcf(double a, double b, double x)
95
+ {
96
+ double xk, pk, pkm1, pkm2, qk, qkm1, qkm2;
97
+ double k1, k2, k3, k4, k5, k6, k7, k8;
98
+ double r, t, ans, thresh;
99
+ int n;
100
+
101
+ k1 = a;
102
+ k2 = a + b;
103
+ k3 = a;
104
+ k4 = a + 1.0;
105
+ k5 = 1.0;
106
+ k6 = b - 1.0;
107
+ k7 = k4;
108
+ k8 = a + 2.0;
109
+
110
+ pkm2 = 0.0;
111
+ qkm2 = 1.0;
112
+ pkm1 = 1.0;
113
+ qkm1 = 1.0;
114
+ ans = 1.0;
115
+ r = 1.0;
116
+ n = 0;
117
+ thresh = 3.0 * EPSILON;
118
+ do
119
+ {
120
+
121
+ xk = -( x * k1 * k2 ) / ( k3 * k4 );
122
+ pk = pkm1 + pkm2 * xk;
123
+ qk = qkm1 + qkm2 * xk;
124
+ pkm2 = pkm1;
125
+ pkm1 = pk;
126
+ qkm2 = qkm1;
127
+ qkm1 = qk;
128
+
129
+ xk = ( x * k5 * k6 ) / ( k7 * k8 );
130
+ pk = pkm1 + pkm2 * xk;
131
+ qk = qkm1 + qkm2 * xk;
132
+ pkm2 = pkm1;
133
+ pkm1 = pk;
134
+ qkm2 = qkm1;
135
+ qkm1 = qk;
136
+
137
+ if( qk != 0.0 )
138
+ r = pk/qk;
139
+ if( r != 0.0 )
140
+ {
141
+ t = fabs( (ans - r) / r );
142
+ ans = r;
143
+ }
144
+ else
145
+ t = 1.0;
146
+
147
+ if( t < thresh )
148
+ break;
149
+
150
+ k1 += 1.0;
151
+ k2 += 1.0;
152
+ k3 += 2.0;
153
+ k4 += 2.0;
154
+ k5 += 1.0;
155
+ k6 -= 1.0;
156
+ k7 += 2.0;
157
+ k8 += 2.0;
158
+
159
+ if( (fabs(qk) + fabs(pk)) > big )
160
+ {
161
+ pkm2 *= biginv;
162
+ pkm1 *= biginv;
163
+ qkm2 *= biginv;
164
+ qkm1 *= biginv;
165
+ }
166
+ if( (fabs(qk) < biginv) || (fabs(pk) < biginv) )
167
+ {
168
+ pkm2 *= big;
169
+ pkm1 *= big;
170
+ qkm2 *= big;
171
+ qkm1 *= big;
172
+ }
173
+ }
174
+ while( ++n < 300 );
175
+
176
+ return ans;
177
+ }
178
+
179
+ /* Continued fraction expansion #2
180
+ * for incomplete beta integral
181
+ */
182
+
183
+ DEVICE static double incbd(double a, double b, double x)
184
+ {
185
+ double xk, pk, pkm1, pkm2, qk, qkm1, qkm2;
186
+ double k1, k2, k3, k4, k5, k6, k7, k8;
187
+ double r, t, ans, z, thresh;
188
+ int n;
189
+
190
+ k1 = a;
191
+ k2 = b - 1.0;
192
+ k3 = a;
193
+ k4 = a + 1.0;
194
+ k5 = 1.0;
195
+ k6 = a + b;
196
+ k7 = a + 1.0;;
197
+ k8 = a + 2.0;
198
+
199
+ pkm2 = 0.0;
200
+ qkm2 = 1.0;
201
+ pkm1 = 1.0;
202
+ qkm1 = 1.0;
203
+ z = x / (1.0-x);
204
+ ans = 1.0;
205
+ r = 1.0;
206
+ n = 0;
207
+ thresh = 3.0 * EPSILON;
208
+ do
209
+ {
210
+
211
+ xk = -( z * k1 * k2 ) / ( k3 * k4 );
212
+ pk = pkm1 + pkm2 * xk;
213
+ qk = qkm1 + qkm2 * xk;
214
+ pkm2 = pkm1;
215
+ pkm1 = pk;
216
+ qkm2 = qkm1;
217
+ qkm1 = qk;
218
+
219
+ xk = ( z * k5 * k6 ) / ( k7 * k8 );
220
+ pk = pkm1 + pkm2 * xk;
221
+ qk = qkm1 + qkm2 * xk;
222
+ pkm2 = pkm1;
223
+ pkm1 = pk;
224
+ qkm2 = qkm1;
225
+ qkm1 = qk;
226
+
227
+ if( qk != 0 )
228
+ r = pk/qk;
229
+ if( r != 0 )
230
+ {
231
+ t = fabs( (ans - r) / r );
232
+ ans = r;
233
+ }
234
+ else
235
+ t = 1.0;
236
+
237
+ if( t < thresh )
238
+ break;
239
+
240
+ k1 += 1.0;
241
+ k2 -= 1.0;
242
+ k3 += 2.0;
243
+ k4 += 2.0;
244
+ k5 += 1.0;
245
+ k6 += 1.0;
246
+ k7 += 2.0;
247
+ k8 += 2.0;
248
+
249
+ if( (fabs(qk) + fabs(pk)) > big )
250
+ {
251
+ pkm2 *= biginv;
252
+ pkm1 *= biginv;
253
+ qkm2 *= biginv;
254
+ qkm1 *= biginv;
255
+ }
256
+ if( (fabs(qk) < biginv) || (fabs(pk) < biginv) )
257
+ {
258
+ pkm2 *= big;
259
+ pkm1 *= big;
260
+ qkm2 *= big;
261
+ qkm1 *= big;
262
+ }
263
+ }
264
+ while( ++n < 300 );
265
+
266
+ return ans;
267
+ }
268
+
269
+
270
+ /* Power series for incomplete beta integral.
271
+ Use when b*x is small and x not too close to 1. */
272
+
273
+ DEVICE static double pseries(double a, double b, double x)
274
+ {
275
+ double s, t, u, v, n, t1, z, ai;
276
+
277
+ ai = 1.0 / a;
278
+ u = (1.0 - b) * x;
279
+ v = u / (a + 1.0);
280
+ t1 = v;
281
+ t = u;
282
+ n = 2.0;
283
+ s = 0.0;
284
+ z = EPSILON * ai;
285
+ while( fabs(v) > z )
286
+ {
287
+ u = (n - b) * x / n;
288
+ t *= u;
289
+ v = t / (a + n);
290
+ s += v;
291
+ n += 1.0;
292
+ }
293
+ s += t1;
294
+ s += ai;
295
+
296
+ u = a * log(x);
297
+ if( (a+b) < MAXGAM && fabs(u) < MAXLOG )
298
+ {
299
+ t = tgamma(a + b) / (tgamma(a) * tgamma(b));
300
+ s = s * t * pow(x,a);
301
+ }
302
+ else
303
+ {
304
+ t = lgamma(a + b) - lgamma(a) - lgamma(b) + u + log(s);
305
+ if( t < MINLOG )
306
+ s = 0.0;
307
+ else
308
+ s = exp(t);
309
+ }
310
+ return s;
311
+ }
@@ -1495,8 +1495,25 @@ class BetaInc(ScalarOp):
1495
1495
  ),
1496
1496
  ]
1497
1497
 
1498
- def c_code(self, *args, **kwargs):
1499
- raise NotImplementedError()
1498
+ def c_support_code(self, **kwargs):
1499
+ with open(os.path.join(os.path.dirname(__file__), "c_code", "incbet.c")) as f:
1500
+ raw = f.read()
1501
+ return raw
1502
+
1503
+ def c_code(self, node, name, inp, out, sub):
1504
+ (a, b, x) = inp
1505
+ (z,) = out
1506
+ if (
1507
+ node.inputs[0].type in float_types
1508
+ and node.inputs[1].type in float_types
1509
+ and node.inputs[2].type in float_types
1510
+ ):
1511
+ return f"""{z} = BetaInc({a}, {b}, {x});"""
1512
+
1513
+ raise NotImplementedError("type not supported", type)
1514
+
1515
+ def c_code_cache_version(self):
1516
+ return (1,)
1500
1517
 
1501
1518
 
1502
1519
  betainc = BetaInc(upgrade_to_float_no_complex, name="betainc")
@@ -4316,23 +4316,26 @@ def block_diag(*matrices: TensorVariable, format: Literal["csc", "csr"] = "csc")
4316
4316
  --------
4317
4317
  Create a sparse block diagonal matrix from two sparse 2x2 matrices:
4318
4318
 
4319
- ..code-block:: python
4319
+ .. testcode::
4320
4320
  import numpy as np
4321
4321
  from pytensor.sparse import block_diag
4322
4322
  from scipy.sparse import csr_matrix
4323
4323
 
4324
4324
  A = csr_matrix([[1, 2], [3, 4]])
4325
4325
  B = csr_matrix([[5, 6], [7, 8]])
4326
- result_sparse = block_diag(A, B, format='csr', name='X')
4326
+ result_sparse = block_diag(A, B, format='csr')
4327
4327
 
4328
4328
  print(result_sparse)
4329
- >>> SparseVariable{csr,int32}
4330
-
4331
4329
  print(result_sparse.toarray().eval())
4332
- >>> array([[1, 2, 0, 0],
4333
- >>> [3, 4, 0, 0],
4334
- >>> [0, 0, 5, 6],
4335
- >>> [0, 0, 7, 8]])
4330
+
4331
+ .. testoutput::
4332
+
4333
+ SparseVariable{csr,int64}
4334
+ [[1 2 0 0]
4335
+ [3 4 0 0]
4336
+ [0 0 5 6]
4337
+ [0 0 7 8]]
4338
+
4336
4339
  """
4337
4340
  if len(matrices) == 1:
4338
4341
  return matrices