pytensor 2.31.1__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.1/pytensor.egg-info → pytensor-2.31.2}/PKG-INFO +1 -1
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/_version.py +3 -3
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/slinalg.py +15 -1
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/basic.py +1 -26
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/elemwise.py +1 -1
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +1 -1
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/nlinalg.py +3 -3
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/scalar.py +20 -1
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/_linalg/solve/rewriting.py +19 -8
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/blas.py +14 -9
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/blas_c.py +28 -19
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/blockwise.py +22 -2
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/blas.py +1 -1
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/signal/conv.py +84 -2
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/type.py +1 -1
- {pytensor-2.31.1 → pytensor-2.31.2/pytensor.egg-info}/PKG-INFO +1 -1
- {pytensor-2.31.1 → pytensor-2.31.2}/LICENSE.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/MANIFEST.in +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/README.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/.templates/layout.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/.templates/nb-badges.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/LICENSE.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/README.md +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/acknowledgement.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/bcast.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/bcast.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/blog.md +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/conf.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/core_development_guide.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/css.inc +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/dev_start_guide.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/environment.yml +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/apply.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/apply.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/apply2.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/ctype.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/extending_faq.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/graphstructures.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/inplace.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/op.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/other_ops.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/pipeline.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/scan.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/tips.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/type.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/unittest.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/extending/using_params.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/faq.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/gallery/page_footer.md +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/glossary.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/Elman_srnn.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/PyTensor.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/binder.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/blocksparse.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/colab.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/github.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/lstm.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/talk2010.gif +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/images/talk2010.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/install.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/internal/how_to_release.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/internal/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/introduction.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/function.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/io.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/mode.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/ops.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/compile/shared.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/config.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/features.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/graph.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/op.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/replace.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/type.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/graph/utils.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/printing.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/scalar/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/scan.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/sparse/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/basic.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/bcast.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/conv.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/fft.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/functional.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/io.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/random/distributions.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/random/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/tensor/utils.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/library/typed_list.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/links.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/optimizations.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/pylintrc +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/robots.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/troubleshooting.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/adding.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/apply.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/apply.svg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/bcast.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/conditions.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/examples.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/gradients.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/index.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/logistic.gp +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/logistic.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/loop.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/modes.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/prng.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/profiling.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/sparse.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/doc/user_guide.rst +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pyproject.toml +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/bin/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/breakpoint.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/builders.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/compiledir.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/compilelock.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/debugmode.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/function/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/function/pfunc.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/function/types.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/io.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/mode.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/monitormode.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/nanguardmode.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/ops.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/profiling.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/configdefaults.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/configparser.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/gradient.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/features.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/fg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/null_type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/op.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/replace.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/graph/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/ifelse.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/cutils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/cvm.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/interface.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/op.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/params_type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/c/type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/jax/linker.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/slinalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/sparse.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/numba/linker.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/link/vm.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/check_blas.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/frozendict.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/npy_2_compat.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/printing.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/py.typed +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/raise_op.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/loop.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/math.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/op.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/rewriting.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/scan/views.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/sandbox/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/sandbox/sp.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/sandbox/sp2.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/sparse/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/_linalg/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/blas_scipy.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/conv/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/conv/abstract_conv.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/einsum.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/fft.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/fourier.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/functional.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/inplace.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/io.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/linalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/math.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/pad.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/op.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/random/var.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/conv.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/linalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/math.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/subtensor.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/shape.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/slinalg.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/sort.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/special.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/subtensor.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/type_other.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/var.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/variable.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/typed_list/basic.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/typed_list/type.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/updates.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor/utils.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor.egg-info/SOURCES.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/scripts/mypy-failing.txt +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/setup.cfg +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/setup.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_breakpoint.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_config.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_gradient.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_ifelse.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_printing.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_raise_op.py +0 -0
- {pytensor-2.31.1 → pytensor-2.31.2}/tests/test_rop.py +0 -0
- {pytensor-2.31.1 → 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
|
|
@@ -14,16 +14,22 @@ from pytensor.tensor.slinalg import Solve, lu_factor, lu_solve
|
|
|
14
14
|
from pytensor.tensor.variable import TensorVariable
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
def decompose_A(A, assume_a):
|
|
17
|
+
def decompose_A(A, assume_a, check_finite):
|
|
18
18
|
if assume_a == "gen":
|
|
19
|
-
return lu_factor(A, check_finite=
|
|
19
|
+
return lu_factor(A, check_finite=check_finite)
|
|
20
20
|
else:
|
|
21
21
|
raise NotImplementedError
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
def solve_lu_decomposed_system(A_decomp, b,
|
|
25
|
-
if assume_a == "gen":
|
|
26
|
-
return lu_solve(
|
|
24
|
+
def solve_lu_decomposed_system(A_decomp, b, transposed=False, *, core_solve_op: Solve):
|
|
25
|
+
if core_solve_op.assume_a == "gen":
|
|
26
|
+
return lu_solve(
|
|
27
|
+
A_decomp,
|
|
28
|
+
b,
|
|
29
|
+
trans=transposed,
|
|
30
|
+
b_ndim=core_solve_op.b_ndim,
|
|
31
|
+
check_finite=core_solve_op.check_finite,
|
|
32
|
+
)
|
|
27
33
|
else:
|
|
28
34
|
raise NotImplementedError
|
|
29
35
|
|
|
@@ -102,14 +108,19 @@ def _split_lu_solve_steps(
|
|
|
102
108
|
):
|
|
103
109
|
return None
|
|
104
110
|
|
|
105
|
-
|
|
111
|
+
# If any Op had check_finite=True, we also do it for the LU decomposition
|
|
112
|
+
check_finite_decomp = False
|
|
113
|
+
for client, _ in A_solve_clients_and_transpose:
|
|
114
|
+
if client.op.core_op.check_finite:
|
|
115
|
+
check_finite_decomp = True
|
|
116
|
+
break
|
|
117
|
+
A_decomp = decompose_A(A, assume_a=assume_a, check_finite=check_finite_decomp)
|
|
106
118
|
|
|
107
119
|
replacements = {}
|
|
108
120
|
for client, transposed in A_solve_clients_and_transpose:
|
|
109
121
|
_, b = client.inputs
|
|
110
|
-
b_ndim = client.op.core_op.b_ndim
|
|
111
122
|
new_x = solve_lu_decomposed_system(
|
|
112
|
-
A_decomp, b,
|
|
123
|
+
A_decomp, b, transposed=transposed, core_solve_op=client.op.core_op
|
|
113
124
|
)
|
|
114
125
|
[old_x] = client.outputs
|
|
115
126
|
new_x = atleast_Nd(new_x, n=old_x.type.ndim).astype(old_x.type.dtype)
|
|
@@ -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
|
|
@@ -336,11 +336,12 @@ cger_no_inplace = CGer(False)
|
|
|
336
336
|
# ##### ####### #######
|
|
337
337
|
|
|
338
338
|
|
|
339
|
-
def gemv_c_code(y, A, x, z, alpha, beta, fail,
|
|
339
|
+
def gemv_c_code(y, A, x, z, alpha, beta, fail, must_initialize_y=False, params=None):
|
|
340
340
|
"""
|
|
341
341
|
z <- beta * y + alpha * dot(A, x)
|
|
342
342
|
|
|
343
343
|
where A is a matrix, y and x are vectors (ergo z is vector)
|
|
344
|
+
z = y if inplace else y.copy()
|
|
344
345
|
"""
|
|
345
346
|
code = """
|
|
346
347
|
|
|
@@ -400,17 +401,11 @@ def gemv_c_code(y, A, x, z, alpha, beta, fail, force_init_beta=False, params=Non
|
|
|
400
401
|
}
|
|
401
402
|
if (dbeta != 0)
|
|
402
403
|
{
|
|
404
|
+
// If dbeta is zero, we avoid doing the copy
|
|
403
405
|
if (PyArray_CopyInto(%(z)s, %(y)s) != 0) {
|
|
404
406
|
%(fail)s
|
|
405
407
|
}
|
|
406
408
|
}
|
|
407
|
-
else if (%(force_init_beta)d)
|
|
408
|
-
{
|
|
409
|
-
PyObject *zero = PyFloat_FromDouble(0.);
|
|
410
|
-
if (zero == NULL) %(fail)s;
|
|
411
|
-
if (PyArray_FillWithScalar(%(z)s, zero) != 0) %(fail)s;
|
|
412
|
-
Py_DECREF(zero);
|
|
413
|
-
}
|
|
414
409
|
}
|
|
415
410
|
else
|
|
416
411
|
{
|
|
@@ -422,6 +417,20 @@ def gemv_c_code(y, A, x, z, alpha, beta, fail, force_init_beta=False, params=Non
|
|
|
422
417
|
}
|
|
423
418
|
}
|
|
424
419
|
|
|
420
|
+
if (%(must_initialize_y)d && dbeta == 0)
|
|
421
|
+
{
|
|
422
|
+
// Most BLAS implementations of GEMV ignore y=nan when beta=0
|
|
423
|
+
// PyTensor considers that the correct behavior,
|
|
424
|
+
// and even exploits it to avoid copying or initializing outputs.
|
|
425
|
+
// By deciding to exploit this, however, it becomes our responsibility
|
|
426
|
+
// to ensure the behavior even in the rare cases BLAS deviates,
|
|
427
|
+
// or users will get errors, even for graphs that had no nan to begin with.
|
|
428
|
+
PyObject *zero = PyFloat_FromDouble(0.);
|
|
429
|
+
if (zero == NULL) %(fail)s;
|
|
430
|
+
if (PyArray_FillWithScalar(%(z)s, zero) != 0) %(fail)s;
|
|
431
|
+
Py_DECREF(zero);
|
|
432
|
+
}
|
|
433
|
+
|
|
425
434
|
{
|
|
426
435
|
int NA0 = PyArray_DIMS(%(A)s)[0];
|
|
427
436
|
int NA1 = PyArray_DIMS(%(A)s)[1];
|
|
@@ -491,13 +500,13 @@ def gemv_c_code(y, A, x, z, alpha, beta, fail, force_init_beta=False, params=Non
|
|
|
491
500
|
|
|
492
501
|
if (is_float)
|
|
493
502
|
{
|
|
494
|
-
z_data[0]
|
|
503
|
+
z_data[0] = dbeta != 0 ? dbeta * z_data[0] : 0.f;
|
|
495
504
|
z_data[0] += alpha * sdot_(&NA1, (float*)(A_data), &SA1,
|
|
496
505
|
(float*)x_data, &Sx);
|
|
497
506
|
}
|
|
498
507
|
else
|
|
499
508
|
{
|
|
500
|
-
z_data[0]
|
|
509
|
+
z_data[0] = dbeta != 0 ? dbeta * z_data[0] : 0.;
|
|
501
510
|
z_data[0] += alpha * ddot_(&NA1, (double*)(A_data), &SA1,
|
|
502
511
|
(double*)x_data, &Sx);
|
|
503
512
|
}
|
|
@@ -583,21 +592,21 @@ class CGemv(BaseBLAS, Gemv):
|
|
|
583
592
|
alpha,
|
|
584
593
|
beta,
|
|
585
594
|
fail=sub["fail"],
|
|
586
|
-
|
|
595
|
+
must_initialize_y=must_initialize_y_gemv(),
|
|
587
596
|
params=sub["params"],
|
|
588
597
|
)
|
|
589
598
|
return code
|
|
590
599
|
|
|
591
600
|
def c_code_cache_version(self):
|
|
592
|
-
return (
|
|
601
|
+
return (17, blas_header_version(), must_initialize_y_gemv())
|
|
593
602
|
|
|
594
603
|
|
|
595
604
|
cgemv_inplace = CGemv(inplace=True)
|
|
596
605
|
cgemv_no_inplace = CGemv(inplace=False)
|
|
597
606
|
|
|
598
607
|
|
|
599
|
-
def
|
|
600
|
-
if
|
|
608
|
+
def must_initialize_y_gemv():
|
|
609
|
+
if must_initialize_y_gemv._force_init_beta is None:
|
|
601
610
|
from pytensor.link.c.cmodule import GCC_compiler
|
|
602
611
|
|
|
603
612
|
"""
|
|
@@ -643,13 +652,13 @@ int main() {
|
|
|
643
652
|
)
|
|
644
653
|
if res:
|
|
645
654
|
if res[0]:
|
|
646
|
-
|
|
655
|
+
must_initialize_y_gemv._force_init_beta = res[1]
|
|
647
656
|
else:
|
|
648
|
-
|
|
657
|
+
must_initialize_y_gemv._force_init_beta = False
|
|
649
658
|
else:
|
|
650
|
-
|
|
659
|
+
must_initialize_y_gemv._force_init_beta = False
|
|
651
660
|
|
|
652
|
-
return
|
|
661
|
+
return must_initialize_y_gemv._force_init_beta
|
|
653
662
|
|
|
654
663
|
|
|
655
|
-
|
|
664
|
+
must_initialize_y_gemv._force_init_beta = None
|
|
@@ -16,6 +16,7 @@ from pytensor.graph.replace import (
|
|
|
16
16
|
_vectorize_not_needed,
|
|
17
17
|
vectorize_graph,
|
|
18
18
|
)
|
|
19
|
+
from pytensor.link.c.op import COp
|
|
19
20
|
from pytensor.scalar import ScalarType
|
|
20
21
|
from pytensor.tensor import as_tensor_variable
|
|
21
22
|
from pytensor.tensor.shape import shape_padleft
|
|
@@ -43,7 +44,18 @@ def _vectorize_node_perform(
|
|
|
43
44
|
"""
|
|
44
45
|
|
|
45
46
|
storage_map = {var: [None] for var in core_node.inputs + core_node.outputs}
|
|
46
|
-
|
|
47
|
+
try:
|
|
48
|
+
core_thunk = core_node.op.make_thunk(
|
|
49
|
+
core_node, storage_map, None, [], impl=impl
|
|
50
|
+
)
|
|
51
|
+
except NotImplementedError:
|
|
52
|
+
if impl == "c":
|
|
53
|
+
# Try again with py impl
|
|
54
|
+
core_thunk = core_node.op.make_thunk(
|
|
55
|
+
core_node, storage_map, None, [], impl="py"
|
|
56
|
+
)
|
|
57
|
+
else:
|
|
58
|
+
raise
|
|
47
59
|
single_in = len(core_node.inputs) == 1
|
|
48
60
|
core_input_storage = [storage_map[inp] for inp in core_node.inputs]
|
|
49
61
|
core_output_storage = [storage_map[out] for out in core_node.outputs]
|
|
@@ -128,7 +140,7 @@ def _check_runtime_broadcast_core(numerical_inputs, batch_bcast_patterns, batch_
|
|
|
128
140
|
)
|
|
129
141
|
|
|
130
142
|
|
|
131
|
-
class Blockwise(
|
|
143
|
+
class Blockwise(COp):
|
|
132
144
|
"""Generalizes a core `Op` to work with batched dimensions.
|
|
133
145
|
|
|
134
146
|
TODO: Dispatch JAX (should be easy with the vectorize macro)
|
|
@@ -483,6 +495,14 @@ class Blockwise(Op):
|
|
|
483
495
|
else:
|
|
484
496
|
return self.name
|
|
485
497
|
|
|
498
|
+
def c_code(self, *args, **kwargs):
|
|
499
|
+
# Blockwise is a C_Op just so we can propagate compilation mode to the inner Op.
|
|
500
|
+
# It doesn't itself have a C implementation yet.
|
|
501
|
+
raise NotImplementedError()
|
|
502
|
+
|
|
503
|
+
def c_code_cache_version(self):
|
|
504
|
+
return (-1,)
|
|
505
|
+
|
|
486
506
|
|
|
487
507
|
@_vectorize_node.register(Op)
|
|
488
508
|
def vectorize_node_fallback(op: Op, node: Apply, *bached_inputs) -> Apply:
|
|
@@ -700,7 +700,7 @@ def local_dot22_to_ger_or_gemv(fgraph, node):
|
|
|
700
700
|
new_out = [rval]
|
|
701
701
|
elif xb[0] and yb[1]:
|
|
702
702
|
# x and y are both vectors so this qualifies for a sdot / ddot
|
|
703
|
-
#
|
|
703
|
+
# PyTensor's CGemv will call sdot/ddot at runtime, the Scipy Gemv may not
|
|
704
704
|
xv = x.dimshuffle(1)
|
|
705
705
|
zeros = ptb.AllocEmpty(x.dtype)(1)
|
|
706
706
|
rval = gemv_no_inplace(zeros, one, y.T, xv, zero)
|
|
@@ -2,7 +2,8 @@ from typing import TYPE_CHECKING, Literal, cast
|
|
|
2
2
|
|
|
3
3
|
from numpy import convolve as numpy_convolve
|
|
4
4
|
|
|
5
|
-
from pytensor.graph import Apply
|
|
5
|
+
from pytensor.graph import Apply
|
|
6
|
+
from pytensor.link.c.op import COp
|
|
6
7
|
from pytensor.scalar.basic import upcast
|
|
7
8
|
from pytensor.tensor.basic import as_tensor_variable, join, zeros
|
|
8
9
|
from pytensor.tensor.blockwise import Blockwise
|
|
@@ -15,7 +16,7 @@ if TYPE_CHECKING:
|
|
|
15
16
|
from pytensor.tensor import TensorLike
|
|
16
17
|
|
|
17
18
|
|
|
18
|
-
class Convolve1d(
|
|
19
|
+
class Convolve1d(COp):
|
|
19
20
|
__props__ = ("mode",)
|
|
20
21
|
gufunc_signature = "(n),(k)->(o)"
|
|
21
22
|
|
|
@@ -86,6 +87,87 @@ class Convolve1d(Op):
|
|
|
86
87
|
|
|
87
88
|
return [in1_bar, in2_bar]
|
|
88
89
|
|
|
90
|
+
def c_code_cache_version(self):
|
|
91
|
+
return (1,)
|
|
92
|
+
|
|
93
|
+
def c_code(self, node, name, inputs, outputs, sub):
|
|
94
|
+
# raise NotImplementedError()
|
|
95
|
+
in1, in2 = inputs
|
|
96
|
+
[out] = outputs
|
|
97
|
+
mode_str = self.mode
|
|
98
|
+
|
|
99
|
+
if mode_str == "full":
|
|
100
|
+
np_mode_val = 2 # NPY_CONVOLVE_FULL
|
|
101
|
+
elif mode_str == "valid":
|
|
102
|
+
np_mode_val = 0 # NPY_CONVOLVE_VALID
|
|
103
|
+
else:
|
|
104
|
+
# This case should ideally be prevented by __init__ or make_node
|
|
105
|
+
raise ValueError(f"Unsupported mode {mode_str}")
|
|
106
|
+
|
|
107
|
+
code = f"""
|
|
108
|
+
{{
|
|
109
|
+
PyArrayObject* in2_flipped_view = NULL;
|
|
110
|
+
|
|
111
|
+
if (PyArray_NDIM({in1}) != 1 || PyArray_NDIM({in2}) != 1) {{
|
|
112
|
+
PyErr_SetString(PyExc_ValueError, "Convolve1d C code expects 1D arrays.");
|
|
113
|
+
{sub['fail']};
|
|
114
|
+
}}
|
|
115
|
+
|
|
116
|
+
npy_intp n_in2 = PyArray_DIM({in2}, 0);
|
|
117
|
+
|
|
118
|
+
// Create a reversed view of in2
|
|
119
|
+
if (n_in2 == 0) {{
|
|
120
|
+
PyErr_SetString(PyExc_ValueError, "Convolve1d: second input (kernel) cannot be empty.");
|
|
121
|
+
{sub['fail']};
|
|
122
|
+
}} else {{
|
|
123
|
+
npy_intp view_dims[1];
|
|
124
|
+
view_dims[0] = n_in2;
|
|
125
|
+
|
|
126
|
+
npy_intp view_strides[1];
|
|
127
|
+
view_strides[0] = -PyArray_STRIDES({in2})[0];
|
|
128
|
+
|
|
129
|
+
void* view_data = (char*)PyArray_DATA({in2}) + (n_in2 - 1) * PyArray_STRIDES({in2})[0];
|
|
130
|
+
|
|
131
|
+
Py_INCREF(PyArray_DESCR({in2}));
|
|
132
|
+
in2_flipped_view = (PyArrayObject*)PyArray_NewFromDescr(
|
|
133
|
+
Py_TYPE({in2}),
|
|
134
|
+
PyArray_DESCR({in2}),
|
|
135
|
+
1, // ndim
|
|
136
|
+
view_dims,
|
|
137
|
+
view_strides,
|
|
138
|
+
view_data,
|
|
139
|
+
(PyArray_FLAGS({in2}) & ~NPY_ARRAY_WRITEABLE),
|
|
140
|
+
NULL
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
if (!in2_flipped_view) {{
|
|
144
|
+
PyErr_SetString(PyExc_RuntimeError, "Failed to create flipped kernel view for Convolve1d.");
|
|
145
|
+
{sub['fail']};
|
|
146
|
+
}}
|
|
147
|
+
|
|
148
|
+
Py_INCREF({in2});
|
|
149
|
+
if (PyArray_SetBaseObject(in2_flipped_view, (PyObject*){in2}) < 0) {{
|
|
150
|
+
Py_DECREF({in2}); // SetBaseObject failed, release the extra INCREF
|
|
151
|
+
Py_DECREF(in2_flipped_view);
|
|
152
|
+
in2_flipped_view = NULL;
|
|
153
|
+
PyErr_SetString(PyExc_RuntimeError, "Failed to set base object for flipped kernel view in Convolve1d.");
|
|
154
|
+
{sub['fail']};
|
|
155
|
+
}}
|
|
156
|
+
PyArray_UpdateFlags(in2_flipped_view, (NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_F_CONTIGUOUS));
|
|
157
|
+
}}
|
|
158
|
+
|
|
159
|
+
// TODO: Use lower level implementation that allows reusing the output buffer
|
|
160
|
+
Py_XDECREF({out});
|
|
161
|
+
{out} = (PyArrayObject*) PyArray_Correlate2((PyObject*){in1}, (PyObject*)in2_flipped_view, {np_mode_val});
|
|
162
|
+
Py_XDECREF(in2_flipped_view); // Clean up the view if correlate fails
|
|
163
|
+
if (!{out}) {{
|
|
164
|
+
// PyArray_Correlate already set an error
|
|
165
|
+
{sub['fail']};
|
|
166
|
+
}}
|
|
167
|
+
}}
|
|
168
|
+
"""
|
|
169
|
+
return code
|
|
170
|
+
|
|
89
171
|
|
|
90
172
|
def convolve1d(
|
|
91
173
|
in1: "TensorLike",
|
|
@@ -793,7 +793,7 @@ def tensor(
|
|
|
793
793
|
try:
|
|
794
794
|
# Help catching errors with the new tensor API
|
|
795
795
|
# Many single letter strings are valid sctypes
|
|
796
|
-
if str(name) == "floatX" or (len(str(name)) >
|
|
796
|
+
if str(name) == "floatX" or (len(str(name)) > 2 and np.dtype(name).type):
|
|
797
797
|
raise ValueError(
|
|
798
798
|
f"The first and only positional argument of tensor is now `name`. Got {name}.\n"
|
|
799
799
|
"This name looks like a dtype, which you should pass as a keyword argument only."
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|