pytensor 2.31.2__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.2/pytensor.egg-info → pytensor-2.31.3}/PKG-INFO +1 -1
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/_version.py +3 -3
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/tensor_basic.py +1 -8
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/linker.py +38 -1
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/basic.py +48 -15
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/tensor_basic.py +1 -9
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scan/checkpoints.py +1 -4
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scan/op.py +3 -2
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scan/rewriting.py +24 -15
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/sparse/sandbox/sp2.py +1 -1
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/basic.py +173 -161
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/elemwise.py +2 -2
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/io.py +1 -1
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/random/op.py +2 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/basic.py +26 -37
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/elemwise.py +83 -29
- {pytensor-2.31.2 → pytensor-2.31.3/pytensor.egg-info}/PKG-INFO +1 -1
- {pytensor-2.31.2 → pytensor-2.31.3}/LICENSE.txt +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/MANIFEST.in +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/README.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/.templates/layout.html +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/.templates/nb-badges.html +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/LICENSE.txt +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/README.md +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/acknowledgement.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/bcast.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/bcast.svg +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/blog.md +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/conf.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/core_development_guide.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/css.inc +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/dev_start_guide.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/environment.yml +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/apply.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/apply.svg +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/apply2.svg +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/ctype.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/extending_faq.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/graphstructures.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/index.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/inplace.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/op.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/other_ops.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/pipeline.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/scan.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/tips.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/type.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/unittest.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/extending/using_params.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/faq.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/gallery/page_footer.md +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/glossary.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/images/Elman_srnn.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/images/PyTensor.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/images/binder.svg +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/images/blocksparse.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/images/colab.svg +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/images/github.svg +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/images/lstm.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/images/talk2010.gif +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/images/talk2010.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/index.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/install.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/internal/how_to_release.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/internal/index.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/introduction.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/compile/function.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/compile/index.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/compile/io.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/compile/mode.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/compile/ops.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/compile/shared.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/config.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/index.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/graph/features.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/graph/graph.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/graph/index.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/graph/op.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/graph/replace.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/graph/type.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/graph/utils.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/index.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/printing.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/scalar/index.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/scan.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/sparse/index.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/basic.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/bcast.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/conv.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/fft.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/functional.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/index.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/io.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/random/distributions.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/random/index.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/tensor/utils.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/library/typed_list.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/links.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/optimizations.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/pylintrc +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/robots.txt +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/troubleshooting.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/adding.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/apply.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/apply.svg +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/bcast.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/conditions.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/examples.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/gradients.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/index.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/logistic.gp +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/logistic.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/loop.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/modes.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/prng.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/profiling.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/sparse.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/doc/user_guide.rst +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pyproject.toml +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/bin/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/breakpoint.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/builders.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/compiledir.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/compilelock.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/debugmode.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/function/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/function/pfunc.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/function/types.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/io.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/mode.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/monitormode.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/nanguardmode.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/ops.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/profiling.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/configdefaults.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/configparser.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/gradient.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/basic.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/features.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/fg.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/null_type.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/op.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/replace.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/type.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/graph/utils.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/ifelse.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/basic.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/c/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/c/basic.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/c/cutils.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/c/cvm.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/c/interface.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/c/op.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/c/params_type.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/c/type.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/slinalg.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/elemwise.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/scalar.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/slinalg.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/sparse.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/numba/linker.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/utils.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/link/vm.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/misc/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/misc/check_blas.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/misc/frozendict.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/npy_2_compat.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/printing.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/py.typed +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/raise_op.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scalar/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scalar/basic.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scalar/loop.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scalar/math.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scan/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scan/basic.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scan/utils.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/scan/views.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/sparse/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/sparse/basic.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/sparse/sandbox/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/sparse/sandbox/sp.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/sparse/type.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/sparse/utils.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/_linalg/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/_linalg/solve/rewriting.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/blas.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/blas_c.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/blas_scipy.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/conv/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/conv/abstract_conv.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/einsum.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/fft.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/fourier.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/functional.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/inplace.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/linalg.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/math.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/pad.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/random/type.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/random/var.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/blas.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/conv.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/linalg.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/math.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/subtensor.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/shape.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/signal/conv.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/slinalg.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/sort.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/special.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/subtensor.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/type.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/type_other.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/utils.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/var.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/variable.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/typed_list/basic.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/typed_list/type.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/updates.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor/utils.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor.egg-info/SOURCES.txt +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/scripts/mypy-failing.txt +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/setup.cfg +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/setup.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/tests/test_breakpoint.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/tests/test_config.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/tests/test_gradient.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/tests/test_ifelse.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/tests/test_printing.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/tests/test_raise_op.py +0 -0
- {pytensor-2.31.2 → pytensor-2.31.3}/tests/test_rop.py +0 -0
- {pytensor-2.31.2 → 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
|
|
|
@@ -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
|
|
@@ -565,18 +565,19 @@ def numba_funcify_SpecifyShape(op, node, **kwargs):
|
|
|
565
565
|
def int_to_float_fn(inputs, out_dtype):
|
|
566
566
|
"""Create a Numba function that converts integer and boolean ``ndarray``s to floats."""
|
|
567
567
|
|
|
568
|
-
if
|
|
569
|
-
|
|
570
|
-
|
|
568
|
+
if (
|
|
569
|
+
all(inp.type.dtype == out_dtype for inp in inputs)
|
|
570
|
+
and np.dtype(out_dtype).kind == "f"
|
|
571
|
+
):
|
|
571
572
|
|
|
572
|
-
@numba_njit
|
|
573
|
+
@numba_njit(inline="always")
|
|
573
574
|
def inputs_cast(x):
|
|
574
575
|
return x
|
|
575
576
|
|
|
576
|
-
elif any(i.type.numpy_dtype.kind in "
|
|
577
|
+
elif any(i.type.numpy_dtype.kind in "uib" for i in inputs):
|
|
577
578
|
args_dtype = np.dtype(f"f{out_dtype.itemsize}")
|
|
578
579
|
|
|
579
|
-
@numba_njit
|
|
580
|
+
@numba_njit(inline="always")
|
|
580
581
|
def inputs_cast(x):
|
|
581
582
|
return x.astype(args_dtype)
|
|
582
583
|
|
|
@@ -584,7 +585,7 @@ def int_to_float_fn(inputs, out_dtype):
|
|
|
584
585
|
args_dtype_sz = max(_arg.type.numpy_dtype.itemsize for _arg in inputs)
|
|
585
586
|
args_dtype = np.dtype(f"f{args_dtype_sz}")
|
|
586
587
|
|
|
587
|
-
@numba_njit
|
|
588
|
+
@numba_njit(inline="always")
|
|
588
589
|
def inputs_cast(x):
|
|
589
590
|
return x.astype(args_dtype)
|
|
590
591
|
|
|
@@ -593,17 +594,49 @@ def int_to_float_fn(inputs, out_dtype):
|
|
|
593
594
|
|
|
594
595
|
@numba_funcify.register(Dot)
|
|
595
596
|
def numba_funcify_Dot(op, node, **kwargs):
|
|
596
|
-
# Numba's `np.dot` does not support integer dtypes, so we need to cast to
|
|
597
|
-
|
|
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
|
|
598
600
|
|
|
599
|
-
|
|
600
|
-
|
|
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
|
|
601
605
|
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
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))
|
|
611
|
+
|
|
612
|
+
elif x_dtype == dot_dtype and y_dtype != dot_dtype:
|
|
613
|
+
|
|
614
|
+
@numba_njit
|
|
615
|
+
def dot(x, y):
|
|
616
|
+
return np.asarray(np.dot(x, y.astype(dot_dtype)))
|
|
617
|
+
|
|
618
|
+
elif x_dtype != dot_dtype and y_dtype == dot_dtype:
|
|
619
|
+
|
|
620
|
+
@numba_njit
|
|
621
|
+
def dot(x, y):
|
|
622
|
+
return np.asarray(np.dot(x.astype(dot_dtype), y))
|
|
623
|
+
|
|
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)
|
|
605
638
|
|
|
606
|
-
return
|
|
639
|
+
return dot_with_cast
|
|
607
640
|
|
|
608
641
|
|
|
609
642
|
@numba_funcify.register(Solve)
|
|
@@ -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 (
|