pytensor 2.31.0__tar.gz → 2.31.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pytensor-2.31.0/pytensor.egg-info → pytensor-2.31.2}/PKG-INFO +1 -1
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/_version.py +3 -3
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/mode.py +2 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/slinalg.py +15 -1
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/basic.py +1 -26
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/elemwise.py +1 -1
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +1 -1
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/nlinalg.py +3 -3
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/scalar.py +20 -1
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/rewriting.py +4 -6
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/__init__.py +1 -0
- pytensor-2.31.2/pytensor/tensor/_linalg/__init__.py +2 -0
- pytensor-2.31.2/pytensor/tensor/_linalg/solve/__init__.py +2 -0
- pytensor-2.31.2/pytensor/tensor/_linalg/solve/rewriting.py +209 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/blas.py +14 -9
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/blas_c.py +113 -128
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/blockwise.py +22 -2
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/blas.py +1 -1
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/linalg.py +7 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/subtensor.py +10 -1
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/signal/conv.py +84 -2
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/type.py +1 -1
- {pytensor-2.31.0 → pytensor-2.31.2/pytensor.egg-info}/PKG-INFO +1 -1
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor.egg-info/SOURCES.txt +3 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/LICENSE.txt +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/MANIFEST.in +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/README.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/.templates/layout.html +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/.templates/nb-badges.html +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/LICENSE.txt +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/README.md +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/acknowledgement.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/bcast.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/bcast.svg +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/blog.md +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/conf.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/core_development_guide.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/css.inc +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/dev_start_guide.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/environment.yml +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/apply.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/apply.svg +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/apply2.svg +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/ctype.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/extending_faq.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/graphstructures.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/index.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/inplace.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/op.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/other_ops.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/pipeline.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/scan.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/tips.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/type.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/unittest.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/extending/using_params.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/faq.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/gallery/page_footer.md +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/glossary.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/Elman_srnn.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/PyTensor.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/binder.svg +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/blocksparse.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/colab.svg +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/github.svg +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/lstm.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/talk2010.gif +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/images/talk2010.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/index.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/install.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/internal/how_to_release.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/internal/index.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/introduction.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/function.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/index.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/io.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/mode.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/ops.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/compile/shared.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/config.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/index.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/features.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/graph.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/index.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/op.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/replace.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/type.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/graph/utils.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/index.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/printing.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/scalar/index.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/scan.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/sparse/index.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/basic.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/bcast.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/conv.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/fft.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/functional.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/index.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/io.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/random/distributions.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/random/index.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/tensor/utils.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/library/typed_list.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/links.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/optimizations.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/pylintrc +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/robots.txt +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/troubleshooting.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/adding.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/apply.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/apply.svg +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/bcast.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/conditions.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/examples.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/gradients.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/index.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/logistic.gp +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/logistic.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/loop.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/modes.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/prng.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/profiling.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/sparse.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/doc/user_guide.rst +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pyproject.toml +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/bin/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/breakpoint.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/builders.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/compiledir.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/compilelock.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/debugmode.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/function/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/function/pfunc.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/function/types.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/io.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/monitormode.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/nanguardmode.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/ops.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/profiling.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/configdefaults.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/configparser.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/gradient.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/features.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/fg.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/null_type.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/op.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/replace.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/type.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/graph/utils.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/ifelse.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/cutils.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/cvm.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/interface.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/op.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/params_type.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/c/type.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/jax/linker.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/slinalg.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/sparse.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/numba/linker.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/utils.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/link/vm.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/check_blas.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/frozendict.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/npy_2_compat.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/printing.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/py.typed +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/raise_op.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/loop.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/math.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/op.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/utils.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/scan/views.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/sandbox/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/sandbox/sp.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/sandbox/sp2.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/type.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/sparse/utils.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/blas_scipy.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/conv/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/conv/abstract_conv.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/einsum.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/fft.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/fourier.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/functional.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/inplace.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/io.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/linalg.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/math.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/pad.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/op.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/type.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/random/var.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/conv.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/math.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/shape.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/slinalg.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/sort.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/special.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/subtensor.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/type_other.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/utils.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/var.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/variable.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/typed_list/basic.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/typed_list/type.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/updates.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor/utils.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/scripts/mypy-failing.txt +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/setup.cfg +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/setup.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_breakpoint.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_config.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_gradient.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_ifelse.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_printing.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_raise_op.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_rop.py +0 -0
- {pytensor-2.31.0 → pytensor-2.31.2}/tests/test_updates.py +0 -0
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-05-
|
|
11
|
+
"date": "2025-05-24T11:34:23+0800",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.31.
|
|
14
|
+
"full-revisionid": "2d414d4129882861b867aaf0d9abcf3135e3d5eb",
|
|
15
|
+
"version": "2.31.2"
|
|
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"):
|
|
@@ -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
|
|
|
@@ -607,25 +606,6 @@ def numba_funcify_Dot(op, node, **kwargs):
|
|
|
607
606
|
return dot
|
|
608
607
|
|
|
609
608
|
|
|
610
|
-
@numba_funcify.register(Softplus)
|
|
611
|
-
def numba_funcify_Softplus(op, node, **kwargs):
|
|
612
|
-
x_dtype = np.dtype(node.inputs[0].dtype)
|
|
613
|
-
|
|
614
|
-
@numba_njit
|
|
615
|
-
def softplus(x):
|
|
616
|
-
if x < -37.0:
|
|
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)
|
|
625
|
-
|
|
626
|
-
return softplus
|
|
627
|
-
|
|
628
|
-
|
|
629
609
|
@numba_funcify.register(Solve)
|
|
630
610
|
def numba_funcify_Solve(op, node, **kwargs):
|
|
631
611
|
assume_a = op.assume_a
|
|
@@ -689,11 +669,6 @@ def numba_funcify_BatchedDot(op, node, **kwargs):
|
|
|
689
669
|
return batched_dot
|
|
690
670
|
|
|
691
671
|
|
|
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
672
|
@numba_funcify.register(IfElse)
|
|
698
673
|
def numba_funcify_IfElse(op, **kwargs):
|
|
699
674
|
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
|
|
@@ -2561,7 +2561,6 @@ scan_seqopt1.register(
|
|
|
2561
2561
|
position=1,
|
|
2562
2562
|
)
|
|
2563
2563
|
|
|
2564
|
-
|
|
2565
2564
|
scan_seqopt1.register(
|
|
2566
2565
|
"scan_push_out_non_seq",
|
|
2567
2566
|
in2out(scan_push_out_non_seq, ignore_newtrees=True),
|
|
@@ -2569,10 +2568,9 @@ scan_seqopt1.register(
|
|
|
2569
2568
|
"fast_run",
|
|
2570
2569
|
"scan",
|
|
2571
2570
|
"scan_pushout",
|
|
2572
|
-
position=
|
|
2571
|
+
position=3,
|
|
2573
2572
|
)
|
|
2574
2573
|
|
|
2575
|
-
|
|
2576
2574
|
scan_seqopt1.register(
|
|
2577
2575
|
"scan_push_out_seq",
|
|
2578
2576
|
in2out(scan_push_out_seq, ignore_newtrees=True),
|
|
@@ -2580,7 +2578,7 @@ scan_seqopt1.register(
|
|
|
2580
2578
|
"fast_run",
|
|
2581
2579
|
"scan",
|
|
2582
2580
|
"scan_pushout",
|
|
2583
|
-
position=
|
|
2581
|
+
position=4,
|
|
2584
2582
|
)
|
|
2585
2583
|
|
|
2586
2584
|
|
|
@@ -2592,7 +2590,7 @@ scan_seqopt1.register(
|
|
|
2592
2590
|
"more_mem",
|
|
2593
2591
|
"scan",
|
|
2594
2592
|
"scan_pushout",
|
|
2595
|
-
position=
|
|
2593
|
+
position=5,
|
|
2596
2594
|
)
|
|
2597
2595
|
|
|
2598
2596
|
|
|
@@ -2605,7 +2603,7 @@ scan_seqopt1.register(
|
|
|
2605
2603
|
"more_mem",
|
|
2606
2604
|
"scan",
|
|
2607
2605
|
"scan_pushout",
|
|
2608
|
-
position=
|
|
2606
|
+
position=6,
|
|
2609
2607
|
)
|
|
2610
2608
|
|
|
2611
2609
|
scan_eqopt2.register(
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
from collections.abc import Container
|
|
2
|
+
from copy import copy
|
|
3
|
+
|
|
4
|
+
from pytensor.graph import Constant, graph_inputs
|
|
5
|
+
from pytensor.graph.rewriting.basic import copy_stack_trace, in2out, node_rewriter
|
|
6
|
+
from pytensor.scan.op import Scan
|
|
7
|
+
from pytensor.scan.rewriting import scan_seqopt1
|
|
8
|
+
from pytensor.tensor.basic import atleast_Nd
|
|
9
|
+
from pytensor.tensor.blockwise import Blockwise
|
|
10
|
+
from pytensor.tensor.elemwise import DimShuffle
|
|
11
|
+
from pytensor.tensor.rewriting.basic import register_specialize
|
|
12
|
+
from pytensor.tensor.rewriting.linalg import is_matrix_transpose
|
|
13
|
+
from pytensor.tensor.slinalg import Solve, lu_factor, lu_solve
|
|
14
|
+
from pytensor.tensor.variable import TensorVariable
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def decompose_A(A, assume_a, check_finite):
|
|
18
|
+
if assume_a == "gen":
|
|
19
|
+
return lu_factor(A, check_finite=check_finite)
|
|
20
|
+
else:
|
|
21
|
+
raise NotImplementedError
|
|
22
|
+
|
|
23
|
+
|
|
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
|
+
)
|
|
33
|
+
else:
|
|
34
|
+
raise NotImplementedError
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _split_lu_solve_steps(
|
|
38
|
+
fgraph, node, *, eager: bool, allowed_assume_a: Container[str]
|
|
39
|
+
):
|
|
40
|
+
if not isinstance(node.op.core_op, Solve):
|
|
41
|
+
return None
|
|
42
|
+
|
|
43
|
+
def get_root_A(a: TensorVariable) -> tuple[TensorVariable, bool]:
|
|
44
|
+
# Find the root variable of the first input to Solve
|
|
45
|
+
# If `a` is a left expand_dims or matrix transpose (DimShuffle variants),
|
|
46
|
+
# the root variable is the pre-DimShuffled input.
|
|
47
|
+
# Otherwise, `a` is considered the root variable.
|
|
48
|
+
# We also return whether the root `a` is transposed.
|
|
49
|
+
transposed = False
|
|
50
|
+
if a.owner is not None and isinstance(a.owner.op, DimShuffle):
|
|
51
|
+
if a.owner.op.is_left_expand_dims:
|
|
52
|
+
[a] = a.owner.inputs
|
|
53
|
+
elif is_matrix_transpose(a):
|
|
54
|
+
[a] = a.owner.inputs
|
|
55
|
+
transposed = True
|
|
56
|
+
return a, transposed
|
|
57
|
+
|
|
58
|
+
def find_solve_clients(var, assume_a):
|
|
59
|
+
clients = []
|
|
60
|
+
for cl, idx in fgraph.clients[var]:
|
|
61
|
+
if (
|
|
62
|
+
idx == 0
|
|
63
|
+
and isinstance(cl.op, Blockwise)
|
|
64
|
+
and isinstance(cl.op.core_op, Solve)
|
|
65
|
+
and (cl.op.core_op.assume_a == assume_a)
|
|
66
|
+
):
|
|
67
|
+
clients.append(cl)
|
|
68
|
+
elif isinstance(cl.op, DimShuffle) and cl.op.is_left_expand_dims:
|
|
69
|
+
# If it's a left expand_dims, recurse on the output
|
|
70
|
+
clients.extend(find_solve_clients(cl.outputs[0], assume_a))
|
|
71
|
+
return clients
|
|
72
|
+
|
|
73
|
+
assume_a = node.op.core_op.assume_a
|
|
74
|
+
|
|
75
|
+
if assume_a not in allowed_assume_a:
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
A, _ = get_root_A(node.inputs[0])
|
|
79
|
+
|
|
80
|
+
# Find Solve using A (or left expand_dims of A)
|
|
81
|
+
# TODO: We could handle arbitrary shuffle of the batch dimensions, just need to propagate
|
|
82
|
+
# that to the A_decomp outputs
|
|
83
|
+
A_solve_clients_and_transpose = [
|
|
84
|
+
(client, False) for client in find_solve_clients(A, assume_a)
|
|
85
|
+
]
|
|
86
|
+
|
|
87
|
+
# Find Solves using A.T
|
|
88
|
+
for cl, _ in fgraph.clients[A]:
|
|
89
|
+
if isinstance(cl.op, DimShuffle) and is_matrix_transpose(cl.out):
|
|
90
|
+
A_T = cl.out
|
|
91
|
+
A_solve_clients_and_transpose.extend(
|
|
92
|
+
(client, True) for client in find_solve_clients(A_T, assume_a)
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
if not eager and len(A_solve_clients_and_transpose) == 1:
|
|
96
|
+
# If theres' a single use don't do it... unless it's being broadcast in a Blockwise (or we're eager)
|
|
97
|
+
# That's a "reuse" inside the inner vectorized loop
|
|
98
|
+
batch_ndim = node.op.batch_ndim(node)
|
|
99
|
+
(client, _) = A_solve_clients_and_transpose[0]
|
|
100
|
+
original_A, b = client.inputs
|
|
101
|
+
if not any(
|
|
102
|
+
a_bcast and not b_bcast
|
|
103
|
+
for a_bcast, b_bcast in zip(
|
|
104
|
+
original_A.type.broadcastable[:batch_ndim],
|
|
105
|
+
b.type.broadcastable[:batch_ndim],
|
|
106
|
+
strict=True,
|
|
107
|
+
)
|
|
108
|
+
):
|
|
109
|
+
return None
|
|
110
|
+
|
|
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)
|
|
118
|
+
|
|
119
|
+
replacements = {}
|
|
120
|
+
for client, transposed in A_solve_clients_and_transpose:
|
|
121
|
+
_, b = client.inputs
|
|
122
|
+
new_x = solve_lu_decomposed_system(
|
|
123
|
+
A_decomp, b, transposed=transposed, core_solve_op=client.op.core_op
|
|
124
|
+
)
|
|
125
|
+
[old_x] = client.outputs
|
|
126
|
+
new_x = atleast_Nd(new_x, n=old_x.type.ndim).astype(old_x.type.dtype)
|
|
127
|
+
copy_stack_trace(old_x, new_x)
|
|
128
|
+
replacements[old_x] = new_x
|
|
129
|
+
|
|
130
|
+
return replacements
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _scan_split_non_sequence_lu_decomposition_solve(
|
|
134
|
+
fgraph, node, *, allowed_assume_a: Container[str]
|
|
135
|
+
):
|
|
136
|
+
"""If the A of a Solve within a Scan is a function of non-sequences, split the LU decomposition step.
|
|
137
|
+
|
|
138
|
+
The LU decomposition step can then be pushed out of the inner loop by the `scan_pushout_non_sequences` rewrite.
|
|
139
|
+
"""
|
|
140
|
+
scan_op: Scan = node.op
|
|
141
|
+
non_sequences = set(scan_op.inner_non_seqs(scan_op.inner_inputs))
|
|
142
|
+
new_scan_fgraph = scan_op.fgraph
|
|
143
|
+
|
|
144
|
+
changed = False
|
|
145
|
+
while True:
|
|
146
|
+
for inner_node in new_scan_fgraph.toposort():
|
|
147
|
+
if (
|
|
148
|
+
isinstance(inner_node.op, Blockwise)
|
|
149
|
+
and isinstance(inner_node.op.core_op, Solve)
|
|
150
|
+
and inner_node.op.core_op.assume_a in allowed_assume_a
|
|
151
|
+
):
|
|
152
|
+
A, b = inner_node.inputs
|
|
153
|
+
if all(
|
|
154
|
+
(isinstance(root_inp, Constant) or (root_inp in non_sequences))
|
|
155
|
+
for root_inp in graph_inputs([A])
|
|
156
|
+
):
|
|
157
|
+
if new_scan_fgraph is scan_op.fgraph:
|
|
158
|
+
# Clone the first time to avoid mutating the original fgraph
|
|
159
|
+
new_scan_fgraph, equiv = new_scan_fgraph.clone_get_equiv()
|
|
160
|
+
non_sequences = {equiv[non_seq] for non_seq in non_sequences}
|
|
161
|
+
inner_node = equiv[inner_node] # type: ignore
|
|
162
|
+
|
|
163
|
+
replace_dict = _split_lu_solve_steps(
|
|
164
|
+
new_scan_fgraph,
|
|
165
|
+
inner_node,
|
|
166
|
+
eager=True,
|
|
167
|
+
allowed_assume_a=allowed_assume_a,
|
|
168
|
+
)
|
|
169
|
+
assert (
|
|
170
|
+
isinstance(replace_dict, dict) and len(replace_dict) > 0
|
|
171
|
+
), "Rewrite failed"
|
|
172
|
+
new_scan_fgraph.replace_all(replace_dict.items())
|
|
173
|
+
changed = True
|
|
174
|
+
break # Break to start over with a fresh toposort
|
|
175
|
+
else: # no_break
|
|
176
|
+
break # Nothing else changed
|
|
177
|
+
|
|
178
|
+
if not changed:
|
|
179
|
+
return
|
|
180
|
+
|
|
181
|
+
# Return a new scan to indicate that a rewrite was done
|
|
182
|
+
new_scan_op = copy(scan_op)
|
|
183
|
+
new_scan_op.fgraph = new_scan_fgraph
|
|
184
|
+
new_outs = new_scan_op.make_node(*node.inputs).outputs
|
|
185
|
+
copy_stack_trace(node.outputs, new_outs)
|
|
186
|
+
return new_outs
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
@register_specialize
|
|
190
|
+
@node_rewriter([Blockwise])
|
|
191
|
+
def reuse_lu_decomposition_multiple_solves(fgraph, node):
|
|
192
|
+
return _split_lu_solve_steps(fgraph, node, eager=False, allowed_assume_a={"gen"})
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
@node_rewriter([Scan])
|
|
196
|
+
def scan_split_non_sequence_lu_decomposition_solve(fgraph, node):
|
|
197
|
+
return _scan_split_non_sequence_lu_decomposition_solve(
|
|
198
|
+
fgraph, node, allowed_assume_a={"gen"}
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
scan_seqopt1.register(
|
|
203
|
+
"scan_split_non_sequence_lu_decomposition_solve",
|
|
204
|
+
in2out(scan_split_non_sequence_lu_decomposition_solve, ignore_newtrees=True),
|
|
205
|
+
"fast_run",
|
|
206
|
+
"scan",
|
|
207
|
+
"scan_pushout",
|
|
208
|
+
position=2,
|
|
209
|
+
)
|
|
@@ -113,23 +113,22 @@ from pytensor.tensor.type import DenseTensorType, tensor
|
|
|
113
113
|
_logger = logging.getLogger("pytensor.tensor.blas")
|
|
114
114
|
|
|
115
115
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
# TODO: What is going on here?
|
|
116
|
+
def must_initialize_y_gemv():
|
|
117
|
+
# Check whether Scipy GEMV could output nan if y in not initialized
|
|
119
118
|
from scipy.linalg.blas import get_blas_funcs
|
|
120
119
|
|
|
121
|
-
if
|
|
122
|
-
y =
|
|
120
|
+
if must_initialize_y_gemv._result is None:
|
|
121
|
+
y = np.full((2,), np.nan)
|
|
123
122
|
x = np.ones((2,))
|
|
124
123
|
A = np.ones((2, 2))
|
|
125
124
|
gemv = get_blas_funcs("gemv", dtype=y.dtype)
|
|
126
125
|
gemv(1.0, A.T, x, 0.0, y, overwrite_y=True, trans=True)
|
|
127
|
-
|
|
126
|
+
must_initialize_y_gemv._result = np.isnan(y).any()
|
|
128
127
|
|
|
129
|
-
return
|
|
128
|
+
return must_initialize_y_gemv._result
|
|
130
129
|
|
|
131
130
|
|
|
132
|
-
|
|
131
|
+
must_initialize_y_gemv._result = None # type: ignore
|
|
133
132
|
|
|
134
133
|
|
|
135
134
|
class Gemv(Op):
|
|
@@ -197,7 +196,13 @@ class Gemv(Op):
|
|
|
197
196
|
f"(beta * y + alpha * dot(A, x)). y: {y.shape}, A: {A.shape}, x: {x.shape}"
|
|
198
197
|
)
|
|
199
198
|
|
|
200
|
-
if beta == 0 and
|
|
199
|
+
if beta == 0 and must_initialize_y_gemv():
|
|
200
|
+
# Most BLAS implementations of GEMV ignore y=nan when beta=0
|
|
201
|
+
# PyTensor considers that the correct behavior,
|
|
202
|
+
# and even exploits it to avoid copying or initializing outputs.
|
|
203
|
+
# By deciding to exploit this, however, it becomes our responsibility
|
|
204
|
+
# to ensure the behavior even in the rare cases BLAS deviates,
|
|
205
|
+
# or users will get errors, even for graphs that had no nan to begin with.
|
|
201
206
|
y.fill(0)
|
|
202
207
|
|
|
203
208
|
# Here I suppose that A is in c order. If we don't make it
|