pytensor 2.31.6__tar.gz → 2.32.0__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.6/pytensor.egg-info → pytensor-2.32.0}/PKG-INFO +1 -3
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/conf.py +24 -6
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/environment.yml +2 -1
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/index.rst +1 -3
- pytensor-2.32.0/doc/library/xtensor/index.md +101 -0
- pytensor-2.32.0/doc/library/xtensor/linalg.md +7 -0
- pytensor-2.32.0/doc/library/xtensor/math.md +8 -0
- pytensor-2.32.0/doc/library/xtensor/module_functions.md +7 -0
- pytensor-2.32.0/doc/library/xtensor/random.md +7 -0
- pytensor-2.32.0/doc/library/xtensor/type.md +20 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pyproject.toml +1 -1
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/_version.py +3 -3
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/rewriting/basic.py +21 -10
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/basic.py +8 -4
- pytensor-2.32.0/pytensor/link/jax/dispatch/blockwise.py +21 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -11
- pytensor-2.32.0/pytensor/link/jax/dispatch/signal/conv.py +24 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/slinalg.py +11 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/basic.py +9 -11
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/blockwise.py +3 -2
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +87 -1
- pytensor-2.32.0/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +880 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/nlinalg.py +0 -36
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/scalar.py +60 -70
- pytensor-2.32.0/pytensor/link/numba/dispatch/signal/conv.py +69 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/slinalg.py +104 -1
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/__init__.py +1 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/basic.py +10 -1
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -16
- pytensor-2.32.0/pytensor/link/pytorch/dispatch/slinalg.py +23 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/printing.py +12 -36
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/raise_op.py +24 -53
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/math.py +42 -32
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/__init__.py +0 -1
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/basic.py +16 -6
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/blas.py +14 -22
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/blockwise.py +96 -29
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/extra_ops.py +38 -1
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/math.py +66 -137
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/nlinalg.py +0 -171
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/__init__.py +0 -2
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/basic.py +11 -9
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/blas.py +80 -95
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/blockwise.py +1 -12
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/elemwise.py +33 -62
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/linalg.py +4 -13
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/math.py +270 -138
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/subtensor.py +108 -64
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/subtensor_lift.py +115 -46
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/signal/conv.py +54 -56
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/slinalg.py +389 -4
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/subtensor.py +6 -2
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/__init__.py +2 -2
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/linalg.py +40 -2
- pytensor-2.32.0/pytensor/xtensor/math.py +627 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/random.py +148 -35
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/reduction.py +2 -2
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/shape.py +2 -23
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/shape.py +127 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/type.py +195 -29
- {pytensor-2.31.6 → pytensor-2.32.0/pytensor.egg-info}/PKG-INFO +1 -3
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor.egg-info/SOURCES.txt +8 -3
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor.egg-info/requires.txt +0 -2
- {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_gradient.py +19 -1
- {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_printing.py +4 -4
- {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_raise_op.py +12 -5
- pytensor-2.31.6/pytensor/link/jax/dispatch/blockwise.py +0 -29
- pytensor-2.31.6/pytensor/link/jax/dispatch/signal/conv.py +0 -14
- pytensor-2.31.6/pytensor/link/numba/dispatch/signal/conv.py +0 -70
- pytensor-2.31.6/pytensor/tensor/blas_scipy.py +0 -34
- pytensor-2.31.6/pytensor/tensor/rewriting/blas_scipy.py +0 -37
- pytensor-2.31.6/pytensor/tensor/rewriting/conv.py +0 -78
- pytensor-2.31.6/pytensor/xtensor/math.py +0 -252
- {pytensor-2.31.6 → pytensor-2.32.0}/LICENSE.txt +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/MANIFEST.in +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/README.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/.templates/layout.html +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/.templates/nb-badges.html +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/LICENSE.txt +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/README.md +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/acknowledgement.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/bcast.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/bcast.svg +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/blog.md +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/core_development_guide.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/css.inc +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/dev_start_guide.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/apply.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/apply.svg +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/apply2.svg +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/ctype.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/extending_faq.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/graphstructures.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/index.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/inplace.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/op.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/other_ops.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/pipeline.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/scan.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/tips.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/type.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/unittest.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/extending/using_params.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/faq.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/gallery/optimize/root.ipynb +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/gallery/page_footer.md +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/glossary.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/Elman_srnn.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/PyTensor.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/binder.svg +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/blocksparse.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/colab.svg +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/github.svg +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/lstm.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/talk2010.gif +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/images/talk2010.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/index.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/install.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/internal/how_to_release.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/internal/index.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/introduction.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/function.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/index.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/io.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/mode.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/ops.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/compile/shared.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/config.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/index.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/features.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/graph.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/index.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/op.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/replace.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/type.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/graph/utils.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/printing.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/scalar/index.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/scan.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/sparse/index.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/basic.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/bcast.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/conv.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/fft.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/functional.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/index.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/io.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/optimize.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/random/distributions.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/random/index.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/tensor/utils.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/library/typed_list.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/links.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/optimizations.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/pylintrc +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/robots.txt +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/troubleshooting.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/adding.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/apply.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/apply.svg +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/bcast.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/conditions.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/examples.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/gradients.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/index.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/logistic.gp +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/logistic.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/loop.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/modes.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/prng.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/profiling.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/sparse.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/doc/user_guide.rst +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/bin/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/breakpoint.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/builders.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/compiledir.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/compilelock.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/debugmode.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/function/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/function/pfunc.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/function/types.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/io.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/mode.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/monitormode.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/nanguardmode.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/ops.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/profiling.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/configdefaults.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/configparser.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/gradient.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/basic.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/features.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/fg.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/null_type.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/op.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/replace.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/type.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/graph/utils.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/ifelse.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/ipython.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/basic.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/basic.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/cutils.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/cvm.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/interface.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/op.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/params_type.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/c/type.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/jax/linker.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/elemwise.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/sparse.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/numba/linker.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/utils.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/link/vm.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/check_blas.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/frozendict.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/npy_2_compat.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/py.typed +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/basic.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/loop.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/basic.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/op.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/rewriting.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/utils.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/scan/views.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/basic.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/sandbox/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/sandbox/sp.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/sandbox/sp2.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/type.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/sparse/utils.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/_linalg/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/_linalg/solve/rewriting.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/_linalg/solve/tridiagonal.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/blas_c.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/conv/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/conv/abstract_conv.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/einsum.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/fft.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/fourier.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/functional.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/inplace.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/io.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/linalg.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/optimize.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/pad.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/op.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/type.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/random/var.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/shape.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/sort.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/special.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/type.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/type_other.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/utils.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/var.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/variable.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/typed_list/basic.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/typed_list/type.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/updates.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/utils.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/basic.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/indexing.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/__init__.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/basic.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/indexing.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/math.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/reduction.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/utils.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/rewriting/vectorization.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor/xtensor/vectorization.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/scripts/mypy-failing.txt +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/setup.cfg +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/setup.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_breakpoint.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_config.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_ifelse.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_rop.py +0 -0
- {pytensor-2.31.6 → pytensor-2.32.0}/tests/test_updates.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pytensor
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.32.0
|
|
4
4
|
Summary: Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs.
|
|
5
5
|
Author-email: pymc-devs <pymc.devs@gmail.com>
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -55,8 +55,6 @@ Provides-Extra: rtd
|
|
|
55
55
|
Requires-Dist: sphinx<6,>=5.1.0; extra == "rtd"
|
|
56
56
|
Requires-Dist: pygments; extra == "rtd"
|
|
57
57
|
Requires-Dist: pydot; extra == "rtd"
|
|
58
|
-
Requires-Dist: pydot2; extra == "rtd"
|
|
59
|
-
Requires-Dist: pydot-ng; extra == "rtd"
|
|
60
58
|
Provides-Extra: jax
|
|
61
59
|
Requires-Dist: jax; extra == "jax"
|
|
62
60
|
Requires-Dist: jaxlib; extra == "jax"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import inspect
|
|
3
3
|
import sys
|
|
4
|
+
|
|
4
5
|
import pytensor
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
|
|
@@ -12,6 +13,7 @@ extensions = [
|
|
|
12
13
|
"sphinx.ext.autodoc",
|
|
13
14
|
"sphinx.ext.todo",
|
|
14
15
|
"sphinx.ext.doctest",
|
|
16
|
+
"sphinx_copybutton",
|
|
15
17
|
"sphinx.ext.napoleon",
|
|
16
18
|
"sphinx.ext.linkcode",
|
|
17
19
|
"sphinx.ext.mathjax",
|
|
@@ -86,8 +88,7 @@ today_fmt = "%B %d, %Y"
|
|
|
86
88
|
|
|
87
89
|
# List of directories, relative to source directories, that shouldn't be
|
|
88
90
|
# searched for source files.
|
|
89
|
-
|
|
90
|
-
exclude_patterns = ['page_footer.md', '**/*.myst.md']
|
|
91
|
+
exclude_patterns = ["README.md", "images/*", "page_footer.md", "**/*.myst.md"]
|
|
91
92
|
|
|
92
93
|
# The reST default role (used for this markup: `text`) to use for all
|
|
93
94
|
# documents.
|
|
@@ -235,24 +236,41 @@ htmlhelp_basename = "pytensor_doc"
|
|
|
235
236
|
# Resolve function
|
|
236
237
|
# This function is used to populate the (source) links in the API
|
|
237
238
|
def linkcode_resolve(domain, info):
|
|
238
|
-
def
|
|
239
|
+
def find_obj() -> object:
|
|
239
240
|
# try to find the file and line number, based on code from numpy:
|
|
240
241
|
# https://github.com/numpy/numpy/blob/master/doc/source/conf.py#L286
|
|
241
242
|
obj = sys.modules[info["module"]]
|
|
242
243
|
for part in info["fullname"].split("."):
|
|
243
244
|
obj = getattr(obj, part)
|
|
245
|
+
return obj
|
|
244
246
|
|
|
247
|
+
def find_source(obj):
|
|
245
248
|
fn = Path(inspect.getsourcefile(obj))
|
|
246
|
-
fn = fn.relative_to(Path(__file__).parent)
|
|
249
|
+
fn = fn.relative_to(Path(pytensor.__file__).parent)
|
|
247
250
|
source, lineno = inspect.getsourcelines(obj)
|
|
248
251
|
return fn, lineno, lineno + len(source) - 1
|
|
249
252
|
|
|
253
|
+
def fallback_source():
|
|
254
|
+
return info["module"].replace(".", "/") + ".py"
|
|
255
|
+
|
|
250
256
|
if domain != "py" or not info["module"]:
|
|
251
257
|
return None
|
|
258
|
+
|
|
252
259
|
try:
|
|
253
|
-
|
|
260
|
+
obj = find_obj()
|
|
254
261
|
except Exception:
|
|
255
|
-
filename =
|
|
262
|
+
filename = fallback_source()
|
|
263
|
+
else:
|
|
264
|
+
try:
|
|
265
|
+
filename = "pytensor/%s#L%d-L%d" % find_source(obj)
|
|
266
|
+
except Exception:
|
|
267
|
+
# warnings.warn(f"Could not find source code for {domain}:{info}")
|
|
268
|
+
try:
|
|
269
|
+
filename = obj.__module__.replace(".", "/") + ".py"
|
|
270
|
+
except AttributeError:
|
|
271
|
+
# Some objects do not have a __module__ attribute (?)
|
|
272
|
+
filename = fallback_source()
|
|
273
|
+
|
|
256
274
|
import subprocess
|
|
257
275
|
|
|
258
276
|
tag = subprocess.Popen(
|
|
@@ -13,7 +13,9 @@ dependencies:
|
|
|
13
13
|
- mock
|
|
14
14
|
- pillow
|
|
15
15
|
- pymc-sphinx-theme
|
|
16
|
+
- sphinx-copybutton
|
|
16
17
|
- sphinx-design
|
|
18
|
+
- sphinx-sitemap
|
|
17
19
|
- pygments
|
|
18
20
|
- pydot
|
|
19
21
|
- ipython
|
|
@@ -23,5 +25,4 @@ dependencies:
|
|
|
23
25
|
- ablog
|
|
24
26
|
- pip
|
|
25
27
|
- pip:
|
|
26
|
-
- sphinx_sitemap
|
|
27
28
|
- -e ..
|
|
@@ -20,14 +20,12 @@ Modules
|
|
|
20
20
|
d3viz/index
|
|
21
21
|
graph/index
|
|
22
22
|
gradient
|
|
23
|
-
misc/pkl_utils
|
|
24
23
|
printing
|
|
25
|
-
scalar/index
|
|
26
24
|
scan
|
|
27
25
|
sparse/index
|
|
28
|
-
sparse/sandbox
|
|
29
26
|
tensor/index
|
|
30
27
|
typed_list
|
|
28
|
+
xtensor/index
|
|
31
29
|
|
|
32
30
|
.. module:: pytensor
|
|
33
31
|
:platform: Unix, Windows
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
(libdoc_xtensor)=
|
|
2
|
+
# `xtensor` -- XTensor operations
|
|
3
|
+
|
|
4
|
+
This module implements as abstraction layer on regular tensor operations, that behaves like Xarray.
|
|
5
|
+
|
|
6
|
+
A new type {class}`pytensor.xtensor.type.XTensorType`, generalizes the {class}`pytensor.tensor.TensorType`
|
|
7
|
+
with the addition of a `dims` attribute, that labels the dimensions of the tensor.
|
|
8
|
+
|
|
9
|
+
Variables of XTensorType (i.e., {class}`pytensor.xtensor.type.XTensorVariable`s) are the symbolic counterpart
|
|
10
|
+
to xarray DataArray objects.
|
|
11
|
+
|
|
12
|
+
The module implements several PyTensor operations {class}`pytensor.xtensor.basic.XOp`s, whose signature mimics that of
|
|
13
|
+
xarray (and xarray_einstats) DataArray operations. These operations, unlike most regular PyTensor operations, cannot
|
|
14
|
+
be directly evaluated, but require a rewrite (lowering) into a regular tensor graph that can itself be evaluated as usual.
|
|
15
|
+
|
|
16
|
+
Like regular PyTensor, we don't need an Op for every possible method or function in the public API of xarray.
|
|
17
|
+
If the existing XOps can be composed to produce the desired result, then we can use them directly.
|
|
18
|
+
|
|
19
|
+
## Coordinates
|
|
20
|
+
For now, there's no analogous of xarray coordinates, so you won't be able to do coordinate operations like `.sel`.
|
|
21
|
+
The graphs produced by an xarray program without coords are much more amenable to the numpy-like backend of PyTensor.
|
|
22
|
+
Coords involve aspects of Pandas/database query and joining that are not trivially expressible in PyTensor.
|
|
23
|
+
|
|
24
|
+
## Example
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
```{testcode}
|
|
28
|
+
|
|
29
|
+
import pytensor.tensor as pt
|
|
30
|
+
import pytensor.xtensor as ptx
|
|
31
|
+
|
|
32
|
+
a = pt.tensor("a", shape=(3,))
|
|
33
|
+
b = pt.tensor("b", shape=(4,))
|
|
34
|
+
|
|
35
|
+
ax = ptx.as_xtensor(a, dims=["x"])
|
|
36
|
+
bx = ptx.as_xtensor(b, dims=["y"])
|
|
37
|
+
|
|
38
|
+
zx = ax + bx
|
|
39
|
+
assert zx.type == ptx.type.XTensorType("float64", dims=["x", "y"], shape=(3, 4))
|
|
40
|
+
|
|
41
|
+
z = zx.values
|
|
42
|
+
z.dprint()
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
```{testoutput}
|
|
47
|
+
|
|
48
|
+
TensorFromXTensor [id A]
|
|
49
|
+
└─ XElemwise{scalar_op=Add()} [id B]
|
|
50
|
+
├─ XTensorFromTensor{dims=('x',)} [id C]
|
|
51
|
+
│ └─ a [id D]
|
|
52
|
+
└─ XTensorFromTensor{dims=('y',)} [id E]
|
|
53
|
+
└─ b [id F]
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Once we compile the graph, no XOps are left.
|
|
57
|
+
|
|
58
|
+
```{testcode}
|
|
59
|
+
|
|
60
|
+
import pytensor
|
|
61
|
+
|
|
62
|
+
with pytensor.config.change_flags(optimizer_verbose=True):
|
|
63
|
+
fn = pytensor.function([a, b], z)
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
```{testoutput}
|
|
68
|
+
|
|
69
|
+
rewriting: rewrite lower_elemwise replaces XElemwise{scalar_op=Add()}.0 of XElemwise{scalar_op=Add()}(XTensorFromTensor{dims=('x',)}.0, XTensorFromTensor{dims=('y',)}.0) with XTensorFromTensor{dims=('x', 'y')}.0 of XTensorFromTensor{dims=('x', 'y')}(Add.0)
|
|
70
|
+
rewriting: rewrite useless_tensor_from_xtensor replaces TensorFromXTensor.0 of TensorFromXTensor(XTensorFromTensor{dims=('x',)}.0) with a of None
|
|
71
|
+
rewriting: rewrite useless_tensor_from_xtensor replaces TensorFromXTensor.0 of TensorFromXTensor(XTensorFromTensor{dims=('y',)}.0) with b of None
|
|
72
|
+
rewriting: rewrite useless_tensor_from_xtensor replaces TensorFromXTensor.0 of TensorFromXTensor(XTensorFromTensor{dims=('x', 'y')}.0) with Add.0 of Add(ExpandDims{axis=1}.0, ExpandDims{axis=0}.0)
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
```{testcode}
|
|
77
|
+
|
|
78
|
+
fn.dprint()
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```{testoutput}
|
|
82
|
+
|
|
83
|
+
Add [id A] 2
|
|
84
|
+
├─ ExpandDims{axis=1} [id B] 1
|
|
85
|
+
│ └─ a [id C]
|
|
86
|
+
└─ ExpandDims{axis=0} [id D] 0
|
|
87
|
+
└─ b [id E]
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
## Index
|
|
92
|
+
|
|
93
|
+
:::{toctree}
|
|
94
|
+
:maxdepth: 1
|
|
95
|
+
|
|
96
|
+
module_functions
|
|
97
|
+
math
|
|
98
|
+
linalg
|
|
99
|
+
random
|
|
100
|
+
type
|
|
101
|
+
:::
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
(libdoc_xtenor_type)=
|
|
2
|
+
|
|
3
|
+
# `xtensor.type` -- Types and Variables
|
|
4
|
+
|
|
5
|
+
## XTensorVariable creation functions
|
|
6
|
+
|
|
7
|
+
```{eval-rst}
|
|
8
|
+
.. automodule:: pytensor.xtensor.type
|
|
9
|
+
:members: xtensor, xtensor_constant, as_xtensor
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## XTensor Type and Variable classes
|
|
14
|
+
|
|
15
|
+
```{eval-rst}
|
|
16
|
+
.. automodule:: pytensor.xtensor.type
|
|
17
|
+
:members: XTensorType, XTensorVariable, XTensorConstant
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-07-
|
|
11
|
+
"date": "2025-07-26T12:45:37+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.
|
|
14
|
+
"full-revisionid": "6f8bb55521559b0f5ebb14ef536becca7c70f2a7",
|
|
15
|
+
"version": "2.32.0"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -1550,6 +1550,7 @@ class PatternNodeRewriter(NodeRewriter):
|
|
|
1550
1550
|
tracks=(),
|
|
1551
1551
|
get_nodes=None,
|
|
1552
1552
|
values_eq_approx=None,
|
|
1553
|
+
allow_cast=True,
|
|
1553
1554
|
):
|
|
1554
1555
|
"""
|
|
1555
1556
|
|
|
@@ -1572,6 +1573,10 @@ class PatternNodeRewriter(NodeRewriter):
|
|
|
1572
1573
|
If you provide `tracks`, you must provide this parameter. It must be a
|
|
1573
1574
|
function that takes the tracked node and returns a list of nodes on
|
|
1574
1575
|
which we will try this rewrite.
|
|
1576
|
+
values_eq_approx
|
|
1577
|
+
TODO
|
|
1578
|
+
allow_cast
|
|
1579
|
+
Automatically cast the output of the rewrite whenever new and old types differ
|
|
1575
1580
|
|
|
1576
1581
|
Notes
|
|
1577
1582
|
-----
|
|
@@ -1586,6 +1591,7 @@ class PatternNodeRewriter(NodeRewriter):
|
|
|
1586
1591
|
self.in_pattern = convert_strs_to_vars(in_pattern, var_map=var_map)
|
|
1587
1592
|
self.out_pattern = convert_strs_to_vars(out_pattern, var_map=var_map)
|
|
1588
1593
|
self.values_eq_approx = values_eq_approx
|
|
1594
|
+
self.allow_cast = allow_cast
|
|
1589
1595
|
if isinstance(in_pattern, list | tuple):
|
|
1590
1596
|
self.op = self.in_pattern[0]
|
|
1591
1597
|
elif isinstance(in_pattern, dict):
|
|
@@ -1630,6 +1636,10 @@ class PatternNodeRewriter(NodeRewriter):
|
|
|
1630
1636
|
if node.op != self.op:
|
|
1631
1637
|
return False
|
|
1632
1638
|
|
|
1639
|
+
if len(node.outputs) != 1:
|
|
1640
|
+
# PatternNodeRewriter doesn't support replacing multi-output nodes
|
|
1641
|
+
return False
|
|
1642
|
+
|
|
1633
1643
|
s = unify(self.in_pattern, node.out)
|
|
1634
1644
|
|
|
1635
1645
|
if s is False:
|
|
@@ -1652,19 +1662,20 @@ class PatternNodeRewriter(NodeRewriter):
|
|
|
1652
1662
|
):
|
|
1653
1663
|
return False
|
|
1654
1664
|
|
|
1655
|
-
|
|
1665
|
+
[old_out] = node.outputs
|
|
1666
|
+
if not old_out.type.is_super(ret.type):
|
|
1667
|
+
# Type doesn't match
|
|
1656
1668
|
if not (
|
|
1657
|
-
|
|
1658
|
-
and
|
|
1659
|
-
|
|
1660
|
-
for o, new_o in zip(node.outputs, ret.owner.outputs, strict=True)
|
|
1661
|
-
)
|
|
1669
|
+
self.allow_cast
|
|
1670
|
+
and isinstance(old_out.type, pytensor.tensor.TensorType)
|
|
1671
|
+
and isinstance(ret.type, pytensor.tensor.TensorType)
|
|
1662
1672
|
):
|
|
1663
1673
|
return False
|
|
1664
|
-
|
|
1665
|
-
#
|
|
1666
|
-
|
|
1667
|
-
if not
|
|
1674
|
+
|
|
1675
|
+
# Try to cast tensors
|
|
1676
|
+
ret = ret.astype(old_out.type.dtype)
|
|
1677
|
+
if not old_out.type.is_super(ret.type):
|
|
1678
|
+
# Still doesn't match
|
|
1668
1679
|
return False
|
|
1669
1680
|
|
|
1670
1681
|
return [ret]
|
|
@@ -10,10 +10,11 @@ from pytensor.compile import JAX
|
|
|
10
10
|
from pytensor.compile.builders import OpFromGraph
|
|
11
11
|
from pytensor.compile.ops import DeepCopyOp, TypeCastingOp
|
|
12
12
|
from pytensor.configdefaults import config
|
|
13
|
+
from pytensor.graph import Constant
|
|
13
14
|
from pytensor.graph.fg import FunctionGraph
|
|
14
15
|
from pytensor.ifelse import IfElse
|
|
15
16
|
from pytensor.link.utils import fgraph_to_python
|
|
16
|
-
from pytensor.raise_op import
|
|
17
|
+
from pytensor.raise_op import CheckAndRaise
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
if config.floatX == "float64":
|
|
@@ -73,11 +74,14 @@ def jax_funcify_IfElse(op, **kwargs):
|
|
|
73
74
|
return ifelse
|
|
74
75
|
|
|
75
76
|
|
|
76
|
-
@jax_funcify.register(Assert)
|
|
77
77
|
@jax_funcify.register(CheckAndRaise)
|
|
78
|
-
def jax_funcify_CheckAndRaise(op, **kwargs):
|
|
78
|
+
def jax_funcify_CheckAndRaise(op, node, **kwargs):
|
|
79
|
+
conds = node.inputs[1:]
|
|
80
|
+
if any(isinstance(cond, Constant) and not bool(cond.data) for cond in conds):
|
|
81
|
+
raise op.exc_type(op.msg)
|
|
82
|
+
|
|
79
83
|
warnings.warn(
|
|
80
|
-
f"""Skipping
|
|
84
|
+
f"""Skipping {op} Op (assertion: {op.msg}) as JAX tracing would remove it.""",
|
|
81
85
|
stacklevel=2,
|
|
82
86
|
)
|
|
83
87
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import jax.numpy as jnp
|
|
2
|
+
|
|
3
|
+
from pytensor.link.jax.dispatch import jax_funcify
|
|
4
|
+
from pytensor.tensor.blockwise import Blockwise
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@jax_funcify.register(Blockwise)
|
|
8
|
+
def jax_funcify_Blockwise(op: Blockwise, node, **kwargs):
|
|
9
|
+
signature = op.signature
|
|
10
|
+
core_node = op._create_dummy_core_node(
|
|
11
|
+
node.inputs, propagate_unbatched_core_inputs=True
|
|
12
|
+
)
|
|
13
|
+
core_fn = jax_funcify(core_node.op, node=core_node, **kwargs)
|
|
14
|
+
|
|
15
|
+
vect_fn = jnp.vectorize(core_fn, signature=signature)
|
|
16
|
+
|
|
17
|
+
def blockwise_fn(*inputs):
|
|
18
|
+
op._check_runtime_broadcast(node, inputs)
|
|
19
|
+
return vect_fn(*inputs)
|
|
20
|
+
|
|
21
|
+
return blockwise_fn
|
|
@@ -9,7 +9,6 @@ from pytensor.tensor.nlinalg import (
|
|
|
9
9
|
KroneckerProduct,
|
|
10
10
|
MatrixInverse,
|
|
11
11
|
MatrixPinv,
|
|
12
|
-
QRFull,
|
|
13
12
|
SLogDet,
|
|
14
13
|
)
|
|
15
14
|
|
|
@@ -67,16 +66,6 @@ def jax_funcify_MatrixInverse(op, **kwargs):
|
|
|
67
66
|
return matrix_inverse
|
|
68
67
|
|
|
69
68
|
|
|
70
|
-
@jax_funcify.register(QRFull)
|
|
71
|
-
def jax_funcify_QRFull(op, **kwargs):
|
|
72
|
-
mode = op.mode
|
|
73
|
-
|
|
74
|
-
def qr_full(x, mode=mode):
|
|
75
|
-
return jnp.linalg.qr(x, mode=mode)
|
|
76
|
-
|
|
77
|
-
return qr_full
|
|
78
|
-
|
|
79
|
-
|
|
80
69
|
@jax_funcify.register(MatrixPinv)
|
|
81
70
|
def jax_funcify_Pinv(op, **kwargs):
|
|
82
71
|
def pinv(x):
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import jax
|
|
2
|
+
|
|
3
|
+
from pytensor.link.jax.dispatch import jax_funcify
|
|
4
|
+
from pytensor.tensor.basic import get_underlying_scalar_constant_value
|
|
5
|
+
from pytensor.tensor.exceptions import NotScalarConstantError
|
|
6
|
+
from pytensor.tensor.signal.conv import Convolve1d
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@jax_funcify.register(Convolve1d)
|
|
10
|
+
def jax_funcify_Convolve1d(op, node, **kwargs):
|
|
11
|
+
_, _, full_mode = node.inputs
|
|
12
|
+
try:
|
|
13
|
+
full_mode = get_underlying_scalar_constant_value(full_mode)
|
|
14
|
+
except NotScalarConstantError:
|
|
15
|
+
raise NotImplementedError(
|
|
16
|
+
"Cannot compile Convolve1D to jax without static mode"
|
|
17
|
+
)
|
|
18
|
+
static_mode = "full" if full_mode else "valid"
|
|
19
|
+
|
|
20
|
+
def conv1d(data, kernel, _runtime_full_mode):
|
|
21
|
+
# _runtime_full_mode is not used, as we only support static mode
|
|
22
|
+
return jax.numpy.convolve(data, kernel, mode=static_mode)
|
|
23
|
+
|
|
24
|
+
return conv1d
|
|
@@ -5,6 +5,7 @@ import jax
|
|
|
5
5
|
from pytensor.link.jax.dispatch.basic import jax_funcify
|
|
6
6
|
from pytensor.tensor.slinalg import (
|
|
7
7
|
LU,
|
|
8
|
+
QR,
|
|
8
9
|
BlockDiagonal,
|
|
9
10
|
Cholesky,
|
|
10
11
|
CholeskySolve,
|
|
@@ -168,3 +169,13 @@ def jax_funcify_ChoSolve(op, **kwargs):
|
|
|
168
169
|
)
|
|
169
170
|
|
|
170
171
|
return cho_solve
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
@jax_funcify.register(QR)
|
|
175
|
+
def jax_funcify_QR(op, **kwargs):
|
|
176
|
+
mode = op.mode
|
|
177
|
+
|
|
178
|
+
def qr(x, mode=mode):
|
|
179
|
+
return jax.scipy.linalg.qr(x, mode=mode)
|
|
180
|
+
|
|
181
|
+
return qr
|
|
@@ -402,24 +402,22 @@ def numba_funcify_DeepCopyOp(op, node, **kwargs):
|
|
|
402
402
|
return deepcopyop
|
|
403
403
|
|
|
404
404
|
|
|
405
|
-
@numba_njit
|
|
406
|
-
def makeslice(*x):
|
|
407
|
-
return slice(*x)
|
|
408
|
-
|
|
409
|
-
|
|
410
405
|
@numba_funcify.register(MakeSlice)
|
|
411
406
|
def numba_funcify_MakeSlice(op, **kwargs):
|
|
412
|
-
|
|
413
|
-
|
|
407
|
+
@numba_njit
|
|
408
|
+
def makeslice(*x):
|
|
409
|
+
return slice(*x)
|
|
414
410
|
|
|
415
|
-
|
|
416
|
-
def shape(x):
|
|
417
|
-
return np.asarray(np.shape(x))
|
|
411
|
+
return makeslice
|
|
418
412
|
|
|
419
413
|
|
|
420
414
|
@numba_funcify.register(Shape)
|
|
421
415
|
def numba_funcify_Shape(op, **kwargs):
|
|
422
|
-
|
|
416
|
+
@numba_njit
|
|
417
|
+
def shape(x):
|
|
418
|
+
return np.asarray(np.shape(x))
|
|
419
|
+
|
|
420
|
+
return shape
|
|
423
421
|
|
|
424
422
|
|
|
425
423
|
@numba_funcify.register(Shape_i)
|
|
@@ -16,7 +16,7 @@ from pytensor.tensor import TensorVariable, get_vector_length
|
|
|
16
16
|
from pytensor.tensor.blockwise import Blockwise, BlockwiseWithCoreShape
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
@numba_funcify.register
|
|
19
|
+
@numba_funcify.register(BlockwiseWithCoreShape)
|
|
20
20
|
def numba_funcify_Blockwise(op: BlockwiseWithCoreShape, node, **kwargs):
|
|
21
21
|
[blockwise_node] = op.fgraph.apply_nodes
|
|
22
22
|
blockwise_op: Blockwise = blockwise_node.op
|
|
@@ -26,7 +26,8 @@ def numba_funcify_Blockwise(op: BlockwiseWithCoreShape, node, **kwargs):
|
|
|
26
26
|
core_shapes_len = tuple(get_vector_length(sh) for sh in node.inputs[nin:])
|
|
27
27
|
|
|
28
28
|
core_node = blockwise_op._create_dummy_core_node(
|
|
29
|
-
cast(tuple[TensorVariable],
|
|
29
|
+
cast(tuple[TensorVariable], node.inputs[:nin]),
|
|
30
|
+
propagate_unbatched_core_inputs=True,
|
|
30
31
|
)
|
|
31
32
|
core_op_fn = numba_funcify(
|
|
32
33
|
core_op,
|
|
@@ -283,7 +283,6 @@ class _LAPACK:
|
|
|
283
283
|
|
|
284
284
|
Called by scipy.linalg.lu_solve
|
|
285
285
|
"""
|
|
286
|
-
...
|
|
287
286
|
lapack_ptr, float_pointer = _get_lapack_ptr_and_ptr_type(dtype, "getrs")
|
|
288
287
|
functype = ctypes.CFUNCTYPE(
|
|
289
288
|
None,
|
|
@@ -457,3 +456,90 @@ class _LAPACK:
|
|
|
457
456
|
_ptr_int, # INFO
|
|
458
457
|
)
|
|
459
458
|
return functype(lapack_ptr)
|
|
459
|
+
|
|
460
|
+
@classmethod
|
|
461
|
+
def numba_xgeqrf(cls, dtype):
|
|
462
|
+
"""
|
|
463
|
+
Compute the QR factorization of a general M-by-N matrix A.
|
|
464
|
+
|
|
465
|
+
Used in QR decomposition (no pivoting).
|
|
466
|
+
"""
|
|
467
|
+
lapack_ptr, float_pointer = _get_lapack_ptr_and_ptr_type(dtype, "geqrf")
|
|
468
|
+
functype = ctypes.CFUNCTYPE(
|
|
469
|
+
None,
|
|
470
|
+
_ptr_int, # M
|
|
471
|
+
_ptr_int, # N
|
|
472
|
+
float_pointer, # A
|
|
473
|
+
_ptr_int, # LDA
|
|
474
|
+
float_pointer, # TAU
|
|
475
|
+
float_pointer, # WORK
|
|
476
|
+
_ptr_int, # LWORK
|
|
477
|
+
_ptr_int, # INFO
|
|
478
|
+
)
|
|
479
|
+
return functype(lapack_ptr)
|
|
480
|
+
|
|
481
|
+
@classmethod
|
|
482
|
+
def numba_xgeqp3(cls, dtype):
|
|
483
|
+
"""
|
|
484
|
+
Compute the QR factorization with column pivoting of a general M-by-N matrix A.
|
|
485
|
+
|
|
486
|
+
Used in QR decomposition with pivoting.
|
|
487
|
+
"""
|
|
488
|
+
lapack_ptr, float_pointer = _get_lapack_ptr_and_ptr_type(dtype, "geqp3")
|
|
489
|
+
functype = ctypes.CFUNCTYPE(
|
|
490
|
+
None,
|
|
491
|
+
_ptr_int, # M
|
|
492
|
+
_ptr_int, # N
|
|
493
|
+
float_pointer, # A
|
|
494
|
+
_ptr_int, # LDA
|
|
495
|
+
_ptr_int, # JPVT
|
|
496
|
+
float_pointer, # TAU
|
|
497
|
+
float_pointer, # WORK
|
|
498
|
+
_ptr_int, # LWORK
|
|
499
|
+
_ptr_int, # INFO
|
|
500
|
+
)
|
|
501
|
+
return functype(lapack_ptr)
|
|
502
|
+
|
|
503
|
+
@classmethod
|
|
504
|
+
def numba_xorgqr(cls, dtype):
|
|
505
|
+
"""
|
|
506
|
+
Generate the orthogonal matrix Q from a QR factorization (real types).
|
|
507
|
+
|
|
508
|
+
Used in QR decomposition to form Q.
|
|
509
|
+
"""
|
|
510
|
+
lapack_ptr, float_pointer = _get_lapack_ptr_and_ptr_type(dtype, "orgqr")
|
|
511
|
+
functype = ctypes.CFUNCTYPE(
|
|
512
|
+
None,
|
|
513
|
+
_ptr_int, # M
|
|
514
|
+
_ptr_int, # N
|
|
515
|
+
_ptr_int, # K
|
|
516
|
+
float_pointer, # A
|
|
517
|
+
_ptr_int, # LDA
|
|
518
|
+
float_pointer, # TAU
|
|
519
|
+
float_pointer, # WORK
|
|
520
|
+
_ptr_int, # LWORK
|
|
521
|
+
_ptr_int, # INFO
|
|
522
|
+
)
|
|
523
|
+
return functype(lapack_ptr)
|
|
524
|
+
|
|
525
|
+
@classmethod
|
|
526
|
+
def numba_xungqr(cls, dtype):
|
|
527
|
+
"""
|
|
528
|
+
Generate the unitary matrix Q from a QR factorization (complex types).
|
|
529
|
+
|
|
530
|
+
Used in QR decomposition to form Q for complex types.
|
|
531
|
+
"""
|
|
532
|
+
lapack_ptr, float_pointer = _get_lapack_ptr_and_ptr_type(dtype, "ungqr")
|
|
533
|
+
functype = ctypes.CFUNCTYPE(
|
|
534
|
+
None,
|
|
535
|
+
_ptr_int, # M
|
|
536
|
+
_ptr_int, # N
|
|
537
|
+
_ptr_int, # K
|
|
538
|
+
float_pointer, # A
|
|
539
|
+
_ptr_int, # LDA
|
|
540
|
+
float_pointer, # TAU
|
|
541
|
+
float_pointer, # WORK
|
|
542
|
+
_ptr_int, # LWORK
|
|
543
|
+
_ptr_int, # INFO
|
|
544
|
+
)
|
|
545
|
+
return functype(lapack_ptr)
|