pytensor 2.31.1__tar.gz → 2.31.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pytensor-2.31.1/pytensor.egg-info → pytensor-2.31.3}/PKG-INFO +1 -1
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/_version.py +3 -3
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/slinalg.py +15 -1
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/tensor_basic.py +1 -8
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/linker.py +38 -1
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/basic.py +45 -37
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/elemwise.py +1 -1
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +1 -1
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/nlinalg.py +3 -3
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/scalar.py +20 -1
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/tensor_basic.py +1 -9
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/checkpoints.py +1 -4
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/op.py +3 -2
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/rewriting.py +24 -15
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/sandbox/sp2.py +1 -1
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/_linalg/solve/rewriting.py +19 -8
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/basic.py +173 -161
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/blas.py +14 -9
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/blas_c.py +28 -19
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/blockwise.py +22 -2
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/elemwise.py +2 -2
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/io.py +1 -1
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/op.py +2 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/basic.py +26 -37
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/blas.py +1 -1
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/elemwise.py +83 -29
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/signal/conv.py +84 -2
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/type.py +1 -1
- {pytensor-2.31.1 → pytensor-2.31.3/pytensor.egg-info}/PKG-INFO +1 -1
- {pytensor-2.31.1 → pytensor-2.31.3}/LICENSE.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/MANIFEST.in +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/README.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/.templates/layout.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/.templates/nb-badges.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/LICENSE.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/README.md +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/acknowledgement.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/bcast.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/bcast.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/blog.md +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/conf.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/core_development_guide.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/css.inc +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/dev_start_guide.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/environment.yml +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/apply.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/apply.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/apply2.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/ctype.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/extending_faq.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/graphstructures.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/inplace.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/op.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/other_ops.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/pipeline.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/scan.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/tips.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/type.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/unittest.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/extending/using_params.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/faq.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/gallery/page_footer.md +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/glossary.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/Elman_srnn.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/PyTensor.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/binder.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/blocksparse.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/colab.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/github.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/lstm.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/talk2010.gif +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/images/talk2010.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/install.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/internal/how_to_release.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/internal/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/introduction.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/function.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/io.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/mode.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/ops.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/compile/shared.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/config.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/features.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/graph.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/op.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/replace.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/type.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/graph/utils.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/printing.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/scalar/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/scan.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/sparse/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/basic.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/bcast.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/conv.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/fft.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/functional.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/io.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/random/distributions.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/random/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/tensor/utils.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/library/typed_list.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/links.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/optimizations.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/pylintrc +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/robots.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/troubleshooting.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/adding.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/apply.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/apply.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/bcast.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/conditions.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/examples.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/gradients.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/logistic.gp +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/logistic.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/loop.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/modes.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/prng.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/profiling.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/sparse.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/doc/user_guide.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pyproject.toml +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/bin/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/breakpoint.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/builders.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/compiledir.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/compilelock.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/debugmode.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/function/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/function/pfunc.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/function/types.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/io.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/mode.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/monitormode.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/nanguardmode.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/ops.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/profiling.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/configdefaults.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/configparser.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/gradient.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/features.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/fg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/null_type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/op.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/replace.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/graph/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/ifelse.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/cutils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/cvm.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/interface.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/op.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/params_type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/c/type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/slinalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/sparse.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/numba/linker.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/link/vm.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/check_blas.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/frozendict.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/npy_2_compat.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/printing.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/py.typed +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/raise_op.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/loop.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/math.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/scan/views.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/sandbox/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/sandbox/sp.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/sparse/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/_linalg/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/blas_scipy.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/conv/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/conv/abstract_conv.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/einsum.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/fft.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/fourier.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/functional.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/inplace.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/linalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/math.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/pad.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/random/var.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/conv.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/linalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/math.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/subtensor.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/shape.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/slinalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/sort.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/special.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/subtensor.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/type_other.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/var.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/variable.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/typed_list/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/typed_list/type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/updates.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor.egg-info/SOURCES.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/scripts/mypy-failing.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/setup.cfg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/setup.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_breakpoint.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_config.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_gradient.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_ifelse.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_printing.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_raise_op.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_rop.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.3}/tests/test_updates.py +0 -0
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-
|
|
11
|
+
"date": "2025-06-02T15:09:01+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.31.
|
|
14
|
+
"full-revisionid": "ff98ab8f8d2e6b78539a9225bde5e18a49ae6b81",
|
|
15
|
+
"version": "2.31.3"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -46,6 +46,7 @@ def jax_funcify_Cholesky(op, **kwargs):
|
|
|
46
46
|
def jax_funcify_Solve(op, **kwargs):
|
|
47
47
|
assume_a = op.assume_a
|
|
48
48
|
lower = op.lower
|
|
49
|
+
b_is_vec = op.b_ndim == 1
|
|
49
50
|
|
|
50
51
|
if assume_a == "tridiagonal":
|
|
51
52
|
# jax.scipy.solve does not yet support tridiagonal matrices
|
|
@@ -54,7 +55,20 @@ def jax_funcify_Solve(op, **kwargs):
|
|
|
54
55
|
dl = jax.numpy.diagonal(a, offset=-1, axis1=-2, axis2=-1)
|
|
55
56
|
d = jax.numpy.diagonal(a, offset=0, axis1=-2, axis2=-1)
|
|
56
57
|
du = jax.numpy.diagonal(a, offset=1, axis1=-2, axis2=-1)
|
|
57
|
-
|
|
58
|
+
|
|
59
|
+
# jax requires dl and du to have the same shape as d
|
|
60
|
+
dl = jax.numpy.pad(dl, (1, 0))
|
|
61
|
+
du = jax.numpy.pad(du, (0, 1))
|
|
62
|
+
|
|
63
|
+
if b_is_vec:
|
|
64
|
+
b = jax.numpy.expand_dims(b, -1)
|
|
65
|
+
|
|
66
|
+
res = jax.lax.linalg.tridiagonal_solve(dl, d, du, b)
|
|
67
|
+
|
|
68
|
+
if b_is_vec:
|
|
69
|
+
return jax.numpy.squeeze(res, -1)
|
|
70
|
+
|
|
71
|
+
return res
|
|
58
72
|
|
|
59
73
|
else:
|
|
60
74
|
if assume_a not in ("gen", "sym", "her", "pos"):
|
|
@@ -87,14 +87,7 @@ def jax_funcify_Join(op, **kwargs):
|
|
|
87
87
|
def join(axis, *tensors):
|
|
88
88
|
# tensors could also be tuples, and in this case they don't have a ndim
|
|
89
89
|
tensors = [jnp.asarray(tensor) for tensor in tensors]
|
|
90
|
-
|
|
91
|
-
if (view != -1) and all(
|
|
92
|
-
tensor.shape[axis] == 0 for tensor in tensors[0:view] + tensors[view + 1 :]
|
|
93
|
-
):
|
|
94
|
-
return tensors[view]
|
|
95
|
-
|
|
96
|
-
else:
|
|
97
|
-
return jnp.concatenate(tensors, axis=axis)
|
|
90
|
+
return jnp.concatenate(tensors, axis=axis)
|
|
98
91
|
|
|
99
92
|
return join
|
|
100
93
|
|
|
@@ -9,8 +9,13 @@ from pytensor.link.basic import JITLinker
|
|
|
9
9
|
class JAXLinker(JITLinker):
|
|
10
10
|
"""A `Linker` that JIT-compiles NumPy-based operations using JAX."""
|
|
11
11
|
|
|
12
|
+
def __init__(self, *args, **kwargs):
|
|
13
|
+
self.scalar_shape_inputs: tuple[int] = () # type: ignore[annotation-unchecked]
|
|
14
|
+
super().__init__(*args, **kwargs)
|
|
15
|
+
|
|
12
16
|
def fgraph_convert(self, fgraph, input_storage, storage_map, **kwargs):
|
|
13
17
|
from pytensor.link.jax.dispatch import jax_funcify
|
|
18
|
+
from pytensor.link.jax.dispatch.shape import JAXShapeTuple
|
|
14
19
|
from pytensor.tensor.random.type import RandomType
|
|
15
20
|
|
|
16
21
|
shared_rng_inputs = [
|
|
@@ -64,6 +69,23 @@ class JAXLinker(JITLinker):
|
|
|
64
69
|
fgraph.inputs.remove(new_inp)
|
|
65
70
|
fgraph.inputs.insert(old_inp_fgrap_index, new_inp)
|
|
66
71
|
|
|
72
|
+
fgraph_inputs = fgraph.inputs
|
|
73
|
+
clients = fgraph.clients
|
|
74
|
+
# Detect scalar shape inputs that are used only in JAXShapeTuple nodes
|
|
75
|
+
scalar_shape_inputs = [
|
|
76
|
+
inp
|
|
77
|
+
for node in fgraph.apply_nodes
|
|
78
|
+
if isinstance(node.op, JAXShapeTuple)
|
|
79
|
+
for inp in node.inputs
|
|
80
|
+
if inp in fgraph_inputs
|
|
81
|
+
and all(
|
|
82
|
+
isinstance(cl_node.op, JAXShapeTuple) for cl_node, _ in clients[inp]
|
|
83
|
+
)
|
|
84
|
+
]
|
|
85
|
+
self.scalar_shape_inputs = tuple(
|
|
86
|
+
fgraph_inputs.index(inp) for inp in scalar_shape_inputs
|
|
87
|
+
)
|
|
88
|
+
|
|
67
89
|
return jax_funcify(
|
|
68
90
|
fgraph, input_storage=input_storage, storage_map=storage_map, **kwargs
|
|
69
91
|
)
|
|
@@ -71,7 +93,22 @@ class JAXLinker(JITLinker):
|
|
|
71
93
|
def jit_compile(self, fn):
|
|
72
94
|
import jax
|
|
73
95
|
|
|
74
|
-
|
|
96
|
+
jit_fn = jax.jit(fn, static_argnums=self.scalar_shape_inputs)
|
|
97
|
+
|
|
98
|
+
if not self.scalar_shape_inputs:
|
|
99
|
+
return jit_fn
|
|
100
|
+
|
|
101
|
+
def convert_scalar_shape_inputs(
|
|
102
|
+
*args, scalar_shape_inputs=set(self.scalar_shape_inputs)
|
|
103
|
+
):
|
|
104
|
+
return jit_fn(
|
|
105
|
+
*(
|
|
106
|
+
int(arg) if i in scalar_shape_inputs else arg
|
|
107
|
+
for i, arg in enumerate(args)
|
|
108
|
+
)
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
return convert_scalar_shape_inputs
|
|
75
112
|
|
|
76
113
|
def create_thunk_inputs(self, storage_map):
|
|
77
114
|
from pytensor.link.jax.dispatch import jax_typify
|
|
@@ -31,7 +31,6 @@ from pytensor.link.utils import (
|
|
|
31
31
|
fgraph_to_python,
|
|
32
32
|
)
|
|
33
33
|
from pytensor.scalar.basic import ScalarType
|
|
34
|
-
from pytensor.scalar.math import Softplus
|
|
35
34
|
from pytensor.sparse import SparseTensorType
|
|
36
35
|
from pytensor.tensor.basic import Nonzero
|
|
37
36
|
from pytensor.tensor.blas import BatchedDot
|
|
@@ -466,7 +465,7 @@ def numba_funcify_ArgSortOp(op, node, **kwargs):
|
|
|
466
465
|
axis = axis.item()
|
|
467
466
|
|
|
468
467
|
Y = np.swapaxes(X, axis, 0)
|
|
469
|
-
result = np.empty_like(Y)
|
|
468
|
+
result = np.empty_like(Y, dtype="int64")
|
|
470
469
|
|
|
471
470
|
indices = list(np.ndindex(Y.shape[1:]))
|
|
472
471
|
|
|
@@ -566,18 +565,19 @@ def numba_funcify_SpecifyShape(op, node, **kwargs):
|
|
|
566
565
|
def int_to_float_fn(inputs, out_dtype):
|
|
567
566
|
"""Create a Numba function that converts integer and boolean ``ndarray``s to floats."""
|
|
568
567
|
|
|
569
|
-
if
|
|
570
|
-
|
|
571
|
-
|
|
568
|
+
if (
|
|
569
|
+
all(inp.type.dtype == out_dtype for inp in inputs)
|
|
570
|
+
and np.dtype(out_dtype).kind == "f"
|
|
571
|
+
):
|
|
572
572
|
|
|
573
|
-
@numba_njit
|
|
573
|
+
@numba_njit(inline="always")
|
|
574
574
|
def inputs_cast(x):
|
|
575
575
|
return x
|
|
576
576
|
|
|
577
|
-
elif any(i.type.numpy_dtype.kind in "
|
|
577
|
+
elif any(i.type.numpy_dtype.kind in "uib" for i in inputs):
|
|
578
578
|
args_dtype = np.dtype(f"f{out_dtype.itemsize}")
|
|
579
579
|
|
|
580
|
-
@numba_njit
|
|
580
|
+
@numba_njit(inline="always")
|
|
581
581
|
def inputs_cast(x):
|
|
582
582
|
return x.astype(args_dtype)
|
|
583
583
|
|
|
@@ -585,7 +585,7 @@ def int_to_float_fn(inputs, out_dtype):
|
|
|
585
585
|
args_dtype_sz = max(_arg.type.numpy_dtype.itemsize for _arg in inputs)
|
|
586
586
|
args_dtype = np.dtype(f"f{args_dtype_sz}")
|
|
587
587
|
|
|
588
|
-
@numba_njit
|
|
588
|
+
@numba_njit(inline="always")
|
|
589
589
|
def inputs_cast(x):
|
|
590
590
|
return x.astype(args_dtype)
|
|
591
591
|
|
|
@@ -594,36 +594,49 @@ def int_to_float_fn(inputs, out_dtype):
|
|
|
594
594
|
|
|
595
595
|
@numba_funcify.register(Dot)
|
|
596
596
|
def numba_funcify_Dot(op, node, **kwargs):
|
|
597
|
-
# Numba's `np.dot` does not support integer dtypes, so we need to cast to
|
|
598
|
-
|
|
597
|
+
# Numba's `np.dot` does not support integer dtypes, so we need to cast to float.
|
|
598
|
+
x, y = node.inputs
|
|
599
|
+
[out] = node.outputs
|
|
599
600
|
|
|
600
|
-
|
|
601
|
-
|
|
601
|
+
x_dtype = x.type.dtype
|
|
602
|
+
y_dtype = y.type.dtype
|
|
603
|
+
dot_dtype = f"float{max((32, out.type.numpy_dtype.itemsize * 8))}"
|
|
604
|
+
out_dtype = out.type.dtype
|
|
602
605
|
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
+
if x_dtype == dot_dtype and y_dtype == dot_dtype:
|
|
607
|
+
|
|
608
|
+
@numba_njit
|
|
609
|
+
def dot(x, y):
|
|
610
|
+
return np.asarray(np.dot(x, y))
|
|
606
611
|
|
|
607
|
-
|
|
612
|
+
elif x_dtype == dot_dtype and y_dtype != dot_dtype:
|
|
608
613
|
|
|
614
|
+
@numba_njit
|
|
615
|
+
def dot(x, y):
|
|
616
|
+
return np.asarray(np.dot(x, y.astype(dot_dtype)))
|
|
609
617
|
|
|
610
|
-
|
|
611
|
-
def numba_funcify_Softplus(op, node, **kwargs):
|
|
612
|
-
x_dtype = np.dtype(node.inputs[0].dtype)
|
|
618
|
+
elif x_dtype != dot_dtype and y_dtype == dot_dtype:
|
|
613
619
|
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
value = np.exp(x)
|
|
618
|
-
elif x < 18.0:
|
|
619
|
-
value = np.log1p(np.exp(x))
|
|
620
|
-
elif x < 33.3:
|
|
621
|
-
value = x + np.exp(-x)
|
|
622
|
-
else:
|
|
623
|
-
value = x
|
|
624
|
-
return direct_cast(value, x_dtype)
|
|
620
|
+
@numba_njit
|
|
621
|
+
def dot(x, y):
|
|
622
|
+
return np.asarray(np.dot(x.astype(dot_dtype), y))
|
|
625
623
|
|
|
626
|
-
|
|
624
|
+
else:
|
|
625
|
+
|
|
626
|
+
@numba_njit()
|
|
627
|
+
def dot(x, y):
|
|
628
|
+
return np.asarray(np.dot(x.astype(dot_dtype), y.astype(dot_dtype)))
|
|
629
|
+
|
|
630
|
+
if out_dtype == dot_dtype:
|
|
631
|
+
return dot
|
|
632
|
+
|
|
633
|
+
else:
|
|
634
|
+
|
|
635
|
+
@numba_njit
|
|
636
|
+
def dot_with_cast(x, y):
|
|
637
|
+
return dot(x, y).astype(out_dtype)
|
|
638
|
+
|
|
639
|
+
return dot_with_cast
|
|
627
640
|
|
|
628
641
|
|
|
629
642
|
@numba_funcify.register(Solve)
|
|
@@ -689,11 +702,6 @@ def numba_funcify_BatchedDot(op, node, **kwargs):
|
|
|
689
702
|
return batched_dot
|
|
690
703
|
|
|
691
704
|
|
|
692
|
-
# NOTE: The remaining `pytensor.tensor.blas` `Op`s appear unnecessary, because
|
|
693
|
-
# they're only used to optimize basic `Dot` nodes, and those GEMV and GEMM
|
|
694
|
-
# optimizations are apparently already performed by Numba
|
|
695
|
-
|
|
696
|
-
|
|
697
705
|
@numba_funcify.register(IfElse)
|
|
698
706
|
def numba_funcify_IfElse(op, **kwargs):
|
|
699
707
|
n_outs = op.n_outs
|
|
@@ -30,7 +30,7 @@ def _lu_factor_to_lu(a, dtype, overwrite_a):
|
|
|
30
30
|
# Fortran is 1 indexed, so we need to subtract 1 from the IPIV array
|
|
31
31
|
IPIV = IPIV - 1
|
|
32
32
|
p_inv = _pivot_to_permutation(IPIV, dtype=dtype)
|
|
33
|
-
perm = np.argsort(p_inv)
|
|
33
|
+
perm = np.argsort(p_inv).astype("int32")
|
|
34
34
|
|
|
35
35
|
return perm, L, U
|
|
36
36
|
|
|
@@ -52,7 +52,7 @@ def numba_funcify_Det(op, node, **kwargs):
|
|
|
52
52
|
|
|
53
53
|
@numba_basic.numba_njit(inline="always")
|
|
54
54
|
def det(x):
|
|
55
|
-
return
|
|
55
|
+
return np.array(np.linalg.det(inputs_cast(x))).astype(out_dtype)
|
|
56
56
|
|
|
57
57
|
return det
|
|
58
58
|
|
|
@@ -68,8 +68,8 @@ def numba_funcify_SLogDet(op, node, **kwargs):
|
|
|
68
68
|
def slogdet(x):
|
|
69
69
|
sign, det = np.linalg.slogdet(inputs_cast(x))
|
|
70
70
|
return (
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
np.array(sign).astype(out_dtype_1),
|
|
72
|
+
np.array(det).astype(out_dtype_2),
|
|
73
73
|
)
|
|
74
74
|
|
|
75
75
|
return slogdet
|
|
@@ -28,7 +28,7 @@ from pytensor.scalar.basic import (
|
|
|
28
28
|
Second,
|
|
29
29
|
Switch,
|
|
30
30
|
)
|
|
31
|
-
from pytensor.scalar.math import Erf, Erfc, GammaLn, Log1mexp, Sigmoid
|
|
31
|
+
from pytensor.scalar.math import Erf, Erfc, GammaLn, Log1mexp, Sigmoid, Softplus
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
@numba_funcify.register(ScalarOp)
|
|
@@ -312,3 +312,22 @@ def erfc(x):
|
|
|
312
312
|
@numba_funcify.register(Erfc)
|
|
313
313
|
def numba_funcify_Erfc(op, **kwargs):
|
|
314
314
|
return numba_basic.global_numba_func(erfc)
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
@numba_funcify.register(Softplus)
|
|
318
|
+
def numba_funcify_Softplus(op, node, **kwargs):
|
|
319
|
+
out_dtype = np.dtype(node.outputs[0].type.dtype)
|
|
320
|
+
|
|
321
|
+
@numba_basic.numba_njit
|
|
322
|
+
def softplus(x):
|
|
323
|
+
if x < -37.0:
|
|
324
|
+
value = np.exp(x)
|
|
325
|
+
elif x < 18.0:
|
|
326
|
+
value = np.log1p(np.exp(x))
|
|
327
|
+
elif x < 33.3:
|
|
328
|
+
value = x + np.exp(-x)
|
|
329
|
+
else:
|
|
330
|
+
value = x
|
|
331
|
+
return numba_basic.direct_cast(value, out_dtype)
|
|
332
|
+
|
|
333
|
+
return softplus
|
|
@@ -117,17 +117,9 @@ def numba_funcify_ARange(op, **kwargs):
|
|
|
117
117
|
|
|
118
118
|
@numba_funcify.register(Join)
|
|
119
119
|
def numba_funcify_Join(op, **kwargs):
|
|
120
|
-
view = op.view
|
|
121
|
-
|
|
122
|
-
if view != -1:
|
|
123
|
-
# TODO: Where (and why) is this `Join.view` even being used? From a
|
|
124
|
-
# quick search, the answer appears to be "nowhere", so we should
|
|
125
|
-
# probably just remove it.
|
|
126
|
-
raise NotImplementedError("The `view` parameter to `Join` is not supported")
|
|
127
|
-
|
|
128
120
|
@numba_basic.numba_njit
|
|
129
121
|
def join(axis, *tensors):
|
|
130
|
-
return np.concatenate(tensors,
|
|
122
|
+
return np.concatenate(tensors, axis.item())
|
|
131
123
|
|
|
132
124
|
return join
|
|
133
125
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import pytensor.tensor.basic as ptb
|
|
2
2
|
from pytensor.scan.basic import scan
|
|
3
|
-
from pytensor.tensor.basic import Join
|
|
4
3
|
from pytensor.tensor.math import ceil, eq, neq
|
|
5
4
|
from pytensor.tensor.subtensor import set_subtensor
|
|
6
5
|
|
|
@@ -127,14 +126,12 @@ def scan_checkpoints(
|
|
|
127
126
|
|
|
128
127
|
# Pad the sequences if needed
|
|
129
128
|
if padding:
|
|
130
|
-
# Since padding could be an empty tensor, Join returns a view of s.
|
|
131
|
-
join = Join(view=0)
|
|
132
129
|
for i, s in enumerate(sequences):
|
|
133
130
|
overshoots_by = s.shape[0] % save_every_N
|
|
134
131
|
overshoots = neq(overshoots_by, 0)
|
|
135
132
|
n = (save_every_N - overshoots_by) * overshoots
|
|
136
133
|
z = ptb.zeros((n, *s.shape[1:]), dtype=s.dtype)
|
|
137
|
-
sequences[i] = join(0, s, z)
|
|
134
|
+
sequences[i] = ptb.join(0, s, z)
|
|
138
135
|
|
|
139
136
|
# Establish the input variables of the outer scan
|
|
140
137
|
o_sequences = [
|
|
@@ -1647,8 +1647,9 @@ class Scan(Op, ScanMethodsMixin, HasInnerGraph):
|
|
|
1647
1647
|
p=p, i=node_input_storage, o=node_output_storage, n=node, allow_gc=allow_gc
|
|
1648
1648
|
):
|
|
1649
1649
|
r = p(n, [x[0] for x in i], o)
|
|
1650
|
-
|
|
1651
|
-
|
|
1650
|
+
if compute_map is not None:
|
|
1651
|
+
for o in node.outputs:
|
|
1652
|
+
compute_map[o][0] = True
|
|
1652
1653
|
if allow_gc:
|
|
1653
1654
|
self.fn.free()
|
|
1654
1655
|
return r
|
|
@@ -53,6 +53,7 @@ from pytensor.scan.utils import (
|
|
|
53
53
|
from pytensor.tensor.basic import (
|
|
54
54
|
Alloc,
|
|
55
55
|
AllocEmpty,
|
|
56
|
+
atleast_Nd,
|
|
56
57
|
get_scalar_constant_value,
|
|
57
58
|
)
|
|
58
59
|
from pytensor.tensor.elemwise import DimShuffle, Elemwise
|
|
@@ -1186,8 +1187,8 @@ def while_scan_merge_subtensor_last_element(fgraph, scan_node):
|
|
|
1186
1187
|
return subtensor_merge_replacements
|
|
1187
1188
|
|
|
1188
1189
|
|
|
1189
|
-
def _is_default_scan_buffer(
|
|
1190
|
-
node =
|
|
1190
|
+
def _is_default_scan_buffer(final_buffer: TensorVariable, taps: int) -> bool:
|
|
1191
|
+
node = final_buffer.owner
|
|
1191
1192
|
|
|
1192
1193
|
if node is None:
|
|
1193
1194
|
return False
|
|
@@ -1200,8 +1201,10 @@ def _is_default_scan_buffer(x: TensorVariable) -> bool:
|
|
|
1200
1201
|
):
|
|
1201
1202
|
return False
|
|
1202
1203
|
|
|
1203
|
-
|
|
1204
|
-
if not (
|
|
1204
|
+
init_buffer, init_value, *_ = node.inputs
|
|
1205
|
+
if not (
|
|
1206
|
+
init_buffer.owner is not None and isinstance(init_buffer.owner.op, AllocEmpty)
|
|
1207
|
+
):
|
|
1205
1208
|
return False
|
|
1206
1209
|
|
|
1207
1210
|
# The value may have been broadcast to fill in the initial taps.
|
|
@@ -1218,10 +1221,16 @@ def _is_default_scan_buffer(x: TensorVariable) -> bool:
|
|
|
1218
1221
|
# 1. alloc_empty(2 + nsteps)[:2].broadcastable == x.broadcastable
|
|
1219
1222
|
# But due to laziness we use the slightly more conservative check:
|
|
1220
1223
|
# 2. alloc_empty(2 + nsteps).broadcastable == x.broadcastable
|
|
1221
|
-
if
|
|
1222
|
-
return
|
|
1223
|
-
|
|
1224
|
-
|
|
1224
|
+
if taps > 1:
|
|
1225
|
+
return not broadcasted_by(init_value, init_buffer)
|
|
1226
|
+
else:
|
|
1227
|
+
# In this case we know we have alloc_empty(1 + nsteps, ...)[:1].set(init_value)
|
|
1228
|
+
# The first dimension cannot possibly broadcast in the subtensor assignment,
|
|
1229
|
+
# so we exclude it from `broadcasted_by`. To exclude it we squeeze it out,
|
|
1230
|
+
# after adding any other implicit expand_dims. We select into the first entry of
|
|
1231
|
+
# the buffer, to check for potential broadcasting in other dimensions.
|
|
1232
|
+
init_value_ = atleast_Nd(init_value, n=init_buffer.ndim)
|
|
1233
|
+
return not broadcasted_by(init_value_.squeeze(0), init_buffer[0])
|
|
1225
1234
|
|
|
1226
1235
|
|
|
1227
1236
|
def scan_save_mem_rewrite(fgraph, node, backend_supports_output_pre_allocation: bool):
|
|
@@ -1574,15 +1583,16 @@ def scan_save_mem_rewrite(fgraph, node, backend_supports_output_pre_allocation:
|
|
|
1574
1583
|
# If the memory for this output has been pre-allocated
|
|
1575
1584
|
# before going into the scan op (by an alloc node)
|
|
1576
1585
|
if idx < op_info.n_mit_sot + op_info.n_sit_sot:
|
|
1586
|
+
taps = init_l[i]
|
|
1577
1587
|
nw_input = nw_inputs[offset + idx]
|
|
1578
1588
|
|
|
1579
1589
|
# Recreate default buffers with new size
|
|
1580
|
-
if _is_default_scan_buffer(nw_input):
|
|
1581
|
-
extra_size = 1 if required_orphan else val -
|
|
1590
|
+
if _is_default_scan_buffer(nw_input, taps):
|
|
1591
|
+
extra_size = 1 if required_orphan else val - taps
|
|
1582
1592
|
nw_input = expand_empty(nw_input.owner.inputs[1], extra_size)
|
|
1583
1593
|
# Otherwise, just trim with a slice
|
|
1584
1594
|
else:
|
|
1585
|
-
stop =
|
|
1595
|
+
stop = taps if required_orphan else val
|
|
1586
1596
|
nw_input = nw_input[:stop]
|
|
1587
1597
|
|
|
1588
1598
|
nw_inputs[offset + idx] = nw_input
|
|
@@ -1626,14 +1636,13 @@ def scan_save_mem_rewrite(fgraph, node, backend_supports_output_pre_allocation:
|
|
|
1626
1636
|
# val == 0 means that we want to keep all intermediate
|
|
1627
1637
|
# results for that state, including the initial values.
|
|
1628
1638
|
if idx < op_info.n_mit_sot + op_info.n_sit_sot:
|
|
1639
|
+
taps = init_l[op_info.n_mit_mot + idx]
|
|
1629
1640
|
in_idx = offset + idx
|
|
1630
1641
|
nw_input = nw_inputs[in_idx]
|
|
1631
|
-
if _is_default_scan_buffer(nw_input):
|
|
1642
|
+
if _is_default_scan_buffer(nw_input, taps):
|
|
1632
1643
|
nw_input = expand_empty(nw_input.owner.inputs[1], nw_steps)
|
|
1633
1644
|
else:
|
|
1634
|
-
|
|
1635
|
-
init_l_pt = pt.as_tensor(init_l[op_info.n_mit_mot + idx])
|
|
1636
|
-
nw_input = nw_input[: (init_l_pt + nw_steps)]
|
|
1645
|
+
nw_input = nw_input[: (taps + nw_steps)]
|
|
1637
1646
|
nw_inputs[in_idx] = nw_input
|
|
1638
1647
|
|
|
1639
1648
|
elif (
|
|
@@ -14,16 +14,22 @@ from pytensor.tensor.slinalg import Solve, lu_factor, lu_solve
|
|
|
14
14
|
from pytensor.tensor.variable import TensorVariable
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
def decompose_A(A, assume_a):
|
|
17
|
+
def decompose_A(A, assume_a, check_finite):
|
|
18
18
|
if assume_a == "gen":
|
|
19
|
-
return lu_factor(A, check_finite=
|
|
19
|
+
return lu_factor(A, check_finite=check_finite)
|
|
20
20
|
else:
|
|
21
21
|
raise NotImplementedError
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
def solve_lu_decomposed_system(A_decomp, b,
|
|
25
|
-
if assume_a == "gen":
|
|
26
|
-
return lu_solve(
|
|
24
|
+
def solve_lu_decomposed_system(A_decomp, b, transposed=False, *, core_solve_op: Solve):
|
|
25
|
+
if core_solve_op.assume_a == "gen":
|
|
26
|
+
return lu_solve(
|
|
27
|
+
A_decomp,
|
|
28
|
+
b,
|
|
29
|
+
trans=transposed,
|
|
30
|
+
b_ndim=core_solve_op.b_ndim,
|
|
31
|
+
check_finite=core_solve_op.check_finite,
|
|
32
|
+
)
|
|
27
33
|
else:
|
|
28
34
|
raise NotImplementedError
|
|
29
35
|
|
|
@@ -102,14 +108,19 @@ def _split_lu_solve_steps(
|
|
|
102
108
|
):
|
|
103
109
|
return None
|
|
104
110
|
|
|
105
|
-
|
|
111
|
+
# If any Op had check_finite=True, we also do it for the LU decomposition
|
|
112
|
+
check_finite_decomp = False
|
|
113
|
+
for client, _ in A_solve_clients_and_transpose:
|
|
114
|
+
if client.op.core_op.check_finite:
|
|
115
|
+
check_finite_decomp = True
|
|
116
|
+
break
|
|
117
|
+
A_decomp = decompose_A(A, assume_a=assume_a, check_finite=check_finite_decomp)
|
|
106
118
|
|
|
107
119
|
replacements = {}
|
|
108
120
|
for client, transposed in A_solve_clients_and_transpose:
|
|
109
121
|
_, b = client.inputs
|
|
110
|
-
b_ndim = client.op.core_op.b_ndim
|
|
111
122
|
new_x = solve_lu_decomposed_system(
|
|
112
|
-
A_decomp, b,
|
|
123
|
+
A_decomp, b, transposed=transposed, core_solve_op=client.op.core_op
|
|
113
124
|
)
|
|
114
125
|
[old_x] = client.outputs
|
|
115
126
|
new_x = atleast_Nd(new_x, n=old_x.type.ndim).astype(old_x.type.dtype)
|