pytensor 2.25.5__tar.gz → 2.26.1__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 (419) hide show
  1. {pytensor-2.25.5/pytensor.egg-info → pytensor-2.26.1}/PKG-INFO +1 -1
  2. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/graph/graph.rst +0 -7
  3. pytensor-2.26.1/doc/library/graph/index.rst +21 -0
  4. pytensor-2.26.1/doc/library/graph/op.rst +8 -0
  5. pytensor-2.26.1/doc/library/graph/replace.rst +8 -0
  6. pytensor-2.26.1/doc/library/tensor/functional.rst +2 -0
  7. pytensor-2.26.1/doc/library/tensor/index.rst +33 -0
  8. pytensor-2.26.1/doc/library/tensor/random/distributions.rst +8 -0
  9. pytensor-2.25.5/doc/library/tensor/random/utils.rst → pytensor-2.26.1/doc/library/tensor/random/index.rst +41 -16
  10. {pytensor-2.25.5 → pytensor-2.26.1}/pyproject.toml +4 -3
  11. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/_version.py +3 -3
  12. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/function/types.py +122 -127
  13. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/gradient.py +0 -3
  14. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/null_type.py +0 -3
  15. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/op.py +16 -3
  16. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/type.py +1 -4
  17. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/ifelse.py +1 -1
  18. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/c/cmodule.py +40 -6
  19. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/pytorch/dispatch/__init__.py +1 -0
  20. pytensor-2.26.1/pytensor/link/pytorch/dispatch/blockwise.py +32 -0
  21. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/pytorch/dispatch/scalar.py +11 -0
  22. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/pytorch/dispatch/shape.py +1 -1
  23. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/pytorch/dispatch/subtensor.py +7 -2
  24. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scalar/basic.py +42 -41
  25. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scalar/loop.py +2 -2
  26. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scan/rewriting.py +1 -1
  27. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/sparse/basic.py +11 -12
  28. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/sparse/rewriting.py +5 -5
  29. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/sparse/sandbox/sp.py +2 -3
  30. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/basic.py +7 -8
  31. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/blas.py +32 -10
  32. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/blockwise.py +46 -27
  33. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/elemwise.py +67 -97
  34. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/extra_ops.py +40 -67
  35. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/fft.py +5 -4
  36. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/inplace.py +2 -2
  37. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/math.py +83 -31
  38. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/nlinalg.py +1 -1
  39. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/random/op.py +5 -13
  40. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/random/rewriting/basic.py +1 -1
  41. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/random/rewriting/jax.py +1 -1
  42. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/basic.py +24 -14
  43. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/blas.py +12 -8
  44. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/blas_scipy.py +1 -1
  45. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/blockwise.py +82 -4
  46. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/elemwise.py +4 -7
  47. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/jax.py +1 -1
  48. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/linalg.py +290 -2
  49. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/math.py +159 -236
  50. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/shape.py +2 -7
  51. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/subtensor.py +72 -41
  52. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/shape.py +2 -13
  53. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/sharedvar.py +1 -2
  54. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/slinalg.py +296 -101
  55. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/sort.py +1 -2
  56. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/subtensor.py +18 -9
  57. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/type.py +5 -6
  58. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/type_other.py +0 -6
  59. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/variable.py +9 -7
  60. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/typed_list/rewriting.py +1 -1
  61. {pytensor-2.25.5 → pytensor-2.26.1/pytensor.egg-info}/PKG-INFO +1 -1
  62. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor.egg-info/SOURCES.txt +4 -3
  63. pytensor-2.25.5/doc/library/graph/index.rst +0 -21
  64. pytensor-2.25.5/doc/library/graph/op.rst +0 -12
  65. pytensor-2.25.5/doc/library/tensor/index.rst +0 -31
  66. pytensor-2.25.5/doc/library/tensor/random/basic.rst +0 -161
  67. pytensor-2.25.5/doc/library/tensor/random/index.rst +0 -21
  68. pytensor-2.25.5/pytensor/misc/safe_asarray.py +0 -57
  69. {pytensor-2.25.5 → pytensor-2.26.1}/LICENSE.txt +0 -0
  70. {pytensor-2.25.5 → pytensor-2.26.1}/MANIFEST.in +0 -0
  71. {pytensor-2.25.5 → pytensor-2.26.1}/README.rst +0 -0
  72. {pytensor-2.25.5 → pytensor-2.26.1}/doc/.templates/PLACEHOLDER +0 -0
  73. {pytensor-2.25.5 → pytensor-2.26.1}/doc/.templates/layout.html +0 -0
  74. {pytensor-2.25.5 → pytensor-2.26.1}/doc/LICENSE.txt +0 -0
  75. {pytensor-2.25.5 → pytensor-2.26.1}/doc/README.md +0 -0
  76. {pytensor-2.25.5 → pytensor-2.26.1}/doc/acknowledgement.rst +0 -0
  77. {pytensor-2.25.5 → pytensor-2.26.1}/doc/bcast.png +0 -0
  78. {pytensor-2.25.5 → pytensor-2.26.1}/doc/bcast.svg +0 -0
  79. {pytensor-2.25.5 → pytensor-2.26.1}/doc/conf.py +0 -0
  80. {pytensor-2.25.5 → pytensor-2.26.1}/doc/core_development_guide.rst +0 -0
  81. {pytensor-2.25.5 → pytensor-2.26.1}/doc/css.inc +0 -0
  82. {pytensor-2.25.5 → pytensor-2.26.1}/doc/dev_start_guide.rst +0 -0
  83. {pytensor-2.25.5 → pytensor-2.26.1}/doc/environment.yml +0 -0
  84. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/apply.png +0 -0
  85. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/apply.svg +0 -0
  86. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/apply2.svg +0 -0
  87. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/creating_a_c_op.rst +0 -0
  88. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/creating_a_numba_jax_op.rst +0 -0
  89. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/creating_an_op.rst +0 -0
  90. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/ctype.rst +0 -0
  91. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/extending_faq.rst +0 -0
  92. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/extending_pytensor_solution_1.py +0 -0
  93. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/graph_rewriting.rst +0 -0
  94. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/graphstructures.rst +0 -0
  95. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/index.rst +0 -0
  96. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/inplace.rst +0 -0
  97. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/op.rst +0 -0
  98. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/other_ops.rst +0 -0
  99. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/pics/symbolic_graph_opt.png +0 -0
  100. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
  101. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/pipeline.rst +0 -0
  102. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/scan.rst +0 -0
  103. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/tips.rst +0 -0
  104. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/type.rst +0 -0
  105. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/unittest.rst +0 -0
  106. {pytensor-2.25.5 → pytensor-2.26.1}/doc/extending/using_params.rst +0 -0
  107. {pytensor-2.25.5 → pytensor-2.26.1}/doc/faq.rst +0 -0
  108. {pytensor-2.25.5 → pytensor-2.26.1}/doc/generate_dtype_tensor_table.py +0 -0
  109. {pytensor-2.25.5 → pytensor-2.26.1}/doc/glossary.rst +0 -0
  110. {pytensor-2.25.5 → pytensor-2.26.1}/doc/images/Elman_srnn.png +0 -0
  111. {pytensor-2.25.5 → pytensor-2.26.1}/doc/images/PyTensor_RGB.svg +0 -0
  112. {pytensor-2.25.5 → pytensor-2.26.1}/doc/images/blocksparse.png +0 -0
  113. {pytensor-2.25.5 → pytensor-2.26.1}/doc/images/lstm.png +0 -0
  114. {pytensor-2.25.5 → pytensor-2.26.1}/doc/images/lstm_memorycell.png +0 -0
  115. {pytensor-2.25.5 → pytensor-2.26.1}/doc/images/talk2010.gif +0 -0
  116. {pytensor-2.25.5 → pytensor-2.26.1}/doc/images/talk2010.png +0 -0
  117. {pytensor-2.25.5 → pytensor-2.26.1}/doc/index.rst +0 -0
  118. {pytensor-2.25.5 → pytensor-2.26.1}/doc/install.rst +0 -0
  119. {pytensor-2.25.5 → pytensor-2.26.1}/doc/internal/how_to_release.rst +0 -0
  120. {pytensor-2.25.5 → pytensor-2.26.1}/doc/internal/index.rst +0 -0
  121. {pytensor-2.25.5 → pytensor-2.26.1}/doc/internal/metadocumentation.rst +0 -0
  122. {pytensor-2.25.5 → pytensor-2.26.1}/doc/introduction.rst +0 -0
  123. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/compile/debugmode.rst +0 -0
  124. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/compile/function.rst +0 -0
  125. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/compile/index.rst +0 -0
  126. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/compile/io.rst +0 -0
  127. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/compile/mode.rst +0 -0
  128. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/compile/nanguardmode.rst +0 -0
  129. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/compile/opfromgraph.rst +0 -0
  130. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/compile/ops.rst +0 -0
  131. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/compile/profilemode.rst +0 -0
  132. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/compile/shared.rst +0 -0
  133. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/config.rst +0 -0
  134. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
  135. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
  136. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
  137. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
  138. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
  139. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
  140. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
  141. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/mlp.html +0 -0
  142. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/mlp.png +0 -0
  143. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/mlp2.html +0 -0
  144. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/mlp2.pdf +0 -0
  145. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/mlp2.png +0 -0
  146. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/ofg.html +0 -0
  147. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/examples/ofg2.html +0 -0
  148. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/index.ipynb +0 -0
  149. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/index.rst +0 -0
  150. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/index_files/index_10_0.png +0 -0
  151. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/index_files/index_11_0.png +0 -0
  152. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/index_files/index_24_0.png +0 -0
  153. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/d3viz/index_files/index_25_0.png +0 -0
  154. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/gradient.rst +0 -0
  155. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/graph/features.rst +0 -0
  156. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/graph/fgraph.rst +0 -0
  157. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/graph/type.rst +0 -0
  158. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/graph/utils.rst +0 -0
  159. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/index.rst +0 -0
  160. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/misc/pkl_utils.rst +0 -0
  161. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/printing.rst +0 -0
  162. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/sandbox/index.rst +0 -0
  163. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/sandbox/linalg.rst +0 -0
  164. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/scalar/index.rst +0 -0
  165. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/scan.rst +0 -0
  166. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/sparse/index.rst +0 -0
  167. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/sparse/sandbox.rst +0 -0
  168. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/basic.rst +0 -0
  169. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/basic_opt.rst +0 -0
  170. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/bcast.png +0 -0
  171. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/bcast.svg +0 -0
  172. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/conv.rst +0 -0
  173. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/elemwise.rst +0 -0
  174. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/extra_ops.rst +0 -0
  175. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/fft.rst +0 -0
  176. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/io.rst +0 -0
  177. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/math_opt.rst +0 -0
  178. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/nlinalg.rst +0 -0
  179. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/plot_fft.png +0 -0
  180. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/slinalg.rst +0 -0
  181. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/tensor/utils.rst +0 -0
  182. {pytensor-2.25.5 → pytensor-2.26.1}/doc/library/typed_list.rst +0 -0
  183. {pytensor-2.25.5 → pytensor-2.26.1}/doc/links.rst +0 -0
  184. {pytensor-2.25.5 → pytensor-2.26.1}/doc/optimizations.rst +0 -0
  185. {pytensor-2.25.5 → pytensor-2.26.1}/doc/pylintrc +0 -0
  186. {pytensor-2.25.5 → pytensor-2.26.1}/doc/troubleshooting.rst +0 -0
  187. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/adding.rst +0 -0
  188. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/adding_solution_1.py +0 -0
  189. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/aliasing.rst +0 -0
  190. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/apply.png +0 -0
  191. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/apply.svg +0 -0
  192. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/bcast.png +0 -0
  193. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/broadcasting.rst +0 -0
  194. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/conditions.rst +0 -0
  195. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/debug_faq.rst +0 -0
  196. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/dlogistic.png +0 -0
  197. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/examples.rst +0 -0
  198. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/faq_tutorial.rst +0 -0
  199. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/gradients.rst +0 -0
  200. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/index.rst +0 -0
  201. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/loading_and_saving.rst +0 -0
  202. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/logistic.gp +0 -0
  203. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/logistic.png +0 -0
  204. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/loop.rst +0 -0
  205. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/loop_solution_1.py +0 -0
  206. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/modes.rst +0 -0
  207. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/modes_solution_1.py +0 -0
  208. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/multi_cores.rst +0 -0
  209. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/nan_tutorial.rst +0 -0
  210. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/pics/d3viz.png +0 -0
  211. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
  212. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
  213. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
  214. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/printing_drawing.rst +0 -0
  215. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/prng.rst +0 -0
  216. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/profiling.rst +0 -0
  217. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/profiling_example.py +0 -0
  218. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/profiling_example_out.prof +0 -0
  219. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/shape_info.rst +0 -0
  220. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/sparse.rst +0 -0
  221. {pytensor-2.25.5 → pytensor-2.26.1}/doc/tutorial/symbolic_graphs.rst +0 -0
  222. {pytensor-2.25.5 → pytensor-2.26.1}/doc/user_guide.rst +0 -0
  223. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/__init__.py +0 -0
  224. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/bin/__init__.py +0 -0
  225. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/bin/pytensor_cache.py +0 -0
  226. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/breakpoint.py +0 -0
  227. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/__init__.py +0 -0
  228. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/builders.py +0 -0
  229. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/compiledir.py +0 -0
  230. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/compilelock.py +0 -0
  231. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/debugmode.py +0 -0
  232. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/function/__init__.py +0 -0
  233. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/function/pfunc.py +0 -0
  234. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/io.py +0 -0
  235. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/mode.py +0 -0
  236. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/monitormode.py +0 -0
  237. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/nanguardmode.py +0 -0
  238. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/ops.py +0 -0
  239. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/profiling.py +0 -0
  240. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/compile/sharedvalue.py +0 -0
  241. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/configdefaults.py +0 -0
  242. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/configparser.py +0 -0
  243. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/d3viz/__init__.py +0 -0
  244. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/d3viz/css/d3-context-menu.css +0 -0
  245. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/d3viz/css/d3viz.css +0 -0
  246. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/d3viz/d3viz.py +0 -0
  247. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/d3viz/formatting.py +0 -0
  248. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/d3viz/js/d3-context-menu.js +0 -0
  249. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/d3viz/js/d3.v3.min.js +0 -0
  250. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/d3viz/js/d3viz.js +0 -0
  251. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
  252. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
  253. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/__init__.py +0 -0
  254. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/basic.py +0 -0
  255. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/destroyhandler.py +0 -0
  256. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/features.py +0 -0
  257. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/fg.py +0 -0
  258. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/replace.py +0 -0
  259. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/rewriting/__init__.py +0 -0
  260. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/rewriting/basic.py +0 -0
  261. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/rewriting/db.py +0 -0
  262. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/rewriting/kanren.py +0 -0
  263. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/rewriting/unify.py +0 -0
  264. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/rewriting/utils.py +0 -0
  265. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/graph/utils.py +0 -0
  266. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/__init__.py +0 -0
  267. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/basic.py +0 -0
  268. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/c/__init__.py +0 -0
  269. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/c/basic.py +0 -0
  270. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
  271. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
  272. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/c/cutils.py +0 -0
  273. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/c/cvm.py +0 -0
  274. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/c/exceptions.py +0 -0
  275. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/c/interface.py +0 -0
  276. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/c/lazylinker_c.py +0 -0
  277. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/c/op.py +0 -0
  278. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/c/params_type.py +0 -0
  279. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/c/type.py +0 -0
  280. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/__init__.py +0 -0
  281. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/__init__.py +0 -0
  282. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/basic.py +0 -0
  283. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/blas.py +0 -0
  284. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/blockwise.py +0 -0
  285. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/einsum.py +0 -0
  286. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/elemwise.py +0 -0
  287. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
  288. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/math.py +0 -0
  289. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
  290. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/pad.py +0 -0
  291. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/random.py +0 -0
  292. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/scalar.py +0 -0
  293. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/scan.py +0 -0
  294. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/shape.py +0 -0
  295. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/slinalg.py +0 -0
  296. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/sort.py +0 -0
  297. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/sparse.py +0 -0
  298. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/subtensor.py +0 -0
  299. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
  300. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/jax/linker.py +0 -0
  301. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/__init__.py +0 -0
  302. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/__init__.py +0 -0
  303. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/basic.py +0 -0
  304. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/cython_support.py +0 -0
  305. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/elemwise.py +0 -0
  306. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
  307. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
  308. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/random.py +0 -0
  309. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/scalar.py +0 -0
  310. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/scan.py +0 -0
  311. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/slinalg.py +0 -0
  312. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/sparse.py +0 -0
  313. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/subtensor.py +0 -0
  314. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
  315. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
  316. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/numba/linker.py +0 -0
  317. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/pytorch/dispatch/basic.py +0 -0
  318. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/pytorch/dispatch/blas.py +0 -0
  319. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
  320. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
  321. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/pytorch/dispatch/math.py +0 -0
  322. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
  323. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/pytorch/dispatch/sort.py +0 -0
  324. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/pytorch/linker.py +0 -0
  325. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/utils.py +0 -0
  326. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/link/vm.py +0 -0
  327. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/misc/__init__.py +0 -0
  328. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/misc/check_blas.py +0 -0
  329. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/misc/check_blas_many.sh +0 -0
  330. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/misc/check_duplicate_key.py +0 -0
  331. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
  332. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/misc/elemwise_time_test.py +0 -0
  333. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/misc/frozendict.py +0 -0
  334. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/misc/may_share_memory.py +0 -0
  335. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/misc/ordered_set.py +0 -0
  336. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/misc/pkl_utils.py +0 -0
  337. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/printing.py +0 -0
  338. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/py.typed +0 -0
  339. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/raise_op.py +0 -0
  340. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scalar/__init__.py +0 -0
  341. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
  342. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
  343. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scalar/c_code/gamma.c +0 -0
  344. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scalar/c_code/incbet.c +0 -0
  345. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scalar/math.py +0 -0
  346. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scalar/sharedvar.py +0 -0
  347. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scan/__init__.py +0 -0
  348. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scan/basic.py +0 -0
  349. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scan/checkpoints.py +0 -0
  350. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scan/op.py +0 -0
  351. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scan/scan_perform.pyx +0 -0
  352. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scan/scan_perform_ext.py +0 -0
  353. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scan/utils.py +0 -0
  354. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/scan/views.py +0 -0
  355. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/sparse/__init__.py +0 -0
  356. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/sparse/sandbox/__init__.py +0 -0
  357. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/sparse/sandbox/sp2.py +0 -0
  358. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/sparse/sharedvar.py +0 -0
  359. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/sparse/type.py +0 -0
  360. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/sparse/utils.py +0 -0
  361. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/__init__.py +0 -0
  362. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/blas_c.py +0 -0
  363. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/blas_headers.py +0 -0
  364. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/blas_scipy.py +0 -0
  365. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
  366. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
  367. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/c_code/dimshuffle.c +0 -0
  368. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/conv/__init__.py +0 -0
  369. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/conv/abstract_conv.py +0 -0
  370. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/einsum.py +0 -0
  371. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/elemwise_cgen.py +0 -0
  372. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/exceptions.py +0 -0
  373. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/fourier.py +0 -0
  374. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/functional.py +0 -0
  375. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/io.py +0 -0
  376. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/linalg.py +0 -0
  377. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/pad.py +0 -0
  378. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/random/__init__.py +0 -0
  379. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/random/basic.py +0 -0
  380. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/random/rewriting/__init__.py +0 -0
  381. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/random/rewriting/numba.py +0 -0
  382. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/random/type.py +0 -0
  383. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/random/utils.py +0 -0
  384. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/random/var.py +0 -0
  385. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/__init__.py +0 -0
  386. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/blas_c.py +0 -0
  387. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/einsum.py +0 -0
  388. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/extra_ops.py +0 -0
  389. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/ofg.py +0 -0
  390. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/special.py +0 -0
  391. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
  392. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/special.py +0 -0
  393. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/utils.py +0 -0
  394. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/var.py +0 -0
  395. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/tensor/xlogx.py +0 -0
  396. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/typed_list/__init__.py +0 -0
  397. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/typed_list/basic.py +0 -0
  398. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/typed_list/type.py +0 -0
  399. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/updates.py +0 -0
  400. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor/utils.py +0 -0
  401. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor.egg-info/dependency_links.txt +0 -0
  402. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor.egg-info/entry_points.txt +0 -0
  403. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor.egg-info/requires.txt +0 -0
  404. {pytensor-2.25.5 → pytensor-2.26.1}/pytensor.egg-info/top_level.txt +0 -0
  405. {pytensor-2.25.5 → pytensor-2.26.1}/scripts/mypy-failing.txt +0 -0
  406. {pytensor-2.25.5 → pytensor-2.26.1}/setup.cfg +0 -0
  407. {pytensor-2.25.5 → pytensor-2.26.1}/setup.py +0 -0
  408. {pytensor-2.25.5 → pytensor-2.26.1}/tests/link/c/c_code/test_cenum.h +0 -0
  409. {pytensor-2.25.5 → pytensor-2.26.1}/tests/link/c/c_code/test_quadratic_function.c +0 -0
  410. {pytensor-2.25.5 → pytensor-2.26.1}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
  411. {pytensor-2.25.5 → pytensor-2.26.1}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
  412. {pytensor-2.25.5 → pytensor-2.26.1}/tests/test_breakpoint.py +0 -0
  413. {pytensor-2.25.5 → pytensor-2.26.1}/tests/test_config.py +0 -0
  414. {pytensor-2.25.5 → pytensor-2.26.1}/tests/test_gradient.py +0 -0
  415. {pytensor-2.25.5 → pytensor-2.26.1}/tests/test_ifelse.py +0 -0
  416. {pytensor-2.25.5 → pytensor-2.26.1}/tests/test_printing.py +0 -0
  417. {pytensor-2.25.5 → pytensor-2.26.1}/tests/test_raise_op.py +0 -0
  418. {pytensor-2.25.5 → pytensor-2.26.1}/tests/test_rop.py +0 -0
  419. {pytensor-2.25.5 → pytensor-2.26.1}/tests/test_updates.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytensor
3
- Version: 2.25.5
3
+ Version: 2.26.1
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:
@@ -4,12 +4,5 @@
4
4
  :mod:`graph` -- Interface for the PyTensor graph
5
5
  ================================================
6
6
 
7
- ---------
8
- Reference
9
- ---------
10
-
11
7
  .. automodule:: pytensor.graph.basic
12
- :platform: Unix, Windows
13
- :synopsis: Interface for types of symbolic variables
14
8
  :members:
15
- .. moduleauthor:: LISA
@@ -0,0 +1,21 @@
1
+
2
+ .. _libdoc_graph:
3
+
4
+ ========================================
5
+ :mod:`graph` -- PyTensor Graph Internals
6
+ ========================================
7
+
8
+ .. module:: graph
9
+
10
+ .. moduleauthor:: LISA
11
+
12
+ .. toctree::
13
+ :maxdepth: 1
14
+
15
+ graph
16
+ fgraph
17
+ replace
18
+ features
19
+ op
20
+ type
21
+ utils
@@ -0,0 +1,8 @@
1
+ .. _libdoc_graph_op:
2
+
3
+ ===========================================
4
+ :mod:`op` -- Objects that define operations
5
+ ===========================================
6
+
7
+ .. automodule:: pytensor.graph.op
8
+ :members:
@@ -0,0 +1,8 @@
1
+ .. _libdoc_graph_replace:
2
+
3
+ ==================================================
4
+ :mod:`replace` -- High level graph transformations
5
+ ==================================================
6
+
7
+ .. automodule:: pytensor.graph.replace
8
+ :members:
@@ -0,0 +1,2 @@
1
+ .. automodule:: pytensor.tensor.functional
2
+ :members: vectorize
@@ -0,0 +1,33 @@
1
+ .. _libdoc_tensor:
2
+
3
+ ===============================================
4
+ :mod:`tensor` -- Tensor operations in PyTensor
5
+ ===============================================
6
+
7
+ .. module:: tensor
8
+
9
+ PyTensor's strength is in expressing symbolic calculations involving tensors.
10
+
11
+ PyTensor tries to emulate the numpy interface as much as possible in the tensor module.
12
+ This means that once TensorVariables are created, it should be possibly to define
13
+ symbolic expressions using calls that look just like numpy calls, such as
14
+ `pt.exp(x).transpose(0, 1)[:, None]`
15
+
16
+
17
+
18
+ .. toctree::
19
+ :maxdepth: 1
20
+
21
+ basic
22
+ random/index
23
+ utils
24
+ elemwise
25
+ extra_ops
26
+ io
27
+ slinalg
28
+ nlinalg
29
+ fft
30
+ conv
31
+ math_opt
32
+ basic_opt
33
+ functional
@@ -0,0 +1,8 @@
1
+ .. _libdoc_tensor_random_distributions:
2
+
3
+ Distributions
4
+ =============
5
+
6
+ .. automodule:: pytensor.tensor.random.basic
7
+ :members:
8
+ :special-members: __call__
@@ -1,36 +1,37 @@
1
- .. _libdoc_tensor_random_utils:
2
1
 
3
- ======================================================
4
- :mod:`utils` -- Friendly random numbers
5
- ======================================================
2
+ .. _libdoc_tensor_random_basic:
6
3
 
7
- .. module:: pytensor.tensor.random.utils
8
- :platform: Unix, Windows
4
+ =============================================
5
+ :mod:`random` -- Random number functionality
6
+ =============================================
7
+
8
+ .. module:: pytensor.tensor.random
9
9
  :synopsis: symbolic random variables
10
- .. moduleauthor:: LISA
11
10
 
12
- Guide
13
- =====
14
11
 
15
- PyTensor assigns NumPy RNG states (e.g. `Generator` or `RandomState` objects) to
12
+ The :mod:`pytensor.tensor.random` module provides random-number drawing functionality
13
+ that closely resembles the :mod:`numpy.random` module.
14
+
15
+
16
+ High-level API
17
+ ==============
18
+
19
+ PyTensor assigns NumPy RNG states (i.e. `Generator` objects) to
16
20
  each `RandomVariable`. The combination of an RNG state, a specific
17
21
  `RandomVariable` type (e.g. `NormalRV`), and a set of distribution parameters
18
22
  uniquely defines the `RandomVariable` instances in a graph.
19
23
 
20
24
  This means that a "stream" of distinct RNG states is required in order to
21
- produce distinct random variables of the same kind. `RandomStream` provides a
25
+ produce distinct random variables of the same kind. `RandomStream` provides a
22
26
  means of generating distinct random variables in a fully reproducible way.
23
27
 
24
28
  `RandomStream` is also designed to produce simpler graphs and work with more
25
- sophisticated `Op`\s like `Scan`, which makes it the de facto random variable
29
+ sophisticated `Op`\s like `Scan`, which makes it a user-friendly random variable
26
30
  interface in PyTensor.
27
31
 
28
32
  For an example of how to use random numbers, see :ref:`Using Random Numbers <using_random_numbers>`.
29
33
 
30
34
 
31
- Reference
32
- =========
33
-
34
35
  .. class:: RandomStream()
35
36
 
36
37
  This is a symbolic stand-in for `numpy.random.Generator`.
@@ -61,4 +62,28 @@ Reference
61
62
 
62
63
  .. method:: uniform, normal, binomial, multinomial, random_integers, ...
63
64
 
64
- See :class:`basic.RandomVariable`.
65
+ See :ref: Available distributions `<_libdoc_tensor_random_distributions>`.
66
+
67
+
68
+ .. testcode:: constructors
69
+
70
+ from pytensor.tensor.random.utils import RandomStream
71
+
72
+ rng = RandomStream()
73
+ sample = rng.normal(0, 1, size=(2, 2))
74
+
75
+ fn = pytensor.function([], sample)
76
+ print(fn(), fn()) # different numbers due to default updates
77
+
78
+
79
+ Low-level objects
80
+ =================
81
+
82
+ .. automodule:: pytensor.tensor.random.op
83
+ :members: RandomVariable, default_rng
84
+
85
+ ..automodule:: pytensor.tensor.random.type
86
+ :members: RandomType, RandomGeneratorType, random_generator_type
87
+
88
+ .. automodule:: pytensor.tensor.random.var
89
+ :members: RandomGeneratorSharedVariable
@@ -116,9 +116,10 @@ versionfile_source = "pytensor/_version.py"
116
116
  versionfile_build = "pytensor/_version.py"
117
117
  tag_prefix = "rel-"
118
118
 
119
- [tool.pytest]
120
- addopts = "--durations=50 --doctest-modules pytensor --ignore=pytensor/misc/check_duplicate_key.py --ignore=pytensor/link"
121
- testpaths = "tests/"
119
+ [tool.pytest.ini_options]
120
+ addopts = "--durations=50 --doctest-modules --ignore=pytensor/link --ignore=pytensor/misc/check_duplicate_key.py"
121
+ testpaths = ["pytensor/", "tests/"]
122
+ xfail_strict = true
122
123
 
123
124
  [tool.ruff]
124
125
  line-length = 88
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2024-10-03T14:16:20+0200",
11
+ "date": "2024-11-11T09:09:00+0100",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "117f80da92ac06ba19dc5ac054f49aae3c4a69f9",
15
- "version": "2.25.5"
14
+ "full-revisionid": "f2ad711ff22c4d56d210e4bd67c1e727481fd818",
15
+ "version": "2.26.1"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -326,8 +326,8 @@ class Function:
326
326
  def __init__(
327
327
  self,
328
328
  vm: "VM",
329
- input_storage,
330
- output_storage,
329
+ input_storage: list[Container],
330
+ output_storage: list[Container],
331
331
  indices,
332
332
  outputs,
333
333
  defaults,
@@ -372,7 +372,6 @@ class Function:
372
372
  name
373
373
  A string name.
374
374
  """
375
- # TODO: Rename to `vm`
376
375
  self.vm = vm
377
376
  self.input_storage = input_storage
378
377
  self.output_storage = output_storage
@@ -388,31 +387,52 @@ class Function:
388
387
  self.nodes_with_inner_function = []
389
388
  self.output_keys = output_keys
390
389
 
391
- # See if we have any mutable / borrow inputs
392
- # TODO: this only need to be set if there is more than one input
393
- self._check_for_aliased_inputs = False
394
- for i in maker.inputs:
395
- # If the input is a shared variable, the memory region is
396
- # under PyTensor control and so we don't need to check if it
397
- # is aliased as we never do that.
398
- if (
399
- isinstance(i, In)
400
- and not i.shared
401
- and (getattr(i, "borrow", False) or getattr(i, "mutable", False))
390
+ if self.output_keys is not None:
391
+ warnings.warn("output_keys is deprecated.", FutureWarning)
392
+
393
+ assert len(self.input_storage) == len(self.maker.fgraph.inputs)
394
+ assert len(self.output_storage) == len(self.maker.fgraph.outputs)
395
+
396
+ # Group indexes of inputs that are potentially aliased to each other
397
+ # Note: Historically, we only worried about aliasing inputs if they belonged to the same type,
398
+ # even though there could be two distinct types that use the same kinds of underlying objects.
399
+ potential_aliased_input_groups = []
400
+ for inp in maker.inputs:
401
+ # If the input is a shared variable, the memory region is under PyTensor control
402
+ # and can't be aliased.
403
+ if not (
404
+ isinstance(inp, In)
405
+ and inp.borrow
406
+ and not inp.shared
407
+ and hasattr(inp.variable.type, "may_share_memory")
402
408
  ):
403
- self._check_for_aliased_inputs = True
404
- break
409
+ continue
410
+
411
+ for group in potential_aliased_input_groups:
412
+ # If one is super of the other, that means one could be replaced by the other
413
+ if any(
414
+ inp.variable.type.is_super(other_inp.variable.type)
415
+ or other_inp.variable.type.is_super(inp.variable.type)
416
+ for other_inp in group
417
+ ):
418
+ group.append(inp)
419
+ break
420
+ else: # no break
421
+ # Input makes a new group
422
+ potential_aliased_input_groups.append([inp])
423
+
424
+ # Potential aliased inputs are those that belong to the same group
425
+ self._potential_aliased_input_groups: tuple[tuple[int, ...], ...] = tuple(
426
+ tuple(maker.inputs.index(inp) for inp in group)
427
+ for group in potential_aliased_input_groups
428
+ if len(group) > 1
429
+ )
405
430
 
406
431
  # We will be popping stuff off this `containers` object. It is a copy.
407
432
  containers = list(self.input_storage)
408
433
  finder = {}
409
434
  inv_finder = {}
410
435
 
411
- def distribute(indices, cs, value):
412
- input.distribute(value, indices, cs)
413
- for c in cs:
414
- c.provided += 1
415
-
416
436
  # Store the list of names of named inputs.
417
437
  named_inputs = []
418
438
  # Count the number of un-named inputs.
@@ -777,6 +797,13 @@ class Function:
777
797
  f_cpy.maker.fgraph.name = name
778
798
  return f_cpy
779
799
 
800
+ def _restore_defaults(self):
801
+ for i, (required, refeed, value) in enumerate(self.defaults):
802
+ if refeed:
803
+ if isinstance(value, Container):
804
+ value = value.storage[0]
805
+ self[i] = value
806
+
780
807
  def __call__(self, *args, **kwargs):
781
808
  """
782
809
  Evaluates value of a function on given arguments.
@@ -805,52 +832,45 @@ class Function:
805
832
  List of outputs on indices/keys from ``output_subset`` or all of them,
806
833
  if ``output_subset`` is not passed.
807
834
  """
808
-
809
- def restore_defaults():
810
- for i, (required, refeed, value) in enumerate(self.defaults):
811
- if refeed:
812
- if isinstance(value, Container):
813
- value = value.storage[0]
814
- self[i] = value
815
-
835
+ input_storage = self.input_storage
816
836
  profile = self.profile
817
- t0 = time.perf_counter()
837
+
838
+ if profile:
839
+ t0 = time.perf_counter()
818
840
 
819
841
  output_subset = kwargs.pop("output_subset", None)
820
- if output_subset is not None and self.output_keys is not None:
821
- output_subset = [self.output_keys.index(key) for key in output_subset]
842
+ if output_subset is not None:
843
+ warnings.warn("output_subset is deprecated.", FutureWarning)
844
+ if self.output_keys is not None:
845
+ output_subset = [self.output_keys.index(key) for key in output_subset]
822
846
 
823
847
  # Reinitialize each container's 'provided' counter
824
848
  if self.trust_input:
825
- i = 0
826
- for arg in args:
827
- s = self.input_storage[i]
828
- s.storage[0] = arg
829
- i += 1
849
+ for arg_container, arg in zip(input_storage, args, strict=False):
850
+ arg_container.storage[0] = arg
830
851
  else:
831
- for c in self.input_storage:
832
- c.provided = 0
852
+ for arg_container in input_storage:
853
+ arg_container.provided = 0
833
854
 
834
- if len(args) + len(kwargs) > len(self.input_storage):
855
+ if len(args) + len(kwargs) > len(input_storage):
835
856
  raise TypeError("Too many parameter passed to pytensor function")
836
857
 
837
858
  # Set positional arguments
838
- i = 0
839
- for arg in args:
840
- # TODO: provide a option for skipping the filter if we really
841
- # want speed.
842
- s = self.input_storage[i]
843
- # see this emails for a discuation about None as input
859
+ for arg_container, arg in zip(input_storage, args, strict=False):
860
+ # See discussion about None as input
844
861
  # https://groups.google.com/group/theano-dev/browse_thread/thread/920a5e904e8a8525/4f1b311a28fc27e5
845
862
  if arg is None:
846
- s.storage[0] = arg
863
+ arg_container.storage[0] = arg
847
864
  else:
848
865
  try:
849
- s.storage[0] = s.type.filter(
850
- arg, strict=s.strict, allow_downcast=s.allow_downcast
866
+ arg_container.storage[0] = arg_container.type.filter(
867
+ arg,
868
+ strict=arg_container.strict,
869
+ allow_downcast=arg_container.allow_downcast,
851
870
  )
852
871
 
853
872
  except Exception as e:
873
+ i = input_storage.index(arg_container)
854
874
  function_name = "pytensor function"
855
875
  argument_name = "argument"
856
876
  if self.name:
@@ -875,85 +895,66 @@ class Function:
875
895
  + function_name
876
896
  + f" at index {int(i)} (0-based). {where}"
877
897
  ) + e.args
878
- restore_defaults()
898
+ self._restore_defaults()
879
899
  raise
880
- s.provided += 1
881
- i += 1
900
+ arg_container.provided += 1
882
901
 
883
902
  # Set keyword arguments
884
903
  if kwargs: # for speed, skip the items for empty kwargs
885
904
  for k, arg in kwargs.items():
886
905
  self[k] = arg
887
906
 
888
- if (
889
- not self.trust_input
890
- and
891
- # The getattr is only needed for old pickle
892
- getattr(self, "_check_for_aliased_inputs", True)
893
- ):
907
+ if not self.trust_input:
894
908
  # Collect aliased inputs among the storage space
895
- args_share_memory = []
896
- for i in range(len(self.input_storage)):
897
- i_var = self.maker.inputs[i].variable
898
- i_val = self.input_storage[i].storage[0]
899
- if hasattr(i_var.type, "may_share_memory"):
900
- is_aliased = False
901
- for j in range(len(args_share_memory)):
902
- group_j = zip(
903
- [
904
- self.maker.inputs[k].variable
905
- for k in args_share_memory[j]
906
- ],
907
- [
908
- self.input_storage[k].storage[0]
909
- for k in args_share_memory[j]
910
- ],
911
- )
909
+ for potential_group in self._potential_aliased_input_groups:
910
+ args_share_memory: list[list[int]] = []
911
+ for i in potential_group:
912
+ i_type = self.maker.inputs[i].variable.type
913
+ i_val = input_storage[i].storage[0]
914
+
915
+ # Check if value is aliased with any of the values in one of the groups
916
+ for j_group in args_share_memory:
912
917
  if any(
913
- (
914
- var.type is i_var.type
915
- and var.type.may_share_memory(val, i_val)
916
- )
917
- for (var, val) in group_j
918
+ i_type.may_share_memory(input_storage[j].storage[0], i_val)
919
+ for j in j_group
918
920
  ):
919
- is_aliased = True
920
- args_share_memory[j].append(i)
921
+ j_group.append(i)
921
922
  break
922
-
923
- if not is_aliased:
923
+ else: # no break
924
+ # Create a new group
924
925
  args_share_memory.append([i])
925
926
 
926
- # Check for groups of more than one argument that share memory
927
- for group in args_share_memory:
928
- if len(group) > 1:
929
- # copy all but the first
930
- for j in group[1:]:
931
- self.input_storage[j].storage[0] = copy.copy(
932
- self.input_storage[j].storage[0]
933
- )
927
+ # Check for groups of more than one argument that share memory
928
+ for group in args_share_memory:
929
+ if len(group) > 1:
930
+ # copy all but the first
931
+ for i in group[1:]:
932
+ input_storage[i].storage[0] = copy.copy(
933
+ input_storage[i].storage[0]
934
+ )
934
935
 
935
- # Check if inputs are missing, or if inputs were set more than once, or
936
- # if we tried to provide inputs that are supposed to be implicit.
937
- if not self.trust_input:
938
- for c in self.input_storage:
939
- if c.required and not c.provided:
940
- restore_defaults()
936
+ # Check if inputs are missing, or if inputs were set more than once, or
937
+ # if we tried to provide inputs that are supposed to be implicit.
938
+ for arg_container in input_storage:
939
+ if arg_container.required and not arg_container.provided:
940
+ self._restore_defaults()
941
941
  raise TypeError(
942
- f"Missing required input: {getattr(self.inv_finder[c], 'variable', self.inv_finder[c])}"
942
+ f"Missing required input: {getattr(self.inv_finder[arg_container], 'variable', self.inv_finder[arg_container])}"
943
943
  )
944
- if c.provided > 1:
945
- restore_defaults()
944
+ if arg_container.provided > 1:
945
+ self._restore_defaults()
946
946
  raise TypeError(
947
- f"Multiple values for input: {getattr(self.inv_finder[c], 'variable', self.inv_finder[c])}"
947
+ f"Multiple values for input: {getattr(self.inv_finder[arg_container], 'variable', self.inv_finder[arg_container])}"
948
948
  )
949
- if c.implicit and c.provided > 0:
950
- restore_defaults()
949
+ if arg_container.implicit and arg_container.provided > 0:
950
+ self._restore_defaults()
951
951
  raise TypeError(
952
- f"Tried to provide value for implicit input: {getattr(self.inv_finder[c], 'variable', self.inv_finder[c])}"
952
+ f"Tried to provide value for implicit input: {getattr(self.inv_finder[arg_container], 'variable', self.inv_finder[arg_container])}"
953
953
  )
954
954
 
955
955
  # Do the actual work
956
- t0_fn = time.perf_counter()
956
+ if profile:
957
+ t0_fn = time.perf_counter()
957
958
  try:
958
959
  outputs = (
959
960
  self.vm()
@@ -961,7 +962,7 @@ class Function:
961
962
  else self.vm(output_subset=output_subset)
962
963
  )
963
964
  except Exception:
964
- restore_defaults()
965
+ self._restore_defaults()
965
966
  if hasattr(self.vm, "position_of_error"):
966
967
  # this is a new vm-provided function or c linker
967
968
  # they need this because the exception manipulation
@@ -979,26 +980,24 @@ class Function:
979
980
  # old-style linkers raise their own exceptions
980
981
  raise
981
982
 
982
- dt_fn = time.perf_counter() - t0_fn
983
- self.maker.mode.fn_time += dt_fn
984
983
  if profile:
984
+ dt_fn = time.perf_counter() - t0_fn
985
+ self.maker.mode.fn_time += dt_fn
985
986
  profile.vm_call_time += dt_fn
986
987
 
987
988
  # Retrieve the values that were computed
988
989
  if outputs is None:
989
990
  outputs = [x.data for x in self.output_storage]
990
- assert len(outputs) == len(self.output_storage)
991
991
 
992
992
  # Remove internal references to required inputs.
993
993
  # These cannot be re-used anyway.
994
- for c in self.input_storage:
995
- if c.required:
996
- c.storage[0] = None
994
+ for arg_container in input_storage:
995
+ if arg_container.required:
996
+ arg_container.storage[0] = None
997
997
 
998
998
  # if we are allowing garbage collection, remove the
999
999
  # output reference from the internal storage cells
1000
1000
  if getattr(self.vm, "allow_gc", False):
1001
- assert len(self.output_storage) == len(self.maker.fgraph.outputs)
1002
1001
  for o_container, o_variable in zip(
1003
1002
  self.output_storage, self.maker.fgraph.outputs
1004
1003
  ):
@@ -1007,12 +1006,10 @@ class Function:
1007
1006
  # WARNING: This circumvents the 'readonly' attribute in x
1008
1007
  o_container.storage[0] = None
1009
1008
 
1010
- # TODO: Get rid of this and `expanded_inputs`, since all the VMs now
1011
- # perform the updates themselves
1012
1009
  if getattr(self.vm, "need_update_inputs", True):
1013
1010
  # Update the inputs that have an update function
1014
1011
  for input, storage in reversed(
1015
- list(zip(self.maker.expanded_inputs, self.input_storage))
1012
+ list(zip(self.maker.expanded_inputs, input_storage))
1016
1013
  ):
1017
1014
  if input.update is not None:
1018
1015
  storage.data = outputs.pop()
@@ -1020,17 +1017,12 @@ class Function:
1020
1017
  outputs = outputs[: self.n_returned_outputs]
1021
1018
 
1022
1019
  # Put default values back in the storage
1023
- restore_defaults()
1024
- #
1025
- # NOTE: This logic needs to be replicated in
1026
- # scan.
1027
- # grep for 'PROFILE_CODE'
1028
- #
1029
-
1030
- dt_call = time.perf_counter() - t0
1031
- pytensor.compile.profiling.total_fct_exec_time += dt_call
1032
- self.maker.mode.call_time += dt_call
1020
+ self._restore_defaults()
1021
+
1033
1022
  if profile:
1023
+ dt_call = time.perf_counter() - t0
1024
+ pytensor.compile.profiling.total_fct_exec_time += dt_call
1025
+ self.maker.mode.call_time += dt_call
1034
1026
  profile.fct_callcount += 1
1035
1027
  profile.fct_call_time += dt_call
1036
1028
  if hasattr(self.vm, "update_profile"):
@@ -1038,6 +1030,7 @@ class Function:
1038
1030
  if profile.ignore_first_call:
1039
1031
  profile.reset()
1040
1032
  profile.ignore_first_call = False
1033
+
1041
1034
  if self.return_none:
1042
1035
  return None
1043
1036
  elif self.unpack_single and len(outputs) == 1 and output_subset is None:
@@ -1572,6 +1565,8 @@ class FunctionMaker:
1572
1565
  )
1573
1566
  for i in self.inputs
1574
1567
  ]
1568
+ if any(self.refeed):
1569
+ warnings.warn("Inputs with default values are deprecated.", FutureWarning)
1575
1570
 
1576
1571
  def create(self, input_storage=None, storage_map=None):
1577
1572
  """
@@ -128,9 +128,6 @@ class DisconnectedType(Type):
128
128
  " a symbolic placeholder."
129
129
  )
130
130
 
131
- def may_share_memory(a, b):
132
- return False
133
-
134
131
  def value_eq(a, b, force_same_dtype=True):
135
132
  raise AssertionError(
136
133
  "If you're assigning to a DisconnectedType you're"
@@ -26,9 +26,6 @@ class NullType(Type):
26
26
  def filter_variable(self, other, allow_convert=True):
27
27
  raise ValueError("No values may be assigned to a NullType")
28
28
 
29
- def may_share_memory(a, b):
30
- return False
31
-
32
29
  def values_eq(self, a, b, force_same_dtype=True):
33
30
  raise ValueError("NullType has no values to compare")
34
31