pytensor 2.36.3__tar.gz → 2.38.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.36.3/pytensor.egg-info → pytensor-2.38.0}/PKG-INFO +1 -1
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/creating_an_op.rst +3 -3
- pytensor-2.38.0/doc/library/xtensor/signal.md +7 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pyproject.toml +8 -13
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/_version.py +3 -3
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/breakpoint.py +2 -2
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/gradient.py +15 -14
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/replace.py +25 -10
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/basic.py +1 -1
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/slinalg.py +30 -10
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/linker.py +1 -1
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/basic.py +16 -9
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/blockwise.py +3 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/compile_ops.py +1 -1
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/elemwise.py +1 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +581 -201
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +11 -13
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +6 -15
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +4 -3
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +13 -244
- pytensor-2.38.0/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +1320 -0
- pytensor-2.38.0/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +228 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +9 -8
- pytensor-2.38.0/pytensor/link/numba/dispatch/linalg/solve/general.py +85 -0
- pytensor-2.38.0/pytensor/link/numba/dispatch/linalg/solve/linear_control.py +100 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +5 -12
- pytensor-2.38.0/pytensor/link/numba/dispatch/linalg/solve/posdef.py +116 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +44 -130
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +6 -8
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +16 -92
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/utils.py +2 -64
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/random.py +1 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/scalar.py +1 -1
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/scan.py +3 -1
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/slinalg.py +221 -111
- pytensor-2.38.0/pytensor/link/numba/dispatch/sparse/__init__.py +1 -0
- pytensor-2.38.0/pytensor/link/numba/dispatch/sparse/basic.py +240 -0
- pytensor-2.38.0/pytensor/link/numba/dispatch/sparse/math.py +649 -0
- pytensor-2.38.0/pytensor/link/numba/dispatch/sparse/variable.py +598 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/tensor_basic.py +2 -2
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/typed_list.py +13 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +19 -8
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/linker.py +1 -1
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/vm.py +1 -1
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/raise_op.py +5 -2
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/basic.py +3 -3
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/basic.py +9 -11
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/op.py +56 -51
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/rewriting.py +5 -7
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/utils.py +16 -18
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/basic.py +73 -28
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/math.py +95 -71
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/variable.py +9 -7
- pytensor-2.38.0/pytensor/tensor/_linalg/solve/linear_control.py +457 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/_linalg/solve/rewriting.py +41 -18
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/basic.py +16 -15
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/elemwise.py +3 -3
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/extra_ops.py +3 -4
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/fft.py +3 -3
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/linalg.py +1 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/nlinalg.py +8 -4
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/optimize.py +303 -238
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/reshape.py +112 -130
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/basic.py +7 -3
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/blas_c.py +1 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/blockwise.py +11 -5
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/linalg.py +179 -51
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/math.py +46 -26
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/reshape.py +3 -2
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/shape.py +31 -8
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/subtensor.py +1 -1
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/shape.py +7 -6
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/signal/conv.py +7 -6
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/slinalg.py +688 -433
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/subtensor.py +14 -12
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/type.py +4 -2
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/type_other.py +2 -2
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/utils.py +11 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/__init__.py +1 -1
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/basic.py +50 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/indexing.py +48 -2
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/linalg.py +8 -19
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/reduction.py +17 -6
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/utils.py +10 -2
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/shape.py +50 -42
- pytensor-2.38.0/pytensor/xtensor/signal.py +74 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/type.py +79 -20
- pytensor-2.38.0/pytensor/xtensor/vectorization.py +664 -0
- {pytensor-2.36.3 → pytensor-2.38.0/pytensor.egg-info}/PKG-INFO +1 -1
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor.egg-info/SOURCES.txt +10 -2
- {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_gradient.py +12 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_raise_op.py +1 -6
- pytensor-2.36.3/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -147
- pytensor-2.36.3/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -55
- pytensor-2.36.3/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -224
- pytensor-2.36.3/pytensor/link/numba/dispatch/sparse.py +0 -206
- pytensor-2.36.3/pytensor/xtensor/vectorization.py +0 -278
- {pytensor-2.36.3 → pytensor-2.38.0}/LICENSE.txt +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/MANIFEST.in +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/README.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/.templates/layout.html +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/.templates/nb-badges.html +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/LICENSE.txt +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/README.md +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/acknowledgement.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/bcast.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/bcast.svg +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/blog.md +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/conf.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/core_development_guide.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/css.inc +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/dev_start_guide.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/environment.yml +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/apply.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/apply.svg +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/apply2.svg +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/ctype.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/extending_faq.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/graphstructures.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/index.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/inplace.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/op.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/other_ops.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/pipeline.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/scan.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/tips.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/type.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/unittest.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/extending/using_params.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/faq.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/optimize/root.ipynb +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/page_footer.md +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/glossary.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/Elman_srnn.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/PyTensor.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/binder.svg +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/blocksparse.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/colab.svg +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/github.svg +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/lstm.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/talk2010.gif +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/images/talk2010.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/index.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/install.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/internal/how_to_release.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/internal/index.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/introduction.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/function.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/index.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/io.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/mode.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/ops.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/compile/shared.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/config.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/index.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/features.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/graph.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/index.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/op.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/replace.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/type.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/graph/utils.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/index.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/printing.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/scalar/index.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/scan.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/sparse/index.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/basic.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/bcast.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/fft.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/functional.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/index.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/io.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/optimize.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/random/distributions.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/random/index.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/tensor/utils.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/typed_list.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/xtensor/index.md +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/xtensor/linalg.md +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/xtensor/math.md +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/xtensor/module_functions.md +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/xtensor/random.md +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/library/xtensor/type.md +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/links.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/optimizations.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/pylintrc +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/robots.txt +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/troubleshooting.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/adding.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/apply.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/apply.svg +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/bcast.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/conditions.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/examples.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/gradients.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/index.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/logistic.gp +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/logistic.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/loop.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/modes.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/prng.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/profiling.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/sparse.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/doc/user_guide.rst +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/bin/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/builders.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/compiledir.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/compilelock.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/debugmode.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/function/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/function/pfunc.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/function/types.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/io.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/mode.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/monitormode.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/nanguardmode.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/ops.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/profiling.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/configdefaults.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/configparser.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/basic.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/features.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/fg.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/null_type.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/op.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/traversal.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/type.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/graph/utils.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/ifelse.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/ipython.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/basic.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/cutils.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/cvm.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/interface.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/op.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/params_type.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/c/type.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/jax/ops.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/basic.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/core.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/math.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/nlinalg.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/shape.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/slinalg.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/sort.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/mlx/linker.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/cache.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/shape.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/sort.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/slinalg.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/link/utils.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/check_blas.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/frozendict.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/npy_2_compat.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/printing.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/py.typed +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/loop.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/math.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/scan/views.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/linalg.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/type.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/sparse/utils.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/_linalg/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/_linalg/solve/tridiagonal.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/blas.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/blas_c.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/einsum.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/fourier.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/functional.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/math.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/pad.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/op.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/type.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/random/var.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/blas.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/sort.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/special.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/utils.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/var.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/variable.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/typed_list/basic.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/typed_list/type.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/updates.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/math.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/random.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/__init__.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/basic.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/indexing.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/math.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/reduction.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/shape.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor/xtensor/rewriting/vectorization.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/scripts/mypy-failing.txt +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/setup.cfg +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/setup.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_breakpoint.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_config.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_ifelse.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_printing.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_rop.py +0 -0
- {pytensor-2.36.3 → pytensor-2.38.0}/tests/test_updates.py +0 -0
|
@@ -495,7 +495,7 @@ If both outputs are disconnected PyTensor will not bother calling the :meth:`L_o
|
|
|
495
495
|
|
|
496
496
|
from pytensor.graph.op import Op
|
|
497
497
|
from pytensor.graph.basic import Apply
|
|
498
|
-
from pytensor.gradient import DisconnectedType
|
|
498
|
+
from pytensor.gradient import DisconnectedType, disconnected_type
|
|
499
499
|
|
|
500
500
|
class TransposeAndSumOp(Op):
|
|
501
501
|
__props__ = ()
|
|
@@ -539,13 +539,13 @@ If both outputs are disconnected PyTensor will not bother calling the :meth:`L_o
|
|
|
539
539
|
out1_grad, out2_grad = output_grads
|
|
540
540
|
|
|
541
541
|
if isinstance(out1_grad.type, DisconnectedType):
|
|
542
|
-
x_grad =
|
|
542
|
+
x_grad = disconnected_type()
|
|
543
543
|
else:
|
|
544
544
|
# Transpose the last two dimensions of the output gradient
|
|
545
545
|
x_grad = pt.swapaxes(out1_grad, -1, -2)
|
|
546
546
|
|
|
547
547
|
if isinstance(out2_grad.type, DisconnectedType):
|
|
548
|
-
y_grad =
|
|
548
|
+
y_grad = disconnected_type()
|
|
549
549
|
else:
|
|
550
550
|
# Broadcast the output gradient to the same shape as y
|
|
551
551
|
y_grad = pt.broadcast_to(pt.expand_dims(out2_grad, -1), y.shape)
|
|
@@ -149,27 +149,22 @@ lines-after-imports = 2
|
|
|
149
149
|
# TODO: Get rid of these:
|
|
150
150
|
"**/__init__.py" = ["F401", "E402", "F403"]
|
|
151
151
|
"pytensor/tensor/linalg.py" = ["F403"]
|
|
152
|
+
# Modules that use print-statements, skip "T201"
|
|
152
153
|
"pytensor/link/c/cmodule.py" = ["PTH", "T201"]
|
|
153
154
|
"pytensor/misc/elemwise_time_test.py" = ["T201"]
|
|
154
155
|
"pytensor/misc/elemwise_openmp_speedup.py" = ["T201"]
|
|
155
156
|
"pytensor/misc/check_duplicate_key.py" = ["T201"]
|
|
156
157
|
"pytensor/misc/check_blas.py" = ["T201"]
|
|
157
158
|
"pytensor/bin/pytensor_cache.py" = ["T201"]
|
|
158
|
-
# For the tests we skip `E402` because `pytest.importorskip` is used:
|
|
159
|
-
"tests/link/jax/test_scalar.py" = ["E402"]
|
|
160
|
-
"tests/link/jax/test_tensor_basic.py" = ["E402"]
|
|
161
|
-
"tests/link/numba/test_basic.py" = ["E402"]
|
|
162
|
-
"tests/link/numba/test_cython_support.py" = ["E402"]
|
|
163
|
-
"tests/link/numba/test_performance.py" = ["E402"]
|
|
164
|
-
"tests/link/numba/test_sparse.py" = ["E402"]
|
|
165
|
-
"tests/link/numba/test_tensor_basic.py" = ["E402"]
|
|
166
|
-
"tests/tensor/test_math_scipy.py" = ["E402"]
|
|
167
|
-
"tests/sparse/test_basic.py" = ["E402"]
|
|
168
|
-
"tests/sparse/test_sp2.py" = ["E402"]
|
|
169
|
-
"tests/sparse/test_utils.py" = ["E402"]
|
|
170
|
-
"tests/sparse/sandbox/test_sp.py" = ["E402", "F401"]
|
|
171
159
|
"tests/compile/test_monitormode.py" = ["T201"]
|
|
172
160
|
"scripts/run_mypy.py" = ["T201"]
|
|
161
|
+
# Test modules of optional backends that use `pytest.importorskip`, skip "E402"
|
|
162
|
+
"tests/link/jax/**/test_*.py" = ["E402"]
|
|
163
|
+
"tests/link/numba/**/test_*.py" = ["E402"]
|
|
164
|
+
"tests/link/pytorch/**/test_*.py" = ["E402"]
|
|
165
|
+
"tests/link/mlx/**/test_*.py" = ["E402"]
|
|
166
|
+
"tests/xtensor/**/*.py" = ["E402"]
|
|
167
|
+
|
|
173
168
|
|
|
174
169
|
|
|
175
170
|
[tool.mypy]
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2026-
|
|
11
|
+
"date": "2026-02-19T15:15:27+0100",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.
|
|
14
|
+
"full-revisionid": "87470065d89190405c9291235daf621d17de17ed",
|
|
15
|
+
"version": "2.38.0"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import numpy as np
|
|
2
2
|
|
|
3
|
-
from pytensor.gradient import
|
|
3
|
+
from pytensor.gradient import disconnected_type
|
|
4
4
|
from pytensor.graph.basic import Apply, Variable
|
|
5
5
|
from pytensor.graph.op import Op
|
|
6
6
|
from pytensor.tensor.basic import as_tensor_variable
|
|
@@ -142,7 +142,7 @@ class PdbBreakpoint(Op):
|
|
|
142
142
|
output_storage[i][0] = inputs[i + 1]
|
|
143
143
|
|
|
144
144
|
def grad(self, inputs, output_gradients):
|
|
145
|
-
return [
|
|
145
|
+
return [disconnected_type(), *output_gradients]
|
|
146
146
|
|
|
147
147
|
def infer_shape(self, fgraph, inputs, input_shapes):
|
|
148
148
|
# Return the shape of every input but the condition (first input)
|
|
@@ -494,22 +494,25 @@ def Lop(
|
|
|
494
494
|
coordinates of the tensor elements.
|
|
495
495
|
If `f` is a list/tuple, then return a list/tuple with the results.
|
|
496
496
|
"""
|
|
497
|
-
|
|
498
|
-
_eval_points: list[Variable] = [pytensor.tensor.as_tensor_variable(eval_points)]
|
|
499
|
-
else:
|
|
500
|
-
_eval_points = [pytensor.tensor.as_tensor_variable(x) for x in eval_points]
|
|
497
|
+
from pytensor.tensor import as_tensor_variable
|
|
501
498
|
|
|
502
|
-
if not isinstance(
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
499
|
+
if not isinstance(eval_points, Sequence):
|
|
500
|
+
eval_points = [eval_points]
|
|
501
|
+
_eval_points = [
|
|
502
|
+
x if isinstance(x, Variable) else as_tensor_variable(x) for x in eval_points
|
|
503
|
+
]
|
|
504
|
+
|
|
505
|
+
if not isinstance(f, Sequence):
|
|
506
|
+
f = [f]
|
|
507
|
+
_f = [x if isinstance(x, Variable) else as_tensor_variable(x) for x in f]
|
|
506
508
|
|
|
507
509
|
grads = list(_eval_points)
|
|
508
510
|
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
511
|
+
using_list = isinstance(wrt, list)
|
|
512
|
+
using_tuple = isinstance(wrt, tuple)
|
|
513
|
+
if not isinstance(wrt, Sequence):
|
|
514
|
+
wrt = [wrt]
|
|
515
|
+
_wrt = [x if isinstance(x, Variable) else as_tensor_variable(x) for x in wrt]
|
|
513
516
|
|
|
514
517
|
assert len(_f) == len(grads)
|
|
515
518
|
known = dict(zip(_f, grads, strict=True))
|
|
@@ -523,8 +526,6 @@ def Lop(
|
|
|
523
526
|
return_disconnected=return_disconnected,
|
|
524
527
|
)
|
|
525
528
|
|
|
526
|
-
using_list = isinstance(wrt, list)
|
|
527
|
-
using_tuple = isinstance(wrt, tuple)
|
|
528
529
|
return as_list_or_tuple(using_list, using_tuple, ret)
|
|
529
530
|
|
|
530
531
|
|
|
@@ -208,19 +208,13 @@ def graph_replace(
|
|
|
208
208
|
|
|
209
209
|
|
|
210
210
|
@singledispatch
|
|
211
|
-
def _vectorize_node(op: Op, node: Apply, *batched_inputs) -> Apply:
|
|
211
|
+
def _vectorize_node(op: Op, node: Apply, *batched_inputs) -> Apply | Sequence[Variable]:
|
|
212
212
|
# Default implementation is provided in pytensor.tensor.blockwise
|
|
213
213
|
raise NotImplementedError
|
|
214
214
|
|
|
215
215
|
|
|
216
|
-
def vectorize_node(node: Apply, *batched_inputs) -> Apply:
|
|
217
|
-
"""Returns vectorized version of node with new batched inputs."""
|
|
218
|
-
op = node.op
|
|
219
|
-
return _vectorize_node(op, node, *batched_inputs)
|
|
220
|
-
|
|
221
|
-
|
|
222
216
|
def _vectorize_not_needed(op, node, *batched_inputs):
|
|
223
|
-
return op.make_node(*batched_inputs)
|
|
217
|
+
return op.make_node(*batched_inputs).outputs
|
|
224
218
|
|
|
225
219
|
|
|
226
220
|
@overload
|
|
@@ -289,19 +283,40 @@ def vectorize_graph(
|
|
|
289
283
|
# [array([-10., -11.]), array([10., 11.])]
|
|
290
284
|
|
|
291
285
|
"""
|
|
286
|
+
# TODO: Move this to tensor.vectorize, and make this helper type agnostic.
|
|
287
|
+
#
|
|
288
|
+
# This helper may dispatch to tensor.vectorize_graph or xtensor.vectorize_graph depending on the replacement types
|
|
289
|
+
# The behavior is distinct, because tensor vectorization depends on axis-position while xtensor depends on dimension labels
|
|
290
|
+
#
|
|
291
|
+
# xtensor.vectorize_graph will be able to handle batched inner tensor operations, while tensor.vectorize_graph won't,
|
|
292
|
+
# as it is by design unaware of xtensors and their semantics.
|
|
292
293
|
if isinstance(outputs, Sequence):
|
|
293
294
|
seq_outputs = outputs
|
|
294
295
|
else:
|
|
295
296
|
seq_outputs = [outputs]
|
|
296
297
|
|
|
298
|
+
if not all(
|
|
299
|
+
isinstance(key, Variable) and isinstance(value, Variable)
|
|
300
|
+
for key, value in replace.items()
|
|
301
|
+
):
|
|
302
|
+
raise ValueError(f"Some of the replaced items are not Variables: {replace}")
|
|
303
|
+
|
|
297
304
|
inputs = truncated_graph_inputs(seq_outputs, ancestors_to_include=replace.keys())
|
|
298
305
|
new_inputs = [replace.get(inp, inp) for inp in inputs]
|
|
299
306
|
|
|
300
307
|
vect_vars = dict(zip(inputs, new_inputs, strict=True))
|
|
301
308
|
for node in toposort(seq_outputs, blockers=inputs):
|
|
302
309
|
vect_inputs = [vect_vars.get(inp, inp) for inp in node.inputs]
|
|
303
|
-
|
|
304
|
-
|
|
310
|
+
|
|
311
|
+
vect_node_or_outputs = _vectorize_node(node.op, node, *vect_inputs)
|
|
312
|
+
# Compatibility with the old API
|
|
313
|
+
vect_outputs = (
|
|
314
|
+
vect_node_or_outputs.outputs
|
|
315
|
+
if isinstance(vect_node_or_outputs, Apply)
|
|
316
|
+
else vect_node_or_outputs
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
for output, vect_output in zip(node.outputs, vect_outputs, strict=True):
|
|
305
320
|
if output in vect_vars:
|
|
306
321
|
# This can happen when some outputs of a multi-output node are given a replacement,
|
|
307
322
|
# while some of the remaining outputs are still needed in the graph.
|
|
@@ -284,7 +284,7 @@ class PerformLinker(LocalLinker):
|
|
|
284
284
|
"""
|
|
285
285
|
|
|
286
286
|
required_rewrites: tuple[str, ...] = ("minimum_compile", "py_only")
|
|
287
|
-
incompatible_rewrites: tuple[str, ...] = ("
|
|
287
|
+
incompatible_rewrites: tuple[str, ...] = ("cxx_only",)
|
|
288
288
|
|
|
289
289
|
def __init__(
|
|
290
290
|
self, allow_gc: bool | None = None, schedule: Callable | None = None
|
|
@@ -3,6 +3,7 @@ import warnings
|
|
|
3
3
|
import jax
|
|
4
4
|
|
|
5
5
|
from pytensor.link.jax.dispatch.basic import jax_funcify
|
|
6
|
+
from pytensor.tensor._linalg.solve.linear_control import SolveSylvester
|
|
6
7
|
from pytensor.tensor.slinalg import (
|
|
7
8
|
LU,
|
|
8
9
|
QR,
|
|
@@ -13,6 +14,7 @@ from pytensor.tensor.slinalg import (
|
|
|
13
14
|
Expm,
|
|
14
15
|
LUFactor,
|
|
15
16
|
PivotToPermutations,
|
|
17
|
+
Schur,
|
|
16
18
|
Solve,
|
|
17
19
|
SolveTriangular,
|
|
18
20
|
)
|
|
@@ -92,7 +94,6 @@ def jax_funcify_Solve(op, **kwargs):
|
|
|
92
94
|
def jax_funcify_SolveTriangular(op, **kwargs):
|
|
93
95
|
lower = op.lower
|
|
94
96
|
unit_diagonal = op.unit_diagonal
|
|
95
|
-
check_finite = op.check_finite
|
|
96
97
|
|
|
97
98
|
def solve_triangular(A, b):
|
|
98
99
|
return jax.scipy.linalg.solve_triangular(
|
|
@@ -101,7 +102,7 @@ def jax_funcify_SolveTriangular(op, **kwargs):
|
|
|
101
102
|
lower=lower,
|
|
102
103
|
trans=0, # this is handled by explicitly transposing A, so it will always be 0 when we get to here.
|
|
103
104
|
unit_diagonal=unit_diagonal,
|
|
104
|
-
check_finite=
|
|
105
|
+
check_finite=False,
|
|
105
106
|
)
|
|
106
107
|
|
|
107
108
|
return solve_triangular
|
|
@@ -132,27 +133,23 @@ def jax_funcify_PivotToPermutation(op, **kwargs):
|
|
|
132
133
|
def jax_funcify_LU(op, **kwargs):
|
|
133
134
|
permute_l = op.permute_l
|
|
134
135
|
p_indices = op.p_indices
|
|
135
|
-
check_finite = op.check_finite
|
|
136
136
|
|
|
137
137
|
if p_indices:
|
|
138
138
|
raise ValueError("JAX does not support the p_indices argument")
|
|
139
139
|
|
|
140
140
|
def lu(*inputs):
|
|
141
|
-
return jax.scipy.linalg.lu(
|
|
142
|
-
*inputs, permute_l=permute_l, check_finite=check_finite
|
|
143
|
-
)
|
|
141
|
+
return jax.scipy.linalg.lu(*inputs, permute_l=permute_l, check_finite=False)
|
|
144
142
|
|
|
145
143
|
return lu
|
|
146
144
|
|
|
147
145
|
|
|
148
146
|
@jax_funcify.register(LUFactor)
|
|
149
147
|
def jax_funcify_LUFactor(op, **kwargs):
|
|
150
|
-
check_finite = op.check_finite
|
|
151
148
|
overwrite_a = op.overwrite_a
|
|
152
149
|
|
|
153
150
|
def lu_factor(a):
|
|
154
151
|
return jax.scipy.linalg.lu_factor(
|
|
155
|
-
a, check_finite=
|
|
152
|
+
a, check_finite=False, overwrite_a=overwrite_a
|
|
156
153
|
)
|
|
157
154
|
|
|
158
155
|
return lu_factor
|
|
@@ -161,12 +158,11 @@ def jax_funcify_LUFactor(op, **kwargs):
|
|
|
161
158
|
@jax_funcify.register(CholeskySolve)
|
|
162
159
|
def jax_funcify_ChoSolve(op, **kwargs):
|
|
163
160
|
lower = op.lower
|
|
164
|
-
check_finite = op.check_finite
|
|
165
161
|
overwrite_b = op.overwrite_b
|
|
166
162
|
|
|
167
163
|
def cho_solve(c, b):
|
|
168
164
|
return jax.scipy.linalg.cho_solve(
|
|
169
|
-
(c, lower), b, check_finite=
|
|
165
|
+
(c, lower), b, check_finite=False, overwrite_b=overwrite_b
|
|
170
166
|
)
|
|
171
167
|
|
|
172
168
|
return cho_solve
|
|
@@ -189,3 +185,27 @@ def jax_funcify_Expm(op, **kwargs):
|
|
|
189
185
|
return jax.scipy.linalg.expm(x)
|
|
190
186
|
|
|
191
187
|
return expm
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
@jax_funcify.register(Schur)
|
|
191
|
+
def jax_funcify_Schur(op, **kwargs):
|
|
192
|
+
output = op.output
|
|
193
|
+
|
|
194
|
+
if op.sort is not None:
|
|
195
|
+
warnings.warn(
|
|
196
|
+
"jax.scipy.linalg.schur only supports sort=None. The sort argument is ignored."
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
def schur(a):
|
|
200
|
+
T, Z = jax.scipy.linalg.schur(a, output=output)
|
|
201
|
+
return T, Z
|
|
202
|
+
|
|
203
|
+
return schur
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
@jax_funcify.register(SolveSylvester)
|
|
207
|
+
def jax_funcify_SolveSylsterer(op, **kwargs):
|
|
208
|
+
def solve_sylvester(a, b, c):
|
|
209
|
+
return jax.scipy.linalg.solve_sylvester(a, b, c)
|
|
210
|
+
|
|
211
|
+
return solve_sylvester
|
|
@@ -14,14 +14,13 @@ from pytensor.graph.basic import Apply, Constant, Variable
|
|
|
14
14
|
from pytensor.graph.fg import FunctionGraph
|
|
15
15
|
from pytensor.graph.type import Type
|
|
16
16
|
from pytensor.link.numba.cache import compile_numba_function_src, hash_from_pickle_dump
|
|
17
|
-
from pytensor.link.numba.dispatch.sparse import CSCMatrixType, CSRMatrixType
|
|
18
17
|
from pytensor.link.utils import (
|
|
19
18
|
fgraph_to_python,
|
|
20
19
|
)
|
|
21
20
|
from pytensor.scalar.basic import ScalarType
|
|
22
21
|
from pytensor.sparse import SparseTensorType
|
|
23
22
|
from pytensor.tensor.random.type import RandomGeneratorType
|
|
24
|
-
from pytensor.tensor.type import
|
|
23
|
+
from pytensor.tensor.type import DenseTensorType
|
|
25
24
|
from pytensor.tensor.utils import hash_from_ndarray
|
|
26
25
|
from pytensor.typed_list import TypedListType
|
|
27
26
|
|
|
@@ -112,7 +111,7 @@ def get_numba_type(
|
|
|
112
111
|
Return Numba scalars for zero dimensional :class:`TensorType`\s.
|
|
113
112
|
"""
|
|
114
113
|
|
|
115
|
-
if isinstance(pytensor_type,
|
|
114
|
+
if isinstance(pytensor_type, DenseTensorType):
|
|
116
115
|
dtype = pytensor_type.numpy_dtype
|
|
117
116
|
numba_dtype = numba.from_dtype(dtype)
|
|
118
117
|
if force_scalar or (
|
|
@@ -125,18 +124,26 @@ def get_numba_type(
|
|
|
125
124
|
numba_dtype = numba.from_dtype(dtype)
|
|
126
125
|
return numba_dtype
|
|
127
126
|
elif isinstance(pytensor_type, SparseTensorType):
|
|
128
|
-
|
|
129
|
-
|
|
127
|
+
from pytensor.link.numba.dispatch.sparse.variable import (
|
|
128
|
+
CSCMatrixType,
|
|
129
|
+
CSRMatrixType,
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
data_array = numba.types.Array(
|
|
133
|
+
numba.from_dtype(pytensor_type.numpy_dtype), 1, layout
|
|
134
|
+
)
|
|
135
|
+
indices_array = numba.types.Array(numba.from_dtype(np.int32), 1, layout)
|
|
136
|
+
indptr_array = numba.types.Array(numba.from_dtype(np.int32), 1, layout)
|
|
130
137
|
if pytensor_type.format == "csr":
|
|
131
|
-
return CSRMatrixType(
|
|
138
|
+
return CSRMatrixType(data_array, indices_array, indptr_array)
|
|
132
139
|
if pytensor_type.format == "csc":
|
|
133
|
-
return CSCMatrixType(
|
|
140
|
+
return CSCMatrixType(data_array, indices_array, indptr_array)
|
|
134
141
|
elif isinstance(pytensor_type, RandomGeneratorType):
|
|
135
142
|
return numba.types.NumPyRandomGeneratorType("NumPyRandomGeneratorType")
|
|
136
143
|
elif isinstance(pytensor_type, TypedListType):
|
|
137
144
|
return numba.types.List(get_numba_type(pytensor_type.ttype))
|
|
138
|
-
|
|
139
|
-
|
|
145
|
+
|
|
146
|
+
raise NotImplementedError(f"Numba type not implemented for {pytensor_type}")
|
|
140
147
|
|
|
141
148
|
|
|
142
149
|
def create_numba_signature(
|
|
@@ -86,6 +86,7 @@ def numba_funcify_Blockwise(op: BlockwiseWithCoreShape, node, **kwargs):
|
|
|
86
86
|
output_bc_patterns,
|
|
87
87
|
output_dtypes,
|
|
88
88
|
inplace_pattern,
|
|
89
|
+
False, # allow_core_scalar
|
|
89
90
|
(), # constant_inputs
|
|
90
91
|
inputs,
|
|
91
92
|
tuple_core_shapes,
|
|
@@ -98,6 +99,7 @@ def numba_funcify_Blockwise(op: BlockwiseWithCoreShape, node, **kwargs):
|
|
|
98
99
|
# If the core op cannot be cached, the Blockwise wrapper cannot be cached either
|
|
99
100
|
blockwise_key = None
|
|
100
101
|
else:
|
|
102
|
+
blockwise_cache_version = 1
|
|
101
103
|
blockwise_key = "_".join(
|
|
102
104
|
map(
|
|
103
105
|
str,
|
|
@@ -108,6 +110,7 @@ def numba_funcify_Blockwise(op: BlockwiseWithCoreShape, node, **kwargs):
|
|
|
108
110
|
blockwise_op.signature,
|
|
109
111
|
input_bc_patterns,
|
|
110
112
|
core_op_key,
|
|
113
|
+
blockwise_cache_version,
|
|
111
114
|
),
|
|
112
115
|
)
|
|
113
116
|
)
|
|
@@ -68,7 +68,7 @@ def numba_funcify_OpFromGraph(op, node=None, **kwargs):
|
|
|
68
68
|
output_specs = [Out(o, borrow=False) for o in fgraph.outputs]
|
|
69
69
|
insert_deepcopy(fgraph, wrapped_inputs=input_specs, wrapped_outputs=output_specs)
|
|
70
70
|
fgraph_fn, fgraph_cache_key = numba_funcify_and_cache_key(
|
|
71
|
-
fgraph, squeeze_output=True, **kwargs
|
|
71
|
+
fgraph, squeeze_output=True, fgraph_name="numba_ofg", **kwargs
|
|
72
72
|
)
|
|
73
73
|
|
|
74
74
|
if fgraph_cache_key is None:
|